diff --git a/src/main/java/net/minecraft/server/BlockButtonAbstract.java b/src/main/java/net/minecraft/server/BlockButtonAbstract.java index b8f62e5b9f..bdc48ffd43 100644 --- a/src/main/java/net/minecraft/server/BlockButtonAbstract.java +++ b/src/main/java/net/minecraft/server/BlockButtonAbstract.java @@ -238,15 +238,6 @@ public abstract class BlockButtonAbstract extends Block { if (!world.isStatic) { if (this.a) { if ((world.getData(i, j, k) & 8) == 0) { - // CraftBukkit start - Call interaction when entities (currently arrows) hit wooden buttons - EntityInteractEvent event = new EntityInteractEvent(entity.getBukkitEntity(), world.getWorld().getBlockAt(i, j, k)); - world.getServer().getPluginManager().callEvent(event); - - if (event.isCancelled()) { - return; - } - // CraftBukkit end - this.n(world, i, j, k); } } @@ -262,6 +253,30 @@ public abstract class BlockButtonAbstract extends Block { List list = world.a(EntityArrow.class, AxisAlignedBB.a().a((double) i + this.minX, (double) j + this.minY, (double) k + this.minZ, (double) i + this.maxX, (double) j + this.maxY, (double) k + this.maxZ)); boolean flag1 = !list.isEmpty(); + // CraftBukkit start - Call interact event when arrows turn on wooden buttons + if (flag != flag1 && flag1) { + org.bukkit.block.Block block = world.getWorld().getBlockAt(i, j, k); + boolean allowed = false; + + // If all of the events are cancelled block the button press, else allow + for (Object object : list) { + if (object != null) { + EntityInteractEvent event = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); + world.getServer().getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + allowed = true; + break; + } + } + } + + if (!allowed) { + return; + } + } + // CraftBukkit end + if (flag1 && !flag) { world.setData(i, j, k, i1 | 8, 3); this.d(world, i, j, k, i1); diff --git a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java index ba7b66053b..3b9de8a7b0 100644 --- a/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java +++ b/src/main/java/net/minecraft/server/BlockPressurePlateBinary.java @@ -43,7 +43,7 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); - // CraftBukkit start + // CraftBukkit start - Fire interact event when turning on a pressure plate org.bukkit.World bworld = world.getWorld(); org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); org.bukkit.event.Cancellable cancellable; @@ -55,8 +55,9 @@ public class BlockPressurePlateBinary extends BlockPressurePlateAbstract { manager.callEvent((EntityInteractEvent) cancellable); } + // We only want to block turning the plate on if all events are cancelled if (cancellable.isCancelled()) { - return 0; + continue; } // CraftBukkit end diff --git a/src/main/java/net/minecraft/server/BlockTripwire.java b/src/main/java/net/minecraft/server/BlockTripwire.java index 520b4e3efa..f020300f7f 100644 --- a/src/main/java/net/minecraft/server/BlockTripwire.java +++ b/src/main/java/net/minecraft/server/BlockTripwire.java @@ -147,31 +147,37 @@ public class BlockTripwire extends Block { } } - // CraftBukkit start - org.bukkit.World bworld = world.getWorld(); - org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); + // CraftBukkit start - Call interact even when triggering connected tripwire + if (flag != flag1 && flag1 && (world.getData(i, j, k) & 4) == 4) { + org.bukkit.World bworld = world.getWorld(); + org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager(); + org.bukkit.block.Block block = bworld.getBlockAt(i, j, k); + boolean allowed = false; - if (flag != flag1) { - if (flag1) { - for (Object object : list) { - if (object != null) { - org.bukkit.event.Cancellable cancellable; + // If all of the events are cancelled block the tripwire trigger, else allow + for (Object object : list) { + if (object != null) { + org.bukkit.event.Cancellable cancellable; - if (object instanceof EntityHuman) { - cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); - } else if (object instanceof Entity) { - cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), bworld.getBlockAt(i, j, k)); - manager.callEvent((EntityInteractEvent) cancellable); - } else { - continue; - } + if (object instanceof EntityHuman) { + cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, i, j, k, -1, null); + } else if (object instanceof Entity) { + cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block); + manager.callEvent((EntityInteractEvent) cancellable); + } else { + continue; + } - if (cancellable.isCancelled()) { - return; - } + if (!cancellable.isCancelled()) { + allowed = true; + break; } } } + + if (!allowed) { + return; + } } // CraftBukkit end