Properly track block update flags (actually fixes #5038)

This commit is contained in:
Shane Freeder 2021-01-11 19:08:03 +00:00
parent 2b06877898
commit 630fa37394
2 changed files with 1 additions and 47 deletions

View file

@ -1,47 +0,0 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Shane Freeder <theboyetronic@gmail.com>
Date: Tue, 22 Dec 2020 22:41:12 +0000
Subject: [PATCH] Do not perform neighbour updates when using debug stick
CB blindly drops any update flags when recording block modifications,
this causes the debug stick to blindly update neighbouring blocks on usage
in order to control this, we will special case this item, however, this
ideally should be fixed by recording the actual update flags used,
but will induce ABI breaks...
This patch also maintains the behavior of the BlockPlaceEvent, this
behavior will NOT be guaranteed in the future, however.
diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -0,0 +0,0 @@ public final class ItemStack {
}
public EnumInteractionResult placeItem(ItemActionContext itemactioncontext, EnumHand enumhand) { // CraftBukkit - add hand
+ boolean doPhysicsUpdate = true; // Paper
EntityHuman entityhuman = itemactioncontext.getEntity();
BlockPosition blockposition = itemactioncontext.getClickPosition();
ShapeDetectorBlock shapedetectorblock = new ShapeDetectorBlock(itemactioncontext.getWorld(), blockposition, false);
@@ -0,0 +0,0 @@ public final class ItemStack {
// special case bonemeal
if (this.getItem() == Items.BONE_MEAL) {
world.captureTreeGeneration = true;
+ // Paper start
+ } else if (this.getItem() instanceof ItemDebugStick) {
+ doPhysicsUpdate = false;
}
+ // Paper end
}
Item item = this.getItem();
EnumInteractionResult enuminteractionresult = item.a(itemactioncontext);
@@ -0,0 +0,0 @@ public final class ItemStack {
block.getBlock().onPlace(block, world, newblockposition, oldBlock, true, itemactioncontext); // Paper - pass itemactioncontext
}
- world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getType(newblockposition), updateFlag, 512); // send null chunk as chunk.k() returns false by this point
+ world.notifyAndUpdatePhysics(newblockposition, null, oldBlock, block, world.getType(newblockposition), updateFlag | (doPhysicsUpdate ? 0 : 16), 512); // send null chunk as chunk.k() returns false by this point // Paper
}
// Special case juke boxes as they update their tile entity. Copied from ItemRecord.

View file

@ -45,6 +45,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
if (this.captureBlockStates && !this.capturedBlockStates.containsKey(blockposition)) {
- CapturedBlockState blockstate = CapturedBlockState.getBlockState(this, blockposition, i);
+ CraftBlockState blockstate = (CraftBlockState) world.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()).getState(); // Paper - use CB getState to get a suitable snapshot
+ blockstate.setFlag(i); // Paper - set flag
this.capturedBlockStates.put(blockposition.immutableCopy(), blockstate);
captured = true;
}