From 61a58d36c2ffaf6c81786ff9827c7987cb637b90 Mon Sep 17 00:00:00 2001
From: Oleg Agafonov <jaydi85@gmail.com>
Date: Thu, 26 Dec 2019 05:24:44 +0400
Subject: [PATCH] Refactor: added missing getPlayersInRange in cards code (to
 ignore leaved/lost players);

---
 .../src/mage/player/ai/ComputerPlayer6.java   |  2 +-
 .../src/mage/cards/d/DescentIntoMadness.java  | 65 ++++++++++---------
 .../src/mage/cards/e/EnsnaringBridge.java     |  2 +-
 Mage.Sets/src/mage/cards/p/PeaceTalks.java    |  2 +-
 Mage.Sets/src/mage/cards/p/PriceOfGlory.java  | 11 +---
 Mage.Sets/src/mage/cards/s/SyphonMind.java    | 14 ++--
 Mage.Sets/src/mage/cards/t/TidalFlats.java    | 12 ++--
 .../java/org/mage/test/player/TestPlayer.java |  5 --
 .../java/org/mage/test/stub/PlayerStub.java   |  5 --
 .../BeginningOfUntapTriggeredAbility.java     | 10 ++-
 Mage/src/main/java/mage/game/Game.java        | 22 +++----
 Mage/src/main/java/mage/game/GameState.java   |  5 +-
 .../java/mage/game/permanent/Battlefield.java | 18 ++---
 Mage/src/main/java/mage/players/Player.java   |  7 --
 .../main/java/mage/players/PlayerImpl.java    |  5 --
 15 files changed, 75 insertions(+), 110 deletions(-)

diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
index 4a3936a1e6..e0d065ac3a 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
@@ -227,7 +227,7 @@ public class ComputerPlayer6 extends ComputerPlayer /*implements Player*/ {
             }
             val = minimaxAB(node, depth - 1, alpha, beta);
         } else {
-            logger.trace("Add Action -- alpha: " + alpha + " beta: " + beta + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + game.getPlayer(game.getPlayerList().get()).getName());
+            logger.trace("Add Action -- alpha: " + alpha + " beta: " + beta + " depth:" + depth + " step:" + game.getTurn().getStepType() + " for player:" + game.getPlayer(game.getActivePlayerId()).getName());
             if (allPassed(game)) {
                 if (!game.getStack().isEmpty()) {
                     resolve(node, depth, game);
diff --git a/Mage.Sets/src/mage/cards/d/DescentIntoMadness.java b/Mage.Sets/src/mage/cards/d/DescentIntoMadness.java
index 5d0e29e5fd..da95405944 100644
--- a/Mage.Sets/src/mage/cards/d/DescentIntoMadness.java
+++ b/Mage.Sets/src/mage/cards/d/DescentIntoMadness.java
@@ -1,10 +1,5 @@
-
 package mage.cards.d;
 
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.UUID;
 import mage.abilities.Ability;
 import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
 import mage.abilities.effects.OneShotEffect;
@@ -24,13 +19,17 @@ import mage.filter.predicate.permanent.PermanentIdPredicate;
 import mage.game.Game;
 import mage.game.permanent.Permanent;
 import mage.players.Player;
-import mage.players.PlayerList;
 import mage.target.Target;
 import mage.target.TargetCard;
 import mage.target.common.TargetControlledPermanent;
 
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
 /**
- * 5/1/2012 	For each despair counter on Descent into Madness, you'll exile a permanent 
+ * 5/1/2012 	For each despair counter on Descent into Madness, you'll exile a permanent
  * you control or exile a card from your hand, not both.
  * 5/1/2012 	First you choose the permanents and/or cards from your hand that will be
  * exiled. Then each other player in turn order does the same. Then all the chosen permanents
@@ -43,13 +42,13 @@ import mage.target.common.TargetControlledPermanent;
  * 5/1/2012 	If Descent into Madness isn't on the battlefield when its ability resolves,
  * use the number of counters on it when it left the battlefield to determine how many permanents
  * and/or cards from hands to exile.
- * 
+ *
  * @author noxx
  */
 public final class DescentIntoMadness extends CardImpl {
 
     public DescentIntoMadness(UUID ownerId, CardSetInfo setInfo) {
-        super(ownerId,setInfo,new CardType[]{CardType.ENCHANTMENT},"{3}{B}{B}");
+        super(ownerId, setInfo, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
 
 
         // At the beginning of your upkeep, put a despair counter on Descent into Madness, then each player exiles X permanents they control and/or cards from their hand, where X is the number of despair counters on Descent into Madness.
@@ -83,7 +82,7 @@ class DescentIntoMadnessEffect extends OneShotEffect {
     }
 
     @Override
-    public boolean apply(Game game, Ability source) {        
+    public boolean apply(Game game, Ability source) {
         Player controller = game.getPlayer(source.getControllerId());
         Permanent sourcePermanent = game.getPermanent(source.getSourceId());
         if (sourcePermanent != null && controller != null) {
@@ -92,18 +91,20 @@ class DescentIntoMadnessEffect extends OneShotEffect {
         if (sourcePermanent == null) {
             sourcePermanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD);
         }
-        if (sourcePermanent != null && controller != null) {            
+        if (sourcePermanent != null && controller != null) {
             int count = sourcePermanent.getCounters(game).getCount(CounterType.DESPAIR);
             if (count > 0) {
                 // select the permanents and hand cards in turn order
                 LinkedList<UUID> selectedObjects = new LinkedList<>();
-                PlayerList playerList = game.getState().getPlayerList(controller.getId());
-                Player currentPlayer = controller;
-                do {
-                    selectCards(currentPlayer, selectedObjects, count, source, game);
-                    currentPlayer = playerList.getNextInRange(controller, game);                    
-                } while (!currentPlayer.equals(controller) && controller.canRespond());
-                
+
+                // ask all players
+                for (UUID playerId : game.getState().getPlayersInRange(controller.getId(), game)) {
+                    Player currentPlayer = game.getPlayer(playerId);
+                    if (currentPlayer != null && currentPlayer.canRespond()) {
+                        selectCards(currentPlayer, selectedObjects, count, source, game);
+                    }
+                }
+
                 // move permanents and hand cards to exile
                 for (UUID objectId : selectedObjects) {
                     if (game.getState().getZone(objectId) == Zone.BATTLEFIELD) {
@@ -121,10 +122,10 @@ class DescentIntoMadnessEffect extends OneShotEffect {
                             if (player != null) {
                                 player.moveCardToExileWithInfo(card, null, "", source.getSourceId(), game, Zone.HAND, true);
                             }
-                        }                        
+                        }
                     }
                 }
-                
+
             }
             return true;
         }
@@ -134,22 +135,22 @@ class DescentIntoMadnessEffect extends OneShotEffect {
     private void selectCards(Player player, List<UUID> selectedObjects, int count, Ability source, Game game) {
         int amount = Math.min(count, player.getHand().size() + game.getBattlefield().getAllActivePermanents(player.getId()).size());
         int cardsFromHand = 0;
-        
+
         while (player.canRespond() && amount > 0) {
-            
+
             Target target;
             do {
                 FilterControlledPermanent filter = new FilterControlledPermanent();
-                filter.setMessage("permanent you control (" + amount + " left in total)" );
+                filter.setMessage("permanent you control (" + amount + " left in total)");
                 List<PermanentIdPredicate> uuidPredicates = new ArrayList<>();
-                for (UUID uuid :selectedObjects) {
+                for (UUID uuid : selectedObjects) {
                     uuidPredicates.add(new PermanentIdPredicate(uuid));
                 }
-                filter.add(Predicates.not(Predicates.or(uuidPredicates)));                    
-                
+                filter.add(Predicates.not(Predicates.or(uuidPredicates)));
+
                 target = new TargetControlledPermanent(0, 1, filter, true);
                 if (target.canChoose(player.getId(), game)
-                        && player.choose(Outcome.Exile, target, source.getSourceId(), game)) {                
+                        && player.choose(Outcome.Exile, target, source.getSourceId(), game)) {
                     for (UUID targetId : target.getTargets()) {
                         if (!selectedObjects.contains(targetId)) {
                             Permanent chosen = game.getPermanent(targetId);
@@ -162,17 +163,17 @@ class DescentIntoMadnessEffect extends OneShotEffect {
                     }
                 }
             } while (amount > 0 && !target.getTargets().isEmpty() && player.canRespond());
-            if (amount > 0) {                
+            if (amount > 0) {
                 TargetCard targetInHand;
                 do {
                     FilterCard filterInHand = new FilterCard();
-                    filterInHand.setMessage("card from your hand (" + amount + " left in total)");                    
+                    filterInHand.setMessage("card from your hand (" + amount + " left in total)");
                     targetInHand = new TargetCard(0, 1, Zone.HAND, filterInHand);
                     List<CardIdPredicate> uuidPredicates = new ArrayList<>();
-                    for (UUID uuid :selectedObjects) {
+                    for (UUID uuid : selectedObjects) {
                         uuidPredicates.add(new CardIdPredicate(uuid));
                     }
-                    filterInHand.add(Predicates.not(Predicates.or(uuidPredicates)));                    
+                    filterInHand.add(Predicates.not(Predicates.or(uuidPredicates)));
                     if (targetInHand.canChoose(player.getId(), game) &&
                             player.choose(Outcome.Exile, player.getHand(), targetInHand, game)) {
 
@@ -188,7 +189,7 @@ class DescentIntoMadnessEffect extends OneShotEffect {
             }
         }
         if (cardsFromHand > 0) {
-            game.informPlayers(player.getLogName() + " selects " + cardsFromHand + (cardsFromHand == 1?" card":" cards") + " from their hand");
+            game.informPlayers(player.getLogName() + " selects " + cardsFromHand + (cardsFromHand == 1 ? " card" : " cards") + " from their hand");
         }
     }
 }
diff --git a/Mage.Sets/src/mage/cards/e/EnsnaringBridge.java b/Mage.Sets/src/mage/cards/e/EnsnaringBridge.java
index eb32232266..dfac1b9ca3 100644
--- a/Mage.Sets/src/mage/cards/e/EnsnaringBridge.java
+++ b/Mage.Sets/src/mage/cards/e/EnsnaringBridge.java
@@ -53,7 +53,7 @@ class EnsnaringBridgeRestrictionEffect extends RestrictionEffect {
         if (controller == null) {
             return false;
         }
-        return controller.getInRange().contains(permanent.getControllerId())
+        return game.getState().getPlayersInRange(controller.getId(), game).contains(permanent.getControllerId())
                 && permanent.getPower().getValue() > controller.getHand().size();
     }
 
diff --git a/Mage.Sets/src/mage/cards/p/PeaceTalks.java b/Mage.Sets/src/mage/cards/p/PeaceTalks.java
index e50bbf11e3..bff35048f3 100644
--- a/Mage.Sets/src/mage/cards/p/PeaceTalks.java
+++ b/Mage.Sets/src/mage/cards/p/PeaceTalks.java
@@ -142,7 +142,7 @@ class PeaceTalksPlayersAndPermanentsCantBeTargetsOfSpellsOrActivatedAbilities ex
 
     @Override
     public boolean applies(GameEvent event, Ability source, Game game) {
-        for (UUID playerId : game.getPlayer(source.getControllerId()).getInRange()) {
+        for (UUID playerId : game.getState().getPlayersInRange(source.getControllerId(), game)) {
             if (event.getTargetId().equals(playerId)) {
                 return false;
             }
diff --git a/Mage.Sets/src/mage/cards/p/PriceOfGlory.java b/Mage.Sets/src/mage/cards/p/PriceOfGlory.java
index c34c287cd4..1fbc55a591 100644
--- a/Mage.Sets/src/mage/cards/p/PriceOfGlory.java
+++ b/Mage.Sets/src/mage/cards/p/PriceOfGlory.java
@@ -1,7 +1,5 @@
-
 package mage.cards.p;
 
-import java.util.UUID;
 import mage.abilities.Ability;
 import mage.abilities.TriggeredAbilityImpl;
 import mage.abilities.effects.OneShotEffect;
@@ -17,8 +15,9 @@ import mage.game.permanent.Permanent;
 import mage.players.Player;
 import mage.target.targetpointer.FixedTarget;
 
+import java.util.UUID;
+
 /**
- *
  * @author cbt33, Loki (Heartbeat of Spring)
  */
 public final class PriceOfGlory extends CardImpl {
@@ -63,12 +62,8 @@ class PriceOfGloryAbility extends TriggeredAbilityImpl {
         if (permanent == null) {
             return false;
         }
-        Player player = game.getPlayer(controllerId);
-        if (player == null) {
-            return false;
-        }
         if (permanent.isLand()
-                && player.getInRange().contains(permanent.getControllerId())
+                && game.getState().getPlayersInRange(controllerId, game).contains(permanent.getControllerId())
                 && !permanent.isControlledBy(game.getActivePlayerId())) { // intervening if clause
             getEffects().get(0).setTargetPointer(new FixedTarget(permanent.getId()));
             return true;
diff --git a/Mage.Sets/src/mage/cards/s/SyphonMind.java b/Mage.Sets/src/mage/cards/s/SyphonMind.java
index d66789f773..820017992a 100644
--- a/Mage.Sets/src/mage/cards/s/SyphonMind.java
+++ b/Mage.Sets/src/mage/cards/s/SyphonMind.java
@@ -1,7 +1,5 @@
-
 package mage.cards.s;
 
-import java.util.UUID;
 import mage.abilities.Ability;
 import mage.abilities.effects.OneShotEffect;
 import mage.cards.Card;
@@ -13,15 +11,15 @@ import mage.game.Game;
 import mage.players.Player;
 import mage.target.common.TargetCardInHand;
 
+import java.util.UUID;
+
 /**
- *
  * @author jeffwadsworth
  */
 public final class SyphonMind extends CardImpl {
 
     public SyphonMind(UUID ownerId, CardSetInfo setInfo) {
-        super(ownerId,setInfo,new CardType[]{CardType.SORCERY},"{3}{B}");
-
+        super(ownerId, setInfo, new CardType[]{CardType.SORCERY}, "{3}{B}");
 
         // Each other player discards a card. You draw a card for each card discarded this way.
         this.getSpellAbility().addEffect(new SyphonMindEffect());
@@ -60,8 +58,8 @@ class SyphonMindEffect extends OneShotEffect {
         boolean result = false;
         Player you = game.getPlayer(source.getControllerId());
         if (you != null) {
-            for (UUID playerId : you.getInRange()) {
-                if (!playerId.equals(source.getControllerId())) {
+            for (UUID playerId : game.getState().getPlayersInRange(you.getId(), game)) {
+                if (!playerId.equals(you.getId())) {
                     Player otherPlayer = game.getPlayer(playerId);
                     if (otherPlayer != null && !otherPlayer.getHand().isEmpty()) {
                         TargetCardInHand target = new TargetCardInHand();
@@ -77,7 +75,7 @@ class SyphonMindEffect extends OneShotEffect {
                         }
                     }
                 }
-            }            
+            }
             you.drawCards(amount, game);
         }
         return result;
diff --git a/Mage.Sets/src/mage/cards/t/TidalFlats.java b/Mage.Sets/src/mage/cards/t/TidalFlats.java
index 686c387329..7bdc8a5767 100644
--- a/Mage.Sets/src/mage/cards/t/TidalFlats.java
+++ b/Mage.Sets/src/mage/cards/t/TidalFlats.java
@@ -1,10 +1,5 @@
-
 package mage.cards.t;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.UUID;
 import mage.abilities.Ability;
 import mage.abilities.common.SimpleActivatedAbility;
 import mage.abilities.costs.Cost;
@@ -29,8 +24,12 @@ import mage.game.permanent.Permanent;
 import mage.players.Player;
 import mage.target.targetpointer.FixedTarget;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+
 /**
- *
  * @author L_J
  */
 public final class TidalFlats extends CardImpl {
@@ -76,7 +75,6 @@ class TidalFlatsEffect extends OneShotEffect {
 
     @Override
     public boolean apply(Game game, Ability source) {
-        game.getPlayerList();
         Player controller = game.getPlayer(source.getControllerId());
         if (controller == null) {
             return false;
diff --git a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
index 3816f591c7..f31dd797f6 100644
--- a/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
+++ b/Mage.Tests/src/test/java/org/mage/test/player/TestPlayer.java
@@ -2203,11 +2203,6 @@ public class TestPlayer implements Player {
         return computerPlayer.getCounters();
     }
 
-    @Override
-    public void otherPlayerLeftGame(Game game) {
-        computerPlayer.otherPlayerLeftGame(game);
-    }
-
     @Override
     public void beginTurn(Game game) {
         checkLegalMovesThisTurn(game);
diff --git a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java
index 0a570d788c..d745681ea4 100644
--- a/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java
+++ b/Mage.Tests/src/test/java/org/mage/test/stub/PlayerStub.java
@@ -403,11 +403,6 @@ public class PlayerStub implements Player {
         return false;
     }
 
-    @Override
-    public void otherPlayerLeftGame(Game game) {
-
-    }
-
     @Override
     public ManaPool getManaPool() {
         return null;
diff --git a/Mage/src/main/java/mage/abilities/common/BeginningOfUntapTriggeredAbility.java b/Mage/src/main/java/mage/abilities/common/BeginningOfUntapTriggeredAbility.java
index bc685c9fa7..89d9f87241 100644
--- a/Mage/src/main/java/mage/abilities/common/BeginningOfUntapTriggeredAbility.java
+++ b/Mage/src/main/java/mage/abilities/common/BeginningOfUntapTriggeredAbility.java
@@ -10,11 +10,9 @@ import mage.constants.TargetController;
 import mage.constants.Zone;
 import mage.game.Game;
 import mage.game.events.GameEvent;
-import mage.players.Player;
 import mage.target.targetpointer.FixedTarget;
 
 /**
- *
  * @author Jeff
  */
 public class BeginningOfUntapTriggeredAbility extends TriggeredAbilityImpl {
@@ -59,8 +57,8 @@ public class BeginningOfUntapTriggeredAbility extends TriggeredAbilityImpl {
                 }
                 return yours;
             case NOT_YOU:
-                Player controller = game.getPlayer(this.getControllerId());
-                if (controller != null && controller.getInRange().contains(event.getPlayerId()) && !event.getPlayerId().equals(this.getControllerId())) {
+                if (game.getState().getPlayersInRange(this.getControllerId(), game).contains(event.getPlayerId())
+                        && !event.getPlayerId().equals(this.getControllerId())) {
                     if (getTargets().isEmpty()) {
                         for (Effect effect : this.getEffects()) {
                             effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
@@ -80,8 +78,7 @@ public class BeginningOfUntapTriggeredAbility extends TriggeredAbilityImpl {
                 }
                 break;
             case ANY:
-                controller = game.getPlayer(this.getControllerId());
-                if (controller != null && controller.getInRange().contains(event.getPlayerId())) {
+                if (game.getState().getPlayersInRange(this.getControllerId(), game).contains(event.getPlayerId())) {
                     if (getTargets().isEmpty()) {
                         for (Effect effect : this.getEffects()) {
                             effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
@@ -89,6 +86,7 @@ public class BeginningOfUntapTriggeredAbility extends TriggeredAbilityImpl {
                     }
                     return true;
                 }
+                break;
         }
         return false;
     }
diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java
index 354e8817a3..2da26d73c9 100644
--- a/Mage/src/main/java/mage/game/Game.java
+++ b/Mage/src/main/java/mage/game/Game.java
@@ -1,8 +1,5 @@
 package mage.game;
 
-import java.io.Serializable;
-import java.util.*;
-import java.util.stream.Collectors;
 import mage.MageItem;
 import mage.MageObject;
 import mage.abilities.Ability;
@@ -44,6 +41,10 @@ import mage.players.Players;
 import mage.util.MessageToClient;
 import mage.util.functions.ApplyToPermanent;
 
+import java.io.Serializable;
+import java.util.*;
+import java.util.stream.Collectors;
+
 public interface Game extends MageItem, Serializable {
 
     MatchType getGameType();
@@ -127,7 +128,6 @@ public interface Game extends MageItem, Serializable {
         return player.getInRange().stream()
                 .filter(opponentId -> !opponentId.equals(playerId))
                 .collect(Collectors.toSet());
-
     }
 
     default boolean isActivePlayer(UUID playerId) {
@@ -298,9 +298,9 @@ public interface Game extends MageItem, Serializable {
     /**
      * Creates and fires an damage prevention event
      *
-     * @param damageEvent damage event that will be replaced (instanceof check
-     * will be done)
-     * @param source ability that's the source of the prevention effect
+     * @param damageEvent     damage event that will be replaced (instanceof check
+     *                        will be done)
+     * @param source          ability that's the source of the prevention effect
      * @param game
      * @param amountToPrevent max preventable amount
      * @return true prevention was successfull / false prevention was replaced
@@ -310,12 +310,12 @@ public interface Game extends MageItem, Serializable {
     /**
      * Creates and fires an damage prevention event
      *
-     * @param event damage event that will be replaced (instanceof check will be
-     * done)
-     * @param source ability that's the source of the prevention effect
+     * @param event            damage event that will be replaced (instanceof check will be
+     *                         done)
+     * @param source           ability that's the source of the prevention effect
      * @param game
      * @param preventAllDamage true if there is no limit to the damage that can
-     * be prevented
+     *                         be prevented
      * @return true prevention was successfull / false prevention was replaced
      */
     PreventionEffectData preventDamage(GameEvent event, Ability source, Game game, boolean preventAllDamage);
diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java
index 14f9de51ea..b43dc75c4c 100644
--- a/Mage/src/main/java/mage/game/GameState.java
+++ b/Mage/src/main/java/mage/game/GameState.java
@@ -635,6 +635,9 @@ public class GameState implements Serializable, Copyable<GameState> {
      * Returns a list of all active players of the game in range of playerId,
      * also setting the playerId to the first/current player of the list. Also
      * returning the other players in turn order.
+     * <p>
+     * Not safe for continuous effects, see rule 800.4k (effects must work until end of turn even after player leaves)
+     * Use Player.InRange() to find active players list at the start of the turn
      *
      * @param playerId
      * @param game
@@ -645,7 +648,7 @@ public class GameState implements Serializable, Copyable<GameState> {
         Player currentPlayer = game.getPlayer(playerId);
         if (currentPlayer != null) {
             for (Player player : players.values()) {
-                if (!player.hasLeft() && !player.hasLost() && currentPlayer.getInRange().contains(player.getId())) {
+                if (player.isInGame() && currentPlayer.getInRange().contains(player.getId())) {
                     newPlayerList.add(player.getId());
                 }
             }
diff --git a/Mage/src/main/java/mage/game/permanent/Battlefield.java b/Mage/src/main/java/mage/game/permanent/Battlefield.java
index cff67b0068..178880baa6 100644
--- a/Mage/src/main/java/mage/game/permanent/Battlefield.java
+++ b/Mage/src/main/java/mage/game/permanent/Battlefield.java
@@ -1,4 +1,3 @@
-
 package mage.game.permanent;
 
 import mage.abilities.keyword.PhasingAbility;
@@ -6,7 +5,6 @@ import mage.constants.CardType;
 import mage.constants.RangeOfInfluence;
 import mage.filter.FilterPermanent;
 import mage.game.Game;
-import mage.players.Player;
 
 import java.io.Serializable;
 import java.util.*;
@@ -85,8 +83,8 @@ public class Battlefield implements Serializable {
                             && permanent.isPhasedIn())
                     .count();
         } else {
-            Set<UUID> range = game.getPlayer(sourcePlayerId).getInRange();
-            return  (int) field.values()
+            List<UUID> range = game.getState().getPlayersInRange(sourcePlayerId, game);
+            return (int) field.values()
                     .stream()
                     .filter(permanent -> range.contains(permanent.getControllerId())
                             && filter.match(permanent, sourceId, sourcePlayerId, game)
@@ -150,7 +148,7 @@ public class Battlefield implements Serializable {
                             && permanent.isPhasedIn()).count() >= num;
 
         } else {
-            Set<UUID> range = game.getPlayer(sourcePlayerId).getInRange();
+            List<UUID> range = game.getState().getPlayersInRange(sourcePlayerId, game);
             return field.values().stream()
                     .filter(permanent -> range.contains(permanent.getControllerId())
                             && filter.match(permanent, null, sourcePlayerId, game)
@@ -298,12 +296,8 @@ public class Battlefield implements Serializable {
                     .filter(perm -> perm.isPhasedIn() && filter.match(perm, sourceId, sourcePlayerId, game))
                     .collect(Collectors.toList());
         } else {
-            Player player = game.getPlayer(sourcePlayerId);
-            if(player == null){
-                return Collections.emptyList();
-            }
-            Set<UUID> range = player.getInRange();
-            return  field.values()
+            List<UUID> range = game.getState().getPlayersInRange(sourcePlayerId, game);
+            return field.values()
                     .stream()
                     .filter(perm -> perm.isPhasedIn() && range.contains(perm.getControllerId())
                             && filter.match(perm, sourceId, sourcePlayerId, game)).collect(Collectors.toList());
@@ -323,7 +317,7 @@ public class Battlefield implements Serializable {
         if (game.getRangeOfInfluence() == RangeOfInfluence.ALL) {
             return getAllActivePermanents();
         } else {
-            Set<UUID> range = game.getPlayer(sourcePlayerId).getInRange();
+            List<UUID> range = game.getState().getPlayersInRange(sourcePlayerId, game);
             return field.values()
                     .stream()
                     .filter(perm -> perm.isPhasedIn()
diff --git a/Mage/src/main/java/mage/players/Player.java b/Mage/src/main/java/mage/players/Player.java
index 21c1c4ec00..989f14df13 100644
--- a/Mage/src/main/java/mage/players/Player.java
+++ b/Mage/src/main/java/mage/players/Player.java
@@ -211,13 +211,6 @@ public interface Player extends MageItem, Copyable<Player> {
      */
     boolean canRespond();
 
-    /**
-     * Called if other player left the game
-     *
-     * @param game
-     */
-    void otherPlayerLeftGame(Game game);
-
     ManaPool getManaPool();
 
     Set<UUID> getInRange();
diff --git a/Mage/src/main/java/mage/players/PlayerImpl.java b/Mage/src/main/java/mage/players/PlayerImpl.java
index a5941952c1..38c9f1fdf5 100644
--- a/Mage/src/main/java/mage/players/PlayerImpl.java
+++ b/Mage/src/main/java/mage/players/PlayerImpl.java
@@ -457,11 +457,6 @@ public abstract class PlayerImpl implements Player, Serializable {
         return counters;
     }
 
-    @Override
-    public void otherPlayerLeftGame(Game game) {
-        findRange(game);
-    }
-
     @Override
     public void beginTurn(Game game) {
         this.landsPlayed = 0;