From 3fbf4d3b5f3c5b74b73ba761ec278c9bdff448f5 Mon Sep 17 00:00:00 2001 From: Nate Mortensen Date: Sun, 25 May 2014 21:11:34 -0600 Subject: Fix ItemStack state during BlockPlaceEvent. Fixes BUKKIT-5632 --- src/main/java/net/minecraft/server/BlockSapling.java | 3 +-- src/main/java/net/minecraft/server/ItemStack.java | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main/java/net/minecraft/server/BlockSapling.java b/src/main/java/net/minecraft/server/BlockSapling.java index 22197bb8..4152bd70 100644 --- a/src/main/java/net/minecraft/server/BlockSapling.java +++ b/src/main/java/net/minecraft/server/BlockSapling.java @@ -34,8 +34,7 @@ public class BlockSapling extends BlockPlant implements IBlockFragilePlantElemen this.grow(world, i, j, k, random); // CraftBukkit start world.captureTreeGeneration = false; - if (world.capturedBlockStates.size() > 0) - { + if (world.capturedBlockStates.size() > 0) { TreeType treeType = BlockSapling.treeType; BlockSapling.treeType = null; Location location = new Location(world.getWorld(), i, j, k); diff --git a/src/main/java/net/minecraft/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java index bae352b2..73428488 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -100,6 +100,10 @@ public final class ItemStack { } } boolean flag = this.getItem().interactWith(this, entityhuman, world, i, j, k, l, f, f1, f2); + int newData = this.getData(); + int newCount = this.count; + this.count = count; + this.setData(data); world.captureBlockStates = false; if (flag && world.captureTreeGeneration && world.capturedBlockStates.size() > 0) { world.captureTreeGeneration = false; @@ -114,6 +118,11 @@ public final class ItemStack { org.bukkit.Bukkit.getPluginManager().callEvent(event); } if (event == null || !event.isCancelled()) { + // Change the stack to its new contents if it hasn't been tampered with. + if (this.count == count && this.getData() == data) { + this.setData(newData); + this.count = newCount; + } for (BlockState blockstate : blocks) { blockstate.update(true); } @@ -139,10 +148,12 @@ public final class ItemStack { for (BlockState blockstate : blocks) { blockstate.update(true, false); } - // make sure to restore stack after cancel - this.setData(data); - this.count = count; } else { + // Change the stack to its new contents if it hasn't been tampered with. + if (this.count == count && this.getData() == data) { + this.setData(newData); + this.count = newCount; + } for (BlockState blockstate : blocks) { int x = blockstate.getX(); int y = blockstate.getY(); -- cgit v1.2.3