mirror of
https://github.com/Multiverse/Multiverse-Core.git
synced 2024-11-22 10:36:06 +01:00
Implement configurable transfer of data during regen
This commit is contained in:
parent
9cb8724db2
commit
3ef72a993a
@ -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<MVWorld> 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()));
|
||||
|
@ -35,10 +35,6 @@ public interface DataStore<T> {
|
||||
DataStore<T> pasteTo(T object);
|
||||
|
||||
class GameRulesStore implements DataStore<MVWorld> {
|
||||
public static GameRulesStore createAndCopyFrom(MVWorld world) {
|
||||
return new GameRulesStore().copyFrom(world);
|
||||
}
|
||||
|
||||
private Map<GameRule<?>, Object> gameRuleMap;
|
||||
|
||||
/**
|
||||
@ -84,18 +80,14 @@ public interface DataStore<T> {
|
||||
}
|
||||
}
|
||||
|
||||
class WorldConfigStore implements DataStore<OfflineWorld> {
|
||||
public static WorldConfigStore createAndCopyFrom(OfflineWorld world) {
|
||||
return new WorldConfigStore().copyFrom(world);
|
||||
}
|
||||
|
||||
class WorldConfigStore implements DataStore<MVWorld> {
|
||||
private Map<String, Object> 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<T> {
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public WorldConfigStore pasteTo(OfflineWorld world) {
|
||||
public WorldConfigStore pasteTo(MVWorld world) {
|
||||
if (configMap == null) {
|
||||
return this;
|
||||
}
|
||||
@ -124,16 +116,6 @@ public interface DataStore<T> {
|
||||
}
|
||||
|
||||
class WorldBorderStore implements DataStore<MVWorld> {
|
||||
/**
|
||||
* 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;
|
||||
|
@ -0,0 +1,22 @@
|
||||
package com.onarandombox.MultiverseCore.worldnew.helpers;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DataTransfer<T> {
|
||||
private final List<DataStore<T>> dataStores;
|
||||
|
||||
public DataTransfer() {
|
||||
this.dataStores = new ArrayList<>();
|
||||
}
|
||||
|
||||
public DataTransfer<T> addDataStore(DataStore<T> dataStore, T object) {
|
||||
this.dataStores.add(dataStore.copyFrom(object));
|
||||
return this;
|
||||
}
|
||||
|
||||
public DataTransfer<T> pasteAllTo(T object) {
|
||||
this.dataStores.forEach(dataStore -> dataStore.pasteTo(object));
|
||||
return this;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user