aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch
diff options
context:
space:
mode:
authorJake Potrebic <[email protected]>2024-07-16 16:39:57 -0700
committerGitHub <[email protected]>2024-07-16 16:39:57 -0700
commit506f1651e549c290142df8d1e2e8ea831bc381c0 (patch)
tree250f8cb16a8e94a588aa9df694e199f3e45ae824 /patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch
parenta6ceda12c54cd8b7d272fe50e744c9b9a26d0838 (diff)
downloadPaper-506f1651e549c290142df8d1e2e8ea831bc381c0.tar.gz
Paper-506f1651e549c290142df8d1e2e8ea831bc381c0.zip
Don't store removed components in multiple places (#11091)
Diffstat (limited to 'patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch')
-rw-r--r--patches/server/0979-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch47
1 files changed, 47 insertions, 0 deletions
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 <[email protected]>
+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<BlockPos, org.bukkit.craftbukkit.block.CraftBlockState> capturedBlockStates = new java.util.LinkedHashMap<>(); // Paper
+ public Map<BlockPos, BlockEntity> capturedTileEntities = new java.util.LinkedHashMap<>(); // Paper - Retain block place order when capturing blockstates
+ public List<ItemEntity> 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);