diff --git a/README.md b/README.md index b8dee0b..6ad77b2 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,10 @@ To create a network, simply create extend the Network type. ```java public class MyNetwork extends Network { + public MyNetwork() { + super(MyNetwork::new); + } + @Override public void tick(ServerWorld serverWorld) { // Do stuff diff --git a/build.gradle b/build.gradle index 299d826..79d9db9 100644 --- a/build.gradle +++ b/build.gradle @@ -56,6 +56,10 @@ processResources { filesMatching("fabric.mod.json") { expand "version": inputs.properties.version } + + filesMatching("quilt.mod.json") { + expand "version": inputs.properties.version, "group": inputs.properties.maven_group + } } tasks.withType(JavaCompile).configureEach { diff --git a/gradle.properties b/gradle.properties index 1bacbb5..2ec7278 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ minecraft_version=1.20 yarn_mappings=1.20+build.1 loader_version=0.16.10 # Mod Properties -mod_version=1.0.0 +mod_version=1.1.0 maven_group=arzumify.networked archives_base_name=networked # Dependencies diff --git a/src/main/java/arzumify/networked/api/Network.java b/src/main/java/arzumify/networked/api/Network.java index 50505b8..260248e 100644 --- a/src/main/java/arzumify/networked/api/Network.java +++ b/src/main/java/arzumify/networked/api/Network.java @@ -2,17 +2,23 @@ package arzumify.networked.api; import arzumify.networked.impl.BasePresence; 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.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.chunk.WorldChunk; 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 nodes = new HashSet<>(); + private final NetworkFactory factory; + private static final HashSet unloadedChunks = new HashSet<>(); - public Network(Vec3i... points) { - super((short) 1, points); + public Network(NetworkFactory parentFactory) { + super((short) 1); + this.factory = parentFactory; } public void Merge(Network other) { @@ -26,11 +32,15 @@ abstract public class Network extends BasePresence implements ServerTickEvents.E nodes.add(node); } - public void Remove(Node node, NetworkFactory factory) { + public void Remove(Node node) { System.out.println("Removing"); System.out.println(nodes); nodes.remove(node); MatchMaker.matchMaker.Remove(this, MatchMaker.networkDiscovery); + rebuildNetwork(); + } + + private void rebuildNetwork() { for (Node splitNode : nodes) { var found = MatchMaker.matchMaker.Search(splitNode, MatchMaker.networkDiscovery); 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 */ 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(); + } + } } diff --git a/src/main/java/arzumify/networked/api/NetworkedBlock.java b/src/main/java/arzumify/networked/api/NetworkedBlock.java index a9ecc10..fccb3c4 100644 --- a/src/main/java/arzumify/networked/api/NetworkedBlock.java +++ b/src/main/java/arzumify/networked/api/NetworkedBlock.java @@ -31,7 +31,7 @@ public class NetworkedBlock extends Block { } public void onStateReplaced(BlockPos pos) { - network.get(pos).Remove(node.get(pos), factory); + network.get(pos).Remove(node.get(pos)); } @Override @@ -42,6 +42,7 @@ public class NetworkedBlock extends Block { } } + public void onPlaced(BlockPos pos) { var presence = new Node(new Vec3i(pos.getX(), pos.getY(), pos.getZ())); node.put(pos, presence); diff --git a/src/test/java/CodeOnlyNetworkedBlock.java b/src/test/java/CodeOnlyNetworkedBlock.java index a755144..1c33d3e 100644 --- a/src/test/java/CodeOnlyNetworkedBlock.java +++ b/src/test/java/CodeOnlyNetworkedBlock.java @@ -18,7 +18,7 @@ public class CodeOnlyNetworkedBlock { public void onStateReplaced(BlockPos pos) { 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) { diff --git a/src/test/java/ExampleNetwork.java b/src/test/java/ExampleNetwork.java index 1812a54..11365ec 100644 --- a/src/test/java/ExampleNetwork.java +++ b/src/test/java/ExampleNetwork.java @@ -2,6 +2,10 @@ import arzumify.networked.api.Network; import net.minecraft.server.world.ServerWorld; public class ExampleNetwork extends Network { + public ExampleNetwork() { + super(ExampleNetwork::new); + } + @Override public void tick(ServerWorld serverWorld) { System.out.println("Tick"); diff --git a/src/test/java/NetworkTests.java b/src/test/java/NetworkTests.java index e0adbc7..3eab3de 100644 --- a/src/test/java/NetworkTests.java +++ b/src/test/java/NetworkTests.java @@ -33,6 +33,4 @@ public class NetworkTests { var found = MatchMaker.matchMaker.Search(new BasePresence((short) 1, new Vec3i(0, 0, 0)), MatchMaker.networkDiscovery); assertEquals(3, found.size()); } - - }