From 88f990ec673422e3080a19e218d4706f79cc0040 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Fri, 7 Sep 2012 20:03:47 +0400 Subject: [PATCH] Another way to fix Issue#51: Gravecrawler could block creatures with and without flying --- Mage/src/mage/abilities/Ability.java | 3 +- Mage/src/mage/abilities/AbilityImpl.java | 35 ++++++++++++------- .../mage/abilities/TriggeredAbilities.java | 2 +- .../common/DiesTriggeredAbility.java | 2 +- Mage/src/mage/game/stack/StackAbility.java | 3 +- Mage/src/mage/util/trace/TraceUtil.java | 19 ++++++---- 6 files changed, 40 insertions(+), 24 deletions(-) diff --git a/Mage/src/mage/abilities/Ability.java b/Mage/src/mage/abilities/Ability.java index fc80b46f730..f64742d2747 100644 --- a/Mage/src/mage/abilities/Ability.java +++ b/Mage/src/mage/abilities/Ability.java @@ -31,6 +31,7 @@ package mage.abilities; import mage.Constants.AbilityType; import mage.Constants.EffectType; import mage.Constants.Zone; +import mage.MageObject; import mage.abilities.costs.AlternativeCost; import mage.abilities.costs.Cost; import mage.abilities.costs.Costs; @@ -362,6 +363,6 @@ public interface Ability extends Controllable, Serializable { * @param checkLKI * @return */ - public boolean isInUseableZone(Game game, boolean checkLKI); + public boolean isInUseableZone(Game game, MageObject source, boolean checkLKI); } diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index 98fffb6eab9..61281e9c045 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -467,7 +467,7 @@ public abstract class AbilityImpl> implements Ability { } @Override - public boolean isInUseableZone(Game game, boolean checkLKI) { + public boolean isInUseableZone(Game game, MageObject source, boolean checkLKI) { // emblem are always actual if (zone.equals(Zone.COMMAND)) { @@ -482,18 +482,27 @@ public abstract class AbilityImpl> implements Ability { } } - if (!(this instanceof MageSingleton)) { - MageObject object = game.getObject(getSourceId()); - if (object != null && !object.getAbilities().contains(this)) { - boolean found = false; - // unfortunately we need to handle double faced cards separately and only this way - if (object instanceof PermanentCard && ((PermanentCard)object).canTransform()) { - PermanentCard permanent = (PermanentCard)object; - found = permanent.getSecondCardFace().getAbilities().contains(this) || permanent.getCard().getAbilities().contains(this); - } - if (!found) { - return false; - } + MageObject object; + UUID sourceId; + // for singleton abilities like Flying we can't rely on abilities' source + // so will use the one that came as a parameter if it is not null + if (this instanceof MageSingleton && source != null) { + object = source; + sourceId = source.getId(); + } else { + object = game.getObject(getSourceId()); + sourceId = getSourceId(); + } + + if (object != null && !object.getAbilities().contains(this)) { + boolean found = false; + // unfortunately we need to handle double faced cards separately and only this way + if (object instanceof PermanentCard && ((PermanentCard)object).canTransform()) { + PermanentCard permanent = (PermanentCard)object; + found = permanent.getSecondCardFace().getAbilities().contains(this) || permanent.getCard().getAbilities().contains(this); + } + if (!found) { + return false; } } diff --git a/Mage/src/mage/abilities/TriggeredAbilities.java b/Mage/src/mage/abilities/TriggeredAbilities.java index a009097c2dc..3f8afcc8c7c 100644 --- a/Mage/src/mage/abilities/TriggeredAbilities.java +++ b/Mage/src/mage/abilities/TriggeredAbilities.java @@ -54,7 +54,7 @@ public class TriggeredAbilities extends HashMap { public void checkTriggers(GameEvent event, Game game) { for (TriggeredAbility ability: this.values()) { - if (ability.isInUseableZone(game, true)) { + if (ability.isInUseableZone(game, null, true)) { MageObject object = getMageObject(event, game, ability); if (object != null) { if (checkAbilityStillExists(ability, object)) { diff --git a/Mage/src/mage/abilities/common/DiesTriggeredAbility.java b/Mage/src/mage/abilities/common/DiesTriggeredAbility.java index be58d8be359..9b50b9a5d7d 100644 --- a/Mage/src/mage/abilities/common/DiesTriggeredAbility.java +++ b/Mage/src/mage/abilities/common/DiesTriggeredAbility.java @@ -53,7 +53,7 @@ public class DiesTriggeredAbility extends ZoneChangeTriggeredAbility