From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Spottedleaf <Spottedleaf@users.noreply.github.com>
Date: Sat, 18 Jul 2020 11:27:43 -0500
Subject: [PATCH] Populator seed controls


diff --git a/src/main/java/co/aikar/timings/TimingsExport.java b/src/main/java/co/aikar/timings/TimingsExport.java
index 5e672a0660d0aceffcdb26d185590ca18aa4f023..4b171a2a60e24947e884f8988920f335bd99a471 100644
--- a/src/main/java/co/aikar/timings/TimingsExport.java
+++ b/src/main/java/co/aikar/timings/TimingsExport.java
@@ -293,7 +293,7 @@ public class TimingsExport extends Thread {
         JSONObject object = new JSONObject();
         for (String key : config.getKeys(false)) {
             String fullKey = (parentKey != null ? parentKey + "." + key : key);
-            if (fullKey.equals("database") || fullKey.equals("settings.bungeecord-addresses") || TimingsManager.hiddenConfigs.contains(fullKey) || key.startsWith("seed-") || key.equals("worldeditregentempworld")) {
+            if (fullKey.equals("database") || fullKey.equals("settings.bungeecord-addresses") || TimingsManager.hiddenConfigs.contains(fullKey) || key.startsWith("seed-") || key.equals("worldeditregentempworld") || fullKey.contains("worldgen.seeds.populator")) { // Tuinity
                 continue;
             }
             final Object val = config.get(key);
diff --git a/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java
index e1dc7c1025e19f7393a45719af8fe7aae016184d..dd45a896998e4d5637ef0dd08f2b72d6b6f891de 100644
--- a/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java
+++ b/src/main/java/com/tuinity/tuinity/config/TuinityConfig.java
@@ -1,5 +1,6 @@
 package com.tuinity.tuinity.config;
 
+import co.aikar.timings.TimingsManager;
 import com.destroystokyo.paper.util.SneakyThrow;
 import net.minecraft.server.MinecraftServer;
 import net.minecraft.server.level.TicketType;
@@ -410,6 +411,19 @@ public final class TuinityConfig {
             this.spawnLimitAmbient = this.getInt(path + ".ambient", -1);
         }
 
+        public Long populatorSeed;
+        public boolean useRandomPopulatorSeed;
+
+        private void populatorSeed() {
+            final String seedString = this.getString("worldgen.seeds.populator", "default");
+            if (seedString.equalsIgnoreCase("random")) {
+                this.useRandomPopulatorSeed = true;
+            } else if (!seedString.equalsIgnoreCase("default")) {
+                this.populatorSeed = Long.parseLong(seedString);
+            }
+            if (!TimingsManager.hiddenConfigs.contains("worldgen.seeds.populator")) TimingsManager.hiddenConfigs.add("worldgen.seeds.populator");
+        }
+
     }
 
 }
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/world/level/biome/BiomeBase.java b/src/main/java/net/minecraft/world/level/biome/BiomeBase.java
index 9bbd175f7e20591bbefdbddcb5e998e7098c5adb..c4fb051739c1c186c1574185e0653f513755987d 100644
--- a/src/main/java/net/minecraft/world/level/biome/BiomeBase.java
+++ b/src/main/java/net/minecraft/world/level/biome/BiomeBase.java
@@ -23,7 +23,9 @@ import net.minecraft.core.SectionPosition;
 import net.minecraft.data.RegistryGeneration;
 import net.minecraft.resources.MinecraftKey;
 import net.minecraft.resources.RegistryFileCodec;
+import net.minecraft.server.level.ChunkProviderServer;
 import net.minecraft.server.level.RegionLimitedWorldAccess;
+import net.minecraft.server.level.WorldServer;
 import net.minecraft.util.INamable;
 import net.minecraft.world.level.ChunkCoordIntPair;
 import net.minecraft.world.level.EnumSkyBlock;
@@ -257,6 +259,10 @@ public final class BiomeBase {
         return this.k;
     }
 
+    // Tuinity start - populator seed control
+    private static final java.security.SecureRandom SECURE_RANDOM = new java.security.SecureRandom();
+    // Tuinity end - populator seed control
+
     public void a(StructureManager structuremanager, ChunkGenerator chunkgenerator, RegionLimitedWorldAccess regionlimitedworldaccess, long i, SeededRandom seededrandom, BlockPosition blockposition) {
         List<List<Supplier<WorldGenFeatureConfigured<?, ?>>>> list = this.k.c();
         int j = WorldGenStage.Decoration.values().length;
@@ -293,12 +299,24 @@ public final class BiomeBase {
                 }
             }
 
+            // Tuinity start - populator seed control
+            long populatorSeed;
+            WorldServer world = (WorldServer)((ChunkProviderServer)regionlimitedworldaccess.getChunkProvider()).getWorld();
+            if (world.tuinityConfig.useRandomPopulatorSeed) {
+                populatorSeed = SECURE_RANDOM.nextLong();
+            } else if (world.tuinityConfig.populatorSeed != null) {
+                populatorSeed = world.tuinityConfig.populatorSeed.longValue();
+            } else {
+                populatorSeed = i;
+            }
+            // Tuinity end - populator seed control
+
             if (list.size() > k) {
                 for (Iterator iterator1 = ((List) list.get(k)).iterator(); iterator1.hasNext(); ++l) {
                     Supplier<WorldGenFeatureConfigured<?, ?>> supplier = (Supplier) iterator1.next();
                     WorldGenFeatureConfigured<?, ?> worldgenfeatureconfigured = (WorldGenFeatureConfigured) supplier.get();
 
-                    seededrandom.b(i, l, k);
+                    seededrandom.b(populatorSeed, l, k); // Tuinity - populator seed control - move i up into default branch
 
                     try {
                         worldgenfeatureconfigured.a(regionlimitedworldaccess, chunkgenerator, seededrandom, blockposition);
