MageSingleton marker interface

This commit is contained in:
magenoxx 2012-07-19 09:29:17 +04:00
parent 60bd1f9585
commit 5b83ffe518
35 changed files with 147 additions and 79 deletions

View file

@ -116,7 +116,9 @@ public abstract class AbilityImpl<T extends AbilityImpl<T>> implements Ability {
@Override
public void newId() {
this.id = UUID.randomUUID();
if (!(this instanceof MageSingleton)) {
this.id = UUID.randomUUID();
}
getEffects().newId();
}

View file

@ -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 {
}

View file

@ -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<CantBlockEffect> {
class CantBlockEffect extends RestrictionEffect<CantBlockEffect> implements MageSingleton {
public CantBlockEffect() {
super(Duration.WhileOnBattlefield);

View file

@ -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<DamageAsThoughNotBlockedAbility> {
public class DamageAsThoughNotBlockedAbility extends StaticAbility<DamageAsThoughNotBlockedAbility> implements MageSingleton {
private static final DamageAsThoughNotBlockedAbility fINSTANCE = new DamageAsThoughNotBlockedAbility();

View file

@ -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<T extends ContinuousEffectImpl<T>> ex
@Override
public void newId() {
this.id = UUID.randomUUID();
if (!(this instanceof MageSingleton)) {
this.id = UUID.randomUUID();
}
}
@Override

View file

@ -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<T extends Effect<T>> implements Effect<T> {
@Override
public void newId() {
this.id = UUID.randomUUID();
if (!(this instanceof MageSingleton)) {
this.id = UUID.randomUUID();
}
}
@Override

View file

@ -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<ExileSpellEffect> {
public class ExileSpellEffect extends PostResolveEffect<ExileSpellEffect> implements MageSingleton {
private static final ExileSpellEffect fINSTANCE = new ExileSpellEffect();

View file

@ -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<ReturnToHandSpellEffect> {
public class ReturnToHandSpellEffect extends PostResolveEffect<ReturnToHandSpellEffect> implements MageSingleton {
private static final ReturnToHandSpellEffect fINSTANCE = new ReturnToHandSpellEffect();
private Object readResolve() throws ObjectStreamException {

View file

@ -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<ShuffleSpellEffect> {
public class ShuffleSpellEffect extends PostResolveEffect<ShuffleSpellEffect> implements MageSingleton {
private static final ShuffleSpellEffect fINSTANCE = new ShuffleSpellEffect();

View file

@ -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<CanBlockOnlyFlyingEffect> {
public class CanBlockOnlyFlyingEffect extends ReplacementEffectImpl<CanBlockOnlyFlyingEffect> implements MageSingleton {
public CanBlockOnlyFlyingEffect() {
super(Duration.WhileOnBattlefield, Outcome.Detriment);

View file

@ -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<ChangelingAbility> {
public class ChangelingAbility extends StaticAbility<ChangelingAbility> implements MageSingleton {
private static final ChangelingAbility fINSTANCE = new ChangelingAbility();

View file

@ -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<DeathtouchAbility> {
public class DeathtouchAbility extends StaticAbility<DeathtouchAbility> implements MageSingleton {
private static final DeathtouchAbility fINSTANCE = new DeathtouchAbility();

View file

@ -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<DefenderAbility> {
public class DefenderAbility extends StaticAbility<DefenderAbility> implements MageSingleton {
private static final DefenderAbility fINSTANCE = new DefenderAbility();

View file

@ -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<DoubleStrikeAbility> {
public class DoubleStrikeAbility extends StaticAbility<DoubleStrikeAbility> implements MageSingleton {
private static final DoubleStrikeAbility fINSTANCE = new DoubleStrikeAbility();

View file

@ -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<FearAbility> {
public class FearAbility extends EvasionAbility<FearAbility> implements MageSingleton {
private static final FearAbility fINSTANCE = new FearAbility();
@ -70,7 +71,7 @@ public class FearAbility extends EvasionAbility<FearAbility> {
}
class FearEffect extends RestrictionEffect<FearEffect> {
class FearEffect extends RestrictionEffect<FearEffect> implements MageSingleton {
public FearEffect() {
super(Duration.WhileOnBattlefield);

View file

@ -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<FirstStrikeAbility> {
public class FirstStrikeAbility extends StaticAbility<FirstStrikeAbility> implements MageSingleton {
private static final FirstStrikeAbility fINSTANCE = new FirstStrikeAbility();

View file

@ -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<FlashAbility> {
public class FlashAbility extends StaticAbility<FlashAbility> implements MageSingleton {
private static final FlashAbility fINSTANCE = new FlashAbility();

View file

@ -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<FlyingAbility> {
public class FlyingAbility extends EvasionAbility<FlyingAbility> implements MageSingleton {
private static final FlyingAbility fINSTANCE = new FlyingAbility();
@ -69,7 +70,7 @@ public class FlyingAbility extends EvasionAbility<FlyingAbility> {
}
class FlyingEffect extends RestrictionEffect<FlyingEffect> {
class FlyingEffect extends RestrictionEffect<FlyingEffect> implements MageSingleton {
public FlyingEffect() {
super(Duration.EndOfGame);
@ -79,11 +80,6 @@ class FlyingEffect extends RestrictionEffect<FlyingEffect> {
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())) {

View file

@ -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<HasteAbility> {
public class HasteAbility extends StaticAbility<HasteAbility> implements MageSingleton {
private static final HasteAbility fINSTANCE = new HasteAbility();

View file

@ -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;

View file

@ -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<IndestructibleAbility> {
public class IndestructibleAbility extends StaticAbility<IndestructibleAbility> implements MageSingleton {
private static final IndestructibleAbility fINSTANCE = new IndestructibleAbility();

View file

@ -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<InfectAbility> {
public class InfectAbility extends StaticAbility<InfectAbility> implements MageSingleton {
private static final InfectAbility fINSTANCE = new InfectAbility();

View file

@ -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<IntimidateAbility> {
public class IntimidateAbility extends EvasionAbility<IntimidateAbility> implements MageSingleton {
private static final IntimidateAbility fInstance = new IntimidateAbility();
public static IntimidateAbility getInstance() {
@ -29,7 +30,7 @@ public class IntimidateAbility extends EvasionAbility<IntimidateAbility> {
}
}
class IntimidateEffect extends RestrictionEffect<IntimidateEffect> {
class IntimidateEffect extends RestrictionEffect<IntimidateEffect> implements MageSingleton {
public IntimidateEffect() {
super(Constants.Duration.WhileOnBattlefield);
}

View file

@ -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<LeylineAbility>{
public class LeylineAbility extends StaticAbility<LeylineAbility> implements MageSingleton {
private static final LeylineAbility fINSTANCE = new LeylineAbility();

View file

@ -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<LifelinkAbility> {
public class LifelinkAbility extends StaticAbility<LifelinkAbility> implements MageSingleton {
private static final LifelinkAbility fINSTANCE = new LifelinkAbility();

View file

@ -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<PhasingAbility> {
public class PhasingAbility extends StaticAbility<PhasingAbility> implements MageSingleton {
private static final PhasingAbility fINSTANCE = new PhasingAbility();

View file

@ -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<ReachAbility> {
public class ReachAbility extends StaticAbility<ReachAbility> implements MageSingleton {
private static final ReachAbility fINSTANCE = new ReachAbility();

View file

@ -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<ShroudAbility> {
public class ShroudAbility extends StaticAbility<ShroudAbility> implements MageSingleton {
private static final ShroudAbility fINSTANCE = new ShroudAbility();

View file

@ -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<SoulbondAbility> {
public class SoulbondAbility extends StaticAbility<SoulbondAbility> implements MageSingleton {
private static final SoulbondAbility fINSTANCE = new SoulbondAbility();

View file

@ -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<SplitSecondEffect> {
class SplitSecondEffect extends ReplacementEffectImpl<SplitSecondEffect> implements MageSingleton {
SplitSecondEffect() {
super(Constants.Duration.WhileOnStack, Constants.Outcome.Detriment);
}

View file

@ -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<TrampleAbility> {
public class TrampleAbility extends StaticAbility<TrampleAbility> implements MageSingleton {
private static final TrampleAbility fINSTANCE = new TrampleAbility();

View file

@ -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<UnblockableAbility> {
public class UnblockableAbility extends EvasionAbility<UnblockableAbility> implements MageSingleton {
private static final UnblockableAbility fINSTANCE = new UnblockableAbility();
@ -68,7 +69,7 @@ public class UnblockableAbility extends EvasionAbility<UnblockableAbility> {
}
class UnblockableEffect extends RestrictionEffect<UnblockableEffect> {
class UnblockableEffect extends RestrictionEffect<UnblockableEffect> implements MageSingleton {
public UnblockableEffect() {
super(Duration.EndOfGame);
@ -78,11 +79,6 @@ class UnblockableEffect extends RestrictionEffect<UnblockableEffect> {
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())) {

View file

@ -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<VigilanceAbility> {
public class VigilanceAbility extends StaticAbility<VigilanceAbility> implements MageSingleton {
private static final VigilanceAbility fINSTANCE = new VigilanceAbility();

View file

@ -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<WitherAbility> {
public class WitherAbility extends StaticAbility<WitherAbility> implements MageSingleton {
private static final WitherAbility fINSTANCE = new WitherAbility();

View file

@ -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