This is generated by calude As it's only change the display, no tests and review are required
424 lines
28 KiB
Diff
424 lines
28 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Helvetica Volubi <suisuroru@blue-millennium.fun>
|
|
Date: Sun, 28 Jun 2026 20:39:22 +0800
|
|
Subject: [PATCH] Leaf: Secure seed and matter seed command
|
|
|
|
Co-authored by: Apehum <apehumchik@gmail.com>
|
|
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<DedicatedServerPropertie
|
|
String levelSeed = this.get("level-seed", "");
|
|
boolean generateStructures = this.get("generate-structures", true);
|
|
long seed = WorldOptions.parseSeed(levelSeed).orElse(WorldOptions.randomSeed());
|
|
- this.worldOptions = new WorldOptions(seed, generateStructures, false);
|
|
+ // Leaf start - Matter - Secure Seed
|
|
+ if (moe.monnairealms.camellia.config.modules.function.SecureSeedConfig.enabled) {
|
|
+ String featureSeedStr = this.get("feature-level-seed", "");
|
|
+ long[] featureSeed = su.plo.matter.Globals.parseSeed(featureSeedStr)
|
|
+ .orElse(su.plo.matter.Globals.createRandomWorldSeed());
|
|
+
|
|
+ this.worldOptions = new WorldOptions(seed, featureSeed, generateStructures, false);
|
|
+ } else {
|
|
+ this.worldOptions = new WorldOptions(seed, generateStructures, false);
|
|
+ }
|
|
+ // Leaf end - Matter - Secure Seed
|
|
this.worldDimensionData = new DedicatedServerProperties.WorldDimensionData(
|
|
this.get("generator-settings", s -> 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<Integer, List<Structure>> structuresByStep = structuresRegistry.stream()
|
|
.collect(Collectors.groupingBy(structure -> structure.step().ordinal()));
|
|
List<FeatureSorter.StepFeatureData> 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<Holder<Biome>> possibleBiomes = new ObjectArraySet<>();
|
|
ChunkPos.rangeClosed(sectionPos.chunk(), 1).forEach(chunkPos -> {
|
|
@@ -571,8 +575,15 @@ public abstract class ChunkGenerator {
|
|
} else {
|
|
ArrayList<StructureSet.StructureSelectionEntry> 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<CompletableFuture<ChunkPos>> tasks = new ArrayList<>(count);
|
|
int spread = placement.spread();
|
|
HolderSet<Biome> 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<ChunkAccess> apply(final WorldGenContext context, final StaticCache2D<GenerationChunkHolder> 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<WorldOptions> 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<String> 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<String> 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<String> 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<String> 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<GeodeConfiguration> {
|
|
int maxGenOffset = config.maxGenOffset();
|
|
List<Pair<BlockPos, Integer>> 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<BlockPos> 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<StructureTemplatePool> pools = registryAccess.lookupOrThrow(Registries.TEMPLATE_POOL);
|
|
Rotation centerRotation = Rotation.getRandom(random);
|
|
StructureTemplatePool centerPool = startPool.unwrapKey()
|