geforkt von Mirrors/Paper
5963da294f
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.
83 Zeilen
2.6 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|
|
}
|