From 506f1651e549c290142df8d1e2e8ea831bc381c0 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Tue, 16 Jul 2024 16:39:57 -0700 Subject: Don't store removed components in multiple places (#11091) --- ...ncelling-BlockPlaceEvent-calling-onRemove.patch | 47 ++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch (limited to 'patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch') diff --git a/patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch b/patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch new file mode 100644 index 0000000000..8af7943ca8 --- /dev/null +++ b/patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch @@ -0,0 +1,47 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Tamion <70228790+notTamion@users.noreply.github.com> +Date: Thu, 23 May 2024 11:02:20 +0200 +Subject: [PATCH] Fix cancelling BlockPlaceEvent calling onRemove + + +diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java +index 8309d2f7872ccdbc9d76f0fbf481411f74080148..de32bf4947af8d2ec64e8799580a129b038dd35e 100644 +--- a/src/main/java/net/minecraft/world/item/ItemStack.java ++++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -494,9 +494,11 @@ public final class ItemStack implements DataComponentHolder { + world.capturedTileEntities.clear(); // Paper - Allow chests to be placed with NBT data; clear out block entities as chests and such will pop loot + // revert back all captured blocks + world.preventPoiUpdated = true; // CraftBukkit - SPIGOT-5710 ++ world.isBlockPlaceCancelled = true; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + for (BlockState blockstate : blocks) { + blockstate.update(true, false); + } ++ world.isBlockPlaceCancelled = false; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + world.preventPoiUpdated = false; + + // Brute force all possible updates +diff --git a/src/main/java/net/minecraft/world/level/Level.java b/src/main/java/net/minecraft/world/level/Level.java +index c6c9400fa155831ab11d0f059971d0123617e622..e27d3547d1e19c137e05e6b8d075127a8bafb237 100644 +--- a/src/main/java/net/minecraft/world/level/Level.java ++++ b/src/main/java/net/minecraft/world/level/Level.java +@@ -151,6 +151,7 @@ public abstract class Level implements LevelAccessor, AutoCloseable { + public boolean preventPoiUpdated = false; // CraftBukkit - SPIGOT-5710 + public boolean captureBlockStates = false; + public boolean captureTreeGeneration = false; ++ public boolean isBlockPlaceCancelled = false; // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + public Map capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper + public Map capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates + public List captureDrops; +diff --git a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +index 7f8983a2102787b13e5d28d6981055da6acd1012..602ad80c2b93d320bf2a25832d25a58cb8c72e4b 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java ++++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java +@@ -345,7 +345,7 @@ public class LevelChunk extends ChunkAccess { + + boolean flag3 = iblockdata1.hasBlockEntity(); + +- if (!this.level.isClientSide) { ++ if (!this.level.isClientSide && !this.level.isBlockPlaceCancelled) { // Paper - prevent calling cleanup logic when undoing a block place upon a cancelled BlockPlaceEvent + iblockdata1.onRemove(this.level, blockposition, iblockdata, flag); + } else if (!iblockdata1.is(block) && flag3) { + this.removeBlockEntity(blockposition); -- cgit v1.2.3