From 6fa4c0b8f2dd6a86cfad73a5ea6c8aa012474ddd Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Tue, 25 Aug 2020 23:38:51 +0400 Subject: [PATCH] Fixed NPE on playerList.getNext usage --- Mage.Sets/src/mage/cards/e/EyeOfDoom.java | 2 +- Mage.Sets/src/mage/cards/t/Tariff.java | 2 +- Mage.Sets/src/mage/cards/t/TemptWithReflections.java | 2 +- Mage.Sets/src/mage/cards/t/ThievesAuction.java | 4 ++-- .../src/main/java/mage/verify/mtgjson/MtgJsonCard.java | 2 +- Mage/src/main/java/mage/game/GameImpl.java | 9 +++++++-- Mage/src/main/java/mage/game/combat/Combat.java | 9 ++++++--- 7 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Mage.Sets/src/mage/cards/e/EyeOfDoom.java b/Mage.Sets/src/mage/cards/e/EyeOfDoom.java index 2ccd1e35591..798a652fa43 100644 --- a/Mage.Sets/src/mage/cards/e/EyeOfDoom.java +++ b/Mage.Sets/src/mage/cards/e/EyeOfDoom.java @@ -95,7 +95,7 @@ class EyeOfDoomEffect extends OneShotEffect { } } player = playerList.getNext(game, false); - } while (!player.getId().equals(game.getActivePlayerId())); + } while (player != null && !player.getId().equals(game.getActivePlayerId())); for (Permanent permanent : permanents) { permanent.addCounters(CounterType.DOOM.createInstance(), source, game); diff --git a/Mage.Sets/src/mage/cards/t/Tariff.java b/Mage.Sets/src/mage/cards/t/Tariff.java index 88ba621659b..96b653e92ff 100644 --- a/Mage.Sets/src/mage/cards/t/Tariff.java +++ b/Mage.Sets/src/mage/cards/t/Tariff.java @@ -71,7 +71,7 @@ class TariffEffect extends OneShotEffect { do { processPlayer(game, source, player); player = playerList.getNext(game, false); - } while (!player.getId().equals(game.getActivePlayerId())); + } while (player != null && !player.getId().equals(game.getActivePlayerId())); return true; } diff --git a/Mage.Sets/src/mage/cards/t/TemptWithReflections.java b/Mage.Sets/src/mage/cards/t/TemptWithReflections.java index 3df0617fdca..2531f2f3963 100644 --- a/Mage.Sets/src/mage/cards/t/TemptWithReflections.java +++ b/Mage.Sets/src/mage/cards/t/TemptWithReflections.java @@ -81,7 +81,7 @@ class TemptWithReflectionsEffect extends OneShotEffect { game.informPlayers((player.getLogName() + decision + permanent.getName())); } player = playerList.getNext(game, false); - } while (!player.getId().equals(game.getActivePlayerId())); + } while (player != null && !player.getId().equals(game.getActivePlayerId())); for (UUID playerId : playersSaidYes) { effect = new CreateTokenCopyTargetEffect(playerId); diff --git a/Mage.Sets/src/mage/cards/t/ThievesAuction.java b/Mage.Sets/src/mage/cards/t/ThievesAuction.java index ed260a99d58..941494e807b 100644 --- a/Mage.Sets/src/mage/cards/t/ThievesAuction.java +++ b/Mage.Sets/src/mage/cards/t/ThievesAuction.java @@ -77,8 +77,8 @@ class ThievesAuctionEffect extends OneShotEffect { // Starting with you, each player PlayerList playerList = game.getState().getPlayersInRange(controller.getId(), game); Player player = playerList.getCurrent(game); - while (!exiledCards.isEmpty() && !game.hasEnded()) { - if (player != null && player.canRespond()) { + while (player != null && !exiledCards.isEmpty() && !game.hasEnded()) { + if (player.canRespond()) { // chooses one of the exiled cards TargetCard target = new TargetCardInExile(new FilterCard()); if (player.choose(Outcome.PutCardInPlay, exiledCards, target, game)) { diff --git a/Mage.Verify/src/main/java/mage/verify/mtgjson/MtgJsonCard.java b/Mage.Verify/src/main/java/mage/verify/mtgjson/MtgJsonCard.java index 5cbeea27973..10fa4fcca9b 100644 --- a/Mage.Verify/src/main/java/mage/verify/mtgjson/MtgJsonCard.java +++ b/Mage.Verify/src/main/java/mage/verify/mtgjson/MtgJsonCard.java @@ -39,7 +39,7 @@ public final class MtgJsonCard { if ("transform".equals(layout) || "flip".equals(layout) || "adventure".equals(layout) - || "meld".equals(layout)) { // TODO: remove or keep after mtgjson's meld bug resolve https://github.com/mtgjson/mtgjson/issues/661 + || "meld".equals(layout)) { // mtgjson uses composite names for meld cards, but scryfall uses simple face names return faceName; } return asciiName != null ? asciiName : name; diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index a7d8590b986..a80f1ab61e7 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -796,7 +796,9 @@ public abstract class GameImpl implements Game, Serializable { break; } playerByOrder = playerList.getNext(this, true); - state.setPlayerByOrderId(playerByOrder.getId()); + if (playerByOrder != null) { + state.setPlayerByOrderId(playerByOrder.getId()); + } } } if (checkIfGameIsOver() && !isSimulation()) { @@ -902,7 +904,10 @@ public abstract class GameImpl implements Game, Serializable { state.getTurn().resumePlay(this, wasPaused); if (!isPaused() && !checkIfGameIsOver()) { endOfTurn(); - player = playerList.getNext(this, true); + Player nextPlayer = playerList.getNext(this, true); + if (nextPlayer != null) { + player = nextPlayer; + } state.setTurnNum(state.getTurnNum() + 1); } } diff --git a/Mage/src/main/java/mage/game/combat/Combat.java b/Mage/src/main/java/mage/game/combat/Combat.java index a3c25098d52..a49496379f0 100644 --- a/Mage/src/main/java/mage/game/combat/Combat.java +++ b/Mage/src/main/java/mage/game/combat/Combat.java @@ -1234,25 +1234,28 @@ public class Combat implements Serializable, Copyable { Player attackingPlayer = game.getPlayer(attackingPlayerId); if (attackingPlayer != null) { PlayerList players; + Player opponent; switch (game.getAttackOption()) { case LEFT: players = game.getState().getPlayerList(attackingPlayerId); - while (attackingPlayer.isInGame()) { - Player opponent = players.getNext(game, false); + opponent = players.getNext(game, false); + while (opponent != null && attackingPlayer.isInGame()) { if (attackingPlayer.hasOpponent(opponent.getId(), game)) { attackablePlayers.add(opponent.getId()); break; } + opponent = players.getNext(game, false); } break; case RIGHT: players = game.getState().getPlayerList(attackingPlayerId); + opponent = players.getPrevious(game); while (attackingPlayer.isInGame()) { - Player opponent = players.getPrevious(game); if (attackingPlayer.hasOpponent(opponent.getId(), game)) { attackablePlayers.add(opponent.getId()); break; } + opponent = players.getPrevious(game); } break; case MULTIPLE: