From d393ac9c60e063763d26bb3c867033895378a082 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 31 Mar 2023 23:38:09 +0400 Subject: [PATCH] Fixed NPE in some cards with exile zone (example: Draugr Necromancer) --- .../src/mage/cards/a/AutomatedArtificer.java | 4 +++- .../src/mage/cards/d/DraugrNecromancer.java | 2 +- .../emblems/TibaltCosmicImpostorEmblem.java | 17 +++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/Mage.Sets/src/mage/cards/a/AutomatedArtificer.java b/Mage.Sets/src/mage/cards/a/AutomatedArtificer.java index e39f0d2b9c..1b6f49f102 100644 --- a/Mage.Sets/src/mage/cards/a/AutomatedArtificer.java +++ b/Mage.Sets/src/mage/cards/a/AutomatedArtificer.java @@ -10,6 +10,7 @@ import mage.abilities.costs.common.TapSourceCost; import mage.abilities.mana.ConditionalColorlessManaAbility; import mage.abilities.mana.builder.ConditionalManaBuilder; import mage.abilities.mana.conditional.ManaCondition; +import mage.cards.Card; import mage.cards.CardImpl; import mage.cards.CardSetInfo; import mage.constants.CardType; @@ -87,7 +88,8 @@ class AutomatedArtificerManaCondition extends ManaCondition { return false; } if (object instanceof Commander) { - return ((Commander) object).getSourceObject().isArtifact(game); + Card card = ((Commander) object).getSourceObject(); + return card != null && card.isArtifact(game); } return object.isArtifact(game); } diff --git a/Mage.Sets/src/mage/cards/d/DraugrNecromancer.java b/Mage.Sets/src/mage/cards/d/DraugrNecromancer.java index 259f04e49c..8ca2fce148 100644 --- a/Mage.Sets/src/mage/cards/d/DraugrNecromancer.java +++ b/Mage.Sets/src/mage/cards/d/DraugrNecromancer.java @@ -193,7 +193,7 @@ class DraugrNecromancerSpendAnyManaEffect extends AsThoughEffectImpl implements @Override public ManaType getAsThoughManaType(ManaType manaType, ManaPoolItem mana, UUID affectedControllerId, Ability source, Game game) { - if (mana.getSourceObject().isSnow()) { + if (mana.getSourceObject() != null && mana.getSourceObject().isSnow()) { return mana.getFirstAvailable(); } return null; diff --git a/Mage/src/main/java/mage/game/command/emblems/TibaltCosmicImpostorEmblem.java b/Mage/src/main/java/mage/game/command/emblems/TibaltCosmicImpostorEmblem.java index 98d2c177ae..e9baa8f92b 100644 --- a/Mage/src/main/java/mage/game/command/emblems/TibaltCosmicImpostorEmblem.java +++ b/Mage/src/main/java/mage/game/command/emblems/TibaltCosmicImpostorEmblem.java @@ -57,23 +57,20 @@ class TibaltCosmicImpostorPlayFromExileEffect extends AsThoughEffectImpl { return false; } // the exile zone of the Tibalt, Cosmic Impostor that spawned the emblem only - UUID exileId = CardUtil.getExileZoneId(tibaltEmblem.getSourceObject().getId().toString(), game); - if (exileId == null) { - return false; - } - ExileZone exile = game.getState().getExile().getExileZone(exileId); - if (exile == null) { - return false; - } - if (exile.isEmpty()) { + UUID sourceId = tibaltEmblem.getSourceId(); + UUID exileId = CardUtil.getExileZoneId(sourceId != null ? sourceId.toString() : source.getSourceId().toString(), game); + ExileZone exileZone = game.getState().getExile().getExileZone(exileId); + if (exileZone == null || exileZone.isEmpty()) { return false; } + Card cardInExile = game.getCard(objectId); if (cardInExile == null) { return false; } + UUID mainCardId = cardInExile.getMainCard().getId(); - if (exile.contains(mainCardId) + if (exileZone.contains(mainCardId) && affectedControllerId.equals(source.getControllerId()) && game.getState().getZone(mainCardId).equals(Zone.EXILED)) { CardUtil.makeCardPlayable(game, source, cardInExile, Duration.Custom, true);