diff --git a/src/main/java/com/garbagemule/MobArena/ArenaClass.java b/src/main/java/com/garbagemule/MobArena/ArenaClass.java index e508d25..7c5ab8b 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaClass.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaClass.java @@ -137,6 +137,11 @@ public class ArenaClass this.armor = armor; } + public boolean hasPermission(Player p) { + String perm = "mobarena.classes." + configName; + return !p.isPermissionSet(perm) || p.hasPermission(perm); + } + /** * Grants all of the class items and armor to the given player. * The normal items will be added to the inventory normally, while the diff --git a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java index 68bca3e..dcdb94d 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaImpl.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaImpl.java @@ -63,9 +63,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Random; import java.util.Set; import java.util.concurrent.PriorityBlockingQueue; +import java.util.stream.Collectors; public class ArenaImpl implements Arena { @@ -657,6 +657,12 @@ public class ArenaImpl implements Arena cleanup(); } + @Override + public boolean hasPermission(Player p) { + String perm = "mobarena.arenas." + name; + return !p.isPermissionSet(perm) || p.hasPermission(perm); + } + @Override public boolean playerJoin(Player p, Location loc) { @@ -1353,21 +1359,19 @@ public class ArenaImpl implements Arena @Override public void assignRandomClass(Player p) { - Random r = new Random(); - List classes = new LinkedList<>(this.classes.keySet()); + List classes = this.classes.values().stream() + .filter(c -> c.hasPermission(p)) + .collect(Collectors.toList()); - String className = classes.remove(r.nextInt(classes.size())); - while (!plugin.has(p, "mobarena.classes." + className)) - { - if (classes.isEmpty()) - { - plugin.getLogger().info("Player '" + p.getName() + "' has no class permissions!"); - playerLeave(p); - return; - } - className = classes.remove(r.nextInt(classes.size())); + if (classes.isEmpty()) { + plugin.getLogger().info("Player '" + p.getName() + "' has no class permissions!"); + playerLeave(p); + return; } + int index = MobArena.random.nextInt(classes.size()); + String className = classes.get(index).getConfigName(); + assignClass(p, className); messenger.tell(p, Msg.LOBBY_CLASS_PICKED, this.classes.get(className).getConfigName()); } @@ -1621,7 +1625,7 @@ public class ArenaImpl implements Arena messenger.tell(p, Msg.JOIN_ALREADY_PLAYING); else if (running) messenger.tell(p, Msg.JOIN_ARENA_IS_RUNNING); - else if (!plugin.has(p, "mobarena.arenas." + configName())) + else if (!hasPermission(p)) messenger.tell(p, Msg.JOIN_ARENA_PERMISSION); else if (getMaxPlayers() > 0 && lobbyPlayers.size() >= getMaxPlayers()) messenger.tell(p, Msg.JOIN_PLAYER_LIMIT_REACHED); diff --git a/src/main/java/com/garbagemule/MobArena/ArenaListener.java b/src/main/java/com/garbagemule/MobArena/ArenaListener.java index 52b932a..19a05fa 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaListener.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaListener.java @@ -1061,14 +1061,15 @@ public class ArenaListener if (!arena.getClasses().containsKey(className) && !className.equals("random")) return; + ArenaClass newAC = arena.getClasses().get(className); + // Check for permission. - if (!plugin.has(p, "mobarena.classes." + className) && !className.equals("random")) { + if (!newAC.hasPermission(p) && !className.equals("random")) { arena.getMessenger().tell(p, Msg.LOBBY_CLASS_PERMISSION); return; } ArenaClass oldAC = arena.getArenaPlayer(p).getArenaClass(); - ArenaClass newAC = arena.getClasses().get(className); // Same class, do nothing. if (newAC.equals(oldAC)) { diff --git a/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java b/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java index 739f34f..53497f3 100644 --- a/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java +++ b/src/main/java/com/garbagemule/MobArena/ArenaMasterImpl.java @@ -19,9 +19,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.PlayerInventory; -import org.bukkit.permissions.Permission; -import org.bukkit.permissions.PermissionDefault; -import org.bukkit.plugin.PluginManager; import java.util.ArrayList; import java.util.Arrays; @@ -140,7 +137,7 @@ public class ArenaMasterImpl implements ArenaMaster public List getPermittedArenas(Player p) { List result = new ArrayList<>(arenas.size()); for (Arena arena : arenas) - if (plugin.has(p, "mobarena.arenas." + arena.configName())) + if (arena.hasPermission(p)) result.add(arena); return result; } @@ -148,7 +145,7 @@ public class ArenaMasterImpl implements ArenaMaster public List getEnabledAndPermittedArenas(Player p) { List result = new ArrayList<>(arenas.size()); for (Arena arena : arenas) - if (arena.isEnabled() && plugin.has(p, "mobarena.arenas." + arena.configName())) + if (arena.isEnabled() && arena.hasPermission(p)) result.add(arena); return result; } @@ -338,9 +335,6 @@ public class ArenaMasterImpl implements ArenaMaster loadClassPermissions(arenaClass, section); loadClassLobbyPermissions(arenaClass, section); - // Register the permission. - registerPermission("mobarena.classes." + lowercase, PermissionDefault.TRUE).addParent("mobarena.classes", true); - // Check for class chests Location cc = parseLocation(section, "classchest", null); arenaClass.setClassChest(cc); @@ -486,8 +480,6 @@ public class ArenaMasterImpl implements ArenaMaster // Remove the class from the map. classes.remove(lowercase); - - unregisterPermission("mobarena.arenas." + lowercase); } public boolean addClassPermission(String classname, String perm) { @@ -621,7 +613,6 @@ public class ArenaMasterImpl implements ArenaMaster ConfigUtils.addIfEmpty(plugin, "waves.yml", makeSection(section, "waves")); Arena arena = new ArenaImpl(plugin, section, arenaname, world); - registerPermission("mobarena.arenas." + arenaname.toLowerCase(), PermissionDefault.TRUE); arenas.add(arena); plugin.getLogger().info("Loaded arena '" + arenaname + "'"); return arena; @@ -669,7 +660,6 @@ public class ArenaMasterImpl implements ArenaMaster public void removeArenaNode(Arena arena) { arenas.remove(arena); - unregisterPermission("mobarena.arenas." + arena.configName()); config.set("arenas." + arena.configName(), null); plugin.saveConfig(); @@ -690,20 +680,4 @@ public class ArenaMasterImpl implements ArenaMaster public void saveConfig() { plugin.saveConfig(); } - - private Permission registerPermission(String permString, PermissionDefault value) { - PluginManager pm = plugin.getServer().getPluginManager(); - - Permission perm = pm.getPermission(permString); - if (perm == null) { - perm = new Permission(permString); - perm.setDefault(value); - pm.addPermission(perm); - } - return perm; - } - - private void unregisterPermission(String s) { - plugin.getServer().getPluginManager().removePermission(s); - } } diff --git a/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java b/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java index 544a8c6..dac902a 100644 --- a/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java +++ b/src/main/java/com/garbagemule/MobArena/commands/user/PickClassCommand.java @@ -54,7 +54,7 @@ public class PickClassCommand implements Command } // Check for permission. - if (!am.getPlugin().has(p, "mobarena.classes." + lowercase) && !lowercase.equals("random")) { + if (!ac.hasPermission(p) && !lowercase.equals("random")) { arena.getMessenger().tell(p, Msg.LOBBY_CLASS_PERMISSION); return true; } diff --git a/src/main/java/com/garbagemule/MobArena/framework/Arena.java b/src/main/java/com/garbagemule/MobArena/framework/Arena.java index 207d887..0a9d67f 100644 --- a/src/main/java/com/garbagemule/MobArena/framework/Arena.java +++ b/src/main/java/com/garbagemule/MobArena/framework/Arena.java @@ -147,6 +147,8 @@ public interface Arena void forceStart(); void forceEnd(); + + boolean hasPermission(Player p); boolean playerJoin(Player p, Location loc);