diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/CreateCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/CreateCommand.java index 3dbcd3be7..bd21ada4c 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/CreateCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/CreateCommand.java @@ -57,7 +57,7 @@ class CreateCommand extends CoreCommand { @CommandCompletion("@empty @environments @flags:groupName=" + Flags.NAME) @Syntax(" [--seed --generator --world-type " + "--adjust-spawn --no-structures --generate-bonus-chest --force-spawn-position " + - "--biome --properties ]") + "--biome --generator-settings --properties ]") @Description("{@@mv-core.create.description}") void onCreateCommand( MVCommandIssuer issuer, @@ -73,7 +73,7 @@ void onCreateCommand( @Optional @Syntax("[--seed --generator --world-type --adjust-spawn " + "--no-structures --generate-bonus-chest --force-spawn-position --biome " + - "--properties ]") + "--generator-settings --properties ]") @Description("{@@mv-core.create.flags.description}") String[] flagArray) { ParsedCommandFlags parsedFlags = flags.parse(flagArray); diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/ImportCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/ImportCommand.java index ffee9d2c6..1da3fcec4 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/ImportCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/ImportCommand.java @@ -67,7 +67,8 @@ void onImportCommand( worldManager.importWorld(ImportWorldOptions.worldName(worldName) .biome(parsedFlags.flagValue(flags.biome, "")) .environment(environment) - .generator(parsedFlags.flagValue(flags.generator, String.class)) + .generator(parsedFlags.flagValue(flags.generator)) + .generatorSettings(parsedFlags.flagValue(flags.generatorSettings, "")) .useSpawnAdjust(!parsedFlags.hasFlag(flags.noAdjustSpawn)) .doFolderCheck(!parsedFlags.hasFlag(flags.skipFolderCheck))) .onSuccess(newWorld -> { @@ -110,6 +111,11 @@ private Flags(@NotNull CommandFlagsManager flagsManager, @NotNull GeneratorProvi private final CommandFlag skipFolderCheck = flag(CommandFlag.builder("--skip-folder-check") .addAlias("-f") .build()); + + private final CommandValueFlag generatorSettings = flag(CommandValueFlag + .builder("--generator-settings", String.class) + .addAlias("-gs") + .build()); } @Service diff --git a/src/main/java/org/mvplugins/multiverse/core/commands/InfoCommand.java b/src/main/java/org/mvplugins/multiverse/core/commands/InfoCommand.java index e84c637fb..66c0b94ed 100644 --- a/src/main/java/org/mvplugins/multiverse/core/commands/InfoCommand.java +++ b/src/main/java/org/mvplugins/multiverse/core/commands/InfoCommand.java @@ -104,6 +104,7 @@ private Map getInfo(LoadedMultiverseWorld world) { outMap.put("World Type", world.getWorldType().map(WorldType::getName).getOrNull()); outMap.put("Biome", world.getBiome()); outMap.put("Generator", world.getGenerator()); + outMap.put("Generator Settings", world.getGeneratorSettings()); outMap.put("Generate Structures", world.canGenerateStructures().map(String::valueOf).getOrNull()); outMap.put("Auto Load", String.valueOf(world.isAutoLoad())); diff --git a/src/main/java/org/mvplugins/multiverse/core/world/MultiverseWorld.java b/src/main/java/org/mvplugins/multiverse/core/world/MultiverseWorld.java index fb8a88e47..c2ed1c84b 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/MultiverseWorld.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/MultiverseWorld.java @@ -421,6 +421,19 @@ public String getGenerator() { return worldConfig.getGenerator(); } + /** + * Gets the generator settings used to create this world. You cannot change this after world creation. + * Changing this manually in config on existing world will have no effect on the world generation. + * + * @return The generator settings string. + * + * @since 5.7 + */ + @ApiStatus.AvailableSince("5.7") + public String getGeneratorSettings() { + return worldConfig.getGeneratorSettings(); + } + /** * Gets whether or not this world will display in chat, mvw and mvl regardless if a user has the * access permissions to go to this world. diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldConfig.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldConfig.java index 369dea0bc..57bf7aba3 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldConfig.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldConfig.java @@ -375,6 +375,14 @@ Try setEnvironment(World.Environment environment) { return configHandle.set(configNodes.environment, environment); } + String getGeneratorSettings() { + return configHandle.get(configNodes.generatorSettings); + } + + Try setGeneratorSettings(String generatorSettings) { + return configHandle.set(configNodes.generatorSettings, generatorSettings); + } + String getLegacyWorldName() { return configHandle.get(configNodes.legacyWorldName); } 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 143bf1088..7831d5cfb 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldConfigNodes.java @@ -273,6 +273,10 @@ public Object serialize(EntitySpawnConfig object, Class type) .defaultValue(World.Environment.NORMAL) .hidden()); + final ConfigNode generatorSettings = node(ConfigNode.builder("read-only.generator-settings", String.class) + .defaultValue("") + .hidden()); + final ConfigNode legacyWorldName = node(ConfigNode.builder("read-only.legacy-world-name", String.class) .hidden()); diff --git a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java index 7d16b3903..afc7de054 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/WorldManager.java @@ -290,10 +290,11 @@ private Attempt doCreateWorld( .mapAttempt(this::createBukkitWorld) .transform(CreateFailureReason.WORLD_CREATOR_FAILED) .map(bukkitWorld -> newLoadedMultiverseWorld( - bukkitWorld, - generatorString, - options.biome(), - options.useSpawnAdjust())) + bukkitWorld, + generatorString, + options.biome(), + options.generatorSettings(), + options.useSpawnAdjust())) .peek(loadedWorld -> postCreateWorld(loadedWorld, options)); } @@ -354,7 +355,8 @@ private Attempt doImportWorld( ImportWorldOptions options = keyOrNameWithOptions.options(); String generatorString = generatorProvider.parseGeneratorString(keyOrName.usableName(), options.generator()); WorldCreator worldCreator = WorldCreatorCompatibility.ofKeyOrName(keyOrName) - .environment(options.environment()); + .environment(options.environment()) + .generatorSettings(options.generatorSettings()); return addBiomeProviderToCreator(worldCreator, keyOrName.usableName(), options.biome()) .mapAttempt(creator -> addGeneratorToCreator(creator, generatorString)) @@ -364,6 +366,7 @@ private Attempt doImportWorld( bukkitWorld, generatorString, options.biome(), + options.generatorSettings(), options.useSpawnAdjust())) .peek(loadedWorld -> pluginManager.callEvent(new MVWorldImportedEvent(loadedWorld))); } @@ -385,6 +388,7 @@ private Attempt doImportBukkitWorld( bukkitWorld, generatorProvider.parseGeneratorString(keyOrName.usableName(), options.generator()), options.biome(), + options.generatorSettings(), options.useSpawnAdjust()); pluginManager.callEvent(new MVWorldImportedEvent(loadedWorld)); return Attempt.success(loadedWorld); @@ -405,13 +409,18 @@ private MultiverseWorld newMultiverseWorld(WorldConfig worldConfig) { * @param adjustSpawn Whether to adjust spawn. */ private LoadedMultiverseWorld newLoadedMultiverseWorld( - @NotNull World world, @Nullable String generator, @Nullable String biome, boolean adjustSpawn) { + @NotNull World world, + @Nullable String generator, + @Nullable String biome, + @Nullable String generatorSettings, + boolean adjustSpawn) { WorldConfig worldConfig = worldsConfigManager.addWorldConfig(world.getKey()); // Properties from multiverse input worldConfig.setAdjustSpawn(adjustSpawn); worldConfig.setGenerator(generator == null ? "" : generator); worldConfig.setBiome(biome == null ? "" : biome); + worldConfig.setGeneratorSettings(generatorSettings == null ? "" : generatorSettings); // Properties from the bukkit world worldConfig.setLegacyWorldName(world.getName()); @@ -870,6 +879,7 @@ public Attempt regenWorld(@NotNull Re .environment(world.getEnvironment()) .generateStructures(world.canGenerateStructures().getOrElse(true)) .generator(world.getGenerator()) + .generatorSettings(world.getGeneratorSettings()) .seed(options.seed()) .useSpawnAdjust(!shouldKeepSpawnLocation && world.getAdjustSpawn()) .worldType(world.getWorldType().getOrElse(WorldType.NORMAL)) diff --git a/src/main/java/org/mvplugins/multiverse/core/world/options/ImportWorldOptions.java b/src/main/java/org/mvplugins/multiverse/core/world/options/ImportWorldOptions.java index b735755e2..c362b2a0b 100644 --- a/src/main/java/org/mvplugins/multiverse/core/world/options/ImportWorldOptions.java +++ b/src/main/java/org/mvplugins/multiverse/core/world/options/ImportWorldOptions.java @@ -56,6 +56,7 @@ public final class ImportWorldOptions { private String biome = ""; private World.Environment environment = World.Environment.NORMAL; private String generator = null; + private String generatorSettings = ""; private boolean useSpawnAdjust = true; private boolean doFolderCheck = true; @@ -153,6 +154,32 @@ public final class ImportWorldOptions { return generator; } + /** + * Sets the custom generator settings string used when creating the world. + * + * @param generatorSettingsInput The custom generator settings string, or null to use the default settings. + * @return This {@link ImportWorldOptions} instance. + * + * @since 5.7 + */ + @ApiStatus.AvailableSince("5.7") + public @NotNull ImportWorldOptions generatorSettings(@NotNull String generatorSettingsInput) { + this.generatorSettings = generatorSettingsInput; + return this; + } + + /** + * Gets the custom generator settings string used when creating the world. + * + * @return The custom generator settings string, or null if none was set. + * + * @since 5.7 + */ + @ApiStatus.AvailableSince("5.7") + public @NotNull String generatorSettings() { + return generatorSettings; + } + /** * Sets whether multiverse will search for a safe spawn location. * diff --git a/src/test/resources/worlds/default_worlds.yml b/src/test/resources/worlds/default_worlds.yml index 2142e3218..c73e7578f 100644 --- a/src/test/resources/worlds/default_worlds.yml +++ b/src/test/resources/worlds/default_worlds.yml @@ -75,6 +75,7 @@ world: world-blacklist: [] read-only: environment: normal + generator-settings: '' legacy-world-name: world seed: -9223372036854775808 version: 1.3 @@ -155,6 +156,7 @@ world_nether: world-blacklist: [] read-only: environment: nether + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3 diff --git a/src/test/resources/worlds/delete_worlds.yml b/src/test/resources/worlds/delete_worlds.yml index ed96af16f..ee8e24d5b 100644 --- a/src/test/resources/worlds/delete_worlds.yml +++ b/src/test/resources/worlds/delete_worlds.yml @@ -75,6 +75,7 @@ world_nether: world-blacklist: [] read-only: environment: nether + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3 diff --git a/src/test/resources/worlds/edgecase_worlds.yml b/src/test/resources/worlds/edgecase_worlds.yml index cb534727e..d96489c38 100644 --- a/src/test/resources/worlds/edgecase_worlds.yml +++ b/src/test/resources/worlds/edgecase_worlds.yml @@ -78,6 +78,7 @@ world: - 2 read-only: environment: normal + generator-settings: '' legacy-world-name: world seed: -9223372036854775808 version: 1.3 @@ -157,6 +158,7 @@ world_nether: world-blacklist: [] read-only: environment: nether + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3 diff --git a/src/test/resources/worlds/migrated_worlds.yml b/src/test/resources/worlds/migrated_worlds.yml index 011777af7..67988d5da 100644 --- a/src/test/resources/worlds/migrated_worlds.yml +++ b/src/test/resources/worlds/migrated_worlds.yml @@ -75,6 +75,7 @@ world_the_end: world-blacklist: [] read-only: environment: the_end + generator-settings: '' legacy-world-name: world_the_end seed: -5176596003035866649 version: 1.3 @@ -156,6 +157,7 @@ world[dot]a[dot]b: - test read-only: environment: normal + generator-settings: '' legacy-world-name: world.a.b seed: -5176596003035866649 version: 1.3 @@ -237,6 +239,7 @@ world[dot]a[dot]c: - test read-only: environment: normal + generator-settings: '' legacy-world-name: world.a.c seed: -5176596003035866649 version: 1.3 diff --git a/src/test/resources/worlds/newworld_worlds.yml b/src/test/resources/worlds/newworld_worlds.yml index 76a2fdc0a..9cff97e8d 100644 --- a/src/test/resources/worlds/newworld_worlds.yml +++ b/src/test/resources/worlds/newworld_worlds.yml @@ -75,6 +75,7 @@ world: world-blacklist: [] read-only: environment: normal + generator-settings: '' legacy-world-name: world seed: -9223372036854775808 version: 1.3 @@ -155,6 +156,7 @@ world_nether: world-blacklist: [] read-only: environment: nether + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3 @@ -230,6 +232,7 @@ minecraft:new[dot]world: world-blacklist: [] read-only: environment: normal + generator-settings: '' legacy-world-name: null seed: -9223372036854775808 version: 1.3 diff --git a/src/test/resources/worlds/properties_worlds.yml b/src/test/resources/worlds/properties_worlds.yml index 6aa089acc..c390531b2 100644 --- a/src/test/resources/worlds/properties_worlds.yml +++ b/src/test/resources/worlds/properties_worlds.yml @@ -75,6 +75,7 @@ world: world-blacklist: [] read-only: environment: NORMAL + generator-settings: '' legacy-world-name: world seed: -9223372036854775808 version: 1.3 @@ -150,6 +151,7 @@ world_nether: world-blacklist: [] read-only: environment: NETHER + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3 diff --git a/src/test/resources/worlds/updated_worlds.yml b/src/test/resources/worlds/updated_worlds.yml index 92aa795bf..5a893d469 100644 --- a/src/test/resources/worlds/updated_worlds.yml +++ b/src/test/resources/worlds/updated_worlds.yml @@ -77,6 +77,7 @@ world: world-blacklist: [] read-only: environment: normal + generator-settings: '' legacy-world-name: world seed: -9223372036854775808 version: 1.3 @@ -157,6 +158,7 @@ world_nether: world-blacklist: [] read-only: environment: nether + generator-settings: '' legacy-world-name: world_nether seed: -9223372036854775808 version: 1.3