From bdde1bd45fa0072777fd1c079bb9eda63b82f3b9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 27 Aug 2014 22:24:42 +0200 Subject: [PATCH] Fixed a bug that lets a player that has reconnected to a game and the game still last for the timeout duration the player loses wrongly because of timeout (fixes #547). --- .../java/mage/server/game/GameController.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) 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 a85e9513d72..36d509a7010 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -268,13 +268,31 @@ public class GameController implements GameCallback { public void join(UUID userId) { UUID playerId = userPlayerMap.get(userId); - GameSession gameSession = new GameSession(game, userId, playerId, useTimeout); - gameSessions.put(playerId, gameSession); User user = UserManager.getInstance().getUser(userId); - gameSession.setUserData(user.getUserData()); + if (userId == null || playerId == null) { + logger.fatal("Join game failed!"); + logger.fatal("- gameId: " + game.getId()); + logger.fatal("- userId: " + userId); + return; + } + Player player = game.getPlayer(playerId); + if (player == null) { + logger.fatal("Player not found - playerId: " +playerId); + return; + } + GameSession gameSession = gameSessions.get(playerId); + String joinType; + if (gameSession == null) { + gameSession = new GameSession(game, userId, playerId, useTimeout); + gameSessions.put(playerId, gameSession); + gameSession.setUserData(user.getUserData()); + joinType = "joined"; + } else { + joinType = "rejoined"; + } user.addGame(playerId, gameSession); - logger.debug(new StringBuilder("Player ").append(playerId).append(" has joined game ").append(game.getId()).toString()); - ChatManager.getInstance().broadcast(chatId, "", new StringBuilder(game.getPlayer(playerId).getName()).append(" has joined the game").toString(), MessageColor.ORANGE, true, MessageType.GAME); + logger.debug("Player " + playerId + " has " + joinType + " gameId: " + game.getId()); + ChatManager.getInstance().broadcast(chatId, "", game.getPlayer(playerId).getName() + " has " + joinType + " the game", MessageColor.ORANGE, true, MessageType.GAME); checkStart(); } @@ -417,11 +435,10 @@ public class GameController implements GameCallback { public void timeout(UUID userId) { if (userPlayerMap.containsKey(userId)) { - StringBuilder sb = new StringBuilder(game.getPlayer(userPlayerMap.get(userId)).getName()) - .append(" has timed out (player had priority and was not active for ") - .append(ConfigSettings.getInstance().getMaxSecondsIdle()) - .append(" seconds ) - Auto concede."); - ChatManager.getInstance().broadcast(chatId, "", sb.toString() , MessageColor.BLACK, true, MessageType.STATUS); + String sb = game.getPlayer(userPlayerMap.get(userId)).getName() + + " has timed out (player had priority and was not active for " + + ConfigSettings.getInstance().getMaxSecondsIdle() + " seconds ) - Auto concede."; + ChatManager.getInstance().broadcast(chatId, "", sb, MessageColor.BLACK, true, MessageType.STATUS); game.idleTimeout(getPlayerId(userId)); } }