From db8ecff8056fedf5703ba08aa35f2328822cf964 Mon Sep 17 00:00:00 2001 From: Aikar Date: Mon, 17 Sep 2018 23:38:17 -0400 Subject: [PATCH] Support Overriding World Seeds - Closes #350 Allows you to add to paper.yml seed-overrides: world_name: some seed value This will ignore every where a seed is set/created/loaded and force a world to use the specified seed. This seed will end up being saved to the world data file, so it is a permanent change in that it won't go back if you remove it from paper.yml --- .../0374-Support-Overriding-World-Seeds.patch | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 Spigot-Server-Patches/0374-Support-Overriding-World-Seeds.patch diff --git a/Spigot-Server-Patches/0374-Support-Overriding-World-Seeds.patch b/Spigot-Server-Patches/0374-Support-Overriding-World-Seeds.patch new file mode 100644 index 0000000000..e3cf178601 --- /dev/null +++ b/Spigot-Server-Patches/0374-Support-Overriding-World-Seeds.patch @@ -0,0 +1,102 @@ +From 9dd9a3abeb5338d4fa5733683634c6c22ee59f24 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Mon, 17 Sep 2018 23:05:31 -0400 +Subject: [PATCH] Support Overriding World Seeds + +Allows you to add to paper.yml + +seed-overrides: + world_name: some seed value + +This will ignore every where a seed is set/created/loaded and force +a world to use the specified seed. + +This seed will end up being saved to the world data file, so it is +a permanent change in that it won't go back if you remove it from paper.yml + +diff --git a/src/main/java/com/destroystokyo/paper/PaperConfig.java b/src/main/java/com/destroystokyo/paper/PaperConfig.java +index 54f088c242..4093fbeb63 100644 +--- a/src/main/java/com/destroystokyo/paper/PaperConfig.java ++++ b/src/main/java/com/destroystokyo/paper/PaperConfig.java +@@ -11,6 +11,7 @@ import java.lang.reflect.Modifier; + import java.util.HashMap; + import java.util.List; + import java.util.Map; ++import java.util.Set; + import java.util.concurrent.TimeUnit; + import java.util.logging.Level; + import java.util.logging.Logger; +@@ -20,6 +21,7 @@ import com.google.common.collect.Lists; + import net.minecraft.server.MinecraftServer; + import org.bukkit.Bukkit; + import org.bukkit.command.Command; ++import org.bukkit.configuration.ConfigurationSection; + import org.bukkit.configuration.InvalidConfigurationException; + import org.bukkit.configuration.file.YamlConfiguration; + import co.aikar.timings.Timings; +@@ -351,4 +353,23 @@ public class PaperConfig { + } + tabSpamLimit = getInt("settings.spam-limiter.tab-spam-limit", tabSpamLimit); + } ++ ++ public static Map seedOverride = new java.util.HashMap<>(); ++ private static void worldSeedOverrides() { ++ ConfigurationSection seeds = config.getConfigurationSection("seed-overrides"); ++ if (seeds != null) { ++ TimingsManager.hiddenConfigs.add("seed-overrides"); ++ for (String key : seeds.getKeys(false)) { ++ String seedString = seeds.getString(key); ++ long seed; ++ try { ++ seed = Long.parseLong(seedString); ++ } catch (Exception e) { ++ seed = (long) seedString.hashCode(); ++ } ++ log("Seed Override: " + key + " => " + seed); ++ seedOverride.put(key, seed); ++ } ++ } ++ } + } +diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java +index 81cda5df56..fb62320310 100644 +--- a/src/main/java/net/minecraft/server/MinecraftServer.java ++++ b/src/main/java/net/minecraft/server/MinecraftServer.java +@@ -350,7 +350,7 @@ public abstract class MinecraftServer implements IAsyncTaskHandler, IMojangStati + this.convertWorld(name); // Run conversion now + + org.bukkit.generator.ChunkGenerator gen = this.server.getGenerator(name); +- WorldSettings worldsettings = new WorldSettings(i, this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); ++ WorldSettings worldsettings = new WorldSettings(com.destroystokyo.paper.PaperConfig.seedOverride.getOrDefault(name, i), this.getGamemode(), this.getGenerateStructures(), this.isHardcore(), worldtype); // Paper + worldsettings.setGeneratorSettings(jsonelement); + + if (j == 0) { +diff --git a/src/main/java/net/minecraft/server/WorldData.java b/src/main/java/net/minecraft/server/WorldData.java +index a98bc4d0e1..c108b97b9b 100644 +--- a/src/main/java/net/minecraft/server/WorldData.java ++++ b/src/main/java/net/minecraft/server/WorldData.java +@@ -110,7 +110,7 @@ public class WorldData { + this.d = nbttagcompound2.getBoolean("Snapshot"); + } + +- this.e = nbttagcompound.getLong("RandomSeed"); ++ this.e = com.destroystokyo.paper.PaperConfig.seedOverride.getOrDefault(nbttagcompound.getString("LevelName"), nbttagcompound.getLong("RandomSeed")); // Paper + if (nbttagcompound.hasKeyOfType("generatorName", 8)) { + String s = nbttagcompound.getString("generatorName"); + +diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +index bcf7a3b9d8..ba01e51b41 100644 +--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java ++++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java +@@ -979,7 +979,7 @@ public final class CraftServer implements Server { + WorldData worlddata = sdm.getWorldData(); + WorldSettings worldSettings = null; + if (worlddata == null) { +- worldSettings = new WorldSettings(creator.seed(), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type); ++ worldSettings = new WorldSettings(com.destroystokyo.paper.PaperConfig.seedOverride.getOrDefault(name, creator.seed()), EnumGamemode.getById(getDefaultGameMode().getValue()), generateStructures, hardcore, type); // Paper + JsonElement parsedSettings = new JsonParser().parse(creator.generatorSettings()); + if (parsedSettings.isJsonObject()) { + worldSettings.setGeneratorSettings(parsedSettings.getAsJsonObject()); +-- +2.19.0 +