From 8b331eefce1be360193c64fc4563eee8c990246a Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 3 Sep 2014 15:38:45 +0200 Subject: [PATCH] * Fixed a bug in table expired check. Changed expired check. Some fixed for table / tournament state handling. --- .../client/tournament/TournamentPanel.java | 18 +++-- .../java/mage/server/TableController.java | 78 ++++++++++++++----- .../tournament/TournamentController.java | 7 +- 3 files changed, 77 insertions(+), 26 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java index d8372f88950..4fae044fe31 100644 --- a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java +++ b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java @@ -132,8 +132,8 @@ public class TournamentPanel extends javax.swing.JPanel { private void saveDividerLocations() { // save panel sizes and divider locations. Rectangle rec = MageFrame.getDesktop().getBounds(); - StringBuilder sb = new StringBuilder(Double.toString(rec.getWidth())).append("x").append(Double.toString(rec.getHeight())); - PreferencesDialog.saveValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, sb.toString()); + String sb = Double.toString(rec.getWidth()) + "x" + Double.toString(rec.getHeight()); + PreferencesDialog.saveValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, sb); PreferencesDialog.saveValue(PreferencesDialog.KEY_TOURNAMENT_DIVIDER_LOCATION_1, Integer.toString(this.jSplitPane1.getDividerLocation())); PreferencesDialog.saveValue(PreferencesDialog.KEY_TOURNAMENT_DIVIDER_LOCATION_2, Integer.toString(this.jSplitPane2.getDividerLocation())); } @@ -142,9 +142,9 @@ public class TournamentPanel extends javax.swing.JPanel { Rectangle rec = MageFrame.getDesktop().getBounds(); if (rec != null) { String size = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_MAGE_PANEL_LAST_SIZE, null); - StringBuilder sb = new StringBuilder(Double.toString(rec.getWidth())).append("x").append(Double.toString(rec.getHeight())); + String sb = Double.toString(rec.getWidth()) + "x" + Double.toString(rec.getHeight()); // use divider positions only if screen size is the same as it was the time the settings were saved - if (size != null && size.equals(sb.toString())) { + if (size != null && size.equals(sb)) { String location = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_TOURNAMENT_DIVIDER_LOCATION_1, null); if (location != null && jSplitPane1 != null) { jSplitPane1.setDividerLocation(Integer.parseInt(location)); @@ -213,11 +213,17 @@ public class TournamentPanel extends javax.swing.JPanel { } switch (tournament.getTournamentState()) { case "Constructing": - String constructionTime = Format.getDuration(tournament.getConstructionTime() - (tournament.getServerTime().getTime() - tournament.getStepStartTime().getTime())/1000); + String constructionTime = ""; + if (tournament.getStepStartTime() != null) { + constructionTime = Format.getDuration(tournament.getConstructionTime() - (tournament.getServerTime().getTime() - tournament.getStepStartTime().getTime())/1000); + } txtTournamentState.setText(new StringBuilder(tournament.getTournamentState()).append(" (").append(constructionTime).append(")").toString()); break; case "Dueling": - String duelingTime = Format.getDuration((tournament.getServerTime().getTime() - tournament.getStepStartTime().getTime())/1000); + String duelingTime = ""; + if (tournament.getStepStartTime() != null) { + duelingTime = Format.getDuration((tournament.getServerTime().getTime() - tournament.getStepStartTime().getTime())/1000); + } txtTournamentState.setText(new StringBuilder(tournament.getTournamentState()).append(" (").append(duelingTime).append(")").toString()); break; default: diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 11c6da05503..4e61c6b54af 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -64,6 +64,7 @@ import mage.server.game.GameManager; import mage.server.game.PlayerFactory; import mage.server.services.LogKeys; import mage.server.services.impl.LogServiceImpl; +import mage.server.tournament.TournamentController; import mage.server.tournament.TournamentFactory; import mage.server.tournament.TournamentManager; import mage.server.util.ConfigSettings; @@ -782,28 +783,67 @@ public class TableController { return match; } - public boolean isMatchTableStillValid() { - // check only normal match table - if (!table.isTournament() && !table.isTournamentSubTable()) { - int humanPlayers = 0; - int validHumanPlayers = 0; - if (match == null) { - return false; + public boolean isTournamentStillValid() { + if (table.getTournament() != null) { + TournamentController tournamentController = TournamentManager.getInstance().getTournamentController(table.getTournament().getId()); + if (tournamentController != null) { + //TODO: Check tournament state } - for(Map.Entry userPlayerEntry: userPlayerMap.entrySet()) { - MatchPlayer matchPlayer = match.getPlayer(userPlayerEntry.getValue()); - if (matchPlayer.getPlayer().isHuman()) { - humanPlayers++; - if (!matchPlayer.hasQuit()) { - User user = UserManager.getInstance().getUser(userPlayerEntry.getKey()); - if (user != null && user.isExpired(null)) { - validHumanPlayers++; - } - } + } + return true; + } + + public boolean isMatchTableStillValid() { + // check only normal match table with state != Finished + if (!table.isTournament()) { + int humanPlayers = 0; + int aiPlayers = 0 ; + int validHumanPlayers = 0; + if (match == null && !(table.getState().equals(TableState.WAITING) || + table.getState().equals(TableState.STARTING) || + table.getState().equals(TableState.READY_TO_START) )) { + logger.debug("- Match table with no match:"); + logger.debug("-- matchId:" + match.getId() + " [" + match.getName() + "]"); + // return false; + } + if (match.isDoneSideboarding()) { + if (match.getGame() == null) { + // no sideboarding and not active game -> match seems to hang (maybe the Draw bug) + logger.debug("- Match with no active game and not in sideboard state:"); + logger.debug("-- matchId:" + match.getId() + " [" + match.getName() + "]"); + // return false; } } - // if at least 2 human players are valid (multiplayer) or all human players are valid the table is valid - return validHumanPlayers >= 2 || validHumanPlayers == humanPlayers; + // check for active players + for(Map.Entry userPlayerEntry: userPlayerMap.entrySet()) { + MatchPlayer matchPlayer = match.getPlayer(userPlayerEntry.getValue()); + if (matchPlayer == null) { + logger.debug("- Match player not found:"); + logger.debug("-- matchId:" + match.getId()); + logger.debug("-- userId:" + userPlayerEntry.getKey()); + logger.debug("-- playerId:" + userPlayerEntry.getValue()); + continue; + } + if (matchPlayer.getPlayer().isHuman()) { + humanPlayers++; + User user = UserManager.getInstance().getUser(userPlayerEntry.getKey()); + if (!matchPlayer.hasQuit()) { + if (user == null) { + logger.debug("- Active user of match is missing:"); + logger.debug("-- matchId:" + match.getId()); + logger.debug("-- userId:" + userPlayerEntry.getKey()); + logger.debug("-- playerId:" + userPlayerEntry.getValue()); + return false; + } + // user exits on the server and match player has not quit -> player is valid + validHumanPlayers++; + } + } else { + aiPlayers++; + } + } + // if at least 2 human players are valid (multiplayer) or all human players are valid the table is valid or it's an AI match + return validHumanPlayers >= 2 || validHumanPlayers == humanPlayers || aiPlayers > 1; } return true; } diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java index f01d01069b8..9928ffab97a 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java @@ -33,6 +33,7 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import mage.MageException; import mage.cards.decks.Deck; +import mage.constants.TableState; import mage.constants.TournamentPlayerState; import mage.game.GameException; import mage.game.Table; @@ -233,10 +234,12 @@ public class TournamentController { Table table = tableManager.createTable(GamesRoomManager.getInstance().getMainRoomId(), matchOptions); table.setTournamentSubTable(true); table.setTournament(tournament); + table.setState(TableState.WAITING); TournamentPlayer player1 = pair.getPlayer1(); TournamentPlayer player2 = pair.getPlayer2(); tableManager.addPlayer(getPlayerUserId(player1.getPlayer().getId()), table.getId(), player1.getPlayer(), player1.getPlayerType(), player1.getDeck()); tableManager.addPlayer(getPlayerUserId(player2.getPlayer().getId()), table.getId(), player2.getPlayer(), player2.getPlayerType(), player2.getDeck()); + table.setState(TableState.STARTING); tableManager.startTournamentSubMatch(null, table.getId()); pair.setMatch(tableManager.getMatch(table.getId())); pair.setTableId(table.getId()); @@ -256,7 +259,9 @@ public class TournamentController { } private void initTournament() { - TableManager.getInstance().initTournament(tableId); + if (!TableManager.getInstance().getTable(tableId).getState().equals(TableState.DUELING)) { + TableManager.getInstance().initTournament(tableId); + } } private void construct(UUID playerId, int timeout) throws MageException {