diff --git a/war/src/main/java/com/tommytony/war/Warzone.java b/war/src/main/java/com/tommytony/war/Warzone.java index 872fa99..781fdac 100644 --- a/war/src/main/java/com/tommytony/war/Warzone.java +++ b/war/src/main/java/com/tommytony/war/Warzone.java @@ -117,6 +117,7 @@ public class Warzone { private final List respawn = new ArrayList(); private final List reallyDeadFighters = new ArrayList(); private HashMap attachments = new HashMap(); + private HashMap delayedJoinPlayers = new HashMap(); private List killsDeathsTracker = new ArrayList(); @@ -1055,6 +1056,7 @@ public class Warzone { War.war.msg(player, "join.inventorystored"); this.respawnPlayer(team, player); this.broadcast("join.broadcast", player.getName(), team.getKind().getFormattedName()); + this.tryCallDelayedPlayers(); return true; } @@ -1544,6 +1546,65 @@ public class Warzone { return false; } + /** + * Test whether there would be enough players with the addition of one more player + * + * @param plusOne Team to test + * @return true if there would be enough players + */ + public boolean testEnoughPlayers(TeamKind plusOne, boolean testDelayedJoin) { + int teamsWithEnough = 0; + for (Team team : teams) { + int addl = 0; + if (team.getKind() == plusOne) { + addl = 1; + } + if (testDelayedJoin) { + for (Iterator> iterator = this.delayedJoinPlayers.entrySet().iterator(); iterator.hasNext(); ) { + Map.Entry e = iterator.next(); + if (!isDelayedPlayerStillValid(e.getKey())) { + iterator.remove(); + continue; + } + if (e.getValue() == team) { + addl += 1; + } + } + } + if (team.getPlayers().size() + addl >= this.getWarzoneConfig().getInt(WarzoneConfig.MINPLAYERS)) { + teamsWithEnough++; + } + } + return teamsWithEnough >= this.getWarzoneConfig().getInt(WarzoneConfig.MINTEAMS); + } + + public void signup(Player player, Team team) { + War.war.msg(player, "You will be automatically sent to warzone when minplayers is reached."); + this.delayedJoinPlayers.put(player, team); + tryCallDelayedPlayers(); + } + + // prevent tryCallDelayedPlayers from being recursively called by Warzone#assign + private boolean activeDelayedCall = false; + private void tryCallDelayedPlayers() { + if (activeDelayedCall || (!isEnoughPlayers() && !testEnoughPlayers(null, true))) { + return; + } + activeDelayedCall = true; + for (Map.Entry e : delayedJoinPlayers.entrySet()) { + this.assign(e.getKey(), e.getValue()); + } + delayedJoinPlayers.clear(); + activeDelayedCall = false; + } + + private boolean isDelayedPlayerStillValid(Player player) { + // Make sure they're online, they can play in this team, and they're not in another game + return player.isOnline() && War.war.canPlayWar(player, delayedJoinPlayers.get(player)) + && Warzone.getZoneByPlayerName(player.getName()) == null; + } + + public HashMap getLoadoutSelections() { return loadoutSelections; } 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 be379db..a290631 100644 --- a/war/src/main/java/com/tommytony/war/command/JoinCommand.java +++ b/war/src/main/java/com/tommytony/war/command/JoinCommand.java @@ -31,10 +31,15 @@ public class JoinCommand extends AbstractWarCommand { Warzone zone; TeamKind kind; + boolean signup = false; if (this.args.length == 2) { // zone by name zone = Warzone.getZoneByName(this.args[0]); kind = TeamKind.teamKindFromString(this.args[1]); + } else if (this.args.length == 3 && args[0].equals("delayed")) { + signup = true; + zone = Warzone.getZoneByName(this.args[1]); + kind = TeamKind.teamKindFromString(this.args[2]); } else if (this.args.length == 1) { zone = Warzone.getZoneByLocation((Player) this.getSender()); if (zone == null) { @@ -77,6 +82,11 @@ public class JoinCommand extends AbstractWarCommand { previousTeam.removePlayer(player); previousTeam.resetSign(); } + if (signup && !zone.testEnoughPlayers(kind, false)) { + // player wants to automatically join the zone when everyone else is ready + zone.signup(player, team); + return true; + } zone.assign(player, team); } }