From ce72ba36fa5936ed5c6e1eb1c50f4e6229c90e88 Mon Sep 17 00:00:00 2001 From: cmastudios Date: Tue, 1 Jan 2013 16:48:19 -0600 Subject: [PATCH] Add permission based access to warzones Adds a team default permission configuration option. Default is war.player. It is modifiable at the zone level and the team level. In autoassign zones where there is a mix of teams that some players have access to and some that they don't, the player will only ever be placed in a team he can access. You can't /join a team you don't have permission to join. --- war/src/main/java/com/tommytony/war/War.java | 12 ++++++---- .../main/java/com/tommytony/war/Warzone.java | 4 +++- .../tommytony/war/command/JoinCommand.java | 8 +++---- .../com/tommytony/war/config/TeamConfig.java | 3 ++- .../tommytony/war/config/TeamConfigBag.java | 24 +++++++++++++++++++ .../war/event/WarPlayerListener.java | 17 +++++++++---- 6 files changed, 52 insertions(+), 16 deletions(-) diff --git a/war/src/main/java/com/tommytony/war/War.java b/war/src/main/java/com/tommytony/war/War.java index 2fdf508..4c9ab4f 100644 --- a/war/src/main/java/com/tommytony/war/War.java +++ b/war/src/main/java/com/tommytony/war/War.java @@ -184,6 +184,7 @@ public class War extends JavaPlugin { teamDefaultConfig.put(TeamConfig.SATURATION, 10); teamDefaultConfig.put(TeamConfig.SPAWNSTYLE, TeamSpawnStyle.SMALL); teamDefaultConfig.put(TeamConfig.TEAMSIZE, 10); + teamDefaultConfig.put(TeamConfig.PERMISSION, "war.player"); this.getDefaultInventories().getLoadouts().clear(); HashMap defaultLoadout = new HashMap(); @@ -937,15 +938,16 @@ public class War extends JavaPlugin { } return null; } - + /** - * Checks whether the given player is allowed to play war. + * Checks whether the given player is allowed to play in a certain team * * @param player Player to check - * @return true if the player may play war + * @param team Team to check + * @return true if the player may play in the team */ - public boolean canPlayWar(Player player) { - return player.hasPermission("war.player"); + public boolean canPlayWar(Player player, Team team) { + return player.hasPermission(team.getTeamConfig().resolveString(TeamConfig.PERMISSION)); } /** diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index 0a9c765..5446ec5 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -830,7 +830,9 @@ public class Warzone { Team lowestNoOfPlayers = null; for (Team t : this.teams) { if (lowestNoOfPlayers == null || (lowestNoOfPlayers != null && lowestNoOfPlayers.getPlayers().size() > t.getPlayers().size())) { - lowestNoOfPlayers = t; + if (War.war.canPlayWar(player, t)) { + lowestNoOfPlayers = t; + } } } if (lowestNoOfPlayers != null) { diff --git a/war/src/main/java/com/tommytony/war/command/JoinCommand.java b/war/src/main/java/com/tommytony/war/command/JoinCommand.java index 4f0fe34..01712f2 100644 --- a/war/src/main/java/com/tommytony/war/command/JoinCommand.java +++ b/war/src/main/java/com/tommytony/war/command/JoinCommand.java @@ -32,10 +32,6 @@ public class JoinCommand extends AbstractWarCommand { } Player player = (Player) this.getSender(); - if (!War.war.canPlayWar(player)) { - this.badMsg("Cannot play war. You need the war.player permission."); - return true; - } Warzone zone; if (this.args.length == 0) { @@ -87,6 +83,10 @@ public class JoinCommand extends AbstractWarCommand { boolean foundTeam = false; for (Team team : teams) { if (team.getName().startsWith(name) || team.getKind() == kind) { + if (!War.war.canPlayWar(player, team)) { + this.badMsg("You don't have permission to join this team."); + return true; + } if (!zone.hasPlayerState(player.getName())) { zone.keepPlayerState(player); this.msg("Your inventory is in storage until you use '/war leave'."); diff --git a/war/src/main/java/com/tommytony/war/config/TeamConfig.java b/war/src/main/java/com/tommytony/war/config/TeamConfig.java index 7dab45c..3b44787 100644 --- a/war/src/main/java/com/tommytony/war/config/TeamConfig.java +++ b/war/src/main/java/com/tommytony/war/config/TeamConfig.java @@ -12,7 +12,8 @@ public enum TeamConfig { RESPAWNTIMER (Integer.class), SATURATION (Integer.class), SPAWNSTYLE (TeamSpawnStyle.class), - TEAMSIZE (Integer.class); + TEAMSIZE (Integer.class), + PERMISSION (String.class); private final Class configType; diff --git a/war/src/main/java/com/tommytony/war/config/TeamConfigBag.java b/war/src/main/java/com/tommytony/war/config/TeamConfigBag.java index ba25fa7..cadbed5 100644 --- a/war/src/main/java/com/tommytony/war/config/TeamConfigBag.java +++ b/war/src/main/java/com/tommytony/war/config/TeamConfigBag.java @@ -92,6 +92,25 @@ public class TeamConfigBag { } } + public String getString(TeamConfig config) { + if (this.contains(config)) { + return (String)this.bag.get(config); + } + return null; + } + + public String resolveString(TeamConfig config) { + if (this.contains(config)) { + return (String)this.bag.get(config); + } else if (this.warzone != null && this.warzone.getTeamDefaultConfig().contains(config)){ + // use Warzone default config + return this.warzone.getTeamDefaultConfig().resolveString(config); + } else { + // use War default config + return War.war.getTeamDefaultConfig().resolveString(config); + } + } + public FlagReturn resolveFlagReturn() { if (this.contains(TeamConfig.FLAGRETURN)) { return (FlagReturn)this.bag.get(TeamConfig.FLAGRETURN); @@ -136,6 +155,8 @@ public class TeamConfigBag { this.put(config, teamConfigSection.getInt(config.toString())); } else if (config.getConfigType().equals(Boolean.class)) { this.put(config, teamConfigSection.getBoolean(config.toString())); + } else if (config.getConfigType().equals(String.class)) { + this.put(config, teamConfigSection.getString(config.toString())); } else if (config.getConfigType().equals(FlagReturn.class)) { String flagReturnStr = teamConfigSection.getString(config.toString()); FlagReturn returnMode = FlagReturn.getFromString(flagReturnStr); @@ -177,6 +198,9 @@ public class TeamConfigBag { } else if (teamConfig.getConfigType().equals(Boolean.class)) { String onOff = namedParams.get(namedParam); this.bag.put(teamConfig, onOff.equals("on") || onOff.equals("true")); + } else if (teamConfig.getConfigType().equals(String.class)) { + String str = namedParams.get(namedParam); + this.bag.put(teamConfig, str); } else if (teamConfig.getConfigType().equals(FlagReturn.class)) { FlagReturn flagValue = FlagReturn.getFromString(namedParams.get(namedParam)); this.bag.put(teamConfig, flagValue); diff --git a/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java b/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java index aed3a54..408aa78 100644 --- a/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java +++ b/war/src/main/java/com/tommytony/war/event/WarPlayerListener.java @@ -257,7 +257,6 @@ public class WarPlayerListener implements Listener { Warzone locZone = Warzone.getZoneByLocation(playerLoc); ZoneLobby locLobby = ZoneLobby.getLobbyByLocation(playerLoc); - boolean canPlay = War.war.canPlayWar(player); boolean isMaker = War.war.isZoneMaker(player); // Zone walls @@ -288,7 +287,7 @@ public class WarPlayerListener implements Listener { Warzone zone = locLobby.getZone(); Team oldTeam = Team.getTeamByPlayerName(player.getName()); boolean isAutoAssignGate = false; - if (oldTeam == null && canPlay) { // trying to counter spammy player move + if (oldTeam == null) { // trying to counter spammy player move isAutoAssignGate = zone.getLobby().isAutoAssignGate(playerLoc); if (isAutoAssignGate) { if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.DISABLED)) { @@ -303,9 +302,13 @@ public class WarPlayerListener implements Listener { } if (noOfPlayers < totalCap) { - zone.autoAssign(player); + boolean assigned = zone.autoAssign(player) != null ? true : false; + if (!assigned) { + event.setTo(zone.getTeleport()); + War.war.badMsg(player, "You don't have permission for any of the available teams in this warzone"); + } - if (War.war.getWarHub() != null) { + if (War.war.getWarHub() != null && assigned) { War.war.getWarHub().resetZoneSign(zone); } } else { @@ -323,7 +326,8 @@ public class WarPlayerListener implements Listener { this.dropFromOldTeamIfAny(player); if (zone.getWarzoneConfig().getBoolean(WarzoneConfig.DISABLED)) { this.handleDisabledZone(event, player, zone); - } else if (team.getPlayers().size() < team.getTeamConfig().resolveInt(TeamConfig.TEAMSIZE)) { + } else if (team.getPlayers().size() < team.getTeamConfig().resolveInt(TeamConfig.TEAMSIZE) + && War.war.canPlayWar(player, team)) { team.addPlayer(player); team.resetSign(); if (War.war.getWarHub() != null) { @@ -335,6 +339,9 @@ public class WarPlayerListener implements Listener { for (Team t : zone.getTeams()) { t.teamcast("" + player.getName() + " joined team " + team.getName() + "."); } + } else if (!War.war.canPlayWar(player, team)) { + event.setTo(zone.getTeleport()); + War.war.badMsg(player, "You don't have permission to join team " + team.getName()); } else { event.setTo(zone.getTeleport()); War.war.badMsg(player, "Team " + team.getName() + " is full.");