From 5b83ffe518f17485150c06b9d7514418dbb414c3 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 19 Jul 2012 09:29:17 +0400 Subject: [PATCH] MageSingleton marker interface --- Mage/src/mage/abilities/AbilityImpl.java | 4 +++- Mage/src/mage/abilities/MageSingleton.java | 19 +++++++++++++++++++ .../abilities/common/CantBlockAbility.java | 8 +++++--- .../DamageAsThoughNotBlockedAbility.java | 8 +++++--- .../effects/ContinuousEffectImpl.java | 5 ++++- .../mage/abilities/effects/EffectImpl.java | 5 ++++- .../effects/common/ExileSpellEffect.java | 8 +++++--- .../common/ReturnToHandSpellEffect.java | 9 +++++---- .../effects/common/ShuffleSpellEffect.java | 9 +++++---- .../continious/CanBlockOnlyFlyingEffect.java | 3 ++- .../abilities/keyword/ChangelingAbility.java | 3 ++- .../abilities/keyword/DeathtouchAbility.java | 6 ++++-- .../abilities/keyword/DefenderAbility.java | 6 ++++-- .../keyword/DoubleStrikeAbility.java | 6 ++++-- .../mage/abilities/keyword/FearAbility.java | 9 +++++---- .../abilities/keyword/FirstStrikeAbility.java | 6 ++++-- .../mage/abilities/keyword/FlashAbility.java | 6 ++++-- .../mage/abilities/keyword/FlyingAbility.java | 10 +++------- .../mage/abilities/keyword/HasteAbility.java | 6 ++++-- .../abilities/keyword/HexproofAbility.java | 6 ++++-- .../keyword/IndestructibleAbility.java | 6 ++++-- .../mage/abilities/keyword/InfectAbility.java | 6 ++++-- .../abilities/keyword/IntimidateAbility.java | 5 +++-- .../abilities/keyword/LeylineAbility.java | 6 ++++-- .../abilities/keyword/LifelinkAbility.java | 6 ++++-- .../abilities/keyword/PhasingAbility.java | 6 ++++-- .../mage/abilities/keyword/ReachAbility.java | 6 ++++-- .../mage/abilities/keyword/ShroudAbility.java | 6 ++++-- .../abilities/keyword/SoulbondAbility.java | 3 ++- .../abilities/keyword/SplitSecondAbility.java | 5 +++-- .../abilities/keyword/TrampleAbility.java | 6 ++++-- .../abilities/keyword/UnblockableAbility.java | 10 +++------- .../abilities/keyword/VigilanceAbility.java | 6 ++++-- .../mage/abilities/keyword/WitherAbility.java | 3 ++- Mage/src/mage/game/stack/StackAbility.java | 4 +++- 35 files changed, 147 insertions(+), 79 deletions(-) create mode 100644 Mage/src/mage/abilities/MageSingleton.java diff --git a/Mage/src/mage/abilities/AbilityImpl.java b/Mage/src/mage/abilities/AbilityImpl.java index 675663efcbc..ef71333bd7f 100644 --- a/Mage/src/mage/abilities/AbilityImpl.java +++ b/Mage/src/mage/abilities/AbilityImpl.java @@ -116,7 +116,9 @@ public abstract class AbilityImpl> implements Ability { @Override public void newId() { - this.id = UUID.randomUUID(); + if (!(this instanceof MageSingleton)) { + this.id = UUID.randomUUID(); + } getEffects().newId(); } diff --git a/Mage/src/mage/abilities/MageSingleton.java b/Mage/src/mage/abilities/MageSingleton.java new file mode 100644 index 00000000000..670a6b3c584 --- /dev/null +++ b/Mage/src/mage/abilities/MageSingleton.java @@ -0,0 +1,19 @@ +package mage.abilities; + +/** + * Marker class for singleton abilities and effects. + * Prevents effects and abilities to get new Id across the games on the server. + * Can be used only for stateless effects and abilities. + * + * Intended to be used to avoid bugs and for performance reasons. + * + * "Must" be used for abilities that use getId() as compare parameter like: + * FlyingAbility.getInstance().getId() + * in + * permanent.getAbilities().containsKey(FlyingAbility.getInstance().getId()) + * + * + * @author noxx + */ +public interface MageSingleton { +} diff --git a/Mage/src/mage/abilities/common/CantBlockAbility.java b/Mage/src/mage/abilities/common/CantBlockAbility.java index 764946202b5..f500311e374 100644 --- a/Mage/src/mage/abilities/common/CantBlockAbility.java +++ b/Mage/src/mage/abilities/common/CantBlockAbility.java @@ -5,19 +5,21 @@ package mage.abilities.common; -import java.io.ObjectStreamException; import mage.Constants.Duration; import mage.Constants.Zone; import mage.abilities.Ability; +import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; +import java.io.ObjectStreamException; + /** * * @author maurer.it_at_gmail.com */ -public class CantBlockAbility extends SimpleStaticAbility { +public class CantBlockAbility extends SimpleStaticAbility implements MageSingleton { private static final CantBlockAbility fINSTANCE = new CantBlockAbility(); @@ -45,7 +47,7 @@ public class CantBlockAbility extends SimpleStaticAbility { } -class CantBlockEffect extends RestrictionEffect { +class CantBlockEffect extends RestrictionEffect implements MageSingleton { public CantBlockEffect() { super(Duration.WhileOnBattlefield); diff --git a/Mage/src/mage/abilities/common/DamageAsThoughNotBlockedAbility.java b/Mage/src/mage/abilities/common/DamageAsThoughNotBlockedAbility.java index 8732a58f975..03e9524c64f 100644 --- a/Mage/src/mage/abilities/common/DamageAsThoughNotBlockedAbility.java +++ b/Mage/src/mage/abilities/common/DamageAsThoughNotBlockedAbility.java @@ -27,16 +27,18 @@ */ package mage.abilities.common; -import java.io.ObjectStreamException; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; -import static mage.Constants.*; +import static mage.Constants.AbilityType; +import static mage.Constants.Zone; /** * @author BetaSteward */ -public class DamageAsThoughNotBlockedAbility extends StaticAbility { +public class DamageAsThoughNotBlockedAbility extends StaticAbility implements MageSingleton { private static final DamageAsThoughNotBlockedAbility fINSTANCE = new DamageAsThoughNotBlockedAbility(); diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java index a126940f818..721c8461408 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java @@ -31,6 +31,7 @@ package mage.abilities.effects; import mage.Constants.*; import mage.abilities.Ability; import mage.abilities.ActivatedAbility; +import mage.abilities.MageSingleton; import mage.abilities.TriggeredAbility; import mage.abilities.dynamicvalue.DynamicValue; import mage.abilities.dynamicvalue.common.DomainValue; @@ -104,7 +105,9 @@ public abstract class ContinuousEffectImpl> ex @Override public void newId() { - this.id = UUID.randomUUID(); + if (!(this instanceof MageSingleton)) { + this.id = UUID.randomUUID(); + } } @Override diff --git a/Mage/src/mage/abilities/effects/EffectImpl.java b/Mage/src/mage/abilities/effects/EffectImpl.java index b2137bc4acd..c71cc3ef9b6 100644 --- a/Mage/src/mage/abilities/effects/EffectImpl.java +++ b/Mage/src/mage/abilities/effects/EffectImpl.java @@ -30,6 +30,7 @@ package mage.abilities.effects; import mage.Constants.EffectType; import mage.Constants.Outcome; +import mage.abilities.MageSingleton; import mage.abilities.Mode; import mage.target.targetpointer.FirstTargetPointer; import mage.target.targetpointer.TargetPointer; @@ -103,7 +104,9 @@ public abstract class EffectImpl> implements Effect { @Override public void newId() { - this.id = UUID.randomUUID(); + if (!(this instanceof MageSingleton)) { + this.id = UUID.randomUUID(); + } } @Override diff --git a/Mage/src/mage/abilities/effects/common/ExileSpellEffect.java b/Mage/src/mage/abilities/effects/common/ExileSpellEffect.java index fcca14a427f..06878f33e04 100644 --- a/Mage/src/mage/abilities/effects/common/ExileSpellEffect.java +++ b/Mage/src/mage/abilities/effects/common/ExileSpellEffect.java @@ -28,18 +28,20 @@ package mage.abilities.effects.common; -import java.io.ObjectStreamException; -import java.util.UUID; import mage.abilities.Ability; +import mage.abilities.MageSingleton; import mage.abilities.effects.PostResolveEffect; import mage.cards.Card; import mage.game.Game; +import java.io.ObjectStreamException; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com */ -public class ExileSpellEffect extends PostResolveEffect { +public class ExileSpellEffect extends PostResolveEffect implements MageSingleton { private static final ExileSpellEffect fINSTANCE = new ExileSpellEffect(); diff --git a/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java b/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java index 6226cba3061..f84d332a6e1 100644 --- a/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java +++ b/Mage/src/mage/abilities/effects/common/ReturnToHandSpellEffect.java @@ -1,19 +1,20 @@ package mage.abilities.effects.common; -import java.util.UUID; +import mage.Constants.Zone; import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.effects.PostResolveEffect; import mage.cards.Card; import mage.game.Game; import java.io.ObjectStreamException; -import mage.Constants.Zone; -import mage.abilities.effects.PostResolveEffect; +import java.util.UUID; /** * * @author Loki */ -public class ReturnToHandSpellEffect extends PostResolveEffect { +public class ReturnToHandSpellEffect extends PostResolveEffect implements MageSingleton { private static final ReturnToHandSpellEffect fINSTANCE = new ReturnToHandSpellEffect(); private Object readResolve() throws ObjectStreamException { diff --git a/Mage/src/mage/abilities/effects/common/ShuffleSpellEffect.java b/Mage/src/mage/abilities/effects/common/ShuffleSpellEffect.java index b451b6caaa5..944d3f014ce 100644 --- a/Mage/src/mage/abilities/effects/common/ShuffleSpellEffect.java +++ b/Mage/src/mage/abilities/effects/common/ShuffleSpellEffect.java @@ -28,21 +28,22 @@ package mage.abilities.effects.common; +import mage.Constants.Zone; import mage.abilities.Ability; +import mage.abilities.MageSingleton; +import mage.abilities.effects.PostResolveEffect; import mage.cards.Card; import mage.game.Game; +import mage.players.Player; import java.io.ObjectStreamException; import java.util.UUID; -import mage.Constants.Zone; -import mage.abilities.effects.PostResolveEffect; -import mage.players.Player; /** * * @author nantuko */ -public class ShuffleSpellEffect extends PostResolveEffect { +public class ShuffleSpellEffect extends PostResolveEffect implements MageSingleton { private static final ShuffleSpellEffect fINSTANCE = new ShuffleSpellEffect(); diff --git a/Mage/src/mage/abilities/effects/common/continious/CanBlockOnlyFlyingEffect.java b/Mage/src/mage/abilities/effects/common/continious/CanBlockOnlyFlyingEffect.java index db65b71fa02..0f804ad3888 100644 --- a/Mage/src/mage/abilities/effects/common/continious/CanBlockOnlyFlyingEffect.java +++ b/Mage/src/mage/abilities/effects/common/continious/CanBlockOnlyFlyingEffect.java @@ -30,6 +30,7 @@ package mage.abilities.effects.common.continious; import mage.Constants.Duration; import mage.Constants.Outcome; import mage.abilities.Ability; +import mage.abilities.MageSingleton; import mage.abilities.effects.ReplacementEffectImpl; import mage.abilities.keyword.FlyingAbility; import mage.game.Game; @@ -41,7 +42,7 @@ import mage.game.permanent.Permanent; * * @author North */ -public class CanBlockOnlyFlyingEffect extends ReplacementEffectImpl { +public class CanBlockOnlyFlyingEffect extends ReplacementEffectImpl implements MageSingleton { public CanBlockOnlyFlyingEffect() { super(Duration.WhileOnBattlefield, Outcome.Detriment); diff --git a/Mage/src/mage/abilities/keyword/ChangelingAbility.java b/Mage/src/mage/abilities/keyword/ChangelingAbility.java index ff6ee5a76c4..10f817c3d02 100644 --- a/Mage/src/mage/abilities/keyword/ChangelingAbility.java +++ b/Mage/src/mage/abilities/keyword/ChangelingAbility.java @@ -29,6 +29,7 @@ package mage.abilities.keyword; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; import java.io.ObjectStreamException; @@ -37,7 +38,7 @@ import java.io.ObjectStreamException; * * @author nantuko */ -public class ChangelingAbility extends StaticAbility { +public class ChangelingAbility extends StaticAbility implements MageSingleton { private static final ChangelingAbility fINSTANCE = new ChangelingAbility(); diff --git a/Mage/src/mage/abilities/keyword/DeathtouchAbility.java b/Mage/src/mage/abilities/keyword/DeathtouchAbility.java index 3c56e742e12..15f60a2c9c8 100644 --- a/Mage/src/mage/abilities/keyword/DeathtouchAbility.java +++ b/Mage/src/mage/abilities/keyword/DeathtouchAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class DeathtouchAbility extends StaticAbility { +public class DeathtouchAbility extends StaticAbility implements MageSingleton { private static final DeathtouchAbility fINSTANCE = new DeathtouchAbility(); diff --git a/Mage/src/mage/abilities/keyword/DefenderAbility.java b/Mage/src/mage/abilities/keyword/DefenderAbility.java index 723e56cef5f..eb6cbbc192a 100644 --- a/Mage/src/mage/abilities/keyword/DefenderAbility.java +++ b/Mage/src/mage/abilities/keyword/DefenderAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class DefenderAbility extends StaticAbility { +public class DefenderAbility extends StaticAbility implements MageSingleton { private static final DefenderAbility fINSTANCE = new DefenderAbility(); diff --git a/Mage/src/mage/abilities/keyword/DoubleStrikeAbility.java b/Mage/src/mage/abilities/keyword/DoubleStrikeAbility.java index 0094a4b8499..7269ff81546 100644 --- a/Mage/src/mage/abilities/keyword/DoubleStrikeAbility.java +++ b/Mage/src/mage/abilities/keyword/DoubleStrikeAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class DoubleStrikeAbility extends StaticAbility { +public class DoubleStrikeAbility extends StaticAbility implements MageSingleton { private static final DoubleStrikeAbility fINSTANCE = new DoubleStrikeAbility(); diff --git a/Mage/src/mage/abilities/keyword/FearAbility.java b/Mage/src/mage/abilities/keyword/FearAbility.java index 0498643b9fd..ab9e6c6ccbe 100644 --- a/Mage/src/mage/abilities/keyword/FearAbility.java +++ b/Mage/src/mage/abilities/keyword/FearAbility.java @@ -28,21 +28,22 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; - import mage.Constants; import mage.Constants.Duration; import mage.abilities.Ability; import mage.abilities.EvasionAbility; +import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; +import java.io.ObjectStreamException; + /** * * @author Loki */ -public class FearAbility extends EvasionAbility { +public class FearAbility extends EvasionAbility implements MageSingleton { private static final FearAbility fINSTANCE = new FearAbility(); @@ -70,7 +71,7 @@ public class FearAbility extends EvasionAbility { } -class FearEffect extends RestrictionEffect { +class FearEffect extends RestrictionEffect implements MageSingleton { public FearEffect() { super(Duration.WhileOnBattlefield); diff --git a/Mage/src/mage/abilities/keyword/FirstStrikeAbility.java b/Mage/src/mage/abilities/keyword/FirstStrikeAbility.java index 8c18709bcee..6863ec49a10 100644 --- a/Mage/src/mage/abilities/keyword/FirstStrikeAbility.java +++ b/Mage/src/mage/abilities/keyword/FirstStrikeAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class FirstStrikeAbility extends StaticAbility { +public class FirstStrikeAbility extends StaticAbility implements MageSingleton { private static final FirstStrikeAbility fINSTANCE = new FirstStrikeAbility(); diff --git a/Mage/src/mage/abilities/keyword/FlashAbility.java b/Mage/src/mage/abilities/keyword/FlashAbility.java index 6b216d1272f..51d52d64ba4 100644 --- a/Mage/src/mage/abilities/keyword/FlashAbility.java +++ b/Mage/src/mage/abilities/keyword/FlashAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class FlashAbility extends StaticAbility { +public class FlashAbility extends StaticAbility implements MageSingleton { private static final FlashAbility fINSTANCE = new FlashAbility(); diff --git a/Mage/src/mage/abilities/keyword/FlyingAbility.java b/Mage/src/mage/abilities/keyword/FlyingAbility.java index e6903b63530..505f04ea243 100644 --- a/Mage/src/mage/abilities/keyword/FlyingAbility.java +++ b/Mage/src/mage/abilities/keyword/FlyingAbility.java @@ -31,6 +31,7 @@ package mage.abilities.keyword; import mage.Constants.Duration; import mage.abilities.Ability; import mage.abilities.EvasionAbility; +import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; @@ -41,7 +42,7 @@ import java.io.ObjectStreamException; * * @author BetaSteward_at_googlemail.com */ -public class FlyingAbility extends EvasionAbility { +public class FlyingAbility extends EvasionAbility implements MageSingleton { private static final FlyingAbility fINSTANCE = new FlyingAbility(); @@ -69,7 +70,7 @@ public class FlyingAbility extends EvasionAbility { } -class FlyingEffect extends RestrictionEffect { +class FlyingEffect extends RestrictionEffect implements MageSingleton { public FlyingEffect() { super(Duration.EndOfGame); @@ -79,11 +80,6 @@ class FlyingEffect extends RestrictionEffect { super(effect); } - @Override - public void newId() { - // do nothing - } - @Override public boolean applies(Permanent permanent, Ability source, Game game) { if (permanent.getAbilities().containsKey(FlyingAbility.getInstance().getId())) { diff --git a/Mage/src/mage/abilities/keyword/HasteAbility.java b/Mage/src/mage/abilities/keyword/HasteAbility.java index 5ed68bcaaf1..701b3a34f8c 100644 --- a/Mage/src/mage/abilities/keyword/HasteAbility.java +++ b/Mage/src/mage/abilities/keyword/HasteAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class HasteAbility extends StaticAbility { +public class HasteAbility extends StaticAbility implements MageSingleton { private static final HasteAbility fINSTANCE = new HasteAbility(); diff --git a/Mage/src/mage/abilities/keyword/HexproofAbility.java b/Mage/src/mage/abilities/keyword/HexproofAbility.java index 68fecd62dd7..9234fc7816a 100644 --- a/Mage/src/mage/abilities/keyword/HexproofAbility.java +++ b/Mage/src/mage/abilities/keyword/HexproofAbility.java @@ -1,19 +1,21 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants; +import mage.abilities.MageSingleton; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.common.CantTargetSourceEffect; import mage.filter.FilterStackObject; import mage.filter.predicate.permanent.ControllerPredicate; +import java.io.ObjectStreamException; + /** * Hexproof * (This creature or player can't be the target of spells or abilities your opponents control.) * * @author loki */ -public class HexproofAbility extends SimpleStaticAbility { +public class HexproofAbility extends SimpleStaticAbility implements MageSingleton { private static final HexproofAbility fINSTANCE; private static final FilterStackObject filter; diff --git a/Mage/src/mage/abilities/keyword/IndestructibleAbility.java b/Mage/src/mage/abilities/keyword/IndestructibleAbility.java index 7918e589297..b1180806997 100644 --- a/Mage/src/mage/abilities/keyword/IndestructibleAbility.java +++ b/Mage/src/mage/abilities/keyword/IndestructibleAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class IndestructibleAbility extends StaticAbility { +public class IndestructibleAbility extends StaticAbility implements MageSingleton { private static final IndestructibleAbility fINSTANCE = new IndestructibleAbility(); diff --git a/Mage/src/mage/abilities/keyword/InfectAbility.java b/Mage/src/mage/abilities/keyword/InfectAbility.java index bd9b44aaee3..d4d008d5239 100644 --- a/Mage/src/mage/abilities/keyword/InfectAbility.java +++ b/Mage/src/mage/abilities/keyword/InfectAbility.java @@ -28,10 +28,12 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * 702.87. Infect * @@ -55,7 +57,7 @@ import mage.abilities.StaticAbility; * * @author nantuko */ -public class InfectAbility extends StaticAbility { +public class InfectAbility extends StaticAbility implements MageSingleton { private static final InfectAbility fINSTANCE = new InfectAbility(); diff --git a/Mage/src/mage/abilities/keyword/IntimidateAbility.java b/Mage/src/mage/abilities/keyword/IntimidateAbility.java index db6cf27aadf..19879b0a0ef 100644 --- a/Mage/src/mage/abilities/keyword/IntimidateAbility.java +++ b/Mage/src/mage/abilities/keyword/IntimidateAbility.java @@ -3,11 +3,12 @@ package mage.abilities.keyword; import mage.Constants; import mage.abilities.Ability; import mage.abilities.EvasionAbility; +import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; -public class IntimidateAbility extends EvasionAbility { +public class IntimidateAbility extends EvasionAbility implements MageSingleton { private static final IntimidateAbility fInstance = new IntimidateAbility(); public static IntimidateAbility getInstance() { @@ -29,7 +30,7 @@ public class IntimidateAbility extends EvasionAbility { } } -class IntimidateEffect extends RestrictionEffect { +class IntimidateEffect extends RestrictionEffect implements MageSingleton { public IntimidateEffect() { super(Constants.Duration.WhileOnBattlefield); } diff --git a/Mage/src/mage/abilities/keyword/LeylineAbility.java b/Mage/src/mage/abilities/keyword/LeylineAbility.java index 1483b520a20..4ab1dfda592 100644 --- a/Mage/src/mage/abilities/keyword/LeylineAbility.java +++ b/Mage/src/mage/abilities/keyword/LeylineAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class LeylineAbility extends StaticAbility{ +public class LeylineAbility extends StaticAbility implements MageSingleton { private static final LeylineAbility fINSTANCE = new LeylineAbility(); diff --git a/Mage/src/mage/abilities/keyword/LifelinkAbility.java b/Mage/src/mage/abilities/keyword/LifelinkAbility.java index d2a950b0adc..a0b24679a4f 100644 --- a/Mage/src/mage/abilities/keyword/LifelinkAbility.java +++ b/Mage/src/mage/abilities/keyword/LifelinkAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class LifelinkAbility extends StaticAbility { +public class LifelinkAbility extends StaticAbility implements MageSingleton { private static final LifelinkAbility fINSTANCE = new LifelinkAbility(); diff --git a/Mage/src/mage/abilities/keyword/PhasingAbility.java b/Mage/src/mage/abilities/keyword/PhasingAbility.java index c986ac8ffe7..952abfc51b7 100644 --- a/Mage/src/mage/abilities/keyword/PhasingAbility.java +++ b/Mage/src/mage/abilities/keyword/PhasingAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class PhasingAbility extends StaticAbility { +public class PhasingAbility extends StaticAbility implements MageSingleton { private static final PhasingAbility fINSTANCE = new PhasingAbility(); diff --git a/Mage/src/mage/abilities/keyword/ReachAbility.java b/Mage/src/mage/abilities/keyword/ReachAbility.java index d7ea618c616..91536bd1d63 100644 --- a/Mage/src/mage/abilities/keyword/ReachAbility.java +++ b/Mage/src/mage/abilities/keyword/ReachAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class ReachAbility extends StaticAbility { +public class ReachAbility extends StaticAbility implements MageSingleton { private static final ReachAbility fINSTANCE = new ReachAbility(); diff --git a/Mage/src/mage/abilities/keyword/ShroudAbility.java b/Mage/src/mage/abilities/keyword/ShroudAbility.java index 34a61b9c640..a8b964ed87d 100644 --- a/Mage/src/mage/abilities/keyword/ShroudAbility.java +++ b/Mage/src/mage/abilities/keyword/ShroudAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class ShroudAbility extends StaticAbility { +public class ShroudAbility extends StaticAbility implements MageSingleton { private static final ShroudAbility fINSTANCE = new ShroudAbility(); diff --git a/Mage/src/mage/abilities/keyword/SoulbondAbility.java b/Mage/src/mage/abilities/keyword/SoulbondAbility.java index 18b36a44ec8..87918aa20b4 100644 --- a/Mage/src/mage/abilities/keyword/SoulbondAbility.java +++ b/Mage/src/mage/abilities/keyword/SoulbondAbility.java @@ -29,6 +29,7 @@ package mage.abilities.keyword; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; import java.io.ObjectStreamException; @@ -36,7 +37,7 @@ import java.io.ObjectStreamException; /** * @author noxx */ -public class SoulbondAbility extends StaticAbility { +public class SoulbondAbility extends StaticAbility implements MageSingleton { private static final SoulbondAbility fINSTANCE = new SoulbondAbility(); diff --git a/Mage/src/mage/abilities/keyword/SplitSecondAbility.java b/Mage/src/mage/abilities/keyword/SplitSecondAbility.java index a00174fd218..e91d56f682d 100644 --- a/Mage/src/mage/abilities/keyword/SplitSecondAbility.java +++ b/Mage/src/mage/abilities/keyword/SplitSecondAbility.java @@ -2,6 +2,7 @@ package mage.abilities.keyword; import mage.Constants; import mage.abilities.Ability; +import mage.abilities.MageSingleton; import mage.abilities.common.SimpleStaticAbility; import mage.abilities.effects.ReplacementEffectImpl; import mage.game.Game; @@ -11,7 +12,7 @@ import mage.game.events.GameEvent; * Split Second * As long as this spell is on the stack, players can't cast other spells or activate abilities that aren't mana abilities. */ -public class SplitSecondAbility extends SimpleStaticAbility { +public class SplitSecondAbility extends SimpleStaticAbility implements MageSingleton { private static final SplitSecondAbility ability = new SplitSecondAbility(); public static SplitSecondAbility getInstance() { @@ -33,7 +34,7 @@ public class SplitSecondAbility extends SimpleStaticAbility { } } -class SplitSecondEffect extends ReplacementEffectImpl { +class SplitSecondEffect extends ReplacementEffectImpl implements MageSingleton { SplitSecondEffect() { super(Constants.Duration.WhileOnStack, Constants.Outcome.Detriment); } diff --git a/Mage/src/mage/abilities/keyword/TrampleAbility.java b/Mage/src/mage/abilities/keyword/TrampleAbility.java index bd04b36182d..737d6728163 100644 --- a/Mage/src/mage/abilities/keyword/TrampleAbility.java +++ b/Mage/src/mage/abilities/keyword/TrampleAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class TrampleAbility extends StaticAbility { +public class TrampleAbility extends StaticAbility implements MageSingleton { private static final TrampleAbility fINSTANCE = new TrampleAbility(); diff --git a/Mage/src/mage/abilities/keyword/UnblockableAbility.java b/Mage/src/mage/abilities/keyword/UnblockableAbility.java index f981a334478..79c82ba5b4a 100644 --- a/Mage/src/mage/abilities/keyword/UnblockableAbility.java +++ b/Mage/src/mage/abilities/keyword/UnblockableAbility.java @@ -31,6 +31,7 @@ package mage.abilities.keyword; import mage.Constants.Duration; import mage.abilities.Ability; import mage.abilities.EvasionAbility; +import mage.abilities.MageSingleton; import mage.abilities.effects.RestrictionEffect; import mage.game.Game; import mage.game.permanent.Permanent; @@ -40,7 +41,7 @@ import java.io.ObjectStreamException; /** * @author BetaSteward_at_googlemail.com */ -public class UnblockableAbility extends EvasionAbility { +public class UnblockableAbility extends EvasionAbility implements MageSingleton { private static final UnblockableAbility fINSTANCE = new UnblockableAbility(); @@ -68,7 +69,7 @@ public class UnblockableAbility extends EvasionAbility { } -class UnblockableEffect extends RestrictionEffect { +class UnblockableEffect extends RestrictionEffect implements MageSingleton { public UnblockableEffect() { super(Duration.EndOfGame); @@ -78,11 +79,6 @@ class UnblockableEffect extends RestrictionEffect { super(effect); } - @Override - public void newId() { - // do nothing - } - @Override public boolean applies(Permanent permanent, Ability source, Game game) { if (permanent.getAbilities().containsKey(UnblockableAbility.getInstance().getId())) { diff --git a/Mage/src/mage/abilities/keyword/VigilanceAbility.java b/Mage/src/mage/abilities/keyword/VigilanceAbility.java index 4a1020c5165..38e8d2d4d2b 100644 --- a/Mage/src/mage/abilities/keyword/VigilanceAbility.java +++ b/Mage/src/mage/abilities/keyword/VigilanceAbility.java @@ -28,15 +28,17 @@ package mage.abilities.keyword; -import java.io.ObjectStreamException; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; +import java.io.ObjectStreamException; + /** * * @author BetaSteward_at_googlemail.com */ -public class VigilanceAbility extends StaticAbility { +public class VigilanceAbility extends StaticAbility implements MageSingleton { private static final VigilanceAbility fINSTANCE = new VigilanceAbility(); diff --git a/Mage/src/mage/abilities/keyword/WitherAbility.java b/Mage/src/mage/abilities/keyword/WitherAbility.java index 053b432bfda..5d57f487987 100644 --- a/Mage/src/mage/abilities/keyword/WitherAbility.java +++ b/Mage/src/mage/abilities/keyword/WitherAbility.java @@ -29,6 +29,7 @@ package mage.abilities.keyword; import mage.Constants.Zone; +import mage.abilities.MageSingleton; import mage.abilities.StaticAbility; import java.io.ObjectStreamException; @@ -46,7 +47,7 @@ import java.io.ObjectStreamException; * * @author nantuko */ -public class WitherAbility extends StaticAbility { +public class WitherAbility extends StaticAbility implements MageSingleton { private static final WitherAbility fINSTANCE = new WitherAbility(); diff --git a/Mage/src/mage/game/stack/StackAbility.java b/Mage/src/mage/game/stack/StackAbility.java index 588e9566674..267e19fab67 100644 --- a/Mage/src/mage/game/stack/StackAbility.java +++ b/Mage/src/mage/game/stack/StackAbility.java @@ -310,7 +310,9 @@ public class StackAbility implements StackObject, Ability { @Override public void newId() { - this.ability.newId(); + if (!(this instanceof MageSingleton)) { + this.ability.newId(); + } } @Override