diff --git a/src/main/java/net/minestom/server/instance/InstanceManager.java b/src/main/java/net/minestom/server/instance/InstanceManager.java index 37218be50..d74c5d31b 100644 --- a/src/main/java/net/minestom/server/instance/InstanceManager.java +++ b/src/main/java/net/minestom/server/instance/InstanceManager.java @@ -114,12 +114,12 @@ public final class InstanceManager { // Unload all chunks if (instance instanceof InstanceContainer) { instance.getChunks().forEach(instance::unloadChunk); + var dispatcher = MinecraftServer.process().dispatcher(); + instance.getChunks().forEach(dispatcher::deletePartition); } // Unregister instance.setRegistered(false); this.instances.remove(instance); - var dispatcher = MinecraftServer.process().dispatcher(); - instance.getChunks().forEach(dispatcher::deletePartition); } } diff --git a/src/test/java/net/minestom/server/api/FlexibleListener.java b/src/test/java/net/minestom/server/api/FlexibleListener.java index 0dd7c73fa..75e99b51e 100644 --- a/src/test/java/net/minestom/server/api/FlexibleListener.java +++ b/src/test/java/net/minestom/server/api/FlexibleListener.java @@ -11,6 +11,12 @@ public interface FlexibleListener { */ void followup(@NotNull Consumer handler); + default void followup() { + followup(event -> { + // Empty + }); + } + /** * Fails if an event is received. Valid until the next followup call. */ diff --git a/src/test/java/net/minestom/server/instance/InstanceUnregisterIntegrationTest.java b/src/test/java/net/minestom/server/instance/InstanceUnregisterIntegrationTest.java new file mode 100644 index 000000000..20f0e5411 --- /dev/null +++ b/src/test/java/net/minestom/server/instance/InstanceUnregisterIntegrationTest.java @@ -0,0 +1,33 @@ +package net.minestom.server.instance; + +import net.minestom.server.api.Env; +import net.minestom.server.api.EnvTest; +import net.minestom.server.coordinate.Pos; +import net.minestom.server.event.player.PlayerTickEvent; +import org.junit.jupiter.api.Test; + +@EnvTest +public class InstanceUnregisterIntegrationTest { + + @Test + public void sharedInstance(Env env) { + // Ensure that unregistering a shared instance does not unload the container chunks + var instanceManager = env.process().instance(); + var instance = instanceManager.createInstanceContainer(); + var shared1 = instanceManager.createSharedInstance(instance); + var connection = env.createConnection(); + var player = connection.connect(shared1, new Pos(0, 40, 0)).join(); + + var listener = env.listen(PlayerTickEvent.class); + listener.followup(); + env.tick(); + + player.setInstance(instanceManager.createSharedInstance(instance)).join(); + listener.followup(); + env.tick(); + + instanceManager.unregisterInstance(shared1); + listener.followup(); + env.tick(); + } +}