Added chunk unloading

This commit is contained in:
Tracker-Friendly 2025-03-02 10:54:54 +00:00
parent 42c0aa1881
commit 48ffc45deb
8 changed files with 53 additions and 10 deletions

View File

@ -43,6 +43,10 @@ To create a network, simply create extend the Network type.
```java ```java
public class MyNetwork extends Network { public class MyNetwork extends Network {
public MyNetwork() {
super(MyNetwork::new);
}
@Override @Override
public void tick(ServerWorld serverWorld) { public void tick(ServerWorld serverWorld) {
// Do stuff // Do stuff

View File

@ -56,6 +56,10 @@ processResources {
filesMatching("fabric.mod.json") { filesMatching("fabric.mod.json") {
expand "version": inputs.properties.version expand "version": inputs.properties.version
} }
filesMatching("quilt.mod.json") {
expand "version": inputs.properties.version, "group": inputs.properties.maven_group
}
} }
tasks.withType(JavaCompile).configureEach { tasks.withType(JavaCompile).configureEach {

View File

@ -7,7 +7,7 @@ minecraft_version=1.20
yarn_mappings=1.20+build.1 yarn_mappings=1.20+build.1
loader_version=0.16.10 loader_version=0.16.10
# Mod Properties # Mod Properties
mod_version=1.0.0 mod_version=1.1.0
maven_group=arzumify.networked maven_group=arzumify.networked
archives_base_name=networked archives_base_name=networked
# Dependencies # Dependencies

View File

@ -2,17 +2,23 @@ package arzumify.networked.api;
import arzumify.networked.impl.BasePresence; import arzumify.networked.impl.BasePresence;
import arzumify.networked.impl.MatchMaker; import arzumify.networked.impl.MatchMaker;
import arzumify.presence.maths.Vec3i; import arzumify.presence.maths.Vec2i;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.ChunkPos;
import net.minecraft.world.chunk.WorldChunk;
import java.util.HashSet; import java.util.HashSet;
abstract public class Network extends BasePresence implements ServerTickEvents.EndWorldTick { abstract public class Network extends BasePresence implements ServerTickEvents.EndWorldTick, ServerChunkEvents.Unload, ServerChunkEvents.Load {
private final HashSet<Node> nodes = new HashSet<>(); private final HashSet<Node> nodes = new HashSet<>();
private final NetworkFactory factory;
private static final HashSet<ChunkPos> unloadedChunks = new HashSet<>();
public Network(Vec3i... points) { public Network(NetworkFactory parentFactory) {
super((short) 1, points); super((short) 1);
this.factory = parentFactory;
} }
public void Merge(Network other) { public void Merge(Network other) {
@ -26,11 +32,15 @@ abstract public class Network extends BasePresence implements ServerTickEvents.E
nodes.add(node); nodes.add(node);
} }
public void Remove(Node node, NetworkFactory factory) { public void Remove(Node node) {
System.out.println("Removing"); System.out.println("Removing");
System.out.println(nodes); System.out.println(nodes);
nodes.remove(node); nodes.remove(node);
MatchMaker.matchMaker.Remove(this, MatchMaker.networkDiscovery); MatchMaker.matchMaker.Remove(this, MatchMaker.networkDiscovery);
rebuildNetwork();
}
private void rebuildNetwork() {
for (Node splitNode : nodes) { for (Node splitNode : nodes) {
var found = MatchMaker.matchMaker.Search(splitNode, MatchMaker.networkDiscovery); var found = MatchMaker.matchMaker.Search(splitNode, MatchMaker.networkDiscovery);
System.out.println("Removing node lol"); System.out.println("Removing node lol");
@ -68,4 +78,26 @@ abstract public class Network extends BasePresence implements ServerTickEvents.E
* @param serverWorld The world that the tick was run in * @param serverWorld The world that the tick was run in
*/ */
abstract public void tick(ServerWorld serverWorld); abstract public void tick(ServerWorld serverWorld);
@Override
public void onChunkUnload(ServerWorld serverWorld, WorldChunk worldChunk) {
var chunk = worldChunk.getPos();
var needsRebuildFactory = false;
for (var loadedChunk : presence.baseChunkPresence) {
if (new Vec2i(chunk.x, chunk.z).equals(loadedChunk)) {
unloadedChunks.add(chunk);
needsRebuildFactory = true;
}
}
if (needsRebuildFactory) {
rebuildNetwork();
}
}
@Override
public void onChunkLoad(ServerWorld serverWorld, WorldChunk worldChunk) {
if (unloadedChunks.contains(worldChunk.getPos())) {
rebuildNetwork();
}
}
} }

View File

@ -31,7 +31,7 @@ public class NetworkedBlock extends Block {
} }
public void onStateReplaced(BlockPos pos) { public void onStateReplaced(BlockPos pos) {
network.get(pos).Remove(node.get(pos), factory); network.get(pos).Remove(node.get(pos));
} }
@Override @Override
@ -42,6 +42,7 @@ public class NetworkedBlock extends Block {
} }
} }
public void onPlaced(BlockPos pos) { public void onPlaced(BlockPos pos) {
var presence = new Node(new Vec3i(pos.getX(), pos.getY(), pos.getZ())); var presence = new Node(new Vec3i(pos.getX(), pos.getY(), pos.getZ()));
node.put(pos, presence); node.put(pos, presence);

View File

@ -18,7 +18,7 @@ public class CodeOnlyNetworkedBlock {
public void onStateReplaced(BlockPos pos) { public void onStateReplaced(BlockPos pos) {
System.out.println("Removing self"); System.out.println("Removing self");
network.get(pos).Remove(node.get(pos), factory); network.get(pos).Remove(node.get(pos));
} }
public void onPlaced(BlockPos pos) { public void onPlaced(BlockPos pos) {

View File

@ -2,6 +2,10 @@ import arzumify.networked.api.Network;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
public class ExampleNetwork extends Network { public class ExampleNetwork extends Network {
public ExampleNetwork() {
super(ExampleNetwork::new);
}
@Override @Override
public void tick(ServerWorld serverWorld) { public void tick(ServerWorld serverWorld) {
System.out.println("Tick"); System.out.println("Tick");

View File

@ -33,6 +33,4 @@ public class NetworkTests {
var found = MatchMaker.matchMaker.Search(new BasePresence((short) 1, new Vec3i(0, 0, 0)), MatchMaker.networkDiscovery); var found = MatchMaker.matchMaker.Search(new BasePresence((short) 1, new Vec3i(0, 0, 0)), MatchMaker.networkDiscovery);
assertEquals(3, found.size()); assertEquals(3, found.size());
} }
} }