From 62563f66401fd5d4c552d233ac65ce7a1578d088 Mon Sep 17 00:00:00 2001 From: Torrie Fischer Date: Fri, 11 Jun 2021 09:34:26 -0700 Subject: [PATCH] permissions: create separate perms for commands vs items, rename creator item to anchor --- .../regions/RegionPostInteractionWatcher.java | 4 +-- .../camin/regions/RegionPostItemWatcher.java | 26 ++++++++++--------- .../camin/regions/commands/RegionCommand.java | 8 +++--- .../regions/commands/RegionOpCommand.java | 6 ++--- src/main/resources/plugin.yml | 22 ++++++++++++---- 5 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/main/java/us/camin/regions/RegionPostInteractionWatcher.java b/src/main/java/us/camin/regions/RegionPostInteractionWatcher.java index f78f6b6..2557af7 100644 --- a/src/main/java/us/camin/regions/RegionPostInteractionWatcher.java +++ b/src/main/java/us/camin/regions/RegionPostInteractionWatcher.java @@ -103,7 +103,7 @@ public class RegionPostInteractionWatcher implements Listener { player.sendMessage("You cannot use region posts at this time."); return; } - if (RegionPostItemWatcher.isChargeItem(handStack)) { + if (RegionPostItemWatcher.isChargeItem(handStack) && player.hasPermission("regions.charge")) { nearest.addCharges(1); m_plugin.getServer().getScheduler().runTask(m_plugin, () -> { RegionPostBuilder builder = new RegionPostBuilder(nearest, m_plugin); @@ -112,7 +112,7 @@ public class RegionPostInteractionWatcher implements Listener { m_plugin.saveRegions(); player.setItemInHand(handStack.subtract()); m_plugin.getServer().getPluginManager().callEvent(new PlayerAddRegionChargeEvent(player, nearest)); - } else if (isBannerItem(handStack)) { + } else if (isBannerItem(handStack) && player.hasPermission("regions.setbanner")) { DyeColor bannerColor = DyeColor.getByDyeData(handStack.getData().getData()); BannerMeta bannerMeta = (BannerMeta)meta; log.info("Setting banner color to " + bannerColor); diff --git a/src/main/java/us/camin/regions/RegionPostItemWatcher.java b/src/main/java/us/camin/regions/RegionPostItemWatcher.java index d04f4bd..479623a 100644 --- a/src/main/java/us/camin/regions/RegionPostItemWatcher.java +++ b/src/main/java/us/camin/regions/RegionPostItemWatcher.java @@ -81,7 +81,7 @@ public class RegionPostItemWatcher implements Listener { return stack; } - static public ItemStack createCreateItem() { + static public ItemStack createAnchor() { ItemStack stack = new ItemStack(Material.LANTERN); ItemMeta meta = stack.getItemMeta(); List lore = new ArrayList(); @@ -89,12 +89,13 @@ public class RegionPostItemWatcher implements Listener { meta.addItemFlags(ItemFlag.HIDE_ENCHANTS); meta.addEnchant(Enchantment.SOUL_SPEED, 1, true); meta.setLore(lore); + meta.setDisplayName("Region Post Anchor"); stack.setItemMeta(meta); return stack; } private ItemStack m_theCompass = createCompass(null); - private ItemStack m_theItem = createCreateItem(); + private ItemStack m_theAnchor = createAnchor(); private static ItemStack m_theChargeItem = createChargeItem(); public static boolean isChargeItem(ItemStack stack) { @@ -106,9 +107,9 @@ public class RegionPostItemWatcher implements Listener { return true; } - if (stack.getType() == m_theItem.getType()) { + if (stack.getType() == m_theAnchor.getType()) { ItemMeta meta = stack.getItemMeta(); - ItemMeta theItemMeta = m_theItem.getItemMeta(); + ItemMeta theItemMeta = m_theAnchor.getItemMeta(); if (meta.getItemFlags() == theItemMeta.getItemFlags()) { return true; } @@ -118,13 +119,13 @@ public class RegionPostItemWatcher implements Listener { } public boolean isRegionCreateItem(ItemStack stack, Player p) { - if (stack.isSimilar(m_theItem)) { + if (stack.isSimilar(m_theAnchor)) { return true; } - if (stack.getType() == m_theItem.getType()) { + if (stack.getType() == m_theAnchor.getType()) { ItemMeta meta = stack.getItemMeta(); - ItemMeta theItemMeta = m_theItem.getItemMeta(); + ItemMeta theItemMeta = m_theAnchor.getItemMeta(); if (meta.getLore().equals(theItemMeta.getLore())) { return true; } @@ -153,15 +154,16 @@ public class RegionPostItemWatcher implements Listener { compassItem = createCompass(nearest); player.setItemInHand(compassItem); player.sendMessage("Now tracking " + nearest.name()); - } else if (!event.isCancelled() && isRegionCreateItem(handStack, player) && event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getClickedBlock().getType().isInteractable()) { + } else if (!event.isCancelled() && isRegionCreateItem(handStack, player) && event.getAction() == Action.RIGHT_CLICK_BLOCK && !event.getClickedBlock().getType().isInteractable() && player.hasPermission("regions.create")) { event.setUseItemInHand(Event.Result.DENY); event.setCancelled(true); - if (meta.getDisplayName().equals("")) { + if (meta.getDisplayName().equals("") || meta.getDisplayName().equals("Region Post Anchor")) { player.sendMessage("You must first give this item a name!"); } else { - Region nearest = m_manager.nearestRegion(player.getLocation()); - if (nearest != null && player.getLocation().distance(nearest.interactLocation()) <= 500) { - player.sendMessage("You are too close to the region post for " + nearest.name()); + Region nearest = m_manager.nearestRegion(event.getClickedBlock().getLocation()); + if (nearest != null && event.getClickedBlock().getLocation().distance(nearest.interactLocation()) < 500) { + int distance = 500 - (int)event.getClickedBlock().getLocation().distance(nearest.interactLocation()); + player.sendMessage("You are " + distance + " blocks too close to the region post for " + nearest.name() + "."); } else { Region r = new Region(meta.getDisplayName(), event.getClickedBlock().getRelative(event.getBlockFace()).getLocation()); m_plugin.getServer().getScheduler().runTask(m_plugin, () -> { diff --git a/src/main/java/us/camin/regions/commands/RegionCommand.java b/src/main/java/us/camin/regions/commands/RegionCommand.java index c7acf00..fff3c08 100644 --- a/src/main/java/us/camin/regions/commands/RegionCommand.java +++ b/src/main/java/us/camin/regions/commands/RegionCommand.java @@ -70,7 +70,7 @@ public class RegionCommand implements CommandExecutor, TabCompleter { return true; } String subCommand = split[0]; - if (subCommand.equals("create") && p.hasPermission("regions.create")) { + if (subCommand.equals("create") && p.hasPermission("regions.commands.create")) { if (split.length <= 1) { p.sendMessage("Must specify a region name"); return true; @@ -85,7 +85,7 @@ public class RegionCommand implements CommandExecutor, TabCompleter { p.teleport(r.teleportLocation()); m_plugin.regionManager().addRegion(r); m_plugin.saveRegions(); - } else if (subCommand.equals("remove") && p.hasPermission("regions.remove")) { + } else if (subCommand.equals("remove") && p.hasPermission("regions.commands.remove")) { Region r = m_plugin.regionManager().nearestRegion(p.getLocation()); if (r == null) { p.sendMessage("There are no regions in this world."); @@ -94,7 +94,7 @@ public class RegionCommand implements CommandExecutor, TabCompleter { m_plugin.regionManager().removeRegion(r); p.sendMessage("Deleted region " + r.coloredName()); m_plugin.saveRegions(); - } else if (subCommand.equals("regen") && p.hasPermission("regions.regen")) { + } else if (subCommand.equals("regen") && p.hasPermission("regions.commands.regen")) { Region r = m_plugin.regionManager().nearestRegion(p.getLocation()); if (r == null) { p.sendMessage("There are no regions in this world."); @@ -106,7 +106,7 @@ public class RegionCommand implements CommandExecutor, TabCompleter { p.sendMessage("Region post regenerated."); }); } - } else if (subCommand.equals("regenall") && p.hasPermission("regions.regen.all")) { + } else if (subCommand.equals("regenall") && p.hasPermission("regions.commands.regen.all")) { for(Region r : m_plugin.regionManager().regionsForWorld(p.getLocation().getWorld())) { m_plugin.getServer().getScheduler().runTask(m_plugin, () -> { RegionPostBuilder builder = new RegionPostBuilder(r, m_plugin); diff --git a/src/main/java/us/camin/regions/commands/RegionOpCommand.java b/src/main/java/us/camin/regions/commands/RegionOpCommand.java index 9b35cd4..0b13718 100644 --- a/src/main/java/us/camin/regions/commands/RegionOpCommand.java +++ b/src/main/java/us/camin/regions/commands/RegionOpCommand.java @@ -72,11 +72,11 @@ public class RegionOpCommand implements CommandExecutor, TabCompleter { } } else if (subCommand.equals("item") && sender.hasPermission("regions.give-items.creator")) { Player player = (Player)sender; - ItemStack createItem = RegionPostItemWatcher.createCreateItem(); + ItemStack anchorStack = RegionPostItemWatcher.createAnchor(); if (split.length > 1) { - createItem.setAmount(Integer.parseInt(split[1])); + anchorStack.setAmount(Integer.parseInt(split[1])); } - HashMap rejected = player.getInventory().addItem(createItem); + HashMap rejected = player.getInventory().addItem(anchorStack); for(ItemStack item : rejected.values()) { player.getLocation().getWorld().dropItem(player.getLocation(), item); } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d5dbf2f..623c81b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -21,7 +21,7 @@ permissions: description: Allows use of all regions permissions children: regions.create: true - regions.remove: true + regions.commands.*: true regions.regen.*: true regions.bypass.*: true regions.give-items.*: true @@ -35,15 +35,27 @@ permissions: default: true description: Use region posts regions.create: + default: true + description: Create a region with a region item + regions.setbanner: + default: true + description: Allows setting a region post banner + regions.charge: + default: true + description: Allows charging a region post with a charge item + regions.commands.*: default: op - description: Create a region - regions.remove: + children: + regions.commands.remove: true + regions.commands.regen: true + regions.commands.regen.all: true + regions.commands.remove: default: op description: Remove a region - regions.regen: + regions.commands.regen: default: op description: Regenerates a region post - regions.regen.all: + regions.commands.regen.all: default: op description: Regenerates all region posts, including in unloaded chunks regions.bypass.*: