diff --git a/src/main/java/emu/grasscutter/game/GenshinScene.java b/src/main/java/emu/grasscutter/game/GenshinScene.java index fc25546b9..668902d87 100644 --- a/src/main/java/emu/grasscutter/game/GenshinScene.java +++ b/src/main/java/emu/grasscutter/game/GenshinScene.java @@ -117,6 +117,7 @@ public class GenshinScene { } public void removePlayer(GenshinPlayer player) { + // Remove player from scene getPlayers().remove(player); player.setScene(null); @@ -127,6 +128,11 @@ public class GenshinScene { for (EntityGadget gadget : player.getTeamManager().getGadgets()) { this.removeEntity(gadget); } + + // Deregister scene if not in use + if (this.getEntities().size() <= 0) { + this.getWorld().deregisterScene(this); + } } private void setupPlayerAvatars(GenshinPlayer player) { diff --git a/src/main/java/emu/grasscutter/game/World.java b/src/main/java/emu/grasscutter/game/World.java index b3fb3e150..802ab6ba0 100644 --- a/src/main/java/emu/grasscutter/game/World.java +++ b/src/main/java/emu/grasscutter/game/World.java @@ -111,7 +111,7 @@ public class World implements Iterable { SceneData sceneData = GenshinData.getSceneDataMap().get(sceneId); if (sceneData != null) { scene = new GenshinScene(this, sceneData); - this.getScenes().put(sceneId, scene); + this.registerScene(scene); return scene; } @@ -198,6 +198,14 @@ public class World implements Iterable { } } + public void registerScene(GenshinScene scene) { + this.getScenes().put(scene.getId(), scene); + } + + public void deregisterScene(GenshinScene scene) { + this.getScenes().remove(scene.getId()); + } + public boolean transferPlayerToScene(GenshinPlayer player, int sceneId, Position pos) { if (player.getScene().getId() == sceneId || GenshinData.getSceneDataMap().get(sceneId) == null) { return false;