Skip to content
179 changes: 171 additions & 8 deletions leaf-server/minecraft-patches/features/0122-Matter-Secure-Seed.patch
Original file line number Diff line number Diff line change
Expand Up @@ -414,14 +414,177 @@ index 653c03d214d2e690852adc4d697e2b24c39ea3d0..807881ab3b647bff515df627543b8a2e
public class EndCityStructure extends Structure {
public static final MapCodec<EndCityStructure> CODEC = simpleCodec(EndCityStructure::new);
diff --git a/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java b/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java
index 5f2118f664c1013b99137c6d34a11c40c2559156..2acee0e8b5b80f7a40346befcafcd011edd37cf9 100644
index 5f2118f664c1013b99137c6d34a11c40c2559156..204f3380fda41d6e251afdda9482a0a1f3dc5d21 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/MineshaftStructure.java
@@ -20,6 +20,7 @@ import net.minecraft.world.level.levelgen.WorldgenRandom;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
+//import su.plo.matter.WorldgenCryptoRandom; // Leaf - Matter - Secure Seed
@@ -35,17 +35,21 @@ public class MineshaftStructure extends Structure {

@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
- context.random().nextDouble();
+ // Leaf start - Matter - Secure Seed
+ WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.MINESHAFT_FEATURE, 0)
+ : context.random();
+ if (!org.dreeam.leaf.config.modules.misc.SecureSeed.enabled) worldgenRandom.nextDouble(); // vanilla compat
+ // Leaf end - Matter - Secure Seed
ChunkPos chunkPos = context.chunkPos();
BlockPos blockPos = new BlockPos(chunkPos.getMiddleBlockX(), 50, chunkPos.getMinBlockZ());
StructurePiecesBuilder structurePiecesBuilder = new StructurePiecesBuilder();
- int i = this.generatePiecesAndAdjust(structurePiecesBuilder, context);
+ int i = this.generatePiecesAndAdjust(structurePiecesBuilder, context, worldgenRandom);
return Optional.of(new Structure.GenerationStub(blockPos.offset(0, i, 0), Either.right(structurePiecesBuilder)));
}

- private int generatePiecesAndAdjust(StructurePiecesBuilder builder, Structure.GenerationContext context) {
+ private int generatePiecesAndAdjust(StructurePiecesBuilder builder, Structure.GenerationContext context, WorldgenRandom worldgenRandom) {
ChunkPos chunkPos = context.chunkPos();
- WorldgenRandom worldgenRandom = context.random();
ChunkGenerator chunkGenerator = context.chunkGenerator();
MineshaftPieces.MineShaftRoom mineShaftRoom = new MineshaftPieces.MineShaftRoom(
0, worldgenRandom, chunkPos.getBlockX(2), chunkPos.getBlockZ(2), this.type
diff --git a/net/minecraft/world/level/levelgen/structure/structures/NetherFortressStructure.java b/net/minecraft/world/level/levelgen/structure/structures/NetherFortressStructure.java
index 0a3b0b28641f18937240b77545997637f1d21b4c..cfd4a776cb027768fdfd06491427b7b39e983bea 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/NetherFortressStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/NetherFortressStructure.java
@@ -29,26 +29,31 @@ public class NetherFortressStructure extends Structure {

@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
+ // Leaf start - Matter - Secure Seed
+ net.minecraft.world.level.levelgen.WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.NETHER_FORTRESS_FEATURE, 0)
+ : context.random();
+ // Leaf end - Matter - Secure Seed
ChunkPos chunkPos = context.chunkPos();
BlockPos blockPos = new BlockPos(chunkPos.getMinBlockX(), 64, chunkPos.getMinBlockZ());
- return Optional.of(new Structure.GenerationStub(blockPos, structurePiecesBuilder -> generatePieces(structurePiecesBuilder, context)));
+ return Optional.of(new Structure.GenerationStub(blockPos, structurePiecesBuilder -> generatePieces(structurePiecesBuilder, context, worldgenRandom)));
}

- private static void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context) {
+ private static void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context, net.minecraft.world.level.levelgen.WorldgenRandom worldgenRandom) {
NetherFortressPieces.StartPiece startPiece = new NetherFortressPieces.StartPiece(
- context.random(), context.chunkPos().getBlockX(2), context.chunkPos().getBlockZ(2)
+ worldgenRandom, context.chunkPos().getBlockX(2), context.chunkPos().getBlockZ(2)
);
builder.addPiece(startPiece);
- startPiece.addChildren(startPiece, builder, context.random());
+ startPiece.addChildren(startPiece, builder, worldgenRandom);
List<StructurePiece> list = startPiece.pendingChildren;

while (!list.isEmpty()) {
- int randomInt = context.random().nextInt(list.size());
+ int randomInt = worldgenRandom.nextInt(list.size());
StructurePiece structurePiece = list.remove(randomInt);
- structurePiece.addChildren(startPiece, builder, context.random());
+ structurePiece.addChildren(startPiece, builder, worldgenRandom);
}

- builder.moveInsideHeights(context.random(), 48, 70);
+ builder.moveInsideHeights(worldgenRandom, 48, 70);
}

@Override
diff --git a/net/minecraft/world/level/levelgen/structure/structures/NetherFossilStructure.java b/net/minecraft/world/level/levelgen/structure/structures/NetherFossilStructure.java
index 1569bbcb4fd3a7018e466f8445974498e76f4bcf..9b504b872fbdcd6a548b72ae01205693c27079b2 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/NetherFossilStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/NetherFossilStructure.java
@@ -29,7 +29,11 @@ public class NetherFossilStructure extends Structure {

@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
- WorldgenRandom worldgenRandom = context.random();
+ // Leaf start - Matter - Secure Seed
+ WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.NETHER_FOSSIL_FEATURE, 0)
+ : context.random();
+ // Leaf end - Matter - Secure Seed
int i = context.chunkPos().getMinBlockX() + worldgenRandom.nextInt(16);
int i1 = context.chunkPos().getMinBlockZ() + worldgenRandom.nextInt(16);
int seaLevel = context.chunkGenerator().getSeaLevel();
diff --git a/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java b/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
index 6941b2c89df8a7c77166e3fb76150cbc852371d9..1ae1b55526ea2738502aaacf4acf5666d88bf1b8 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
@@ -49,15 +49,25 @@ public class OceanMonumentStructure extends Structure {
}

private static void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context) {
- builder.addPiece(createTopPiece(context.chunkPos(), context.random()));
+ // Leaf start - Matter - Secure Seed
+ WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.OCEAN_MONUMENT_FEATURE, 0)
+ : context.random();
+ // Leaf end - Matter - Secure Seed
+ builder.addPiece(createTopPiece(context.chunkPos(), worldgenRandom));
}

public static PiecesContainer regeneratePiecesAfterLoad(ChunkPos chunkPos, long seed, PiecesContainer piecesContainer) {
if (piecesContainer.isEmpty()) {
return piecesContainer;
} else {
- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed()));
- worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z);
+ // Leaf start - Matter - Secure Seed
+ WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(chunkPos.x, chunkPos.z, su.plo.matter.Globals.Salt.OCEAN_MONUMENT_FEATURE, seed)
+ : new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed()));
+ if (!org.dreeam.leaf.config.modules.misc.SecureSeed.enabled)
+ worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z);
+ // Leaf end - Matter - Secure Seed
StructurePiece structurePiece = piecesContainer.pieces().get(0);
BoundingBox boundingBox = structurePiece.getBoundingBox();
int minX = boundingBox.minX();
diff --git a/net/minecraft/world/level/levelgen/structure/structures/RuinedPortalStructure.java b/net/minecraft/world/level/levelgen/structure/structures/RuinedPortalStructure.java
index a58921292156f83081fc2b2dd295b7b8a05ac217..983894e51701db3cd7d6b7defa69ecb73bec4b0a 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/RuinedPortalStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/RuinedPortalStructure.java
@@ -69,7 +69,11 @@ public class RuinedPortalStructure extends Structure {
@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
RuinedPortalPiece.Properties properties = new RuinedPortalPiece.Properties();
- WorldgenRandom worldgenRandom = context.random();
+ // Leaf start - Matter - Secure Seed
+ WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.RUINED_PORTAL_FEATURE, 0)
+ : context.random();
+ // Leaf end - Matter - Secure Seed
RuinedPortalStructure.Setup setup = null;
if (this.setups.size() > 1) {
float f = 0.0F;
diff --git a/net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionStructure.java b/net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionStructure.java
index 6e90f1fd987dec641fb4660384f5a1a67e17d611..5623094b6a1fd48254e2778ad0ca8aa4029c64b0 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/WoodlandMansionStructure.java
@@ -28,21 +28,26 @@ public class WoodlandMansionStructure extends Structure {

@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext context) {
- Rotation random = Rotation.getRandom(context.random());
+ // Leaf start - Matter - Secure Seed
+ net.minecraft.world.level.levelgen.WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
+ ? new su.plo.matter.WorldgenCryptoRandom(context.chunkPos().x, context.chunkPos().z, su.plo.matter.Globals.Salt.WOODLAND_MANSION_FEATURE, 0)
+ : context.random();
+ // Leaf end - Matter - Secure Seed
+ Rotation random = Rotation.getRandom(worldgenRandom);
BlockPos lowestYIn5by5BoxOffset7Blocks = this.getLowestYIn5by5BoxOffset7Blocks(context, random);
return lowestYIn5by5BoxOffset7Blocks.getY() < 60
? Optional.empty()
: Optional.of(
new Structure.GenerationStub(
lowestYIn5by5BoxOffset7Blocks,
- structurePiecesBuilder -> this.generatePieces(structurePiecesBuilder, context, lowestYIn5by5BoxOffset7Blocks, random)
+ structurePiecesBuilder -> this.generatePieces(structurePiecesBuilder, context, lowestYIn5by5BoxOffset7Blocks, random, worldgenRandom)
)
);
}

- private void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context, BlockPos pos, Rotation rotation) {
+ private void generatePieces(StructurePiecesBuilder builder, Structure.GenerationContext context, BlockPos pos, Rotation rotation, net.minecraft.world.level.levelgen.WorldgenRandom worldgenRandom) {
List<WoodlandMansionPieces.WoodlandMansionPiece> list = Lists.newLinkedList();
- WoodlandMansionPieces.generateMansion(context.structureTemplateManager(), pos, rotation, list, context.random());
+ WoodlandMansionPieces.generateMansion(context.structureTemplateManager(), pos, rotation, list, worldgenRandom);
list.forEach(builder::addPiece);
}

public class MineshaftStructure extends Structure {
public static final MapCodec<MineshaftStructure> CODEC = RecordCodecBuilder.mapCodec(
Original file line number Diff line number Diff line change
Expand Up @@ -340,18 +340,18 @@ index 49e400741088e4fb3e3deb40e6dbdaa79bb51079..478f652b8f54dddc4d9f59637a26c88c
worldgenRandom.nextInt();
return worldgenRandom.nextInt((int)(1.0F / frequency)) == 0;
diff --git a/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java b/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
index 6941b2c89df8a7c77166e3fb76150cbc852371d9..661c26c4b981d504988c7498be45a5ddacaf90d8 100644
index 1ae1b55526ea2738502aaacf4acf5666d88bf1b8..a16befee0016633843608ebdcc15f574aed8d086 100644
--- a/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
+++ b/net/minecraft/world/level/levelgen/structure/structures/OceanMonumentStructure.java
@@ -56,7 +56,7 @@ public class OceanMonumentStructure extends Structure {
if (piecesContainer.isEmpty()) {
return piecesContainer;
} else {
- WorldgenRandom worldgenRandom = new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed()));
+ WorldgenRandom worldgenRandom = new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(RandomSupport.generateUniqueSeed()) : new LegacyRandomSource(RandomSupport.generateUniqueSeed())); // Leaf - Faster random generator
worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z);
StructurePiece structurePiece = piecesContainer.pieces().get(0);
BoundingBox boundingBox = structurePiece.getBoundingBox();
@@ -64,7 +64,7 @@ public class OceanMonumentStructure extends Structure {
// Leaf start - Matter - Secure Seed
WorldgenRandom worldgenRandom = org.dreeam.leaf.config.modules.misc.SecureSeed.enabled
? new su.plo.matter.WorldgenCryptoRandom(chunkPos.x, chunkPos.z, su.plo.matter.Globals.Salt.OCEAN_MONUMENT_FEATURE, seed)
- : new WorldgenRandom(new LegacyRandomSource(RandomSupport.generateUniqueSeed()));
+ : new WorldgenRandom(org.dreeam.leaf.config.modules.opt.FastRNG.worldgenEnabled() ? new org.dreeam.leaf.util.math.random.FasterRandomSource(RandomSupport.generateUniqueSeed()) : new LegacyRandomSource(RandomSupport.generateUniqueSeed())); // Leaf - Faster random generator
if (!org.dreeam.leaf.config.modules.misc.SecureSeed.enabled)
worldgenRandom.setLargeFeatureSeed(seed, chunkPos.x, chunkPos.z);
// Leaf end - Matter - Secure Seed
diff --git a/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.java b/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.java
index 935539e7ba6f35597e3f92ffed7e74a12022a94b..21a4c8de077a740cdca76d73ef01abc26c08a859 100644
--- a/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.java
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.dreeam.leaf.config.ConfigModules;
import org.dreeam.leaf.config.EnumConfigCategory;
import org.dreeam.leaf.config.LeafConfig;

public class SecureSeed extends ConfigModules {

Expand All @@ -10,6 +11,7 @@ public String getBasePath() {
}

public static boolean enabled = false;
public static boolean useBlake3 = false;

@Override
public void onLoaded() {
Expand All @@ -20,5 +22,24 @@ public void onLoaded() {
安全种子开启后, 所有矿物与结构都将使用1024位的种子进行生成, 无法被破解.""");

enabled = config.getBoolean(getBasePath() + ".enabled", enabled);

String algorithm = config.getString(getBasePath() + ".hash-algorithm", "blake2b",
config.pickStringRegionBased(
"""
Hash algorithm used for secure seed generation.
Accepted values: blake2b, blake3
blake3 uses fewer rounds (4 vs 12) and ThreadLocal state pooling, which may be faster.""",
"""
用于安全种子生成的哈希算法.
可选值: blake2b, blake3
blake3 使用更少的轮次 (4 vs 12) 并使用 ThreadLocal 状态池, 可能更快."""));
if (algorithm.equalsIgnoreCase("blake3")) {
useBlake3 = true;
} else {
if (!algorithm.equalsIgnoreCase("blake2b")) {
LeafConfig.LOGGER.warn("Unknown hash-algorithm '{}' for secure-seed, falling back to blake2b.", algorithm);
}
useBlake3 = false;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package su.plo.matter;

public class Hashing {
public class HashingBlake2b {

// https://en.wikipedia.org/wiki/BLAKE_(hash_function)
// https://github.com/bcgit/bc-java/blob/master/core/src/main/java/org/bouncycastle/crypto/digests/Blake2bDigest.java
Expand Down
Loading