From ddb9c786b49de06f99cbaece5df568ec46694713 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sun, 17 Aug 2014 20:38:57 +0200 Subject: [PATCH] Some changes to logging and NPE handling. --- .../main/java/mage/server/ChatSession.java | 10 +++++++--- .../java/mage/server/TableController.java | 19 ++++++++++++++---- .../main/java/mage/server/UserManager.java | 5 ++++- .../mage/sets/theros/XenagosTheReveler.java | 20 ++++++++++++------- .../cards/abilities/keywords/PersistTest.java | 2 +- .../abilities/effects/ContinuousEffects.java | 3 +++ Mage/src/mage/game/GameImpl.java | 2 +- 7 files changed, 44 insertions(+), 17 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/ChatSession.java b/Mage.Server/src/main/java/mage/server/ChatSession.java index ed9abfa643d..86ae6892a3a 100644 --- a/Mage.Server/src/main/java/mage/server/ChatSession.java +++ b/Mage.Server/src/main/java/mage/server/ChatSession.java @@ -72,10 +72,14 @@ public class ChatSession { public void kill(UUID userId, DisconnectReason reason) { try { - if (userId != null && clients.containsKey(userId)) { + if (reason == null) { + logger.fatal("User kill without disconnect reason userId: " + userId) ; + reason = DisconnectReason.Undefined; + } + if (reason != null && userId != null && clients.containsKey(userId)) { String userName = clients.get(userId); clients.remove(userId); - logger.debug(userName + (reason == null?"null":"(" + reason.toString() +")") + " removed from chatId " + chatId) ; + logger.debug(userName + "(" + reason.toString() +")" + " removed from chatId " + chatId) ; String message; switch (reason) { case Disconnected: @@ -85,7 +89,7 @@ public class ChatSession { message = " has lost connection"; break; default: - message = reason == null ? " left (unknown reason) ": " left (" + reason.toString() +")"; + message = " left (" + reason.toString() +")"; } if (message != null) { broadcast(null, new StringBuilder(userName).append(message).toString(), MessageColor.BLUE, true, MessageType.STATUS); diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index 0fff6bb7845..2887bc492dc 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -510,8 +510,11 @@ public class TableController { } } else { - logger.error("Unable to find player " + entry.getKey()); - match.getPlayer(entry.getValue()).setQuit(true); + logger.error("Unable to find user: " + entry.getKey() + " playerId: " + entry.getValue()); + MatchPlayer matchPlayer = match.getPlayer(entry.getValue()); + if (matchPlayer != null && !matchPlayer.hasQuit()) { + matchPlayer.setQuit(true); + } } } } @@ -526,11 +529,16 @@ public class TableController { } ServerMessagesUtil.getInstance().incGamesStarted(); + // log about game started logger.info("GAME started [" + match.getName() +"] "+ creator + " - " + opponent.toString()); logger.debug("- matchId: " + match.getId() + " [" + match.getName() + "]"); - logger.debug("- gameId: " + match.getGame().getId()); - logger.debug("- chatId: " + GameManager.getInstance().getChatId(match.getGame().getId())); + if (match.getGame() != null) { + logger.debug("- gameId: " + match.getGame().getId()); + logger.debug("- chatId: " + GameManager.getInstance().getChatId(match.getGame().getId())); + } else { + logger.debug("- no valid game object"); + } LogServiceImpl.instance.log(LogKeys.KEY_GAME_STARTED, String.valueOf(userPlayerMap.size()), creator, opponent.toString()); } catch (Exception ex) { @@ -622,6 +630,9 @@ public class TableController { */ public boolean endGameAndStartNextGame() { // get player that chooses who goes first + if (match.getGame() == null) { + return true; + } UUID choosingPlayerId = match.getChooser(); match.endGame(); if (ConfigSettings.getInstance().isSaveGameActivated() && !match.getGame().isSimulation()) { diff --git a/Mage.Server/src/main/java/mage/server/UserManager.java b/Mage.Server/src/main/java/mage/server/UserManager.java index d1b61af2d96..d95d5639dcf 100644 --- a/Mage.Server/src/main/java/mage/server/UserManager.java +++ b/Mage.Server/src/main/java/mage/server/UserManager.java @@ -81,7 +81,10 @@ public class UserManager { } public User getUser(UUID userId) { - return users.get(userId); + if (userId != null) { + return users.get(userId); + } + return null; } public User findUser(String userName) { diff --git a/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java b/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java index 968c72385eb..81fdc4005fc 100644 --- a/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java +++ b/Mage.Sets/src/mage/sets/theros/XenagosTheReveler.java @@ -117,26 +117,32 @@ class XenagosManaEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Player player = game.getPlayer(source.getControllerId()); - if(player != null){ + if (player != null){ int x = game.getBattlefield().count(new FilterControlledCreaturePermanent(), source.getSourceId(), source.getControllerId(), game); Choice manaChoice = new ChoiceImpl(); - Set choices = new LinkedHashSet(); + Set choices = new LinkedHashSet<>(); choices.add("Red"); choices.add("Green"); manaChoice.setChoices(choices); manaChoice.setMessage("Select color of mana to add"); - for(int i = 0; i < x; i++){ + for (int i = 0; i < x; i++){ Mana mana = new Mana(); while (!player.choose(Outcome.Benefit, manaChoice, game)) { if (!player.isInGame()) { return false; } } - if (manaChoice.getChoice().equals("Green")) { - mana.addGreen(); - } else if (manaChoice.getChoice().equals("Red")) { - mana.addRed(); + if (manaChoice.getChoice() == null) { // can happen if player leaves game + return false; + } + switch (manaChoice.getChoice()) { + case "Green": + mana.addGreen(); + break; + case "Red": + mana.addRed(); + break; } player.getManaPool().addMana(mana, game, source); } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java index 21731614903..da21dd5b30e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/PersistTest.java @@ -158,7 +158,7 @@ public class PersistTest extends CardTestPlayerBase { assertPowerToughness(playerA, "Kitchen Finks", 3,2, Filter.ComparisonScope.Any); assertLife(playerA, 20); // No life from Kitchen Finks ETB becaus of Torpor Orb - assertLife(playerB, 22); // AI assigns damage only 2 damage to one blocker so only 2 life link (It's a kind of bug (or bad play) of AI) + assertLife(playerB, 22); // AI assigns only 2 damage to one blocker so only 2 life link (It's a kind of bug (or bad play) of AI) } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index 8297c8b2ea7..48cd1186a72 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -865,6 +865,9 @@ public class ContinuousEffects implements Serializable { } public void addEffect(ContinuousEffect effect, Ability source) { + if (source == null && effect != null) { + logger.warn("Adding effect without ability : " +effect.toString()); + } switch (effect.getEffectType()) { case REPLACEMENT: case REDIRECTION: diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 184f271a87e..3ad93f7b0e7 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -934,7 +934,7 @@ public abstract class GameImpl implements Game, Serializable { public void quit(UUID playerId) { if (state != null) { Player player = state.getPlayer(playerId); - if (player != null) { + if (player != null && player.isInGame()) { player.quit(this); } }