diff options
author | feildmaster <admin@feildmaster.com> | 2013-01-18 23:07:28 -0600 |
---|---|---|
committer | feildmaster <admin@feildmaster.com> | 2013-01-19 08:14:17 -0600 |
commit | 9ba0ddc29269093e78a02058e836991dc7ad9480 (patch) | |
tree | fd8b2073b62807b9b199d3bfb1375ae881945489 /src/main | |
parent | 6a499c8589abd6f44e49d02339aa2fa503a377b1 (diff) | |
download | craftbukkit-9ba0ddc29269093e78a02058e836991dc7ad9480.tar craftbukkit-9ba0ddc29269093e78a02058e836991dc7ad9480.tar.gz craftbukkit-9ba0ddc29269093e78a02058e836991dc7ad9480.tar.lz craftbukkit-9ba0ddc29269093e78a02058e836991dc7ad9480.tar.xz craftbukkit-9ba0ddc29269093e78a02058e836991dc7ad9480.zip |
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.
Diffstat (limited to 'src/main')
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 2b71464a..f848a079 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 0f821b9b..024be8be 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 0a177348..06e3d962 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 05a1567f..85bdbed4 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); } |