diff --git a/src/main/java/com/drtshock/playervaults/PlayerVaults.java b/src/main/java/com/drtshock/playervaults/PlayerVaults.java index c26cb6f..3ee4a6e 100644 --- a/src/main/java/com/drtshock/playervaults/PlayerVaults.java +++ b/src/main/java/com/drtshock/playervaults/PlayerVaults.java @@ -80,6 +80,7 @@ public class PlayerVaults extends JavaPlugin { // VaultViewInfo - Inventory private final HashMap openInventories = new HashMap<>(); private final Set blockedMats = new HashSet<>(); + private final Set blockedNames = new HashSet<>(); private boolean useVault; private YamlConfiguration signs; private File signsFile; @@ -345,6 +346,17 @@ private void loadConfig() { } } + // Clear just in case this is a reload. + blockedNames.clear(); + if (getConf().getItemBlocking().isEnabled()) { + for (String s : getConf().getItemBlocking().getNames()) { + if (s != null && !s.isEmpty()) { + blockedNames.add(s); + getLogger().log(Level.INFO, "Added {0} to list of blocked names.", s); + } + } + } + File lang = new File(this.getDataFolder(), "lang"); if (lang.exists()) { this.getLogger().warning("There is no clean way for us to migrate your old lang data."); @@ -494,6 +506,9 @@ public String getNameIfPlayer(String potentialUUID) { public boolean isBlockedMaterial(Material mat) { return blockedMats.contains(mat); } + public boolean isBlockedName(String name) { + return blockedNames.contains(name); + } /** * Tries to grab the server version as a string. diff --git a/src/main/java/com/drtshock/playervaults/config/file/Config.java b/src/main/java/com/drtshock/playervaults/config/file/Config.java index 71d8f23..9facc3d 100644 --- a/src/main/java/com/drtshock/playervaults/config/file/Config.java +++ b/src/main/java/com/drtshock/playervaults/config/file/Config.java @@ -48,6 +48,21 @@ public List getList() { } return Collections.unmodifiableList(list); } + + @Comment("Exact item names for blocked items, only effective if the feature is enabled.\n" + + " Useful for blocking custom items based on item name.") + private List names = new ArrayList() { + { + this.add("Named item to be blocked"); + } + }; + + public List getNames() { + if (this.names == null) { + this.names = new ArrayList<>(); + } + return Collections.unmodifiableList(names); + } } public class Economy { diff --git a/src/main/java/com/drtshock/playervaults/config/file/Translation.java b/src/main/java/com/drtshock/playervaults/config/file/Translation.java index 2667137..b861fc2 100644 --- a/src/main/java/com/drtshock/playervaults/config/file/Translation.java +++ b/src/main/java/com/drtshock/playervaults/config/file/Translation.java @@ -218,6 +218,7 @@ private static class Translations { private TL locked = TL.of("Vaults are currently locked while conversion occurs. Please try again in a moment!"); private TL help = TL.of("/pv "); private TL blockedItem = TL.of("{item} is blocked from vaults."); + private TL blockedItemName = TL.of("{name} is blocked from vaults."); private TL signsDisabled = TL.of("Vault signs are currently disabled."); private TL blockedBadItem = TL.of("This item is not allowed in a vault."); } @@ -350,6 +351,10 @@ public Translation(@NonNull PlayerVaults plugin) { return this.translations.blockedItem; } + public @NonNull TL blockedItemName() { + return this.translations.blockedItemName; + } + public @NonNull TL signsDisabled() { return this.translations.signsDisabled; } diff --git a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java index 77e6db9..1a1106b 100644 --- a/src/main/java/com/drtshock/playervaults/listeners/Listeners.java +++ b/src/main/java/com/drtshock/playervaults/listeners/Listeners.java @@ -132,10 +132,17 @@ public void onClick(InventoryClickEvent event) { if (item == null) { continue; } - if (!player.hasPermission("playervaults.bypassblockeditems") && PlayerVaults.getInstance().isBlockedMaterial(item.getType())) { - event.setCancelled(true); - this.plugin.getTL().blockedItem().title().with("item", item.getType().name()).send(player); - return; + if (!player.hasPermission("playervaults.bypassblockeditems")) { + if (PlayerVaults.getInstance().isBlockedMaterial(item.getType())) { + event.setCancelled(true); + this.plugin.getTL().blockedItem().title().with("item", item.getType().name()).send(player); + return; + } + else if (PlayerVaults.getInstance().isBlockedName(item.getItemMeta().getDisplayName())) { + event.setCancelled(true); + this.plugin.getTL().blockedItemName().title().with("name", item.getItemMeta().getDisplayName()).send(player); + return; + } } } } @@ -160,10 +167,17 @@ public void onDrag(InventoryDragEvent event) { String title = this.plugin.getVaultTitle(String.valueOf(num)); if ((inventoryTitle != null && inventoryTitle.equalsIgnoreCase(title)) && event.getNewItems() != null) { for (ItemStack item : event.getNewItems().values()) { - if (!player.hasPermission("playervaults.bypassblockeditems") && PlayerVaults.getInstance().isBlockedMaterial(item.getType())) { - event.setCancelled(true); - this.plugin.getTL().blockedItem().title().with("item", item.getType().name()).send(player); - return; + if (!player.hasPermission("playervaults.bypassblockeditems")) { + if (PlayerVaults.getInstance().isBlockedMaterial(item.getType())) { + event.setCancelled(true); + this.plugin.getTL().blockedItem().title().with("item", item.getType().name()).send(player); + return; + } + else if (PlayerVaults.getInstance().isBlockedName(item.getItemMeta().getDisplayName())) { + event.setCancelled(true); + this.plugin.getTL().blockedItemName().title().with("name", item.getItemMeta().getDisplayName()).send(player); + return; + } } } }