From f3e310cfd39d5b268f9faa50ecfa0b80844041df Mon Sep 17 00:00:00 2001 From: ssk97 Date: Fri, 1 Dec 2023 07:24:39 -0800 Subject: [PATCH] Fixed tags cost and MageObjectReference usage (#11500) * Fix costs tag clearing while permanent still on the battlefield * Improved version of game.getPermanentOrLKIBattlefield with MageObjectReference * Improve documentation --- .../main/java/mage/MageObjectReference.java | 6 +----- Mage/src/main/java/mage/game/Game.java | 19 +++++++++++++++++++ Mage/src/main/java/mage/game/GameImpl.java | 10 ++++++++++ Mage/src/main/java/mage/game/GameState.java | 4 ++-- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/Mage/src/main/java/mage/MageObjectReference.java b/Mage/src/main/java/mage/MageObjectReference.java index 33583eaa57a..22fdf83d15e 100644 --- a/Mage/src/main/java/mage/MageObjectReference.java +++ b/Mage/src/main/java/mage/MageObjectReference.java @@ -172,11 +172,7 @@ public class MageObjectReference implements Comparable, Ser } public Permanent getPermanentOrLKIBattlefield(Game game) { - Permanent permanent = game.getPermanentOrLKIBattlefield(sourceId); - if (permanent != null && permanent.getZoneChangeCounter(game) == zoneChangeCounter) { - return permanent; - } - return null; + return game.getPermanentOrLKIBattlefield(this); } public Card getCard(Game game) { diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 5e3089d7973..dcbdf7cd973 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -112,8 +112,27 @@ public interface Game extends MageItem, Serializable, Copyable { */ Permanent getPermanent(UUID permanentId); + /** + * Given the UUID of a permanent, this method returns the permanent. If the current game state does not contain + * a permanent with the given UUID, this method checks the last known information on the battlefield to look for it. + *
+ * Warning: if the permanent has left the battlefield and then returned, this information might be wrong. + * Prefer usage of a MageObjectReference instead of only the UUID. + * + * @param permanentId - The UUID of the permanent + * @return permanent or permanent's LKI + */ Permanent getPermanentOrLKIBattlefield(UUID permanentId); + /** + * Given a MageObjectReference to a permanent, this method returns the permanent. If the current game state does not + * contain that permanent, this method checks the last known information on the battlefield. + * + * @param permanentRef - A MOR to the permanent + * @return permanent or permanent's LKI + */ + Permanent getPermanentOrLKIBattlefield(MageObjectReference permanentRef); + Permanent getPermanentEntering(UUID permanentId); Map getPermanentsEntering(); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 811bcfe9d62..874fc6630d8 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -717,6 +717,16 @@ public abstract class GameImpl implements Game { return permanent; } + @Override + public Permanent getPermanentOrLKIBattlefield(MageObjectReference permanentRef) { + UUID id = permanentRef.getSourceId(); + Permanent permanent = state.getPermanent(id); + if (permanent == null || state.getZoneChangeCounter(id) != permanentRef.getZoneChangeCounter()) { + permanent = (Permanent) this.getLastKnownInformation(id, Zone.BATTLEFIELD, permanentRef.getZoneChangeCounter()); + } + return permanent; + } + @Override public Permanent getPermanentEntering(UUID permanentId) { return permanentsEntering.get(permanentId); diff --git a/Mage/src/main/java/mage/game/GameState.java b/Mage/src/main/java/mage/game/GameState.java index 3985e08a724..6bf80111caa 100644 --- a/Mage/src/main/java/mage/game/GameState.java +++ b/Mage/src/main/java/mage/game/GameState.java @@ -1374,8 +1374,8 @@ public class GameState implements Serializable, Copyable { */ public void cleanupPermanentCostsTags(Game game){ getPermanentCostsTags().entrySet().removeIf(entry -> - !(entry.getKey().zoneCounterIsCurrent(game)) - ); + !(entry.getKey().getZoneChangeCounter() == game.getState().getZoneChangeCounter(entry.getKey().getSourceId())-1) + ); // The stored MOR is the stack-moment MOR so need to subtract one from the permanent's ZCC for the check } public void addWatcher(Watcher watcher) {