aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBjarne Koll <[email protected]>2024-05-28 12:09:13 +0200
committerNassim Jahnke <[email protected]>2024-05-28 12:09:13 +0200
commitd8d54d927974f36ab1f919c808c0ed9e67e0e6f0 (patch)
tree11b5582267802fc7e7b655425019351a865e8510
parent7ac24a18940da12beb39a030113f6e459f348e2f (diff)
downloadPaper-d8d54d927974f36ab1f919c808c0ed9e67e0e6f0.tar.gz
Paper-d8d54d927974f36ab1f919c808c0ed9e67e0e6f0.zip
Only remove worldgen block entity on changed block (#10794)
-rw-r--r--patches/server/1053-Fix-creation-of-invalid-block-entity-during-world-ge.patch25
1 files changed, 22 insertions, 3 deletions
diff --git a/patches/server/1053-Fix-creation-of-invalid-block-entity-during-world-ge.patch b/patches/server/1053-Fix-creation-of-invalid-block-entity-during-world-ge.patch
index 5f6f4e6b9c..8a66e12626 100644
--- a/patches/server/1053-Fix-creation-of-invalid-block-entity-during-world-ge.patch
+++ b/patches/server/1053-Fix-creation-of-invalid-block-entity-during-world-ge.patch
@@ -5,14 +5,33 @@ Subject: [PATCH] Fix creation of invalid block entity during world generation
diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-index 5ece375eaf6bcc61864997a389bb5e24625e4505..9c3f8f79c2b3389a118dce9a1558edda52446833 100644
+index 5ece375eaf6bcc61864997a389bb5e24625e4505..17e3c28f738504082733859f5ebfccc3dc046b6d 100644
--- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java
+++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java
-@@ -352,6 +352,7 @@ public class WorldGenRegion implements WorldGenLevel {
+@@ -336,7 +336,7 @@ public class WorldGenRegion implements WorldGenLevel {
+ return false;
+ } else {
+ ChunkAccess ichunkaccess = this.getChunk(pos);
+- BlockState iblockdata1 = ichunkaccess.setBlockState(pos, state, false);
++ BlockState iblockdata1 = ichunkaccess.setBlockState(pos, state, false); final BlockState previousBlockState = iblockdata1; // Paper - Clear block entity before setting up a DUMMY block entity
+
+ if (iblockdata1 != null) {
+ this.level.onBlockStateChange(pos, iblockdata1, state);
+@@ -352,6 +352,17 @@ public class WorldGenRegion implements WorldGenLevel {
ichunkaccess.removeBlockEntity(pos);
}
} else {
-+ ichunkaccess.removeBlockEntity(pos); // Paper - Clear the block entity before setting up a DUMMY block entity
++ // Paper start - Clear block entity before setting up a DUMMY block entity
++ // The concept of removing a block entity when the block itself changes is generally lifted
++ // from LevelChunk#setBlockState.
++ // It is however to note that this may only run if the block actually changes.
++ // Otherwise a chest block entity generated by a structure template that is later "updated" to
++ // be waterlogged would remove its existing block entity (see PaperMC/Paper#10750)
++ // This logic is *also* found in LevelChunk#setBlockState.
++ if (previousBlockState != null && !java.util.Objects.equals(previousBlockState.getBlock(), state.getBlock())) {
++ ichunkaccess.removeBlockEntity(pos);
++ }
++ // Paper end - Clear block entity before setting up a DUMMY block entity
CompoundTag nbttagcompound = new CompoundTag();
nbttagcompound.putInt("x", pos.getX());