From ae93f00397e1468e5ab4f9e563c6e1068007c99a Mon Sep 17 00:00:00 2001 From: ScarletRedMan Date: Wed, 27 Nov 2024 02:43:59 +0700 Subject: [PATCH] feat: implemented auto unloading chunks --- .../ru/dragonestia/msb3/api/world/World.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/api/src/main/java/ru/dragonestia/msb3/api/world/World.java b/api/src/main/java/ru/dragonestia/msb3/api/world/World.java index 88f9acb..e8bcae9 100644 --- a/api/src/main/java/ru/dragonestia/msb3/api/world/World.java +++ b/api/src/main/java/ru/dragonestia/msb3/api/world/World.java @@ -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 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; + } }