diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 298f5c2d9da..193a8f91ad9 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -223,7 +223,7 @@ public class TableController { } } - public boolean isPlayer(UUID userId) { + public boolean hasPlayer(UUID userId) { return userPlayerMap.containsKey(userId); } @@ -331,6 +331,12 @@ public class TableController { if (mPlayer == null || mPlayer.hasQuit()) { return true; // so the construct panel closes after submit } + if (table.isTournamentSubTable()) { + TournamentPlayer tournamentPlayer = table.getTournament().getPlayer(mPlayer.getPlayer().getId()); + if (tournamentPlayer != null) { + tournamentPlayer.setStateInfo(""); // reset sideboarding state + } + } } } if (table.getState() != TableState.SIDEBOARDING && table.getState() != TableState.CONSTRUCTING) { @@ -435,7 +441,7 @@ public class TableController { return; } if (table != null - && this.userId.equals(userId) + && this.userId != null && this.userId.equals(userId) // tourn. sub tables have no creator user && (table.getState().equals(TableState.WAITING) || table.getState().equals(TableState.READY_TO_START))) { // table not started yet and user is the owner, remove the table @@ -565,9 +571,9 @@ public class TableController { int activePlayers = 0; for (Entry entry: userPlayerMap.entrySet()) { // no AI players if (!match.getPlayer(entry.getValue()).hasQuit()) { - activePlayers++; User user = UserManager.getInstance().getUser(entry.getKey()); if (user != null) { + activePlayers++; if (!user.isConnected()) { // if the user is not connected but exits, the user is currently disconnected. So it's neccessary // to join the user to the game here (instead the client does it) , so he can join the game, if he reconnects in time. @@ -724,10 +730,7 @@ public class TableController { GameManager.getInstance().removeGame(game.getId()); try { if (!match.hasEnded()) { - table.sideboard(); - setupTimeout(Match.SIDEBOARD_TIME); - match.sideboard(); - cancelTimeout(); + sideboard(); if (!match.hasEnded()) { startGame(choosingPlayerId); } else { @@ -743,6 +746,30 @@ public class TableController { return match.hasEnded(); } + private void sideboard() { + table.sideboard(); + setupTimeout(Match.SIDEBOARD_TIME); + if (table.isTournamentSubTable()) { + for (MatchPlayer matchPlayer :match.getPlayers()) { + if (!matchPlayer.hasQuit()) { + TournamentPlayer tournamentPlayer = table.getTournament().getPlayer(matchPlayer.getPlayer().getId()); + if (tournamentPlayer != null) { + tournamentPlayer.setStateInfo("sideboarding"); + } + } + } + } + match.sideboard(); + cancelTimeout(); + if (table.isTournamentSubTable()) { + for (MatchPlayer matchPlayer :match.getPlayers()) { + TournamentPlayer tournamentPlayer = table.getTournament().getPlayer(matchPlayer.getPlayer().getId()); + if (tournamentPlayer != null && tournamentPlayer.getStateInfo().equals("sideboarding")) { + tournamentPlayer.setStateInfo(""); + } + } + } + } /** * Tables of normal matches or tournament sub tables are no longer * needed, if the match ends. diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java index d4f600962e3..fbdbf543bb3 100644 --- a/Mage.Server/src/main/java/mage/server/TableManager.java +++ b/Mage.Server/src/main/java/mage/server/TableManager.java @@ -191,13 +191,8 @@ public class TableManager { public void userQuitTournamentSubTables(UUID tournamentId, UUID userId) { for (TableController controller: controllers.values()) { if (controller.getTable().isTournamentSubTable() && controller.getTable().getTournament().getId().equals(tournamentId)) { - if (controller.isPlayer(userId)) { - Match match = controller.getTable().getMatch(); - if (match != null) { - if (!match.hasEnded() && match.getGame() != null) { - GameManager.getInstance().quitMatch(match.getGame().getId(), userId); - } - } + if (controller.hasPlayer(userId)) { + controller.leaveTable(userId); } } } diff --git a/Mage/src/mage/constants/TournamentPlayerState.java b/Mage/src/mage/constants/TournamentPlayerState.java index 4fe51dd3506..151f0c5683a 100644 --- a/Mage/src/mage/constants/TournamentPlayerState.java +++ b/Mage/src/mage/constants/TournamentPlayerState.java @@ -16,7 +16,7 @@ public enum TournamentPlayerState { CANCELED ("Canceled"), FINISHED ("Finished"); // winner or player in swiss style - private String text; + private final String text; TournamentPlayerState(String text) { this.text = text; diff --git a/Mage/src/mage/game/tournament/TournamentSwiss.java b/Mage/src/mage/game/tournament/TournamentSwiss.java index 20cca5b82d6..9f6c970bd4a 100644 --- a/Mage/src/mage/game/tournament/TournamentSwiss.java +++ b/Mage/src/mage/game/tournament/TournamentSwiss.java @@ -111,7 +111,11 @@ public abstract class TournamentSwiss extends TournamentImpl { } else { // player free round - add to bye players of this round round.getPlayerByes().add(player1); - player1.setState(TournamentPlayerState.WAITING); + if (round.getRoundNumber() == getNumberRounds()) { + player1.setState(TournamentPlayerState.FINISHED); + } else { + player1.setState(TournamentPlayerState.WAITING); + } player1.setStateInfo("Round Bye"); updateResults(); }