Fixes bug with null flags

This class is called before all the flags are initialized so it cannot
reference them directly. This fixes the situation by using Strings, but
it can be improved.
This commit is contained in:
tastybento 2019-11-06 08:03:22 -08:00
parent 21916b5a59
commit 86e39a801e

View File

@ -3,6 +3,7 @@ package world.bentobox.bentobox.listeners.flags.protection;
import java.util.EnumMap;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.bukkit.Location;
import org.bukkit.Material;
@ -30,115 +31,115 @@ import world.bentobox.bentobox.lists.Flags;
*/
public class BlockInteractionListener extends FlagListener {
private final Map<Material, Flag> inHandItems;
private final Map<Material, String> inHandItems;
private final Map<Material, Flag> clickedBlocks;
private final Map<Material, String> clickedBlocks;
public BlockInteractionListener() {
inHandItems = new EnumMap<>(Material.class);
inHandItems.put(Material.ENDER_PEARL, Flags.ENDER_PEARL);
inHandItems.put(Material.BONE_MEAL, Flags.PLACE_BLOCKS);
inHandItems.put(Material.ENDER_PEARL, "ENDER_PEARL");
inHandItems.put(Material.BONE_MEAL, "PLACE_BLOCKS");
clickedBlocks = new EnumMap<>(Material.class);
clickedBlocks.put(Material.ANVIL, Flags.ANVIL);
clickedBlocks.put(Material.CHIPPED_ANVIL, Flags.ANVIL);
clickedBlocks.put(Material.DAMAGED_ANVIL, Flags.ANVIL);
clickedBlocks.put(Material.BEACON, Flags.BEACON);
clickedBlocks.put(Material.BLACK_BED, Flags.BED);
clickedBlocks.put(Material.BLUE_BED, Flags.BED);
clickedBlocks.put(Material.BROWN_BED, Flags.BED);
clickedBlocks.put(Material.CYAN_BED, Flags.BED);
clickedBlocks.put(Material.GRAY_BED, Flags.BED);
clickedBlocks.put(Material.GREEN_BED, Flags.BED);
clickedBlocks.put(Material.LIGHT_BLUE_BED, Flags.BED);
clickedBlocks.put(Material.LIGHT_GRAY_BED, Flags.BED);
clickedBlocks.put(Material.LIME_BED, Flags.BED);
clickedBlocks.put(Material.MAGENTA_BED, Flags.BED);
clickedBlocks.put(Material.ORANGE_BED, Flags.BED);
clickedBlocks.put(Material.PINK_BED, Flags.BED);
clickedBlocks.put(Material.PURPLE_BED, Flags.BED);
clickedBlocks.put(Material.RED_BED, Flags.BED);
clickedBlocks.put(Material.WHITE_BED, Flags.BED);
clickedBlocks.put(Material.YELLOW_BED, Flags.BED);
clickedBlocks.put(Material.BREWING_STAND, Flags.BREWING);
clickedBlocks.put(Material.CAULDRON, Flags.BREWING);
clickedBlocks.put(Material.BARREL, Flags.CONTAINER);
clickedBlocks.put(Material.CHEST, Flags.CONTAINER);
clickedBlocks.put(Material.CHEST_MINECART, Flags.CONTAINER);
clickedBlocks.put(Material.TRAPPED_CHEST, Flags.CONTAINER);
clickedBlocks.put(Material.BLACK_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.BLUE_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.BROWN_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.CYAN_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.GRAY_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.GREEN_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.LIGHT_BLUE_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.LIME_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.PINK_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.MAGENTA_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.ORANGE_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.PURPLE_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.RED_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.LIGHT_GRAY_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.WHITE_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.YELLOW_SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.SHULKER_BOX, Flags.CONTAINER);
clickedBlocks.put(Material.FLOWER_POT, Flags.CONTAINER);
clickedBlocks.put(Material.COMPOSTER, Flags.CONTAINER);
clickedBlocks.put(Material.DISPENSER, Flags.DISPENSER);
clickedBlocks.put(Material.DROPPER, Flags.DROPPER);
clickedBlocks.put(Material.HOPPER, Flags.HOPPER);
clickedBlocks.put(Material.HOPPER_MINECART, Flags.HOPPER);
clickedBlocks.put(Material.ACACIA_DOOR, Flags.DOOR);
clickedBlocks.put(Material.BIRCH_DOOR, Flags.DOOR);
clickedBlocks.put(Material.DARK_OAK_DOOR, Flags.DOOR);
clickedBlocks.put(Material.IRON_DOOR, Flags.DOOR);
clickedBlocks.put(Material.JUNGLE_DOOR, Flags.DOOR);
clickedBlocks.put(Material.SPRUCE_DOOR, Flags.DOOR);
clickedBlocks.put(Material.OAK_DOOR, Flags.DOOR);
clickedBlocks.put(Material.ACACIA_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.BIRCH_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.DARK_OAK_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.OAK_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.JUNGLE_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.SPRUCE_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.IRON_TRAPDOOR, Flags.TRAPDOOR);
clickedBlocks.put(Material.ACACIA_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.BIRCH_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.DARK_OAK_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.OAK_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.JUNGLE_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.SPRUCE_FENCE_GATE, Flags.GATE);
clickedBlocks.put(Material.BLAST_FURNACE, Flags.FURNACE);
clickedBlocks.put(Material.CAMPFIRE, Flags.FURNACE);
clickedBlocks.put(Material.FURNACE_MINECART, Flags.FURNACE);
clickedBlocks.put(Material.FURNACE, Flags.FURNACE);
clickedBlocks.put(Material.SMOKER, Flags.FURNACE);
clickedBlocks.put(Material.ENCHANTING_TABLE, Flags.ENCHANTING);
clickedBlocks.put(Material.ENDER_CHEST, Flags.ENDER_CHEST);
clickedBlocks.put(Material.JUKEBOX, Flags.JUKEBOX);
clickedBlocks.put(Material.NOTE_BLOCK, Flags.NOTE_BLOCK);
clickedBlocks.put(Material.CRAFTING_TABLE, Flags.CRAFTING);
clickedBlocks.put(Material.CARTOGRAPHY_TABLE, Flags.CRAFTING);
clickedBlocks.put(Material.GRINDSTONE, Flags.CRAFTING);
clickedBlocks.put(Material.STONECUTTER, Flags.CRAFTING);
clickedBlocks.put(Material.LOOM, Flags.CRAFTING);
clickedBlocks.put(Material.STONE_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.ACACIA_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.BIRCH_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.DARK_OAK_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.JUNGLE_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.OAK_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.SPRUCE_BUTTON, Flags.BUTTON);
clickedBlocks.put(Material.LEVER, Flags.LEVER);
clickedBlocks.put(Material.REPEATER, Flags.REDSTONE);
clickedBlocks.put(Material.COMPARATOR, Flags.REDSTONE);
clickedBlocks.put(Material.DAYLIGHT_DETECTOR, Flags.REDSTONE);
clickedBlocks.put(Material.DRAGON_EGG, Flags.DRAGON_EGG);
clickedBlocks.put(Material.END_PORTAL_FRAME, Flags.PLACE_BLOCKS);
clickedBlocks.put(Material.ITEM_FRAME, Flags.ITEM_FRAME);
clickedBlocks.put(Material.LECTERN, Flags.BREAK_BLOCKS);
clickedBlocks.put(Material.SWEET_BERRY_BUSH, Flags.BREAK_BLOCKS);
clickedBlocks.put(Material.CAKE, Flags.CAKE);
clickedBlocks.put(Material.ANVIL, "ANVIL");
clickedBlocks.put(Material.CHIPPED_ANVIL, "ANVIL");
clickedBlocks.put(Material.DAMAGED_ANVIL, "ANVIL");
clickedBlocks.put(Material.BEACON, "BEACON");
clickedBlocks.put(Material.BLACK_BED, "BED");
clickedBlocks.put(Material.BLUE_BED, "BED");
clickedBlocks.put(Material.BROWN_BED, "BED");
clickedBlocks.put(Material.CYAN_BED, "BED");
clickedBlocks.put(Material.GRAY_BED, "BED");
clickedBlocks.put(Material.GREEN_BED, "BED");
clickedBlocks.put(Material.LIGHT_BLUE_BED, "BED");
clickedBlocks.put(Material.LIGHT_GRAY_BED, "BED");
clickedBlocks.put(Material.LIME_BED, "BED");
clickedBlocks.put(Material.MAGENTA_BED, "BED");
clickedBlocks.put(Material.ORANGE_BED, "BED");
clickedBlocks.put(Material.PINK_BED, "BED");
clickedBlocks.put(Material.PURPLE_BED, "BED");
clickedBlocks.put(Material.RED_BED, "BED");
clickedBlocks.put(Material.WHITE_BED, "BED");
clickedBlocks.put(Material.YELLOW_BED, "BED");
clickedBlocks.put(Material.BREWING_STAND, "BREWING");
clickedBlocks.put(Material.CAULDRON, "BREWING");
clickedBlocks.put(Material.BARREL, "CONTAINER");
clickedBlocks.put(Material.CHEST, "CONTAINER");
clickedBlocks.put(Material.CHEST_MINECART, "CONTAINER");
clickedBlocks.put(Material.TRAPPED_CHEST, "CONTAINER");
clickedBlocks.put(Material.BLACK_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.BLUE_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.BROWN_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.CYAN_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.GRAY_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.GREEN_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.LIGHT_BLUE_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.LIME_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.PINK_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.MAGENTA_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.ORANGE_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.PURPLE_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.RED_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.LIGHT_GRAY_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.WHITE_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.YELLOW_SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.SHULKER_BOX, "CONTAINER");
clickedBlocks.put(Material.FLOWER_POT, "CONTAINER");
clickedBlocks.put(Material.COMPOSTER, "CONTAINER");
clickedBlocks.put(Material.DISPENSER, "DISPENSER");
clickedBlocks.put(Material.DROPPER, "DROPPER");
clickedBlocks.put(Material.HOPPER, "HOPPER");
clickedBlocks.put(Material.HOPPER_MINECART, "HOPPER");
clickedBlocks.put(Material.ACACIA_DOOR, "DOOR");
clickedBlocks.put(Material.BIRCH_DOOR, "DOOR");
clickedBlocks.put(Material.DARK_OAK_DOOR, "DOOR");
clickedBlocks.put(Material.IRON_DOOR, "DOOR");
clickedBlocks.put(Material.JUNGLE_DOOR, "DOOR");
clickedBlocks.put(Material.SPRUCE_DOOR, "DOOR");
clickedBlocks.put(Material.OAK_DOOR, "DOOR");
clickedBlocks.put(Material.ACACIA_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.BIRCH_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.DARK_OAK_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.OAK_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.JUNGLE_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.SPRUCE_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.IRON_TRAPDOOR, "TRAPDOOR");
clickedBlocks.put(Material.ACACIA_FENCE_GATE, "GATE");
clickedBlocks.put(Material.BIRCH_FENCE_GATE, "GATE");
clickedBlocks.put(Material.DARK_OAK_FENCE_GATE, "GATE");
clickedBlocks.put(Material.OAK_FENCE_GATE, "GATE");
clickedBlocks.put(Material.JUNGLE_FENCE_GATE, "GATE");
clickedBlocks.put(Material.SPRUCE_FENCE_GATE, "GATE");
clickedBlocks.put(Material.BLAST_FURNACE, "FURNACE");
clickedBlocks.put(Material.CAMPFIRE, "FURNACE");
clickedBlocks.put(Material.FURNACE_MINECART, "FURNACE");
clickedBlocks.put(Material.FURNACE, "FURNACE");
clickedBlocks.put(Material.SMOKER, "FURNACE");
clickedBlocks.put(Material.ENCHANTING_TABLE, "ENCHANTING");
clickedBlocks.put(Material.ENDER_CHEST, "ENDER_CHEST");
clickedBlocks.put(Material.JUKEBOX, "JUKEBOX");
clickedBlocks.put(Material.NOTE_BLOCK, "NOTE_BLOCK");
clickedBlocks.put(Material.CRAFTING_TABLE, "CRAFTING");
clickedBlocks.put(Material.CARTOGRAPHY_TABLE, "CRAFTING");
clickedBlocks.put(Material.GRINDSTONE, "CRAFTING");
clickedBlocks.put(Material.STONECUTTER, "CRAFTING");
clickedBlocks.put(Material.LOOM, "CRAFTING");
clickedBlocks.put(Material.STONE_BUTTON, "BUTTON");
clickedBlocks.put(Material.ACACIA_BUTTON, "BUTTON");
clickedBlocks.put(Material.BIRCH_BUTTON, "BUTTON");
clickedBlocks.put(Material.DARK_OAK_BUTTON, "BUTTON");
clickedBlocks.put(Material.JUNGLE_BUTTON, "BUTTON");
clickedBlocks.put(Material.OAK_BUTTON, "BUTTON");
clickedBlocks.put(Material.SPRUCE_BUTTON, "BUTTON");
clickedBlocks.put(Material.LEVER, "LEVER");
clickedBlocks.put(Material.REPEATER, "REDSTONE");
clickedBlocks.put(Material.COMPARATOR, "REDSTONE");
clickedBlocks.put(Material.DAYLIGHT_DETECTOR, "REDSTONE");
clickedBlocks.put(Material.DRAGON_EGG, "DRAGON_EGG");
clickedBlocks.put(Material.END_PORTAL_FRAME, "PLACE_BLOCKS");
clickedBlocks.put(Material.ITEM_FRAME, "ITEM_FRAME");
clickedBlocks.put(Material.LECTERN, "BREAK_BLOCKS");
clickedBlocks.put(Material.SWEET_BERRY_BUSH, "BREAK_BLOCKS");
clickedBlocks.put(Material.CAKE, "CAKE");
}
/**
@ -166,7 +167,7 @@ public class BlockInteractionListener extends FlagListener {
if (e.getItem() != null && !e.getItem().getType().equals(Material.AIR)) {
// Boats
if (e.getItem().getType().name().endsWith("_BOAT")) {
checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.PLACE_BLOCKS);
checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), Flags.BOAT);
}
// Spawn eggs
else if (e.getItem().getType().name().endsWith("_SPAWN_EGG")) {
@ -174,11 +175,14 @@ public class BlockInteractionListener extends FlagListener {
}
// Other items
else if (inHandItems.containsKey(e.getItem().getType())) {
checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), inHandItems.get(e.getItem().getType()));
getInHandItemFlag(e.getItem().getType()).ifPresent(f -> checkIsland(e, e.getPlayer(), e.getClickedBlock().getLocation(), f));
}
}
}
private Optional<Flag> getInHandItemFlag(Material type) {
return BentoBox.getInstance().getFlagsManager().getFlag(inHandItems.get(type));
}
/**
* Check if an action can occur on a clicked block
* @param e - event called
@ -192,8 +196,9 @@ public class BlockInteractionListener extends FlagListener {
checkIsland(e, player, loc, Flags.CONTAINER);
return;
}
if (clickedBlocks.containsKey(type)) {
checkIsland(e, player, loc, clickedBlocks.get(type));
getClickedBlockFlag(type).ifPresent(f -> checkIsland(e, player, loc, f));
}
if (stringFlags.containsKey(type.name())) {
Optional<Flag> f = BentoBox.getInstance().getFlagsManager().getFlag(stringFlags.get(type.name()));
@ -201,6 +206,10 @@ public class BlockInteractionListener extends FlagListener {
}
}
private Optional<Flag> getClickedBlockFlag(Material type) {
return BentoBox.getInstance().getFlagsManager().getFlag(clickedBlocks.get(type));
}
/**
* When breaking blocks is allowed, this protects
* specific blocks from being broken, which would bypass the protection.
@ -233,16 +242,24 @@ public class BlockInteractionListener extends FlagListener {
}
/**
* @return the inHandItems
* @return the inHandItems with flag values
*/
public Map<Material, Flag> getInHandItems() {
return inHandItems;
return inHandItems.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey(),
e -> BentoBox.getInstance().getFlagsManager().getFlag(e.getValue()).orElse(null)
));
}
/**
* @return the clickedBlocks
* @return the clickedBlocks with flag values
*/
public Map<Material, Flag> getClickedBlocks() {
return clickedBlocks;
return clickedBlocks.entrySet().stream()
.collect(Collectors.toMap(
e -> e.getKey(),
e -> BentoBox.getInstance().getFlagsManager().getFlag(e.getValue()).orElse(null)
));
}
}