From 5ee73b67bbc2a791dd0f4d4344cd09d7e6c4edbf Mon Sep 17 00:00:00 2001 From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com> Date: Mon, 22 Jul 2024 06:39:33 +0800 Subject: [PATCH] Add option to use LegacyRandomSource for slime chunk --- .../server/0043-Faster-Natural-Spawning.patch | 8 +-- .../server/0075-Faster-Random-Generator.patch | 68 ++++++++++++++++--- 2 files changed, 61 insertions(+), 15 deletions(-) diff --git a/patches/server/0043-Faster-Natural-Spawning.patch b/patches/server/0043-Faster-Natural-Spawning.patch index 4d9dca69..b69249fe 100644 --- a/patches/server/0043-Faster-Natural-Spawning.patch +++ b/patches/server/0043-Faster-Natural-Spawning.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Faster Natural Spawning diff --git a/src/main/java/net/minecraft/util/RandomSource.java b/src/main/java/net/minecraft/util/RandomSource.java -index 9c6f5b55b1f1376fa75e216cd366ee47c79fafc4..7762c8186035fdf60e11d9f1844516b61f442206 100644 +index 9c6f5b55b1f1376fa75e216cd366ee47c79fafc4..67d94b649148b3165f09d75d8c9db10db4cc7874 100644 --- a/src/main/java/net/minecraft/util/RandomSource.java +++ b/src/main/java/net/minecraft/util/RandomSource.java @@ -15,6 +15,12 @@ public interface RandomSource { @@ -16,7 +16,7 @@ index 9c6f5b55b1f1376fa75e216cd366ee47c79fafc4..7762c8186035fdf60e11d9f1844516b6 + static RandomSource createFaster() { + return create(RandomSupport.generateFasterSeed()); + } -+ // Leaf end ++ // Leaf end - Generate random seed faster + @Deprecated static RandomSource createThreadSafe() { @@ -54,7 +54,7 @@ index e33b39d369386d677cc15247846790b498e37a82..cf715114f0ebba449d7bd663445baec6 return new BlockPos(i, l, j); } diff --git a/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java b/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java -index 4327bee689e986561d126d6018d3fee7d2623176..267a28724ea0aea926c51c37e1172a2c34b47375 100644 +index 4327bee689e986561d126d6018d3fee7d2623176..82ee2aaabf6563cf3d6ae1e5b63242240a8e5521 100644 --- a/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java +++ b/src/main/java/net/minecraft/world/level/levelgen/RandomSupport.java @@ -41,6 +41,12 @@ public final class RandomSupport { @@ -65,7 +65,7 @@ index 4327bee689e986561d126d6018d3fee7d2623176..267a28724ea0aea926c51c37e1172a2c + public static long generateFasterSeed() { + return SEED_UNIQUIFIER.updateAndGet((seedUniquifier) -> seedUniquifier * 1181783497276652981L)^ java.util.concurrent.ThreadLocalRandom.current().nextLong(); + } -+ // Leaf end ++ // Leaf end - Generate random seed faster + public static record Seed128bit(long seedLo, long seedHi) { public RandomSupport.Seed128bit xor(long seedLo, long seedHi) { diff --git a/patches/server/0075-Faster-Random-Generator.patch b/patches/server/0075-Faster-Random-Generator.patch index f3b27ddf..2f9bf472 100644 --- a/patches/server/0075-Faster-Random-Generator.patch +++ b/patches/server/0075-Faster-Random-Generator.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Faster Random Generator diff --git a/src/main/java/net/minecraft/util/RandomSource.java b/src/main/java/net/minecraft/util/RandomSource.java -index 7762c8186035fdf60e11d9f1844516b61f442206..c2f0b5933c61168cbde507f04674e95b78e2d7f3 100644 +index 67d94b649148b3165f09d75d8c9db10db4cc7874..e0fffcaff4ccb8b20a85a68fa73d3076246aad0c 100644 --- a/src/main/java/net/minecraft/util/RandomSource.java +++ b/src/main/java/net/minecraft/util/RandomSource.java @@ -6,6 +6,7 @@ import net.minecraft.world.level.levelgen.PositionalRandomFactory; @@ -16,55 +16,101 @@ index 7762c8186035fdf60e11d9f1844516b61f442206..c2f0b5933c61168cbde507f04674e95b public interface RandomSource { @Deprecated -@@ -23,16 +24,16 @@ public interface RandomSource { +@@ -23,16 +24,28 @@ public interface RandomSource { @Deprecated static RandomSource createThreadSafe() { - return new ThreadSafeLegacyRandomSource(RandomSupport.generateUniqueSeed()); - } -+ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ? new TheFasterRandom(RandomSupport.generateFasterSeed()) : new ThreadSafeLegacyRandomSource(RandomSupport.generateUniqueSeed()); ++ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ++ ? new TheFasterRandom(RandomSupport.generateFasterSeed()) ++ : new ThreadSafeLegacyRandomSource(RandomSupport.generateUniqueSeed()); + } // Leaf - Faster RNG static RandomSource create(long seed) { - return new LegacyRandomSource(seed); -- } -+ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ? new TheFasterRandom(seed) : new LegacyRandomSource(seed); -+ } // Leaf - Faster RNG ++ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ++ ? new TheFasterRandom(seed) ++ : new LegacyRandomSource(seed); + } ++ static RandomSource createForSlimeChunk(long seed) { ++ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled && !org.dreeam.leaf.config.modules.opt.FastRNG.useLegacyForSlimeChunk ++ ? new TheFasterRandom(seed) ++ : new LegacyRandomSource(seed); ++ } // Leaf - Faster RNG ++ static RandomSource createNewThreadLocalInstance() { - return new SingleThreadedRandomSource(ThreadLocalRandom.current().nextLong()); - } -+ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ? new TheFasterRandom(RandomSupport.generateFasterSeed()) : new SingleThreadedRandomSource(ThreadLocalRandom.current().nextLong()); ++ return org.dreeam.leaf.config.modules.opt.FastRNG.enabled ++ ? new TheFasterRandom(RandomSupport.generateFasterSeed()) ++ : new SingleThreadedRandomSource(ThreadLocalRandom.current().nextLong()); + } // Leaf - Faster RNG RandomSource fork(); +diff --git a/src/main/java/net/minecraft/world/level/levelgen/WorldgenRandom.java b/src/main/java/net/minecraft/world/level/levelgen/WorldgenRandom.java +index c6efe6faf68c7a7b1df344e2e527aa7e44bfacb8..fe89e7b7c4267ee2969d1505f83cba1ac17cb13e 100644 +--- a/src/main/java/net/minecraft/world/level/levelgen/WorldgenRandom.java ++++ b/src/main/java/net/minecraft/world/level/levelgen/WorldgenRandom.java +@@ -69,9 +69,9 @@ public class WorldgenRandom extends LegacyRandomSource { + } + + public static RandomSource seedSlimeChunk(int chunkX, int chunkZ, long worldSeed, long scrambler) { +- return RandomSource.create( ++ return RandomSource.createForSlimeChunk( + worldSeed + (long)(chunkX * chunkX * 4987142) + (long)(chunkX * 5947611) + (long)(chunkZ * chunkZ) * 4392871L + (long)(chunkZ * 389711) ^ scrambler +- ); ++ ); // Leaf - Faster RNG + } + + public static enum Algorithm { diff --git a/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java b/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java new file mode 100644 -index 0000000000000000000000000000000000000000..996418c50cf005dbb850a9627c9c73f84f33f32a +index 0000000000000000000000000000000000000000..dff4d1955d37529403ba08e41c12774e30741b28 --- /dev/null +++ b/src/main/java/org/dreeam/leaf/config/modules/opt/FastRNG.java -@@ -0,0 +1,22 @@ +@@ -0,0 +1,41 @@ +package org.dreeam.leaf.config.modules.opt; + +import org.dreeam.leaf.config.ConfigModules; +import org.dreeam.leaf.config.EnumConfigCategory; ++import org.dreeam.leaf.config.LeafConfig; + +public class FastRNG extends ConfigModules { + + public String getBasePath() { -+ return EnumConfigCategory.PERF.getBaseKeyName(); ++ return EnumConfigCategory.PERF.getBaseKeyName() + ".faster-random-generator"; + } + + public static boolean enabled = false; ++ public static boolean warnForSlimeChunk = true; ++ public static boolean useLegacyForSlimeChunk = false; + + @Override + public void onLoaded() { -+ enabled = config.getBoolean(getBasePath() + ".use-faster-random-generator", enabled, """ ++ config.addComment(getBasePath(), """ + Use faster random generator? (Up to 100X faster) + Requires a JVM that supports RandomGenerator and the LXM generators. + Some JREs don't support this and will cause a crash. + """); ++ ++ enabled = config.getBoolean(getBasePath() + ".enabled", enabled); ++ warnForSlimeChunk = config.getBoolean(getBasePath() + ".warn-for-slime-chunk", warnForSlimeChunk, ++ "Warn if you are not using legacy random source for slime chunk generation."); ++ useLegacyForSlimeChunk = config.getBoolean(getBasePath() + ".use-legacy-random-for-slime-chunk", useLegacyForSlimeChunk, """ ++ Use legacy random source for slime chunk generation, ++ to follow vanilla behavior."""); ++ ++ if (enabled && warnForSlimeChunk) { ++ LeafConfig.LOGGER.warn("You enabled faster random generator, it will offset location of slime chunk"); ++ LeafConfig.LOGGER.warn("If your server has slime farms or facilities need vanilla slime chunk,"); ++ LeafConfig.LOGGER.warn("set performance.faster-random-generator.use-legacy-random-for-slime-chunk " + ++ "to true to use LegacyRandomSource for slime chunk generation."); ++ LeafConfig.LOGGER.warn("Set performance.faster-random-generator.warn-for-slime-chunk to false to " + ++ "disable this warning."); ++ } + } +} diff --git a/src/main/java/org/dreeam/leaf/util/math/random/TheFasterRandom.java b/src/main/java/org/dreeam/leaf/util/math/random/TheFasterRandom.java