From 3ef72a993a079f0107c98d99142469b1490440e8 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Thu, 7 Sep 2023 11:50:30 +0800 Subject: [PATCH] Implement configurable transfer of data during regen --- .../MultiverseCore/worldnew/WorldManager.java | 35 ++++++++++++------- .../worldnew/helpers/DataStore.java | 24 ++----------- .../worldnew/helpers/DataTransfer.java | 22 ++++++++++++ 3 files changed, 47 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataTransfer.java diff --git a/src/main/java/com/onarandombox/MultiverseCore/worldnew/WorldManager.java b/src/main/java/com/onarandombox/MultiverseCore/worldnew/WorldManager.java index 7fc9e2ed..3ef1cc30 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/worldnew/WorldManager.java +++ b/src/main/java/com/onarandombox/MultiverseCore/worldnew/WorldManager.java @@ -10,7 +10,9 @@ import com.onarandombox.MultiverseCore.utils.result.Result; import com.onarandombox.MultiverseCore.worldnew.config.WorldConfig; import com.onarandombox.MultiverseCore.worldnew.config.WorldsConfigManager; import com.onarandombox.MultiverseCore.worldnew.generators.GeneratorProvider; +import com.onarandombox.MultiverseCore.worldnew.helpers.DataStore; import com.onarandombox.MultiverseCore.worldnew.helpers.DataStore.GameRulesStore; +import com.onarandombox.MultiverseCore.worldnew.helpers.DataTransfer; import com.onarandombox.MultiverseCore.worldnew.helpers.FilesManipulator; import com.onarandombox.MultiverseCore.worldnew.options.CreateWorldOptions; import com.onarandombox.MultiverseCore.worldnew.options.ImportWorldOptions; @@ -490,8 +492,8 @@ public class WorldManager { } // TODO: Configure option on whether to copy these - GameRulesStore gameRulesStore = GameRulesStore.createAndCopyFrom(world); - WorldConfigStore worldConfigStore = WorldConfigStore.createAndCopyFrom(world); +// GameRulesStore gameRulesStore = GameRulesStore.createAndCopyFrom(world); +// WorldConfigStore worldConfigStore = WorldConfigStore.createAndCopyFrom(world); File worldFolder = world.getBukkitWorld().map(World::getWorldFolder).getOrNull(); // TODO: Check null? File newWorldFolder = new File(Bukkit.getWorldContainer(), newWorldName); @@ -505,8 +507,8 @@ public class WorldManager { // TODO: Error handling getMVWorld(newWorldName).peek(newWorld -> { - gameRulesStore.pasteTo(newWorld); - worldConfigStore.pasteTo(newWorld); +// gameRulesStore.pasteTo(newWorld); +// worldConfigStore.pasteTo(newWorld); saveWorldsConfig(); }); } @@ -520,15 +522,23 @@ public class WorldManager { // TODO: Teleport players out of world, and back in after regen MVWorld world = options.world(); - GameRulesStore gameRulesStore = GameRulesStore.createAndCopyFrom(world); - WorldConfigStore worldConfigStore = WorldConfigStore.createAndCopyFrom(world); + DataTransfer dataTransfer = new DataTransfer<>(); + if (options.keepWorldConfig()) { + dataTransfer.addDataStore(new WorldConfigStore(), world); + } + if (options.keepGameRule()) { + dataTransfer.addDataStore(new GameRulesStore(), world); + } + if (options.keepWorldBorder()) { + dataTransfer.addDataStore(new WorldBorderStore(), world); + } CreateWorldOptions createWorldOptions = CreateWorldOptions.worldName(world.getName()) - .environment(world.getEnvironment()) - .generateStructures(world.canGenerateStructures().getOrElse(true)) - .generator(world.getGenerator()) - .seed(options.seed()) - .worldType(world.getWorldType().getOrElse(WorldType.NORMAL)); + .environment(world.getEnvironment()) + .generateStructures(world.canGenerateStructures().getOrElse(true)) + .generator(world.getGenerator()) + .seed(options.seed()) + .worldType(world.getWorldType().getOrElse(WorldType.NORMAL)); var deleteResult = deleteWorld(world); if (deleteResult.isFailure()) { @@ -541,8 +551,7 @@ public class WorldManager { } getMVWorld(createWorldOptions.worldName()).peek(newWorld -> { - gameRulesStore.pasteTo(newWorld); - worldConfigStore.pasteTo(newWorld); + dataTransfer.pasteAllTo(newWorld); saveWorldsConfig(); }); return Result.success(RegenWorldResult.Success.REGENERATED, replace("{world}").with(world.getName())); diff --git a/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataStore.java b/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataStore.java index d8b86441..1a152822 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataStore.java +++ b/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataStore.java @@ -35,10 +35,6 @@ public interface DataStore { DataStore pasteTo(T object); class GameRulesStore implements DataStore { - public static GameRulesStore createAndCopyFrom(MVWorld world) { - return new GameRulesStore().copyFrom(world); - } - private Map, Object> gameRuleMap; /** @@ -84,18 +80,14 @@ public interface DataStore { } } - class WorldConfigStore implements DataStore { - public static WorldConfigStore createAndCopyFrom(OfflineWorld world) { - return new WorldConfigStore().copyFrom(world); - } - + class WorldConfigStore implements DataStore { private Map configMap; /** * {@inheritDoc} */ @Override - public WorldConfigStore copyFrom(OfflineWorld world) { + public WorldConfigStore copyFrom(MVWorld world) { this.configMap = new HashMap<>(); world.getConfigurablePropertyNames().forEach(name -> { world.getProperty(name).peek(value -> configMap.put(name, value)).onFailure(e -> { @@ -109,7 +101,7 @@ public interface DataStore { * {@inheritDoc} */ @Override - public WorldConfigStore pasteTo(OfflineWorld world) { + public WorldConfigStore pasteTo(MVWorld world) { if (configMap == null) { return this; } @@ -124,16 +116,6 @@ public interface DataStore { } class WorldBorderStore implements DataStore { - /** - * Creates a new {@link WorldBorderStore} instance and copies the world border data from the given world. - * - * @param world The world to copy the world border data from. - * @return A new {@link WorldBorderStore} instance. - */ - public static WorldBorderStore createAndCopyFrom(MVWorld world) { - return new WorldBorderStore().copyFrom(world); - } - private double borderCenterX; private double borderCenterZ; private double borderDamageAmount; diff --git a/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataTransfer.java b/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataTransfer.java new file mode 100644 index 00000000..641f0bfd --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseCore/worldnew/helpers/DataTransfer.java @@ -0,0 +1,22 @@ +package com.onarandombox.MultiverseCore.worldnew.helpers; + +import java.util.ArrayList; +import java.util.List; + +public class DataTransfer { + private final List> dataStores; + + public DataTransfer() { + this.dataStores = new ArrayList<>(); + } + + public DataTransfer addDataStore(DataStore dataStore, T object) { + this.dataStores.add(dataStore.copyFrom(object)); + return this; + } + + public DataTransfer pasteAllTo(T object) { + this.dataStores.forEach(dataStore -> dataStore.pasteTo(object)); + return this; + } +}