From 3699b7ca3d8cc532622ad5975990fc9d24dc3870 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 4 Sep 2014 18:20:40 +0200 Subject: [PATCH] Fixed a bug of handling of tournament sub tables if a user left. Some chnages to match view. --- Mage.Common/src/mage/view/GameEndView.java | 6 ++-- Mage.Common/src/mage/view/MatchView.java | 35 +++++++++++-------- .../java/mage/server/TableController.java | 6 +++- .../main/java/mage/server/TableManager.java | 10 +++--- .../main/java/mage/server/UserManager.java | 5 ++- .../java/mage/server/game/GameController.java | 2 +- .../java/mage/server/game/GameSession.java | 5 +-- .../java/mage/server/game/GameWatcher.java | 6 ++-- .../java/mage/server/game/GamesRoomImpl.java | 2 +- Mage/src/mage/game/match/Match.java | 1 + Mage/src/mage/game/match/MatchImpl.java | 11 ++++-- 11 files changed, 57 insertions(+), 32 deletions(-) diff --git a/Mage.Common/src/mage/view/GameEndView.java b/Mage.Common/src/mage/view/GameEndView.java index c13d9f258a2..d86219e32dc 100644 --- a/Mage.Common/src/mage/view/GameEndView.java +++ b/Mage.Common/src/mage/view/GameEndView.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.UUID; import mage.game.Game; import mage.game.GameState; +import mage.game.Table; import mage.game.match.Match; import mage.game.match.MatchPlayer; import mage.players.Player; @@ -57,7 +58,7 @@ public class GameEndView implements Serializable { private int loses; private final int winsNeeded; - public GameEndView(GameState state, Game game, UUID playerId, Match match) { + public GameEndView(GameState state, Game game, UUID playerId, Table table) { startTime = game.getStartTime(); endTime = game.getEndTime(); @@ -85,8 +86,9 @@ public class GameEndView implements Serializable { gameInfo = new StringBuilder("Game is a draw on Turn ").append(game.getTurnNum()).append(".").toString(); } } - matchView = new MatchView(match); + matchView = new MatchView(table); + Match match = table.getMatch(); MatchPlayer matchWinner = null; winsNeeded = match.getOptions().getWinsNeeded(); StringBuilder additonalText = new StringBuilder(); diff --git a/Mage.Common/src/mage/view/MatchView.java b/Mage.Common/src/mage/view/MatchView.java index cbe13370f4d..d59f0040823 100644 --- a/Mage.Common/src/mage/view/MatchView.java +++ b/Mage.Common/src/mage/view/MatchView.java @@ -45,24 +45,33 @@ import mage.game.tournament.TournamentPlayer; public class MatchView implements Serializable { private final UUID tableId; - private final UUID matchId; - private final String matchName; + private UUID matchId; + private String matchName; private String gameType; - private final String deckType; + private String deckType; private final List games = new ArrayList<>(); - private final String result; - private final String players; + private String result; + private String players; - private final Date startTime; - private final Date endTime; - private final boolean replayAvailable; + private Date startTime; + private Date endTime; + private boolean replayAvailable; private final boolean isTournament; + public MatchView(Table table) { + this.tableId = table.getId(); + this.isTournament = table.isTournament(); + if (table.isTournament()) { + initTournamentTable(table); + } else { + initMatchTable(table); + } + } + // used for matches - public MatchView(Match match) { - this.tableId = null; - this.isTournament = false; + private void initMatchTable(Table table) { + Match match = table.getMatch(); this.matchId = match.getId(); this.matchName = match.getName(); this.gameType = match.getOptions().getGameType(); @@ -102,9 +111,7 @@ public class MatchView implements Serializable { } // used for tournaments - public MatchView(Table table) { - this.tableId = table.getId(); - this.isTournament = true; + private void initTournamentTable(Table table) { this.matchId = table.getTournament().getId(); this.matchName = table.getName(); this.gameType = table.getGameType(); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 4e61c6b54af..6258a363e85 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -188,6 +188,10 @@ public class TableController { } } + public boolean isPlayer(UUID userId) { + return userPlayerMap.containsKey(userId); + } + public synchronized boolean replaceDraftPlayer(Player oldPlayer, String name, String playerType, int skill) { Player newPlayer = createPlayer(name, playerType, skill); if (newPlayer == null || table.getState() != TableState.DRAFTING) { @@ -404,7 +408,7 @@ public class TableController { } else if (!table.getState().equals(TableState.FINISHED)) { if (table.isTournament()) { logger.debug("Quit tournament sub tables for userId: " + userId); - TableManager.getInstance().userQuitTournamentSubTables(userId); + TableManager.getInstance().userQuitTournamentSubTables(tournament.getId(), userId); logger.debug("Quit tournament Id: " + table.getTournament().getId()); TournamentManager.getInstance().quit(tournament.getId(), userId); } else { diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java index d9c3b886420..fc2a9b6a776 100644 --- a/Mage.Server/src/main/java/mage/server/TableManager.java +++ b/Mage.Server/src/main/java/mage/server/TableManager.java @@ -181,10 +181,12 @@ 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)) { - Match match = controller.getTable().getMatch(); - if (match != null) { - if (match.getGame() != null) { - GameManager.getInstance().quitMatch(match.getGame().getId(), userId); + 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); + } } } } diff --git a/Mage.Server/src/main/java/mage/server/UserManager.java b/Mage.Server/src/main/java/mage/server/UserManager.java index 79267f803cf..97bfc042a75 100644 --- a/Mage.Server/src/main/java/mage/server/UserManager.java +++ b/Mage.Server/src/main/java/mage/server/UserManager.java @@ -193,7 +193,10 @@ public class UserManager { public void handleException(Exception ex) { if (ex != null) { - logger.fatal("User manager exception"); + logger.fatal("User manager exception" + (ex.getMessage() == null ? "null":ex.getMessage())); + if (ex.getCause() != null) { + logger.debug("- Cause: " + (ex.getCause().getMessage() == null ? "null":ex.getCause().getMessage())); + } ex.printStackTrace(); }else { logger.fatal("User manager exception - null"); diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 4eb5bb1331a..2f6d7759d83 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -536,7 +536,7 @@ public class GameController implements GameCallback { if (table != null) { if (table.getMatch() != null) { for (final GameSession gameSession: gameSessions.values()) { - gameSession.endGameInfo(table.getMatch()); + gameSession.endGameInfo(table); } } } diff --git a/Mage.Server/src/main/java/mage/server/game/GameSession.java b/Mage.Server/src/main/java/mage/server/game/GameSession.java index b0c70780f1d..4539eb2c6b2 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameSession.java +++ b/Mage.Server/src/main/java/mage/server/game/GameSession.java @@ -48,6 +48,7 @@ import java.util.Map.Entry; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import mage.game.Table; /** * @@ -161,11 +162,11 @@ public class GameSession extends GameWatcher { } } - public void endGameInfo(Match match) { + public void endGameInfo(Table table) { if (!killed) { User user = UserManager.getInstance().getUser(userId); if (user != null) { - user.fireCallback(new ClientCallback("endGameInfo", game.getId(), getGameEndView(playerId, match))); + user.fireCallback(new ClientCallback("endGameInfo", game.getId(), getGameEndView(playerId, table))); } } } diff --git a/Mage.Server/src/main/java/mage/server/game/GameWatcher.java b/Mage.Server/src/main/java/mage/server/game/GameWatcher.java index ab39c5d7a2b..67d0ce07958 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWatcher.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWatcher.java @@ -30,7 +30,7 @@ package mage.server.game; import java.util.UUID; import mage.game.Game; -import mage.game.match.Match; +import mage.game.Table; import mage.interfaces.callback.ClientCallback; import mage.server.User; import mage.server.UserManager; @@ -123,8 +123,8 @@ public class GameWatcher { return new GameView(game.getState(), game, null); } - public GameEndView getGameEndView(UUID playerId, Match match) { - return new GameEndView(game.getState(), game, playerId, match); + public GameEndView getGameEndView(UUID playerId, Table table) { + return new GameEndView(game.getState(), game, playerId, table); } public boolean isPlayer() { diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java index 9c8de496d1a..3ed422018ad 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -103,7 +103,7 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { if (table.isTournament()) { matchList.add(new MatchView(table)); } else { - matchList.add(new MatchView(table.getMatch())); + matchList.add(new MatchView(table)); } } else { // more since 50 matches finished since this match so remove it diff --git a/Mage/src/mage/game/match/Match.java b/Mage/src/mage/game/match/Match.java index ba5ee6d2e1a..408b777088e 100644 --- a/Mage/src/mage/game/match/Match.java +++ b/Mage/src/mage/game/match/Match.java @@ -50,6 +50,7 @@ public interface Match { UUID getId(); String getName(); boolean hasEnded(); + boolean hasStarted(); boolean checkIfMatchEnds(); List getPlayers(); MatchPlayer getPlayer(UUID playerId); diff --git a/Mage/src/mage/game/match/MatchImpl.java b/Mage/src/mage/game/match/MatchImpl.java index a212bc22fec..ec56fd5f096 100644 --- a/Mage/src/mage/game/match/MatchImpl.java +++ b/Mage/src/mage/game/match/MatchImpl.java @@ -63,7 +63,7 @@ public abstract class MatchImpl implements Match { public MatchImpl(MatchOptions options) { this.options = options; - startTime = new Date(); + startTime = null; replayAvailable = false; draws = 0; } @@ -93,7 +93,7 @@ public abstract class MatchImpl implements Match { public boolean leave(UUID playerId) { MatchPlayer mPlayer = getPlayer(playerId); if (mPlayer != null) { - if (startedGames == 0) { + if (!hasStarted()) { return players.remove(mPlayer); } mPlayer.setQuit(true); @@ -129,7 +129,12 @@ public abstract class MatchImpl implements Match { @Override public boolean hasEnded() { return endTime != null; - }; + } + + @Override + public boolean hasStarted() { + return startTime != null; + } @Override public boolean checkIfMatchEnds() {