Direct all BlockPlaceEvents to a singular location. Fixes BUKKIT-3438

By having a single function to process BlockPlacement logic, we make
it so that there is consistent behavior throughout all BlockPlace
events. This should allow for easier troubleshooting and less diffs
in source.

This also fixes BUKKIT-3463 by including the correct coordinates that
were clicked to the event.
This commit is contained in:
feildmaster
2013-01-27 10:44:32 -06:00
parent 528bbbdcd8
commit 899b9c17cc
13 changed files with 57 additions and 141 deletions

View File

@@ -1,7 +1,5 @@
package net.minecraft.server;
import org.bukkit.craftbukkit.block.CraftBlockState; // CraftBukkit
public class ItemReed extends Item {
private int id;
@@ -12,7 +10,7 @@ public class ItemReed extends Item {
}
public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
final int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
int i1 = world.getTypeId(i, j, k);
if (i1 == Block.SNOW.id) {
@@ -52,31 +50,10 @@ public class ItemReed extends Item {
Block block = Block.byId[this.id];
int j1 = block.getPlacedData(world, i, j, k, l, f, f1, f2, 0);
// CraftBukkit start - This executes the placement of the block
CraftBlockState replacedBlockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
// CraftBukkit start - redirect to common handler
ItemBlock.processBlockPlace(world, entityhuman, itemstack, i, j, k, this.id, j1, clickedX, clickedY, clickedZ);
/*
* @see net.minecraft.server.World#setTypeId(int i, int j, int k, int l)
*
* This replaces world.setTypeId(IIII), we're doing this because we need to
* hook between the 'placement' and the informing to 'world' so we can
* sanely undo this.
*
* Whenever the call to 'world.setTypeId' changes we need to figure out again what to
* replace this with.
*/
if (world.setRawTypeIdAndData(i, j, k, this.id, j1)) { // <-- world.e does this to place the block
org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, replacedBlockState, clickedX, clickedY, clickedZ);
if (event.isCancelled() || !event.canBuild()) {
// CraftBukkit - undo; this only has reed, repeater and pie blocks
world.setTypeIdAndData(i, j, k, replacedBlockState.getTypeId(), replacedBlockState.getRawData());
return true;
}
world.update(i, j, k, this.id); // <-- world.setTypeId does this on success (tell the world)
// CraftBukkit end
if (world.setTypeIdAndData(i, j, k, this.id, j1)) {
if (world.getTypeId(i, j, k) == this.id) {
Block.byId[this.id].postPlace(world, i, j, k, entityhuman);
Block.byId[this.id].postPlace(world, i, j, k, j1);
@@ -85,6 +62,8 @@ public class ItemReed extends Item {
world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getPlaceSound(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F);
--itemstack.count;
}
*/
// CraftBukkit end
}
return true;