From 9ba0ddc29269093e78a02058e836991dc7ad9480 Mon Sep 17 00:00:00 2001 From: feildmaster Date: Fri, 18 Jan 2013 23:07:28 -0600 Subject: [PATCH] Refactor processBlockPlace logic. Fixes BUKKIT-3406 and BUKKIT-3454 The previous logic was faulty since it lost the logic of "placing" the block. It was also taking into account data that could have been changed outside of the processing of this event, which is irrelevant to the processing of this event. --- .../java/net/minecraft/server/BlockPumpkin.java | 1 - .../net/minecraft/server/BlockRedstoneWire.java | 1 - src/main/java/net/minecraft/server/Chunk.java | 4 ++-- .../java/net/minecraft/server/ItemBlock.java | 16 ++++++++++++---- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/minecraft/server/BlockPumpkin.java b/src/main/java/net/minecraft/server/BlockPumpkin.java index 2b71464aa..f848a0795 100644 --- a/src/main/java/net/minecraft/server/BlockPumpkin.java +++ b/src/main/java/net/minecraft/server/BlockPumpkin.java @@ -40,7 +40,6 @@ public class BlockPumpkin extends BlockDirectional { public void onPlace(World world, int i, int j, int k) { super.onPlace(world, i, j, k); - if (world.suppressPhysics) return; // CraftBukkit if (world.getTypeId(i, j - 1, k) == Block.SNOW_BLOCK.id && world.getTypeId(i, j - 2, k) == Block.SNOW_BLOCK.id) { if (!world.isStatic) { // CraftBukkit start - use BlockStateListPopulator diff --git a/src/main/java/net/minecraft/server/BlockRedstoneWire.java b/src/main/java/net/minecraft/server/BlockRedstoneWire.java index 0f821b9b0..024be8bec 100644 --- a/src/main/java/net/minecraft/server/BlockRedstoneWire.java +++ b/src/main/java/net/minecraft/server/BlockRedstoneWire.java @@ -196,7 +196,6 @@ public class BlockRedstoneWire extends Block { } public void onPlace(World world, int i, int j, int k) { - if (world.suppressPhysics) return; // CraftBukkit super.onPlace(world, i, j, k); if (!world.isStatic) { this.l(world, i, j, k); diff --git a/src/main/java/net/minecraft/server/Chunk.java b/src/main/java/net/minecraft/server/Chunk.java index 0a1773487..06e3d9621 100644 --- a/src/main/java/net/minecraft/server/Chunk.java +++ b/src/main/java/net/minecraft/server/Chunk.java @@ -429,8 +429,8 @@ public class Chunk { if (l != 0) { if (!this.world.isStatic) { - // CraftBukkit start - Don't extend piston until data is set - if (!(Block.byId[l] instanceof BlockPiston) || i2 != 0) { + // CraftBukkit start - Don't extend piston until data is set, don't "place" if we're processing the event + if (!this.world.suppressPhysics && (!(Block.byId[l] instanceof BlockPiston) || i2 != 0)) { Block.byId[l].onPlace(this.world, j2, j, k2); } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/ItemBlock.java b/src/main/java/net/minecraft/server/ItemBlock.java index 05a1567ff..85bdbed46 100644 --- a/src/main/java/net/minecraft/server/ItemBlock.java +++ b/src/main/java/net/minecraft/server/ItemBlock.java @@ -80,7 +80,7 @@ public class ItemBlock extends Item { org.bukkit.block.BlockState blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(world, x, y, z); world.suppressPhysics = true; - world.setTypeIdAndData(x, y, z, id, data); + world.setRawTypeIdAndData(x, y, z, id, data); org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockstate, x, y, z); if (event.isCancelled() || !event.canBuild()) { @@ -90,12 +90,20 @@ public class ItemBlock extends Item { } world.suppressPhysics = false; - world.applyPhysics(x, y, z, world.getTypeId(x, y, z)); - Block block = Block.byId[world.getTypeId(x, y, z)]; + int newId = world.getTypeId(x, y, z); + int newData = world.getData(x, y, z); + + Block block = Block.byId[newId]; + if (block != null) { + block.onPlace(world, x, y, z); + } + + world.update(x, y, z, newId); + if (block != null) { block.postPlace(world, x, y, z, entityhuman); - block.postPlace(world, x, y, z, world.getData(x, y, z)); + block.postPlace(world, x, y, z, newData); world.makeSound((double) ((float) x + 0.5F), (double) ((float) y + 0.5F), (double) ((float) z + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F); }