From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Helvetica Volubi Date: Sun, 28 Jun 2026 20:39:22 +0800 Subject: [PATCH] Leaf: Secure seed and matter seed command Co-authored by: Apehum As part of: Leaf (https://github.com/Winds-Studio/Leaf/blob/7f3e240bbe0970683c40279a7a65f0fde47503b6/leaf-server/paper-patches/features/0019-Matter-Secure-Seed.patch and https://github.com/Winds-Studio/Leaf/blob/7f3e240bbe0970683c40279a7a65f0fde47503b6/leaf-server/minecraft-patches/features/0050-Matter-Secure-Seed-command.patch) Licensed under: GPL-3.0 (https://github.com/Winds-Studio/Leaf/blob/7f3e240bbe0970683c40279a7a65f0fde47503b6/licenses/GPL-3.0.txt) diff --git a/net/minecraft/server/commands/SeedCommand.java b/net/minecraft/server/commands/SeedCommand.java index 86ee3b3ae028597576b9549bc4954dfcbaa6732c..56bab28e8fcae16a4e71527afb73e5794098723e 100644 --- a/net/minecraft/server/commands/SeedCommand.java +++ b/net/minecraft/server/commands/SeedCommand.java @@ -13,6 +13,15 @@ public class SeedCommand { long seed = c.getSource().getLevel().getSeed(); Component seedText = ComponentUtils.copyOnClickText(String.valueOf(seed)); c.getSource().sendSuccess(() -> Component.translatable("commands.seed.success", seedText), false); + // Leaf start - Matter - SecureSeed Command + if (io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + su.plo.matter.Globals.setupGlobals(c.getSource().getLevel()); + String seedStr = su.plo.matter.Globals.seedToString(su.plo.matter.Globals.worldSeed); + Component featureSeedComponent = ComponentUtils.copyOnClickText(seedStr); + + c.getSource().sendSuccess(() -> Component.translatable(("Feature seed: %s"), featureSeedComponent), false); + } + // Leaf end - Matter - SecureSeed Command return (int)seed; }) ); diff --git a/net/minecraft/server/dedicated/DedicatedServerProperties.java b/net/minecraft/server/dedicated/DedicatedServerProperties.java index 639a5400499266f83cf8b7c1251483cd8fb699a4..3231e20e6da2b3e47c54fbef0b07dff64c0ae546 100644 --- a/net/minecraft/server/dedicated/DedicatedServerProperties.java +++ b/net/minecraft/server/dedicated/DedicatedServerProperties.java @@ -139,7 +139,17 @@ public class DedicatedServerProperties extends Settings GsonHelper.parse(!s.isEmpty() ? s : "{}"), new JsonObject()), this.get("level-type", v -> v.toLowerCase(Locale.ROOT), WorldPresets.NORMAL.identifier().toString()) diff --git a/net/minecraft/server/level/ServerChunkCache.java b/net/minecraft/server/level/ServerChunkCache.java index 7927769cf9bccb892745f4d1390eb83b2861d1bb..414c21345879f589fb61130180d0ca606e37a454 100644 --- a/net/minecraft/server/level/ServerChunkCache.java +++ b/net/minecraft/server/level/ServerChunkCache.java @@ -671,6 +671,7 @@ public class ServerChunkCache extends ChunkSource implements ca.spottedleaf.moon } public ChunkGenerator getGenerator() { + su.plo.matter.Globals.setupGlobals(level); // Leaf - Matter - Secure Seed return this.chunkMap.generator(); } diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java index 52d74e9df3a01163014ae50ce4f49eba6639ec63..8c2d6a43b52ae6e70506bb779a9dfd33a7a1d440 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -634,6 +634,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet generator = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, generator, gen); } // CraftBukkit end + su.plo.matter.Globals.setupGlobals(this); // Leaf - Matter - Secure Seed boolean syncWrites = server.forceSynchronousWrites(); DataFixer fixerUpper = server.getFixerUpper(); // Paper - rewrite chunk system diff --git a/net/minecraft/world/entity/monster/cubemob/Slime.java b/net/minecraft/world/entity/monster/cubemob/Slime.java index 984ec15bdebcb541cd6ee9014a654ea58988f6f1..af4c1fdac340c49ddd7b97877b2196768dcfe402 100644 --- a/net/minecraft/world/entity/monster/cubemob/Slime.java +++ b/net/minecraft/world/entity/monster/cubemob/Slime.java @@ -94,7 +94,12 @@ public class Slime extends AbstractCubeMob implements Enemy { } ChunkPos chunkPos = ChunkPos.containing(pos); - boolean slimeChunk = level.getMinecraftWorld().paperConfig().entities.spawning.allChunksAreSlimeChunks || WorldgenRandom.seedSlimeChunk(chunkPos.x(), chunkPos.z(), worldGenLevel.getSeed(), level.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Paper + // Leaf start - Matter - Secure Seed + boolean isSlimeChunk = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled + ? level.getChunk(chunkPos.x(), chunkPos.z()).isSlimeChunk() + : WorldgenRandom.seedSlimeChunk(chunkPos.x(), chunkPos.z(), worldGenLevel.getSeed(), level.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Paper + boolean slimeChunk = level.getMinecraftWorld().paperConfig().entities.spawning.allChunksAreSlimeChunks || isSlimeChunk; + // Leaf end - Matter - Secure Seed // Paper start - Replace rules for Height in Slime Chunks final double maxHeightSlimeChunk = level.getMinecraftWorld().paperConfig().entities.spawning.slimeSpawnHeight.slimeChunk.maximum; if (random.nextInt(10) == 0 && slimeChunk && pos.getY() < maxHeightSlimeChunk) { diff --git a/net/minecraft/world/level/chunk/ChunkAccess.java b/net/minecraft/world/level/chunk/ChunkAccess.java index 28f703204afd834cd50335346ef065670d6b37ad..f6cecf0ec1ebf9dd7028877dcadf191d1a2d954c 100644 --- a/net/minecraft/world/level/chunk/ChunkAccess.java +++ b/net/minecraft/world/level/chunk/ChunkAccess.java @@ -83,6 +83,10 @@ public abstract class ChunkAccess implements LightChunk, StructureAccess, BiomeM private static final org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new org.bukkit.craftbukkit.persistence.CraftPersistentDataTypeRegistry(); public org.bukkit.craftbukkit.persistence.DirtyCraftPersistentDataContainer persistentDataContainer = new org.bukkit.craftbukkit.persistence.DirtyCraftPersistentDataContainer(ChunkAccess.DATA_TYPE_REGISTRY); // CraftBukkit end + // Leaf start - Matter - Secure Seed + private boolean slimeChunk; + private boolean hasComputedSlimeChunk; + // Leaf end - Matter - Secure Seed // Paper start - rewrite chunk system private volatile ca.spottedleaf.moonrise.patches.starlight.light.SWMRNibbleArray[] blockNibbles; @@ -186,6 +190,17 @@ public abstract class ChunkAccess implements LightChunk, StructureAccess, BiomeM return GameEventListenerRegistry.NOOP; } + // Leaf start - Matter - Secure Seed + public boolean isSlimeChunk() { + if (!hasComputedSlimeChunk) { + hasComputedSlimeChunk = true; + slimeChunk = su.plo.matter.WorldgenCryptoRandom.seedSlimeChunk(chunkPos.x(), chunkPos.z()).nextInt(10) == 0; + } + + return slimeChunk; + } + // Leaf end - Matter - Secure Seed + public abstract BlockState getBlockState(final int x, final int y, final int z); // Paper public @Nullable BlockState setBlockState(final BlockPos pos, final BlockState state) { diff --git a/net/minecraft/world/level/chunk/ChunkGenerator.java b/net/minecraft/world/level/chunk/ChunkGenerator.java index b7325170369299a74be35ecc66a6446c301605b8..57365340fb3c236b890fa98439e55942f7c38a25 100644 --- a/net/minecraft/world/level/chunk/ChunkGenerator.java +++ b/net/minecraft/world/level/chunk/ChunkGenerator.java @@ -347,7 +347,11 @@ public abstract class ChunkGenerator { Map> structuresByStep = structuresRegistry.stream() .collect(Collectors.groupingBy(structure -> structure.step().ordinal())); List featureList = this.featuresPerStep.get(); - WorldgenRandom random = new WorldgenRandom(new XoroshiroRandomSource(RandomSupport.generateUniqueSeed())); + // Leaf start - Matter - Secure Seed + WorldgenRandom random = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled + ? new su.plo.matter.WorldgenCryptoRandom(origin.getX(), origin.getZ(), su.plo.matter.Globals.Salt.UNDEFINED, 0) + : new WorldgenRandom(new XoroshiroRandomSource(RandomSupport.generateUniqueSeed())); + // Leaf end - Matter - Secure Seed long decorationSeed = random.setDecorationSeed(level.getSeed(), origin.getX(), origin.getZ()); Set> possibleBiomes = new ObjectArraySet<>(); ChunkPos.rangeClosed(sectionPos.chunk(), 1).forEach(chunkPos -> { @@ -571,8 +575,15 @@ public abstract class ChunkGenerator { } else { ArrayList options = new ArrayList<>(structures.size()); options.addAll(structures); - WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L)); - random.setLargeFeatureSeed(state.getLevelSeed(), sourceChunkPos.x(), sourceChunkPos.z()); + // Leaf start - Matter - Secure Seed + WorldgenRandom random; + if (io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + random = new su.plo.matter.WorldgenCryptoRandom(sourceChunkPos.x(), sourceChunkPos.z(), su.plo.matter.Globals.Salt.GENERATE_FEATURE, 0); + } else { + random = new WorldgenRandom(new LegacyRandomSource(0L)); + random.setLargeFeatureSeed(state.getLevelSeed(), sourceChunkPos.x(), sourceChunkPos.z()); + } + // Leaf end - Matter - Secure Seed int total = 0; for (StructureSet.StructureSelectionEntry option : options) { diff --git a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java index 8b4ea2b16da45bcefe743990866e43c94e121825..35c7fcc8fc1852f6f8e63dcebb5e05843e364b98 100644 --- a/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java +++ b/net/minecraft/world/level/chunk/ChunkGeneratorStructureState.java @@ -203,14 +203,20 @@ public class ChunkGeneratorStructureState { List> tasks = new ArrayList<>(count); int spread = placement.spread(); HolderSet preferredBiomes = placement.preferredBiomes(); - RandomSource random = RandomSource.create(); - // Paper start - Add missing structure set seed configs + // Leaf start - Matter - Secure Seed + RandomSource random = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled + ? new su.plo.matter.WorldgenCryptoRandom(0, 0, su.plo.matter.Globals.Salt.STRONGHOLDS, 0) + :RandomSource.create(); + // Leaf end - Matter - Secure Seed + if (!io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + //Paper start - Add missing structure set seed configs if (this.conf.strongholdSeed != null && structureSet.is(net.minecraft.world.level.levelgen.structure.BuiltinStructureSets.STRONGHOLDS)) { random.setSeed(this.conf.strongholdSeed); } else { // Paper end - Add missing structure set seed configs random.setSeed(this.concentricRingsSeed); } // Paper - Add missing structure set seed configs + } // Leaf - Matter - Secure Seed double angle = random.nextDouble() * Math.PI * 2.0; int positionInCircle = 0; int circle = 0; diff --git a/net/minecraft/world/level/chunk/status/ChunkStep.java b/net/minecraft/world/level/chunk/status/ChunkStep.java index 9208924f54d5024bc50ad4501fbff9eb2a289181..01d87d9c474a5f3e14713579e6a1d1e17d2455ae 100644 --- a/net/minecraft/world/level/chunk/status/ChunkStep.java +++ b/net/minecraft/world/level/chunk/status/ChunkStep.java @@ -60,6 +60,7 @@ public final class ChunkStep implements ca.spottedleaf.moonrise.patches.chunk_sy } public CompletableFuture apply(final WorldGenContext context, final StaticCache2D cache, final ChunkAccess chunk) { + su.plo.matter.Globals.setupGlobals(context.level()); // Leaf - Matter - Secure Seed if (chunk.getPersistedStatus().isBefore(this.targetStatus)) { ProfiledDuration profiledDuration = JvmProfiler.INSTANCE.onChunkGenerate(chunk.getPos(), context.level().dimension(), this.targetStatus.getName()); return this.task.doWork(context, this, cache, chunk).thenApply(newCenterChunk -> this.completeChunkGeneration(newCenterChunk, profiledDuration)); diff --git a/net/minecraft/world/level/levelgen/WorldOptions.java b/net/minecraft/world/level/levelgen/WorldOptions.java index 4ad94af024d81b7dfe910dcee2a6ec7a9b200d56..29078b0fd3824dd6c4e547650df4b187ed5ea719 100644 --- a/net/minecraft/world/level/levelgen/WorldOptions.java +++ b/net/minecraft/world/level/levelgen/WorldOptions.java @@ -10,8 +10,22 @@ import net.minecraft.util.RandomSource; import org.apache.commons.lang3.StringUtils; public class WorldOptions { + // Leaf start - Matter - Secure Seed + private static final com.google.gson.Gson gson = new com.google.gson.Gson(); + private static final boolean isSecureSeedEnabled = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled; public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( - i -> i.group( + // Leaf start - Matter - Secure Seed + i -> isSecureSeedEnabled + ? i.group( + Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), + Codec.STRING.fieldOf("feature_seed").orElse(gson.toJson(su.plo.matter.Globals.createRandomWorldSeed())).stable().forGetter(WorldOptions::featureSeedSerialize), + Codec.BOOL.fieldOf("generate_features").orElse(true).stable().forGetter(WorldOptions::generateStructures), + Codec.BOOL.fieldOf("bonus_chest").orElse(false).stable().forGetter(WorldOptions::generateBonusChest), + Codec.STRING.lenientOptionalFieldOf("legacy_custom_options").stable().forGetter(worldOptions -> worldOptions.legacyCustomOptions) + ) + .apply(i, i.stable(WorldOptions::new)) + : i.group( + // Leaf end Codec.LONG.fieldOf("seed").stable().forGetter(WorldOptions::seed), ExtraCodecs.optionalAlwaysPresentFieldOf(Codec.BOOL, "generate_structures", true).stable().forGetter(WorldOptions::generateStructures), ExtraCodecs.optionalAlwaysPresentFieldOf(Codec.BOOL, "bonus_chest", false).stable().forGetter(WorldOptions::generateBonusChest), @@ -19,8 +33,14 @@ public class WorldOptions { ) .apply(i, i.stable(WorldOptions::new)) ); - public static final WorldOptions DEMO_OPTIONS = new WorldOptions("North Carolina".hashCode(), true, true); + // Leaf end - Matter - Secure Seed + // Leaf start - Matter - Secure Seed + public static final WorldOptions DEMO_OPTIONS = isSecureSeedEnabled + ? new WorldOptions((long) "North Carolina".hashCode(), su.plo.matter.Globals.createRandomWorldSeed(), true, true) + : new WorldOptions("North Carolina".hashCode(), true, true); + // Leaf end - Matter - Secure Seed private final long seed; + private long[] featureSeed = su.plo.matter.Globals.createRandomWorldSeed(); // Leaf - Matter - Secure Seed private final boolean generateStructures; private final boolean generateBonusChest; private final Optional legacyCustomOptions; @@ -29,14 +49,35 @@ public class WorldOptions { this(seed, generateStructures, generateBonusChest, Optional.empty()); } + // Leaf start - Matter - Secure Seed + public WorldOptions(long seed, long[] featureSeed, boolean generateStructures, boolean bonusChest) { + this(seed, featureSeed, generateStructures, bonusChest, Optional.empty()); + } + + private WorldOptions(long seed, String featureSeedJson, boolean generateStructures, boolean bonusChest, Optional legacyCustomOptions) { + this(seed, gson.fromJson(featureSeedJson, long[].class), generateStructures, bonusChest, legacyCustomOptions); + } + // Leaf end - Matter - Secure Seed + public static WorldOptions defaultWithRandomSeed() { - return new WorldOptions(randomSeed(), true, false); + // Leaf start - Matter - Secure Seed + return isSecureSeedEnabled + ? new WorldOptions(randomSeed(), su.plo.matter.Globals.createRandomWorldSeed(), true, false) + : new WorldOptions(randomSeed(), true, false); + // Leaf end - Matter - Secure Seed } public static WorldOptions testWorldWithRandomSeed() { return new WorldOptions(randomSeed(), false, false); } + // Leaf start - Matter - Secure Seed + private WorldOptions(long seed, long[] featureSeed, boolean generateStructures, boolean bonusChest, Optional legacyCustomOptions) { + this(seed, generateStructures, bonusChest, legacyCustomOptions); + this.featureSeed = featureSeed; + } + // Leaf end - Matter - Secure Seed + private WorldOptions(final long seed, final boolean generateStructures, final boolean generateBonusChest, final Optional legacyCustomOptions) { this.seed = seed; this.generateStructures = generateStructures; @@ -48,6 +89,16 @@ public class WorldOptions { return this.seed; } + // Leaf start - Matter - Secure Seed + public long[] featureSeed() { + return this.featureSeed; + } + + private String featureSeedSerialize() { + return gson.toJson(this.featureSeed); + } + // Leaf end - Matter - Secure Seed + public boolean generateStructures() { return this.generateStructures; } @@ -60,17 +111,25 @@ public class WorldOptions { return this.legacyCustomOptions.isPresent(); } + // Leaf start - Matter - Secure Seed public WorldOptions withBonusChest(final boolean generateBonusChest) { - return new WorldOptions(this.seed, this.generateStructures, generateBonusChest, this.legacyCustomOptions); + return isSecureSeedEnabled + ? new WorldOptions(this.seed, this.featureSeed, this.generateStructures, generateBonusChest, this.legacyCustomOptions) + : new WorldOptions(this.seed, this.generateStructures, generateBonusChest, this.legacyCustomOptions); } public WorldOptions withStructures(final boolean generateStructures) { - return new WorldOptions(this.seed, generateStructures, this.generateBonusChest, this.legacyCustomOptions); + return isSecureSeedEnabled + ? new WorldOptions(this.seed, this.featureSeed, generateStructures, this.generateBonusChest, this.legacyCustomOptions) + : new WorldOptions(this.seed, generateStructures, this.generateBonusChest, this.legacyCustomOptions); } public WorldOptions withSeed(final OptionalLong seed) { - return new WorldOptions(seed.orElse(randomSeed()), this.generateStructures, this.generateBonusChest, this.legacyCustomOptions); + return isSecureSeedEnabled + ? new WorldOptions(seed.orElse(randomSeed()), su.plo.matter.Globals.createRandomWorldSeed(), this.generateStructures, this.generateBonusChest, this.legacyCustomOptions) + : new WorldOptions(seed.orElse(randomSeed()), this.generateStructures, this.generateBonusChest, this.legacyCustomOptions); } + // Leaf end - Matter - Secure Seed public static OptionalLong parseSeed(String seedString) { seedString = seedString.trim(); diff --git a/net/minecraft/world/level/levelgen/feature/GeodeFeature.java b/net/minecraft/world/level/levelgen/feature/GeodeFeature.java index baed0479a4552676844989868ee4c37ffa344def..7ff10f3f85e1b81cd976e400577c103c49f223ff 100644 --- a/net/minecraft/world/level/levelgen/feature/GeodeFeature.java +++ b/net/minecraft/world/level/levelgen/feature/GeodeFeature.java @@ -43,7 +43,11 @@ public class GeodeFeature extends Feature { int maxGenOffset = config.maxGenOffset(); List> points = Lists.newLinkedList(); int numPoints = config.distributionPoints().sample(random); - WorldgenRandom random1 = new WorldgenRandom(new LegacyRandomSource(level.getSeed())); + // Leaf start - Matter - Secure Seed + WorldgenRandom random1 = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled + ? new su.plo.matter.WorldgenCryptoRandom(0, 0, su.plo.matter.Globals.Salt.GEODE_FEATURE, 0) + : new WorldgenRandom(new LegacyRandomSource(level.getSeed())); + // Leaf end - Matter - Secure Seed NormalNoise noise = NormalNoise.create(random1, -4, 1.0); List crackPoints = Lists.newLinkedList(); double crackSizeAdjustment = (double)numPoints / config.outerWallDistance().maxInclusive(); diff --git a/net/minecraft/world/level/levelgen/structure/Structure.java b/net/minecraft/world/level/levelgen/structure/Structure.java index f1e13ede1f7345089ece8d8ef391f7fd5e55c445..366601d9d52785f5887d9d2605613cd8841702ca 100644 --- a/net/minecraft/world/level/levelgen/structure/Structure.java +++ b/net/minecraft/world/level/levelgen/structure/Structure.java @@ -248,6 +248,11 @@ public abstract class Structure { } private static WorldgenRandom makeRandom(final long seed, final ChunkPos chunkPos) { + // Leaf start - Matter - Secure Seed + if (io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + return new su.plo.matter.WorldgenCryptoRandom(chunkPos.x(), chunkPos.z(), su.plo.matter.Globals.Salt.GENERATE_FEATURE, seed); + } + // Leaf end - Matter - Secure Seed WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L)); random.setLargeFeatureSeed(seed, chunkPos.x(), chunkPos.z()); return random; diff --git a/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java b/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java index 1310b2ca994b8f6d3d92bdc676fe44de3619cc09..ed30fff40feefec0cb3f722b2f897e2a1524e1ec 100644 --- a/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java +++ b/net/minecraft/world/level/levelgen/structure/placement/RandomSpreadStructurePlacement.java @@ -67,8 +67,15 @@ public class RandomSpreadStructurePlacement extends StructurePlacement { public ChunkPos getPotentialStructureChunk(final long seed, final int sourceX, final int sourceZ) { int spacedGridX = Math.floorDiv(sourceX, this.spacing); int spacedGridZ = Math.floorDiv(sourceZ, this.spacing); - WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L)); - random.setLargeFeatureWithSalt(seed, spacedGridX, spacedGridZ, this.salt()); + // Leaf start - Matter - Secure Seed + WorldgenRandom random; + if (io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + random = new su.plo.matter.WorldgenCryptoRandom(spacedGridX, spacedGridZ, su.plo.matter.Globals.Salt.POTENTIONAL_FEATURE, this.salt); + } else { + random = new WorldgenRandom(new LegacyRandomSource(0L)); + random.setLargeFeatureWithSalt(seed, spacedGridX, spacedGridZ, this.salt()); + } + // Leaf end - Matter - Secure Seed int limit = this.spacing - this.separation; int spreadX = this.spreadType.evaluate(random, limit); int spreadZ = this.spreadType.evaluate(random, limit); diff --git a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java index 646df0237a5a2863f75e6c5f9dfe9ddf512c540f..a120ec20591af8deb03d54255c22ba01f12b270a 100644 --- a/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java +++ b/net/minecraft/world/level/levelgen/structure/placement/StructurePlacement.java @@ -137,8 +137,16 @@ public abstract class StructurePlacement { } private static boolean legacyArbitrarySaltProbabilityReducer(final long seed, final int salt, final int sourceX, final int sourceZ, final float probability, final @org.jspecify.annotations.Nullable Integer saltOverride) { // Paper - Add missing structure set seed configs - WorldgenRandom random = new WorldgenRandom(new LegacyRandomSource(0L)); - random.setLargeFeatureWithSalt(seed, sourceX, sourceZ, saltOverride != null ? saltOverride : HIGHLY_ARBITRARY_RANDOM_SALT); // Paper - Add missing structure set seed configs + // Leaf start - Matter - Secure Seed + WorldgenRandom random; + if (io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled) { + random = new su.plo.matter.WorldgenCryptoRandom(sourceX, sourceZ, su.plo.matter.Globals.Salt.UNDEFINED, saltOverride != null ? saltOverride : HIGHLY_ARBITRARY_RANDOM_SALT); + } else { + random = new WorldgenRandom(new LegacyRandomSource(0L)); + random.setLargeFeatureWithSalt(seed, sourceX, sourceZ, saltOverride != null ? saltOverride : HIGHLY_ARBITRARY_RANDOM_SALT); // Paper - Add missing structure set seed configs + } + // Leaf end - Matter - Secure Seed + return random.nextFloat() < probability; } diff --git a/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java b/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java index b92da7acae0789d955a9f71072b95ed030b879e2..d9fc189d03af801dd1c75730836676ed5f63dea8 100644 --- a/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java +++ b/net/minecraft/world/level/levelgen/structure/pools/JigsawPlacement.java @@ -64,7 +64,11 @@ public class JigsawPlacement { ChunkGenerator chunkGenerator = context.chunkGenerator(); StructureTemplateManager structureTemplateManager = context.structureTemplateManager(); LevelHeightAccessor heightAccessor = context.heightAccessor(); - WorldgenRandom random = context.random(); + // Leaf start - Matter - Secure Seed + WorldgenRandom random = io.nanachiyo0721.shiroha.config.modules.function.SecureSeedConfig.enabled + ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x(), context.chunkPos().z(), su.plo.matter.Globals.Salt.JIGSAW_PLACEMENT, 0) + : context.random(); + // Leaf end - Matter - Secure Seed Registry pools = registryAccess.lookupOrThrow(Registries.TEMPLATE_POOL); Rotation centerRotation = Rotation.getRandom(random); StructureTemplatePool centerPool = startPool.unwrapKey()