Added chunk unloading
This commit is contained in:
parent
42c0aa1881
commit
48ffc45deb
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue