-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix Cancelling BlockPlaceEvent calling onRemove (#10773)
- Loading branch information
Showing
1 changed file
with
47 additions
and
0 deletions.
There are no files selected for viewing
47 changes: 47 additions & 0 deletions
47
patches/server/1050-Fix-cancelling-BlockPlaceEvent-calling-onRemove.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 893efb2c4a07c33d41e934279dd914a9dbd4ef79..58c38bc4361ddf24716f326b0c6fc626d434756e 100644 | ||
--- a/src/main/java/net/minecraft/world/item/ItemStack.java | ||
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java | ||
@@ -473,9 +473,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 0a8eeebb2d702ebcefd9f26cc0f41d1eab497902..14281a4e72f49dc4eb2ca3da8479c1f81a3a175d 100644 | ||
--- a/src/main/java/net/minecraft/world/level/Level.java | ||
+++ b/src/main/java/net/minecraft/world/level/Level.java | ||
@@ -150,6 +150,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 2a8609e33716949ff1877b6d10f64a9d7a7c81e9..14ee7b5b9b804bebd4e2a846b238547a28a36035 100644 | ||
--- a/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java | ||
+++ b/src/main/java/net/minecraft/world/level/chunk/LevelChunk.java | ||
@@ -452,7 +452,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); |