feat: implemented auto unloading chunks

This commit is contained in:
Andrey Terentev 2024-11-27 02:43:59 +07:00
parent e4fd8542da
commit ae93f00397

View File

@ -3,6 +3,8 @@ package ru.dragonestia.msb3.api.world;
import lombok.Getter;
import lombok.extern.log4j.Log4j2;
import net.minestom.server.MinecraftServer;
import net.minestom.server.event.EventListener;
import net.minestom.server.event.player.PlayerChunkUnloadEvent;
import net.minestom.server.instance.EntityTracker;
import net.minestom.server.instance.InstanceContainer;
@ -12,6 +14,8 @@ public class World {
private final InstanceContainer instance;
private EventListener<PlayerChunkUnloadEvent> chunkUnloadListener;
World(InstanceContainer instance) {
this.instance = instance;
}
@ -28,4 +32,28 @@ public class World {
MinecraftServer.getInstanceManager().unregisterInstance(instance);
}
public synchronized void setChunkUnloading(boolean unload) {
if (chunkUnloadListener == null) {
if (!unload) return;
chunkUnloadListener = EventListener.of(PlayerChunkUnloadEvent.class, event -> {
var chunk = instance.getChunk(event.getChunkX(), event.getChunkZ());
if (chunk == null) return;
if (chunk.getViewers().isEmpty()) {
try {
instance.unloadChunk(event.getChunkX(), event.getChunkZ());
} catch (NullPointerException ignored) {}
}
});
instance.eventNode().addListener(chunkUnloadListener);
return;
}
if (unload) return;
instance.eventNode().removeListener(chunkUnloadListener);
chunkUnloadListener = null;
}
}