diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 1c8a3db5ebd..ddeb36888cc 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -839,7 +839,12 @@ public class MageServerImpl implements MageServer { @Override public void execute() { UUID userId = SessionManager.getInstance().getSession(sessionId).getUserId(); - GameManager.getInstance().stopWatching(gameId, userId); + User user = UserManager.getInstance().getUser(userId); + if (user != null) { + GameManager.getInstance().stopWatching(gameId, userId); + user.removeGameWatchInfo(gameId); + } + } }); } diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 63b95dc3c43..ff2c6bd43f9 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -402,7 +402,7 @@ public class TableController { if (table.isTournament()) { tournament.removePlayer(playerId); } else { - match.leave(playerId); + match.quitMatch(playerId); } User user = UserManager.getInstance().getUser(userId); if (user != null) { @@ -434,7 +434,7 @@ public class TableController { matchPlayer.submitDeck(matchPlayer.getDeck()); } } - match.leave(playerId); + match.quitMatch(playerId); } } } @@ -526,9 +526,8 @@ public class TableController { user.removeConstructing(match.getPlayer(entry.getValue()).getPlayer().getId()); GameManager.getInstance().joinGame(match.getGame().getId(), user.getId()); logger.debug("Joined currently not connected user " + user.getName() + " matchId: " + match.getId()); - } else { - user.gameStarted(match.getGame().getId(), entry.getValue()); - } + } + user.gameStarted(match.getGame().getId(), entry.getValue()); if (creator == null) { creator = user.getName(); @@ -663,17 +662,18 @@ public class TableController { */ public boolean endGameAndStartNextGame() { // get player that chooses who goes first - if (match.getGame() == null) { + Game game = match.getGame(); + if (game == null) { return true; } UUID choosingPlayerId = match.getChooser(); match.endGame(); - if (ConfigSettings.getInstance().isSaveGameActivated() && !match.getGame().isSimulation()) { - if (GameManager.getInstance().saveGame(match.getGame().getId())) { + if (ConfigSettings.getInstance().isSaveGameActivated() && !game.isSimulation()) { + if (GameManager.getInstance().saveGame(game.getId())) { match.setReplayAvailable(true); } } - GameManager.getInstance().removeGame(match.getGame().getId()); + GameManager.getInstance().removeGame(game.getId()); try { if (!match.hasEnded()) { table.sideboard(); diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java index b541a3bd988..d0ff3637dc4 100644 --- a/Mage.Server/src/main/java/mage/server/TableManager.java +++ b/Mage.Server/src/main/java/mage/server/TableManager.java @@ -81,7 +81,7 @@ public class TableManager { * * In minutes. */ - private static final int EXPIRE_CHECK_PERIOD = 1; + private static final int EXPIRE_CHECK_PERIOD = 10; public static TableManager getInstance() { return INSTANCE; diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 639e44e13f9..ad0351bf691 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -352,6 +352,10 @@ public class User { logger.debug("-- leave tableId: " + entry.getValue().getId()); TableManager.getInstance().leaveTable(userId, entry.getValue().getId()); } + logger.debug("REMOVE " + getName() + " watched Games " + watchedGames.size()); + for (UUID gameId: watchedGames) { + GameManager.getInstance().stopWatching(gameId, userId); + } logger.debug("REMOVE " + getName() + " Chats "); ChatManager.getInstance().removeUser(userId, reason); } diff --git a/Mage.Server/src/main/java/mage/server/UserManager.java b/Mage.Server/src/main/java/mage/server/UserManager.java index af683f9ec5b..08fc6c84c94 100644 --- a/Mage.Server/src/main/java/mage/server/UserManager.java +++ b/Mage.Server/src/main/java/mage/server/UserManager.java @@ -141,18 +141,19 @@ public class UserManager { @Override public void run() { try { - logger.debug("User " + user.getName() + " will be removed (" + reason.toString() + ") userId: " + userId); + logger.debug("USER REMOVE - " + user.getName() + " (" + reason.toString() + ") userId: " + userId); user.remove(reason); - users.remove(userId); - logger.debug("User " + user.getName() + " removed"); + logger.debug("USER REMOVE END - " + user.getName()); } catch (Exception ex) { handleException(ex); + } finally { + users.remove(userId); } } } ); } else { - logger.warn(new StringBuilder("Trying to remove userId: ").append(userId).append(" but it does not exist.")); + logger.warn("Trying to remove userId: " + userId + " - but it does not exist."); } } } 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 109224c72b7..b91a12732ca 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -355,7 +355,6 @@ public class GameController implements GameCallback { watchers.remove(userId); User user = UserManager.getInstance().getUser(userId); if (user != null) { - user.removeGameWatchInfo(game.getId()); ChatManager.getInstance().broadcast(chatId, user.getName(), " has stopped watching", MessageColor.BLUE, true, ChatMessage.MessageType.STATUS); } } @@ -368,7 +367,25 @@ public class GameController implements GameCallback { game.setManaPoolMode(getPlayerId(userId), autoPayment); } - public void quit(UUID userId) { +// public void removeUser(UUID userId) { +// UUID playerId = userPlayerMap.get(userId); +// if (playerId != null) { +// GameSession gameSession = gameSessions.get(playerId); +// if (gameSession != null) { +// gameSession.setKilled(); +// gameSessions.remove(playerId); +// quitMatch(userId); +// userPlayerMap.remove(userId); +// } +// } +// GameWatcher gameWatcher = watchers.get(userId); +// if (gameWatcher != null) { +// gameWatcher.setKilled(); +// watchers.remove(userId); +// } +// } + + public void quitMatch(UUID userId) { game.quit(getPlayerId(userId)); } @@ -388,9 +405,6 @@ public class GameController implements GameCallback { game.restorePriority(getPlayerId(userId)); } - private void leave(UUID userId) { - game.quit(getPlayerId(userId)); - } public void cheat(UUID userId, UUID playerId, DeckCardLists deckList) { Deck deck; @@ -421,24 +435,6 @@ public class GameController implements GameCallback { } } - public void kill(UUID userId) { - UUID playerId = userPlayerMap.get(userId); - if (playerId != null) { - GameSession gameSession = gameSessions.get(playerId); - if (gameSession != null) { - gameSession.setKilled(); - gameSessions.remove(playerId); - leave(userId); - userPlayerMap.remove(userId); - } - } - GameWatcher gameWatcher = watchers.get(userId); - if (gameWatcher != null) { - gameWatcher.setKilled(); - watchers.remove(userId); - } - } - public void timeout(UUID userId) { if (userPlayerMap.containsKey(userId)) { String sb = game.getPlayer(userPlayerMap.get(userId)).getName() + diff --git a/Mage.Server/src/main/java/mage/server/game/GameManager.java b/Mage.Server/src/main/java/mage/server/game/GameManager.java index 8987cf6ab72..9fd8f61374e 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameManager.java +++ b/Mage.Server/src/main/java/mage/server/game/GameManager.java @@ -123,7 +123,7 @@ public class GameManager { public void quitMatch(UUID gameId, UUID userId) { GameController gameController = gameControllers.get(gameId); if (gameController != null) { - gameController.quit(userId); + gameController.quitMatch(userId); } } @@ -175,12 +175,12 @@ public class GameManager { // } // } - public void kill(UUID gameId, UUID userId) { - GameController gameController = gameControllers.get(gameId); - if (gameController != null) { - gameController.kill(userId); - } - } +// public void kill(UUID gameId, UUID userId) { +// GameController gameController = gameControllers.get(gameId); +// if (gameController != null) { +// gameController.kill(userId); +// } +// } public void cheat(UUID gameId, UUID userId, UUID playerId, DeckCardLists deckList) { GameController gameController = gameControllers.get(gameId); 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 4539eb2c6b2..7d6a4894ca1 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameSession.java +++ b/Mage.Server/src/main/java/mage/server/game/GameSession.java @@ -31,7 +31,6 @@ package mage.server.game; import mage.cards.Cards; import mage.constants.ManaType; import mage.game.Game; -import mage.game.match.Match; import mage.interfaces.callback.ClientCallback; import mage.players.Player; import mage.players.net.UserData; diff --git a/Mage/src/mage/game/match/Match.java b/Mage/src/mage/game/match/Match.java index 408b777088e..d69a5db0bab 100644 --- a/Mage/src/mage/game/match/Match.java +++ b/Mage/src/mage/game/match/Match.java @@ -56,7 +56,7 @@ public interface Match { MatchPlayer getPlayer(UUID playerId); void addPlayer(Player player, Deck deck); - boolean leave(UUID playerId); + boolean quitMatch(UUID playerId); void submitDeck(UUID playerId, Deck deck); void updateDeck(UUID playerId, Deck deck); diff --git a/Mage/src/mage/game/match/MatchImpl.java b/Mage/src/mage/game/match/MatchImpl.java index 8f6574e5c46..43295f01efe 100644 --- a/Mage/src/mage/game/match/MatchImpl.java +++ b/Mage/src/mage/game/match/MatchImpl.java @@ -93,7 +93,7 @@ public abstract class MatchImpl implements Match { } @Override - public boolean leave(UUID playerId) { + public boolean quitMatch(UUID playerId) { MatchPlayer mPlayer = getPlayer(playerId); if (mPlayer != null) { if (!hasStarted()) { diff --git a/Mage/src/mage/game/tournament/TournamentPairing.java b/Mage/src/mage/game/tournament/TournamentPairing.java index 3a2478e060e..eaff70c8221 100644 --- a/Mage/src/mage/game/tournament/TournamentPairing.java +++ b/Mage/src/mage/game/tournament/TournamentPairing.java @@ -76,7 +76,7 @@ public class TournamentPairing { * Called by eliminate tournaments after each match */ public void eliminatePlayers() { - if (match.hasEnded()) { + if (match != null && match.hasEnded()) { MatchPlayer mPlayer1 = match.getPlayer(player1.getPlayer().getId()); MatchPlayer mPlayer2 = match.getPlayer(player2.getPlayer().getId()); if (mPlayer1.hasQuit() || !mPlayer1.isMatchWinner()) { @@ -88,7 +88,7 @@ public class TournamentPairing { } } public void finishPlayersThatPlayedLastRound() { - if (match.hasEnded()) { + if (match != null && match.hasEnded()) { if (!player1.isEliminated()) { player1.setEliminated(); player1.setState(TournamentPlayerState.FINISHED);