fixed Root Sliver ability only effecting its controller
@@ -29,18 +29,24 @@ package mage.cards.r;
import java.util.UUID;
import mage.MageInt;
+import mage.MageObject;
+import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
-import mage.abilities.effects.common.CantBeCounteredControlledEffect;
+import mage.abilities.effects.ContinuousRuleModifyingEffectImpl;
import mage.abilities.effects.common.CantBeCounteredSourceEffect;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Duration;
+import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.Zone;
import mage.filter.FilterSpell;
-import mage.filter.FilterStackObject;
import mage.filter.predicate.mageobject.SubtypePredicate;
+import mage.game.Game;
+import mage.game.events.GameEvent;
+import mage.game.stack.Spell;
+import mage.game.stack.StackObject;
/**
*
@@ -54,7 +60,6 @@ public class RootSliver extends CardImpl {
filter.add(new SubtypePredicate(SubType.SLIVER));
}
-
public RootSliver(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.subtype.add(SubType.SLIVER);
@@ -65,7 +70,7 @@ public class RootSliver extends CardImpl {
// Root Sliver can't be countered.
this.addAbility(new SimpleStaticAbility(Zone.STACK, new CantBeCounteredSourceEffect()));
// Sliver spells can't be countered by spells or abilities.
- this.addAbility(new SimpleStaticAbility(Zone.STACK, new CantBeCounteredControlledEffect(filter, new FilterStackObject(), Duration.WhileOnBattlefield)));
+ this.addAbility(new SimpleStaticAbility(Zone.STACK, new RootSliverEffect()));
}
@@ -79,3 +84,42 @@ public class RootSliver extends CardImpl {
}
}
+class RootSliverEffect extends ContinuousRuleModifyingEffectImpl {
+
+ public RootSliverEffect() {
+ super(Duration.WhileOnBattlefield, Outcome.Benefit);
+ staticText = "Sliver spells can't be countered by spells or abilities.";
+ }
+
+ public RootSliverEffect(final RootSliverEffect effect) {
+ super(effect);
+ }
+
+ @Override
+ public RootSliverEffect copy() {
+ return new RootSliverEffect(this);
+ }
+
+ @Override
+ public boolean apply(Game game, Ability source) {
+ return true;
+ }
+
+ @Override
+ public boolean checksEventType(GameEvent event, Game game) {
+ return event.getType() == GameEvent.EventType.COUNTER;
+ }
+
+ @Override
+ public boolean applies(GameEvent event, Ability source, Game game) {
+ Spell spell = game.getStack().getSpell(event.getTargetId());
+ if (spell != null && spell.hasSubtype(SubType.SLIVER, game)) {
+ MageObject sourceObject = game.getObject(event.getSourceId());
+ if (sourceObject != null && sourceObject instanceof StackObject) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
