From 0ad795b27f8acdfae363ce223c9c59601a4fdb97 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Mon, 19 Oct 2026 10:57:18 +0800 Subject: [PATCH] Update legacy world name on world load This should elevate any issues of legacy world name being desynced with actual world name. --- .../core/world/LoadedMultiverseWorld.java | 1 + .../core/world/WorldConfigNodes.java | 2 ++ .../multiverse/core/world/WorldStore.java | 23 +++++++++++++ .../multiverse/core/world/WorldManagerTest.kt | 32 +++++++++++++++++++ 4 files changed, 58 insertions(+) diff --git a/src/main/java/org/mvplugins/multiverse/core/world/LoadedMultiverseWorld.java b/src/main/java/org/mvplugins/multiverse/core/world/LoadedMultiverseWorld.java index ea285cbae..ca45e2266 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/LoadedMultiverseWorld.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/LoadedMultiverseWorld.java @@ -55,6 +55,7 @@ private void setupWorldConfig(World world) { worldConfig.load(); worldConfig.setEnvironment(world.getEnvironment()); worldConfig.setSeed(world.getSeed()); + worldConfig.setLegacyWorldName(world.getName()); } private void setupSpawnLocation(World world) { diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java index b31040a31..98438e90f 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java @@ -306,6 +306,8 @@ public Object serialize(EntitySpawnConfig object, Class type) .hidden()); final ConfigNode legacyWorldName = node(ConfigNode.builder("read-only.legacy-world-name", String.class) + .onLoadAndChange((oldValue, newValue) -> worldManager.getWorldStore().changeLegacyWorldName( + oldValue, newValue, keyOrName.usableKey())) .hidden()); final ConfigNode seed = node(ConfigNode.builder("read-only.seed", Long.class) diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldStore.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldStore.java index ce8cb7e96..57ccf6ed2 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldStore.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldStore.java @@ -120,6 +120,29 @@ void removeLoadedWorld(LoadedMultiverseWorld world) { unloadedList.add(unloadedMap.get(world.getKey().toString())); } + void changeLegacyWorldName(@Nullable String oldName, @Nullable String newName, @NotNull NamespacedKey worldKey) { + if (Objects.equals(oldName, newName)) { + return; + } + String key = worldKey.toString(); + updateLegacyWorldName(loadedMap, oldName, newName, key); + updateLegacyWorldName(unloadedMap, oldName, newName, key); + } + + private void updateLegacyWorldName( + Map map, @Nullable String oldName, @Nullable String newName, String key) { + T world = map.get(key); + if (world == null) { + return; + } + if (oldName != null && !key.equalsIgnoreCase(oldName)) { + map.remove(oldName, world); + } + if (newName != null) { + map.put(newName, world); + } + } + void changeAlias(@Nullable String oldAlias, @Nullable String newAlias, @NotNull NamespacedKey worldKey) { if (Objects.equals(oldAlias, newAlias)) { // nothing changed, ignore diff --git a/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt b/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt index 32edb3935..212d3a381 100644 --- a/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt +++ b/src/test/java/org/mvplugins/multiverse/core/world/WorldManagerTest.kt @@ -49,6 +49,38 @@ class WorldManagerTest : TestWithMockBukkit() { assertNotNull(world2) } + @Test + fun `Legacy world name changes update loaded and unloaded lookups`() { + val worldKey = world.key.toString() + assertTrue(world.worldConfig.setLegacyWorldName("renamed_world").isSuccess) + + assertFalse(worldManager.getWorld("world").isDefined) + assertSame(world, worldManager.getLoadedWorld("RENAMED_WORLD").get()) + assertSame(world, worldManager.getLoadedWorld(worldKey).get()) + + assertTrue(worldManager.unloadWorld(UnloadWorldOptions.world(world)).isSuccess) + assertFalse(worldManager.getWorld("world").isDefined) + assertFalse(worldManager.getLoadedWorld("renamed_world").isDefined) + assertEquals(world.key, worldManager.getUnloadedWorld("RENAMED_WORLD").get().key) + assertEquals(world.key, worldManager.getUnloadedWorld(worldKey).get().key) + } + + @Test + fun `Setting up loaded world config refreshes legacy world name lookups`() { + assertTrue(world.worldConfig.setLegacyWorldName("stale_name").isSuccess) + assertTrue(world.worldConfig.save().isSuccess) + + world.setWorldConfig(world.worldConfig) + + assertEquals("world", world.name) + assertSame(world, worldManager.getLoadedWorld("world").get()) + assertFalse(worldManager.getWorld("stale_name").isDefined) + + assertTrue(worldManager.unloadWorld(UnloadWorldOptions.world(world)).isSuccess) + assertTrue(worldManager.getUnloadedWorld("world").isDefined) + assertFalse(worldManager.getWorld("stale_name").isDefined) + } + @Test fun `Create world with custom options`() { assertTrue(worldManager.createWorld(