diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java index a75ec74a..ad6b3639 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/listener/EventAbstractionListener.java @@ -1048,6 +1048,12 @@ public void onBlockDispense(BlockDispenseEvent event) { Block placed = dispenserBlock.getRelative(dispenser.getFacing()); Block clicked = placed.getRelative(dispenser.getFacing()); handleBlockRightClick(event, cause, item, clicked, placed); + + // handle special dispenser behavior + if (item != null && Materials.isShulkerBox(item.getType())) { + Events.fireToCancel(event, new PlaceBlockEvent(event, cause, placed.getLocation(), item.getType())); + return; + } } } diff --git a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java index 2cd8acad..c2da8c8e 100644 --- a/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java +++ b/worldguard-bukkit/src/main/java/com/sk89q/worldguard/bukkit/util/Materials.java @@ -52,27 +52,7 @@ public final class Materials { private static final Map MATERIAL_FLAGS = new EnumMap<>(Material.class); private static final Set DAMAGE_EFFECTS = new HashSet<>(); - private static Set shulkerBoxes = new HashSet<>(); - static { - shulkerBoxes.add(Material.SHULKER_BOX); - shulkerBoxes.add(Material.WHITE_SHULKER_BOX); - shulkerBoxes.add(Material.ORANGE_SHULKER_BOX); - shulkerBoxes.add(Material.MAGENTA_SHULKER_BOX); - shulkerBoxes.add(Material.LIGHT_BLUE_SHULKER_BOX); - shulkerBoxes.add(Material.YELLOW_SHULKER_BOX); - shulkerBoxes.add(Material.LIME_SHULKER_BOX); - shulkerBoxes.add(Material.PINK_SHULKER_BOX); - shulkerBoxes.add(Material.GRAY_SHULKER_BOX); - shulkerBoxes.add(Material.LIGHT_GRAY_SHULKER_BOX); - shulkerBoxes.add(Material.CYAN_SHULKER_BOX); - shulkerBoxes.add(Material.PURPLE_SHULKER_BOX); - shulkerBoxes.add(Material.BLUE_SHULKER_BOX); - shulkerBoxes.add(Material.BROWN_SHULKER_BOX); - shulkerBoxes.add(Material.GREEN_SHULKER_BOX); - shulkerBoxes.add(Material.RED_SHULKER_BOX); - shulkerBoxes.add(Material.BLACK_SHULKER_BOX); - ENTITY_ITEMS.put(EntityType.PAINTING, Material.PAINTING); ENTITY_ITEMS.put(EntityType.ARROW, Material.ARROW); ENTITY_ITEMS.put(EntityType.SNOWBALL, Material.SNOWBALL); @@ -747,12 +727,10 @@ public final class Materials { MATERIAL_FLAGS.put(Material.WEEPING_VINES_PLANT, 0); - // Fake tags - for (Material m : shulkerBoxes) { - MATERIAL_FLAGS.put(m, MODIFIED_ON_RIGHT); - } - // Generated via tag + for (Material shulkerBox : Tag.SHULKER_BOXES.getValues()) { + MATERIAL_FLAGS.put(shulkerBox, MODIFIED_ON_RIGHT); + } for (Material door : Tag.DOORS.getValues()) { MATERIAL_FLAGS.put(door, MODIFIED_ON_RIGHT); } @@ -1034,6 +1012,16 @@ public static boolean isBoat(Material material) { return Tag.ITEMS_BOATS.isTagged(material); } + /** + * Test whether the given material is a Shulker Box. + * + * @param material the material + * @return true if a Shulker Box block + */ + public static boolean isShulkerBox(Material material) { + return Tag.SHULKER_BOXES.isTagged(material); + } + /** * Test whether the given material is an inventory block. * @@ -1052,7 +1040,7 @@ public static boolean isInventoryBlock(Material material) { || material == Material.BARREL || material == Material.BLAST_FURNACE || material == Material.SMOKER - || shulkerBoxes.contains(material); + || Tag.SHULKER_BOXES.isTagged(material); } public static boolean isSpawnEgg(Material material) {