--- ../src-base/minecraft/net/minecraft/block/BlockPistonBase.java +++ ../src-work/minecraft/net/minecraft/block/BlockPistonBase.java @@ -21,6 +21,12 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +// CraftBukkit start +import org.bukkit.craftbukkit.block.CraftBlock; +import org.bukkit.event.block.BlockPistonRetractEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +// CraftBukkit end + public class BlockPistonBase extends Block { private final boolean isSticky; @@ -128,13 +134,37 @@ if (flag && !isExtended(l)) { - if (canExtend(p_150078_1_, p_150078_2_, p_150078_3_, p_150078_4_, i1)) + // CraftBukkit start + int length = canExtend_IntCB(p_150078_1_, p_150078_2_, p_150078_3_, p_150078_4_, i1); + + if (length >= 0) { + org.bukkit.block.Block block = p_150078_1_.getWorld().getBlockAt(p_150078_2_, p_150078_3_, p_150078_4_); + BlockPistonExtendEvent event = new BlockPistonExtendEvent(block, length, CraftBlock.notchToBlockFace(i1)); + p_150078_1_.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + + // CraftBukkit end p_150078_1_.addBlockEvent(p_150078_2_, p_150078_3_, p_150078_4_, this, 0, i1); } } else if (!flag && isExtended(l)) { + // CraftBukkit start + org.bukkit.block.Block block = p_150078_1_.getWorld().getBlockAt(p_150078_2_, p_150078_3_, p_150078_4_); + BlockPistonRetractEvent event = new BlockPistonRetractEvent(block, CraftBlock.notchToBlockFace(i1)); + p_150078_1_.getServer().getPluginManager().callEvent(event); + + if (event.isCancelled()) + { + return; + } + + // CraftBukkit end p_150078_1_.setBlockMetadataWithNotify(p_150078_2_, p_150078_3_, p_150078_4_, i1, 2); p_150078_1_.addBlockEvent(p_150078_2_, p_150078_3_, p_150078_4_, this, 1, i1); } @@ -297,6 +327,11 @@ public static int getPistonOrientation(int p_150076_0_) { + if ((p_150076_0_ & 7) >= Facing.oppositeSide.length) + { + return 7; // CraftBukkit - check for AIOOB on piston data + } + return p_150076_0_ & 7; } @@ -366,7 +401,13 @@ } } - private static boolean canExtend(World p_150077_0_, int p_150077_1_, int p_150077_2_, int p_150077_3_, int p_150077_4_) + // Cauldron start - vanilla compatibility + private static boolean canExtend(World world, int i, int j, int k, int l) { + return canExtend_IntCB(world, i, j, k, l) >= 0; + } + // Cauldron end + + private static int canExtend_IntCB(World p_150077_0_, int p_150077_1_, int p_150077_2_, int p_150077_3_, int p_150077_4_) // CraftBukkit int -> boolean { int i1 = p_150077_1_ + Facing.offsetsXForSide[p_150077_4_]; int j1 = p_150077_2_ + Facing.offsetsYForSide[p_150077_4_]; @@ -379,7 +420,7 @@ { if (j1 <= 0 || j1 >= p_150077_0_.getHeight()) { - return false; + return -1; // CraftBukkit } Block block = p_150077_0_.getBlock(i1, j1, k1); @@ -388,14 +429,14 @@ { if (!canPushBlock(block, p_150077_0_, i1, j1, k1, true)) { - return false; + return -1; // CraftBukkit } if (block.getMobilityFlag() != 1) { if (l1 == 12) { - return false; + return -1; // CraftBukkit } i1 += Facing.offsetsXForSide[p_150077_4_]; @@ -407,7 +448,7 @@ } } - return true; + return l1; // CraftBukkit } }