From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Mon, 15 Aug 2022 08:23:51 +0800 Subject: [PATCH] Use thread unsafe random for mob spawning This patch is Powered by Pufferfish(https://github.com/pufferfish-gg/Pufferfish) diff --git a/src/main/java/net/minecraft/world/level/NaturalSpawner.java b/src/main/java/net/minecraft/world/level/NaturalSpawner.java index df83b6f0e217eec4c9e9707be0030c129fdeb545..e41e87258da5594c5ec164d76bb59bb327c1d94a 100644 --- a/src/main/java/net/minecraft/world/level/NaturalSpawner.java +++ b/src/main/java/net/minecraft/world/level/NaturalSpawner.java @@ -417,12 +417,21 @@ public final class NaturalSpawner { private static BlockPos getRandomPosWithin(Level world, LevelChunk chunk) { ChunkPos chunkcoordintpair = chunk.getPos(); - int i = chunkcoordintpair.getMinBlockX() + world.random.nextInt(16); - int j = chunkcoordintpair.getMinBlockZ() + world.random.nextInt(16); - int k = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i, j) + 1; - int l = Mth.randomBetweenInclusive(world.random, world.getMinBuildHeight(), k); - - return new BlockPos(i, l, j); + // Leaves start - use thread unsafe random + if (top.leavesmc.leaves.LeavesConfig.useMoreThreadUnsafeRandom) { + int i = chunkcoordintpair.getMinBlockX() + world.getThreadUnsafeRandom().nextInt(16); + int j = chunkcoordintpair.getMinBlockZ() + world.getThreadUnsafeRandom().nextInt(16); + int k = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i, j) + 1; + int l = Mth.randomBetweenInclusive(world.getThreadUnsafeRandom(), world.getMinBuildHeight(), k); + return new BlockPos(i, l, j); + } else { + int i = chunkcoordintpair.getMinBlockX() + world.random.nextInt(16); + int j = chunkcoordintpair.getMinBlockZ() + world.random.nextInt(16); + int k = chunk.getHeight(Heightmap.Types.WORLD_SURFACE, i, j) + 1; + int l = Mth.randomBetweenInclusive(world.random, world.getMinBuildHeight(), k); + return new BlockPos(i, l, j); + } + // Leaves end - use thread unsafe random } public static boolean isValidEmptySpawnBlock(BlockGetter blockView, BlockPos pos, BlockState state, FluidState fluidState, EntityType entityType) { diff --git a/src/main/java/top/leavesmc/leaves/LeavesConfig.java b/src/main/java/top/leavesmc/leaves/LeavesConfig.java index 3e06ad7a31d6f35a55f8c2e6b9d2a666618168ab..4f5717d181c591b03cf78694a95e64be982517d8 100644 --- a/src/main/java/top/leavesmc/leaves/LeavesConfig.java +++ b/src/main/java/top/leavesmc/leaves/LeavesConfig.java @@ -295,6 +295,11 @@ public final class LeavesConfig { entityTargetFindingOptimization = getBoolean("settings.performance.entity-target-find-optimization", entityTargetFindingOptimization); } + public static boolean useMoreThreadUnsafeRandom = true; + private static void useMoreThreadUnsafeRandom() { + useMoreThreadUnsafeRandom = getBoolean("settings.performance.use-more-thread-unsafe-random", useMoreThreadUnsafeRandom); + } + public static final class WorldConfig { public final String worldName;