From ef26173ba1bc4d6858ab85d247acdc349970c765 Mon Sep 17 00:00:00 2001 From: Connor Monahan Date: Thu, 20 Jul 2017 16:10:34 -0400 Subject: [PATCH] Fix #320, add permission when playing in a zone When a player enters an example zone named "Castle_Wars", the following permissions are granted: - war.playing (Added for any zone) - war.playing.castle_wars (Added for this zone, formed by the lower case of the zone name) To grant additional permissions from these, such as 'crackshot.use', you should modify Bukkit's permissions.yml to create a parent node for either war.playing or the zone-specific node with child nodes. http://bukkit.gamepedia.com/Permissions.yml Example: war.playing: description: Allow use of gun plugins inside war zones only default: false children: crackshot.use: true war.playing.castle_wars: description: Allow use of craft book elevators inside Castle_Wars only default: false children: craftbook.use: true --- war/src/main/java/com/tommytony/war/Warzone.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index 2e8e81f..7707144 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -39,6 +39,7 @@ import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; import org.bukkit.permissions.Permissible; +import org.bukkit.permissions.PermissionAttachment; import org.bukkit.potion.PotionEffect; import org.bukkit.scoreboard.DisplaySlot; import org.bukkit.scoreboard.Objective; @@ -118,6 +119,7 @@ public class Warzone { private HashMap killCount = new HashMap(); private final List respawn = new ArrayList(); private final List reallyDeadFighters = new ArrayList(); + private HashMap attachments = new HashMap(); private List killsDeathsTracker = new ArrayList(); @@ -991,6 +993,10 @@ public class Warzone { if (player.getWorld() != this.getWorld()) { player.teleport(this.getWorld().getSpawnLocation()); } + PermissionAttachment attachment = player.addAttachment(War.war); + this.attachments.put(player, attachment); + attachment.setPermission("war.playing", true); + attachment.setPermission("war.playing." + this.getName().toLowerCase(), true); team.addPlayer(player); team.resetSign(); if (this.hasPlayerState(player.getName())) { @@ -1213,6 +1219,7 @@ public class Warzone { playerTeam.removePlayer(player); this.broadcast("leave.broadcast", playerTeam.getKind().getColor() + player.getName() + ChatColor.WHITE); playerTeam.resetSign(); + player.removeAttachment(this.attachments.remove(player)); if (this.getPlayerCount() == 0 && this.getWarzoneConfig().getBoolean(WarzoneConfig.RESETONEMPTY)) { // reset the zone for a new game when the last player leaves for (Team team : this.getTeams()) {