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..65121d2b17432f0ec5e8ec106cd205396ff96b73 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 (moe.monnairealms.camellia.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..24e355b71c196cb0ea7958ef7d33fb49a3de9bb0 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 b71c16640b1a2495e61480e9eb752fafbada7c44..0011653c857ee82f86355cc49b170120d9f96cfd 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 bd1368def6c2656902bae28dc07b98f8709107a9..fca5017a13148a928ae320ee99cddc45f617ffcd 100644 --- a/net/minecraft/server/level/ServerLevel.java +++ b/net/minecraft/server/level/ServerLevel.java @@ -633,6 +633,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..582fcd553e85ff6e2437c117dc0a655cb0017bae 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 = moe.monnairealms.camellia.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..e3a57d7fc2ad9244594870ffac7c6625c5781eff 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 = moe.monnairealms.camellia.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 (moe.monnairealms.camellia.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..144bf28dac810c7009ec3ce06b4f08e958ebc1f6 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 = moe.monnairealms.camellia.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 (!moe.monnairealms.camellia.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..075bffa587e7ca394421a3a4d03b7eb125955247 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 = moe.monnairealms.camellia.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..bcda97e7439945d2a559e45e33f55ccf7ebe801b 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 = moe.monnairealms.camellia.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..2bfc339e3301deb0d46a92b1c138ff1abbf5b409 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 (moe.monnairealms.camellia.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..ae55fd5d4b08f00557b384671412ee31b5d1aeef 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 (moe.monnairealms.camellia.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..3fddb11c1bd0277d878d90d0dae8e5ed8a42556a 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 (moe.monnairealms.camellia.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..2c81e8e7dd0380233b0f17e3d83ff704335dad53 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 = moe.monnairealms.camellia.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()