Fix dispenser workaround.

This commit is contained in:
wizjany 2019-06-02 12:12:57 -04:00
parent 1792bcb18a
commit 903a831248

View File

@ -64,6 +64,7 @@
import org.bukkit.block.Dropper; import org.bukkit.block.Dropper;
import org.bukkit.block.Hopper; import org.bukkit.block.Hopper;
import org.bukkit.block.PistonMoveReaction; import org.bukkit.block.PistonMoveReaction;
import org.bukkit.block.data.type.Dispenser;
import org.bukkit.entity.AreaEffectCloud; import org.bukkit.entity.AreaEffectCloud;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
@ -132,7 +133,6 @@
import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Dispenser;
import org.bukkit.projectiles.ProjectileSource; import org.bukkit.projectiles.ProjectileSource;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
@ -415,7 +415,7 @@ public void onPlayerInteract(PlayerInteractEvent event) {
placed = clicked.getRelative(event.getBlockFace()); placed = clicked.getRelative(event.getBlockFace());
// Re-used for dispensers // Re-used for dispensers
handleBlockRightClick(event, create(event.getPlayer()), item, clicked, event.getBlockFace(), placed); handleBlockRightClick(event, create(event.getPlayer()), item, clicked, placed);
} }
case LEFT_CLICK_BLOCK: case LEFT_CLICK_BLOCK:
@ -929,7 +929,7 @@ public void onBlockDispense(BlockDispenseEvent event) {
Dispenser dispenser = (Dispenser) dispenserBlock.getBlockData(); Dispenser dispenser = (Dispenser) dispenserBlock.getBlockData();
Block placed = dispenserBlock.getRelative(dispenser.getFacing()); Block placed = dispenserBlock.getRelative(dispenser.getFacing());
Block clicked = placed.getRelative(dispenser.getFacing()); Block clicked = placed.getRelative(dispenser.getFacing());
handleBlockRightClick(event, cause, item, clicked, dispenser.getFacing().getOppositeFace(), placed); handleBlockRightClick(event, cause, item, clicked, placed);
} }
} }
@ -979,16 +979,14 @@ public void onBlockExplode(BlockExplodeEvent event) {
* @param event the original event * @param event the original event
* @param cause the list of cause * @param cause the list of cause
* @param item the item * @param item the item
* @param clicked the clicked block
* @param faceClicked the face of the clicked block
* @param placed the placed block * @param placed the placed block
* @param <T> the event type * @param <T> the event type
*/ */
private static <T extends Event & Cancellable> void handleBlockRightClick(T event, Cause cause, @Nullable ItemStack item, Block clicked, BlockFace faceClicked, Block placed) { private static <T extends Event & Cancellable> void handleBlockRightClick(T event, Cause cause, @Nullable ItemStack item, Block clicked, Block placed) {
if (item != null && item.getType() == Material.TNT) { if (item != null && item.getType() == Material.TNT) {
// Workaround for a bug that allowed TNT to trigger instantly if placed // Workaround for a bug that allowed TNT to trigger instantly if placed
// next to redstone, without plugins getting the clicked place event // next to redstone, without plugins getting the clicked place event
// (not sure if this actually still happens) // (not sure if this actually still happens) -- note Jun 2019 - happens with dispensers still, tho not players
Events.fireToCancel(event, new UseBlockEvent(event, cause, clicked.getLocation(), Material.TNT)); Events.fireToCancel(event, new UseBlockEvent(event, cause, clicked.getLocation(), Material.TNT));
// Workaround for http://leaky.bukkit.org/issues/1034 // Workaround for http://leaky.bukkit.org/issues/1034
@ -1027,15 +1025,6 @@ private static <T extends Event & Cancellable> void handleBlockRightClick(T even
Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), Materials.getEntitySpawnEgg(item.getType()))); Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), Materials.getEntitySpawnEgg(item.getType())));
return; return;
} }
// Handle cocoa beans
if (item != null && item.getType() == Material.COCOA_BEANS) {
// CraftBukkit doesn't or didn't throw a clicked place for this
if (!(faceClicked == BlockFace.DOWN || faceClicked == BlockFace.UP)) {
Events.fireToCancel(event, new PlaceBlockEvent(event, cause, placed.getLocation(), Material.COCOA));
}
return;
}
} }
private static <T extends Event & Cancellable> void handleInventoryHolderUse(T originalEvent, Cause cause, InventoryHolder holder) { private static <T extends Event & Cancellable> void handleInventoryHolderUse(T originalEvent, Cause cause, InventoryHolder holder) {