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
public class MyNetwork extends Network {
public MyNetwork() {
super(MyNetwork::new);
}
@Override
public void tick(ServerWorld serverWorld) {
// Do stuff

View File

@ -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 {

View File

@ -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

View File

@ -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<Node> nodes = new HashSet<>();
private final NetworkFactory factory;
private static final HashSet<ChunkPos> 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();
}
}
}

View File

@ -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);

View File

@ -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) {

View File

@ -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");

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);
assertEquals(3, found.size());
}
}