2021-06-13 21:29:58 +02:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Byteflux <byte@byteflux.net>
|
|
|
|
Date: Wed, 2 Mar 2016 02:17:54 -0600
|
|
|
|
Subject: [PATCH] Generator Settings
|
|
|
|
|
|
|
|
|
|
|
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
|
|
index 4c177a383b277debe8a7c02a70d029d862e6b048..0c336a794d21d5084b9ea39308379b2ffb4a4330 100644
|
|
|
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
|
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
|
|
|
@@ -416,5 +416,10 @@ public class PaperWorldConfig {
|
|
|
|
private void disableRelativeProjectileVelocity() {
|
|
|
|
disableRelativeProjectileVelocity = getBoolean("game-mechanics.disable-relative-projectile-velocity", false);
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+ public boolean generateFlatBedrock;
|
|
|
|
+ private void generatorSettings() {
|
|
|
|
+ generateFlatBedrock = getBoolean("generator-settings.flat-bedrock", false);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ChunkMap.java b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
2021-07-07 08:52:40 +02:00
|
|
|
index 6f5e1f7c23b19257c89b7c5a992ad76623bf4006..a2eecfaf54921423f803d759c06789e5e8a38d33 100644
|
2021-06-13 21:29:58 +02:00
|
|
|
--- a/src/main/java/net/minecraft/server/level/ChunkMap.java
|
|
|
|
+++ b/src/main/java/net/minecraft/server/level/ChunkMap.java
|
2021-07-07 08:52:40 +02:00
|
|
|
@@ -677,7 +677,7 @@ public class ChunkMap extends ChunkStorage implements ChunkHolder.PlayerProvider
|
2021-06-13 21:29:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
this.markPositionReplaceable(pos);
|
|
|
|
- return Either.left(new ProtoChunk(pos, UpgradeData.EMPTY, this.level));
|
|
|
|
+ return Either.left(new ProtoChunk(pos, UpgradeData.EMPTY, this.level, this.level)); // Paper - add level
|
|
|
|
// Paper start - Async chunk io
|
|
|
|
};
|
|
|
|
CompletableFuture<Either<ChunkAccess, ChunkHolder.ChunkLoadingFailure>> ret = new CompletableFuture<>();
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
2021-07-10 22:17:47 +02:00
|
|
|
index 974ab04b08bbd3c27a394b37c1af112be5f28f43..149ac5ec368b53a9a5e9208bd49a3c9453625d9c 100644
|
2021-06-13 21:29:58 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ChunkAccess.java
|
2021-07-10 22:17:47 +02:00
|
|
|
@@ -29,6 +29,17 @@ public interface ChunkAccess extends BlockGetter, FeatureAccess {
|
2021-06-13 21:29:58 +02:00
|
|
|
return GameEventDispatcher.NOOP;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ // Paper start
|
|
|
|
+ default boolean generateFlatBedrock() {
|
2021-07-10 22:17:47 +02:00
|
|
|
+ if (this.getLevel() != null) {
|
|
|
|
+ return this.getLevel().paperConfig.generateFlatBedrock;
|
2021-06-13 21:29:58 +02:00
|
|
|
+ }
|
2021-07-10 22:17:47 +02:00
|
|
|
+ return false;
|
2021-06-13 21:29:58 +02:00
|
|
|
+ }
|
2021-07-10 22:17:47 +02:00
|
|
|
+
|
|
|
|
+ net.minecraft.world.level.Level getLevel();
|
2021-06-13 21:29:58 +02:00
|
|
|
+ // Paper end
|
|
|
|
+
|
|
|
|
BlockState getType(final int x, final int y, final int z); // Paper
|
|
|
|
@Nullable
|
|
|
|
BlockState setBlockState(BlockPos pos, BlockState state, boolean moved);
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
|
|
|
index 452b513e8b89d865a396066adaf4feb1140e1c62..8245c5834ec69beb8e3b95fb3900601009a9273f 100644
|
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ImposterProtoChunk.java
|
|
|
|
@@ -25,7 +25,7 @@ public class ImposterProtoChunk extends ProtoChunk {
|
|
|
|
private final LevelChunk wrapped;
|
|
|
|
|
|
|
|
public ImposterProtoChunk(LevelChunk wrapped) {
|
|
|
|
- super(wrapped.getPos(), UpgradeData.EMPTY, wrapped);
|
|
|
|
+ super(wrapped.getPos(), UpgradeData.EMPTY, wrapped, wrapped.level); // Paper - add level
|
|
|
|
this.wrapped = wrapped;
|
|
|
|
}
|
|
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
2021-07-10 22:17:47 +02:00
|
|
|
index 873fea54aecca411b6dee1ed3566f93c4fb9670f..7dc3d806a680150c6a2fffa1436fd63bbdc31eb3 100644
|
2021-06-13 21:29:58 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/ProtoChunk.java
|
2021-07-10 22:17:47 +02:00
|
|
|
@@ -63,16 +63,45 @@ public class ProtoChunk implements ChunkAccess {
|
2021-06-13 21:29:58 +02:00
|
|
|
private long inhabitedTime;
|
|
|
|
private final Map<GenerationStep.Carving, BitSet> carvingMasks = new Object2ObjectArrayMap<>();
|
|
|
|
private volatile boolean isLightCorrect;
|
2021-07-10 22:17:47 +02:00
|
|
|
+ // Paper start - Add level
|
|
|
|
+ final net.minecraft.world.level.Level level;
|
|
|
|
+ @Override
|
|
|
|
+ public net.minecraft.world.level.Level getLevel() {
|
|
|
|
+ return this.level;
|
|
|
|
+ }
|
|
|
|
+ // Paper end
|
|
|
|
+ private static boolean PRINTED_OUTDATED_CTOR_MSG = false; // Paper - Add level
|
2021-06-13 21:29:58 +02:00
|
|
|
|
2021-07-10 22:17:47 +02:00
|
|
|
+ @Deprecated // Paper start - add level
|
|
|
|
public ProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world) {
|
|
|
|
+ // Paper start
|
|
|
|
+ this(pos, upgradeData, world, null);
|
|
|
|
+ if (!PRINTED_OUTDATED_CTOR_MSG) {
|
|
|
|
+ new IllegalArgumentException("Must use ProtoChunk constructor with the ServerLevel parameter").printStackTrace();
|
|
|
|
+ PRINTED_OUTDATED_CTOR_MSG = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
2021-06-13 21:29:58 +02:00
|
|
|
+ public ProtoChunk(ChunkPos pos, UpgradeData upgradeData, LevelHeightAccessor world, net.minecraft.server.level.ServerLevel level) {
|
|
|
|
+ // Paper end
|
|
|
|
this(pos, upgradeData, (LevelChunkSection[])null, new ProtoTickList<>((block) -> {
|
|
|
|
return block == null || block.defaultBlockState().isAir();
|
|
|
|
}, pos, world), new ProtoTickList<>((fluid) -> {
|
|
|
|
return fluid == null || fluid == Fluids.EMPTY;
|
|
|
|
- }, pos, world), world);
|
|
|
|
+ }, pos, world), world, level); // Paper - add level
|
|
|
|
}
|
|
|
|
|
2021-07-10 22:17:47 +02:00
|
|
|
+ @Deprecated // Paper start - add level
|
|
|
|
public ProtoChunk(ChunkPos pos, UpgradeData upgradeData, @Nullable LevelChunkSection[] levelChunkSections, ProtoTickList<Block> blockTickScheduler, ProtoTickList<Fluid> fluidTickScheduler, LevelHeightAccessor world) {
|
|
|
|
+ // Paper start
|
|
|
|
+ this(pos, upgradeData, levelChunkSections, blockTickScheduler, fluidTickScheduler, world, null);
|
|
|
|
+ if (!PRINTED_OUTDATED_CTOR_MSG) {
|
|
|
|
+ new IllegalArgumentException("Must use ProtoChunk constructor with the ServerLevel parameter").printStackTrace();
|
|
|
|
+ PRINTED_OUTDATED_CTOR_MSG = true;
|
|
|
|
+ }
|
|
|
|
+ }
|
2021-06-13 21:29:58 +02:00
|
|
|
+ public ProtoChunk(ChunkPos pos, UpgradeData upgradeData, @Nullable LevelChunkSection[] levelChunkSections, ProtoTickList<Block> blockTickScheduler, ProtoTickList<Fluid> fluidTickScheduler, LevelHeightAccessor world, net.minecraft.server.level.ServerLevel level) {
|
|
|
|
+ this.level = level;
|
|
|
|
+ // Paper end
|
|
|
|
this.chunkPos = pos;
|
|
|
|
this.upgradeData = upgradeData;
|
|
|
|
this.blockTicks = blockTickScheduler;
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
2021-07-07 08:52:40 +02:00
|
|
|
index ea3279113358b41281ee2e92f2371a0f1e36b472..575f0bcb4db4bd58c949acc3b6a15bbeb7f842a0 100644
|
2021-06-13 21:29:58 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
|
|
|
|
@@ -210,7 +210,7 @@ public class ChunkSerializer {
|
|
|
|
// CraftBukkit end
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
- ProtoChunk protochunk = new ProtoChunk(pos, chunkconverter, achunksection, protochunkticklist, protochunkticklist1, world);
|
|
|
|
+ ProtoChunk protochunk = new ProtoChunk(pos, chunkconverter, achunksection, protochunkticklist, protochunkticklist1, world, world); // Paper - add level
|
|
|
|
|
|
|
|
protochunk.setBiomes(biomestorage);
|
|
|
|
object = protochunk;
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
2021-07-07 08:52:40 +02:00
|
|
|
index 4e7e2a3d9135765701c9a74bf6c155539ebb969e..43efd756dec0dddcbcb18bcc2c48972f236ffda9 100644
|
2021-06-13 21:29:58 +02:00
|
|
|
--- a/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator.java
|
|
|
|
@@ -270,8 +270,8 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
|
|
|
int j = chunk.getPos().getMinBlockZ();
|
|
|
|
NoiseGeneratorSettings noiseGeneratorSettings = this.settings.get();
|
|
|
|
int k = noiseGeneratorSettings.noiseSettings().minY();
|
|
|
|
- int l = k + noiseGeneratorSettings.getBedrockFloorPosition();
|
|
|
|
- int m = this.height - 1 + k - noiseGeneratorSettings.getBedrockRoofPosition();
|
|
|
|
+ int l = k + noiseGeneratorSettings.getBedrockFloorPosition(); final int floorHeight = k; // Paper
|
|
|
|
+ int m = this.height - 1 + k - noiseGeneratorSettings.getBedrockRoofPosition(); final int roofHeight = l; // Paper
|
|
|
|
int n = 5;
|
|
|
|
int o = chunk.getMinBuildHeight();
|
|
|
|
int p = chunk.getMaxBuildHeight();
|
|
|
|
@@ -281,7 +281,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
|
|
|
for(BlockPos blockPos : BlockPos.betweenClosed(i, 0, j, i + 15, 0, j + 15)) {
|
|
|
|
if (bl) {
|
|
|
|
for(int q = 0; q < 5; ++q) {
|
|
|
|
- if (q <= random.nextInt(5)) {
|
|
|
|
+ if (q <= (chunk.generateFlatBedrock() ? roofHeight : random.nextInt(5))) { // Paper - Configurable flat bedrock roof
|
|
|
|
chunk.setBlockState(mutableBlockPos.set(blockPos.getX(), m - q, blockPos.getZ()), Blocks.BEDROCK.defaultBlockState(), false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -289,7 +289,7 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
|
|
|
|
|
|
|
if (bl2) {
|
|
|
|
for(int r = 4; r >= 0; --r) {
|
|
|
|
- if (r <= random.nextInt(5)) {
|
|
|
|
+ if (r <= (chunk.generateFlatBedrock() ? roofHeight : random.nextInt(5))) { // Paper - Configurable flat bedrock floor
|
|
|
|
chunk.setBlockState(mutableBlockPos.set(blockPos.getX(), l + r, blockPos.getZ()), Blocks.BEDROCK.defaultBlockState(), false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@@ -309,14 +309,14 @@ public final class NoiseBasedChunkGenerator extends ChunkGenerator {
|
|
|
|
if (l <= 0) {
|
|
|
|
return CompletableFuture.completedFuture(chunk);
|
|
|
|
} else {
|
|
|
|
- int m = chunk.getSectionIndex(l * this.cellHeight - 1 + i);
|
|
|
|
+ int mStart = chunk.getSectionIndex(l * this.cellHeight - 1 + i); // Paper - decompile fix
|
|
|
|
int n = chunk.getSectionIndex(i);
|
|
|
|
return CompletableFuture.supplyAsync(() -> {
|
|
|
|
Set<LevelChunkSection> set = Sets.newHashSet();
|
|
|
|
|
|
|
|
ChunkAccess var16;
|
|
|
|
try {
|
|
|
|
- for(int m = m; m >= n; --m) {
|
|
|
|
+ for(int m = mStart; m >= n; --m) { // Paper - decompile fix
|
|
|
|
LevelChunkSection levelChunkSection = chunk.getOrCreateSection(m);
|
|
|
|
levelChunkSection.acquire();
|
|
|
|
set.add(levelChunkSection);
|