Paper/src/main/java/net/minecraft/server/ItemSign.java
Wizjany 5963da294f Don't update physics until after the place event. Fixes BUKKIT-3316
If you cancel a BlockPlaceEvent for a sign the world is updated as if
the block was placed and then destroyed. To avoid this we set the block
without updating physics then apply the update after the event.
2012-12-27 15:22:19 -06:00

83 Zeilen
2.6 KiB
Java

package net.minecraft.server;
import org.bukkit.craftbukkit.block.CraftBlockState; // CraftBukkit
public class ItemSign extends Item {
public ItemSign(int i) {
super(i);
this.maxStackSize = 16;
this.a(CreativeModeTab.c);
}
public boolean interactWith(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l, float f, float f1, float f2) {
if (l == 0) {
return false;
} else if (!world.getMaterial(i, j, k).isBuildable()) {
return false;
} else {
int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
if (l == 1) {
++j;
}
if (l == 2) {
--k;
}
if (l == 3) {
++k;
}
if (l == 4) {
--i;
}
if (l == 5) {
++i;
}
if (!entityhuman.a(i, j, k, l, itemstack)) {
return false;
} else if (!Block.SIGN_POST.canPlace(world, i, j, k)) {
return false;
} else {
CraftBlockState blockState = CraftBlockState.getBlockState(world, i, j, k); // CraftBukkit
if (l == 1) {
int i1 = MathHelper.floor((double) ((entityhuman.yaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15;
// CraftBukkit start - sign
world.setRawTypeIdAndData(i, j, k, Block.SIGN_POST.id, i1);
} else {
world.setRawTypeIdAndData(i, j, k, Block.WALL_SIGN.id, l);
}
org.bukkit.event.block.BlockPlaceEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent(world, entityhuman, blockState, clickedX, clickedY, clickedZ);
if (event.isCancelled() || !event.canBuild()) {
event.getBlockPlaced().setTypeIdAndData(blockState.getTypeId(), blockState.getRawData(), false);
return false;
} else {
if (l == 1) {
world.update(i, j, k, Block.SIGN_POST.id);
} else {
world.update(i, j, k, Block.WALL_SIGN.id);
}
}
// CraftBukkit end
--itemstack.count;
TileEntitySign tileentitysign = (TileEntitySign) world.getTileEntity(i, j, k);
if (tileentitysign != null) {
entityhuman.a((TileEntity) tileentitysign);
}
return true;
}
}
}
}