From 4a8e32ec747e929bf93c4e50dbd8ecaf3929a044 Mon Sep 17 00:00:00 2001 From: Bjarne Koll Date: Tue, 28 May 2024 11:45:03 +0200 Subject: [PATCH] Only remove worldgen block entity on changed block (#10794) --- ...invalid-block-entity-during-world-ge.patch | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/patches/server/Fix-creation-of-invalid-block-entity-during-world-ge.patch b/patches/server/Fix-creation-of-invalid-block-entity-during-world-ge.patch index 0e21522a3f..a375245723 100644 --- a/patches/server/Fix-creation-of-invalid-block-entity-during-world-ge.patch +++ b/patches/server/Fix-creation-of-invalid-block-entity-during-world-ge.patch @@ -8,11 +8,30 @@ diff --git a/src/main/java/net/minecraft/server/level/WorldGenRegion.java b/src/ index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 --- a/src/main/java/net/minecraft/server/level/WorldGenRegion.java +++ b/src/main/java/net/minecraft/server/level/WorldGenRegion.java +@@ -0,0 +0,0 @@ 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 - obfhelper + + if (iblockdata1 != null) { + this.level.onBlockStateChange(pos, iblockdata1, state); @@ -0,0 +0,0 @@ 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());