From 531768491c486ccf374d7688d9fa338c2fe0ff0e Mon Sep 17 00:00:00 2001 From: Grath <1895280+Grath@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:43:33 -0500 Subject: [PATCH 1/3] Fix tracking Commander in play when your commander is a (M)DFC. Fixes #7530, #7637, #7699, #7773 --- .../watchers/common/CommanderInfoWatcher.java | 31 +++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java index cd5d1681808..a17513b81b6 100644 --- a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java @@ -5,6 +5,8 @@ import java.util.Map; import java.util.UUID; import mage.MageObject; import mage.cards.Card; +import mage.cards.DoubleFacedCard; +import mage.cards.DoubleFacedCardHalf; import mage.constants.WatcherScope; import mage.game.Game; import mage.game.events.DamagedPlayerEvent; @@ -36,7 +38,11 @@ public class CommanderInfoWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { if (checkCommanderDamage && event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) { - if (sourceId.equals(event.getSourceId())) { + Card sourceCard = game.getCard(event.getSourceId()); + if (sourceCard instanceof DoubleFacedCardHalf) { + sourceCard = ((DoubleFacedCardHalf) sourceCard).getParentCard(); + } + if (sourceId.equals(sourceCard.getId())) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage()) { UUID playerUUID = event.getTargetId(); @@ -44,7 +50,7 @@ public class CommanderInfoWatcher extends Watcher { damage += damageEvent.getAmount(); damageToPlayer.put(playerUUID, damage); Player player = game.getPlayer(playerUUID); - MageObject commander = game.getObject(sourceId); + MageObject commander = game.getObject(event.getSourceId()); if (player != null && commander != null) { if (!game.isSimulation()) { game.informPlayers(commander.getLogName() + " did " + damage + " combat damage to " + player.getLogName() + " during the game."); @@ -62,8 +68,15 @@ public class CommanderInfoWatcher extends Watcher { public void addCardInfoToCommander(Game game) { MageObject object = game.getPermanent(sourceId); + MageObject leftObject = null; + MageObject rightObject = null; if (object == null) { object = game.getCard(sourceId); + if (object instanceof DoubleFacedCard) { + DoubleFacedCard cardObject = (DoubleFacedCard)object; + leftObject = game.getPermanent(cardObject.getLeftHalfCard().getId()); + rightObject = game.getPermanent(cardObject.getRightHalfCard().getId()); + } } if (object != null) { StringBuilder sb = new StringBuilder(); @@ -74,6 +87,12 @@ public class CommanderInfoWatcher extends Watcher { sb.append(' ').append(playsCount).append(playsCount == 1 ? " time" : " times").append(" played from the command zone."); } this.addInfoToObject(object, "Commander", sb.toString(), game); + if (leftObject != null) { + this.addInfoToObject(leftObject, "Commander", sb.toString(), game); + } + if (rightObject != null) { + this.addInfoToObject(rightObject, "Commander", sb.toString(), game); + } if (checkCommanderDamage) { for (Map.Entry entry : damageToPlayer.entrySet()) { @@ -81,6 +100,14 @@ public class CommanderInfoWatcher extends Watcher { sb.append("").append(commanderTypeName).append(" did ").append(entry.getValue()).append(" combat damage to player ").append(damagedPlayer.getLogName()).append('.'); this.addInfoToObject(object, "Commander" + entry.getKey(), "" + commanderTypeName + " did " + entry.getValue() + " combat damage to player " + damagedPlayer.getLogName() + '.', game); + if (leftObject != null) { + this.addInfoToObject(leftObject, "Commander" + entry.getKey(), + "" + commanderTypeName + " did " + entry.getValue() + " combat damage to player " + damagedPlayer.getLogName() + '.', game); + } + if (rightObject != null) { + this.addInfoToObject(object, "Commander" + entry.getKey(), + "" + commanderTypeName + " did " + entry.getValue() + " combat damage to player " + damagedPlayer.getLogName() + '.', game); + } } } } From ce36e5dec06c19906213e6ad719272ca87958f05 Mon Sep 17 00:00:00 2001 From: Grath <1895280+Grath@users.noreply.github.com> Date: Fri, 5 Dec 2025 18:06:00 -0500 Subject: [PATCH 2/3] Use getCard.getMainCard() instead. --- .../main/java/mage/watchers/common/CommanderInfoWatcher.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java index a17513b81b6..15a513cecb8 100644 --- a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java @@ -38,10 +38,7 @@ public class CommanderInfoWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { if (checkCommanderDamage && event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) { - Card sourceCard = game.getCard(event.getSourceId()); - if (sourceCard instanceof DoubleFacedCardHalf) { - sourceCard = ((DoubleFacedCardHalf) sourceCard).getParentCard(); - } + Card sourceCard = game.getCard(event.getSourceId()).getMainCard(); if (sourceId.equals(sourceCard.getId())) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage()) { From 8cc31b1a7476614efc3626519f27114d5cad3c65 Mon Sep 17 00:00:00 2001 From: Grath <1895280+Grath@users.noreply.github.com> Date: Fri, 5 Dec 2025 22:29:51 -0500 Subject: [PATCH 3/3] Null check. --- .../java/mage/watchers/common/CommanderInfoWatcher.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java index 15a513cecb8..a9ef959bb88 100644 --- a/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java +++ b/Mage/src/main/java/mage/watchers/common/CommanderInfoWatcher.java @@ -38,7 +38,11 @@ public class CommanderInfoWatcher extends Watcher { @Override public void watch(GameEvent event, Game game) { if (checkCommanderDamage && event.getType() == GameEvent.EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) { - Card sourceCard = game.getCard(event.getSourceId()).getMainCard(); + Card sourceCard = game.getCard(event.getSourceId()); + if (sourceCard == null) { + return; + } + sourceCard = sourceCard.getMainCard(); if (sourceId.equals(sourceCard.getId())) { DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage()) {