spigot/CraftBukkit-Patches/0064-Further-Seed-Customisation.patch
2022-07-28 04:00:00 +10:00

204 lines
11 KiB
Diff

From c53ae5c169cc9e69f2d3f41dde5efab5e411b29f Mon Sep 17 00:00:00 2001
From: md_5 <git@md-5.net>
Date: Fri, 4 Jul 2014 13:28:45 +1000
Subject: [PATCH] Further Seed Customisation
Allow server admins that really want to to customise the seeds used in world generation even further.
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
index aeba97e9b..dcb145102 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -266,6 +266,7 @@ public class WorldServer extends World implements GeneratorAccessSeed {
if (gen != null) {
chunkgenerator = new org.bukkit.craftbukkit.generator.CustomChunkGenerator(this, chunkgenerator, gen);
}
+ chunkgenerator.conf = spigotConfig; // Spigot
// CraftBukkit end
boolean flag2 = minecraftserver.forceSynchronousWrites();
DataFixer datafixer = minecraftserver.getFixerUpper();
diff --git a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
index cc47b0cf2..43ed956ce 100644
--- a/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
+++ b/src/main/java/net/minecraft/world/entity/monster/EntitySlime.java
@@ -317,7 +317,7 @@ public class EntitySlime extends EntityInsentient implements IMonster {
}
ChunkCoordIntPair chunkcoordintpair = new ChunkCoordIntPair(blockposition);
- boolean flag = SeededRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((GeneratorAccessSeed) generatoraccess).getSeed(), 987234911L).nextInt(10) == 0;
+ boolean flag = SeededRandom.seedSlimeChunk(chunkcoordintpair.x, chunkcoordintpair.z, ((GeneratorAccessSeed) generatoraccess).getSeed(), generatoraccess.getMinecraftWorld().spigotConfig.slimeSeed).nextInt(10) == 0; // Spigot
if (randomsource.nextInt(10) == 0 && flag && blockposition.getY() < 40) {
return checkMobSpawnRules(entitytypes, generatoraccess, enummobspawn, blockposition, randomsource);
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
index e51494d21..c892ce881 100644
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkGenerator.java
@@ -98,6 +98,7 @@ public abstract class ChunkGenerator {
private final Map<Structure, List<StructurePlacement>> placementsForStructure;
private final Map<ConcentricRingsStructurePlacement, CompletableFuture<List<ChunkCoordIntPair>>> ringPositions;
private boolean hasGeneratedPositions;
+ public org.spigotmc.SpigotWorldConfig conf; // Spigot
protected static <T extends ChunkGenerator> P1<Mu<T>, IRegistry<StructureSet>> commonCodec(Instance<T> instance) {
return instance.group(RegistryOps.retrieveRegistry(IRegistry.STRUCTURE_SET_REGISTRY).forGetter((chunkgenerator) -> {
@@ -129,11 +130,72 @@ public abstract class ChunkGenerator {
return this.structureOverrides.isPresent() ? ((HolderSet) this.structureOverrides.get()).stream() : this.structureSets.holders().map(Holder::hackyErase);
}
+ // Spigot start
+ private Stream<StructureSet> possibleStructureSetsSpigot() {
+ return possibleStructureSets().map(Holder::value).map((structureset) -> {
+ if (structureset.placement() instanceof RandomSpreadStructurePlacement randomConfig) {
+ String name = structureSets.getKey(structureset).getPath();
+ int seed = randomConfig.salt;
+
+ switch (name) {
+ case "desert_pyramids":
+ seed = conf.desertSeed;
+ break;
+ case "end_cities":
+ seed = conf.endCitySeed;
+ break;
+ case "nether_complexes":
+ seed = conf.netherSeed;
+ break;
+ case "igloos":
+ seed = conf.iglooSeed;
+ break;
+ case "jungle_temples":
+ seed = conf.jungleSeed;
+ break;
+ case "woodland_mansions":
+ seed = conf.mansionSeed;
+ break;
+ case "ocean_monuments":
+ seed = conf.monumentSeed;
+ break;
+ case "nether_fossils":
+ seed = conf.fossilSeed;
+ break;
+ case "ocean_ruins":
+ seed = conf.oceanSeed;
+ break;
+ case "pillager_outposts":
+ seed = conf.outpostSeed;
+ break;
+ case "ruined_portals":
+ seed = conf.portalSeed;
+ break;
+ case "shipwrecks":
+ seed = conf.shipwreckSeed;
+ break;
+ case "swamp_huts":
+ seed = conf.swampSeed;
+ break;
+ case "villages":
+ seed = conf.villageSeed;
+ break;
+ }
+
+ structureset = new StructureSet(structureset.structures(), new RandomSpreadStructurePlacement(randomConfig.locateOffset, randomConfig.frequencyReductionMethod, randomConfig.frequency, seed, randomConfig.exclusionZone, randomConfig.spacing(), randomConfig.separation(), randomConfig.spreadType()));
+ }
+ return structureset;
+ });
+ }
+ // Spigot end
+
private void generatePositions(RandomState randomstate) {
Set<Holder<BiomeBase>> set = this.biomeSource.possibleBiomes();
- this.possibleStructureSets().forEach((holder) -> {
- StructureSet structureset = (StructureSet) holder.value();
+ // Spigot start
+ this.possibleStructureSetsSpigot().forEach((holder) -> {
+ StructureSet structureset = (StructureSet) holder;
+ // Spigot end
boolean flag = false;
Iterator iterator = structureset.structures().iterator();
@@ -164,7 +226,7 @@ public abstract class ChunkGenerator {
});
}
- private CompletableFuture<List<ChunkCoordIntPair>> generateRingPositions(Holder<StructureSet> holder, RandomState randomstate, ConcentricRingsStructurePlacement concentricringsstructureplacement) {
+ private CompletableFuture<List<ChunkCoordIntPair>> generateRingPositions(StructureSet holder, RandomState randomstate, ConcentricRingsStructurePlacement concentricringsstructureplacement) { // Spigot
return concentricringsstructureplacement.count() == 0 ? CompletableFuture.completedFuture(List.of()) : CompletableFuture.supplyAsync(SystemUtils.wrapThreadWithTaskName("placement calculation", () -> {
Stopwatch stopwatch = Stopwatch.createStarted(SystemUtils.TICKER);
List<ChunkCoordIntPair> list = new ArrayList();
@@ -658,9 +720,11 @@ public abstract class ChunkGenerator {
ChunkCoordIntPair chunkcoordintpair = ichunkaccess.getPos();
SectionPosition sectionposition = SectionPosition.bottomOf(ichunkaccess);
- this.possibleStructureSets().forEach((holder) -> {
- StructurePlacement structureplacement = ((StructureSet) holder.value()).placement();
- List<StructureSet.a> list = ((StructureSet) holder.value()).structures();
+ // Spigot start
+ this.possibleStructureSetsSpigot().forEach((holder) -> {
+ StructurePlacement structureplacement = ((StructureSet) holder).placement();
+ List<StructureSet.a> list = ((StructureSet) holder).structures();
+ // Spigot end
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
index 9818d6271..ed86a0674 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftChunk.java
@@ -221,7 +221,7 @@ public class CraftChunk implements Chunk {
@Override
public boolean isSlimeChunk() {
// 987234911L is deterimined in EntitySlime when seeing if a slime can spawn in a chunk
- return SeededRandom.seedSlimeChunk(getX(), getZ(), getWorld().getSeed(), 987234911L).nextInt(10) == 0;
+ return SeededRandom.seedSlimeChunk(getX(), getZ(), getWorld().getSeed(), worldServer.spigotConfig.slimeSeed).nextInt(10) == 0;
}
@Override
diff --git a/src/main/java/org/spigotmc/SpigotWorldConfig.java b/src/main/java/org/spigotmc/SpigotWorldConfig.java
index dd32a4ed9..9b4ab83b7 100644
--- a/src/main/java/org/spigotmc/SpigotWorldConfig.java
+++ b/src/main/java/org/spigotmc/SpigotWorldConfig.java
@@ -286,4 +286,40 @@ public class SpigotWorldConfig
{
endPortalSoundRadius = getInt( "end-portal-sound-radius", 0 );
}
+
+ public int villageSeed;
+ public int desertSeed;
+ public int iglooSeed;
+ public int jungleSeed;
+ public int swampSeed;
+ public int monumentSeed;
+ public int oceanSeed;
+ public int outpostSeed;
+ public int shipwreckSeed;
+ public int slimeSeed;
+ public int endCitySeed;
+ public int netherSeed;
+ public int mansionSeed;
+ public int fossilSeed;
+ public int portalSeed;
+ private void initWorldGenSeeds()
+ {
+ villageSeed = getInt( "seed-village", 10387312 );
+ desertSeed = getInt( "seed-desert", 14357617 );
+ iglooSeed = getInt( "seed-igloo", 14357618 );
+ jungleSeed = getInt( "seed-jungle", 14357619 );
+ swampSeed = getInt( "seed-swamp", 14357620 );
+ monumentSeed = getInt( "seed-monument", 10387313 );
+ shipwreckSeed = getInt( "seed-shipwreck", 165745295 );
+ oceanSeed = getInt( "seed-ocean", 14357621 );
+ outpostSeed = getInt( "seed-outpost", 165745296 );
+ endCitySeed = getInt( "seed-endcity", 10387313 );
+ slimeSeed = getInt( "seed-slime", 987234911 );
+ netherSeed = getInt( "seed-nether", 30084232 );
+ mansionSeed = getInt( "seed-mansion", 10387319 );
+ fossilSeed = getInt( "seed-fossil", 14357921 );
+ portalSeed = getInt( "seed-portal", 34222645 );
+ log( "Custom Map Seeds: Village: " + villageSeed + " Desert: " + desertSeed + " Igloo: " + iglooSeed + " Jungle: " + jungleSeed + " Swamp: " + swampSeed + " Monument: " + monumentSeed
+ + " Ocean: " + oceanSeed + " Shipwreck: " + shipwreckSeed + " End City: " + endCitySeed + " Slime: " + slimeSeed + " Nether: " + netherSeed + " Mansion: " + mansionSeed + " Fossil: " + fossilSeed + " Portal: " + portalSeed );
+ }
}
--
2.34.1