From 6d0b38c8cab78e3523eed3015731173ee8533ef9 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Fri, 22 Nov 2013 00:30:14 +0100 Subject: [PATCH] * Commander - Fixed a NPE if change control effects are used during commander game. --- .../src/mage/game/CommanderDuel.java | 4 +-- .../common/ManaSpentToCastCount.java | 4 +++ .../abilities/effects/ContinuousEffects.java | 26 ++++++++++++------- Mage/src/mage/game/combat/CombatGroup.java | 15 ++++++++--- 4 files changed, 34 insertions(+), 15 deletions(-) diff --git a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java index a0d7fee1c8b..2b5515a54ac 100644 --- a/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java +++ b/Mage.Server.Plugins/Mage.Game.CommanderDuel/src/mage/game/CommanderDuel.java @@ -56,7 +56,7 @@ import mage.watchers.common.CommanderCombatDamageWatcher; public class CommanderDuel extends GameImpl { - private Map mulliganedCards = new HashMap(); + private final Map mulliganedCards = new HashMap(); public CommanderDuel(MultiplayerAttackOption attackOption, RangeOfInfluence range, int freeMulligans) { super(attackOption, range, freeMulligans); @@ -106,7 +106,7 @@ public class CommanderDuel extends GameImpl { } } - this.getState().addAbility(ability, null, null); + this.getState().addAbility(ability, this.getId(), null); state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); } diff --git a/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java b/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java index cb026982b69..c45a5b91824 100644 --- a/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java +++ b/Mage/src/mage/abilities/dynamicvalue/common/ManaSpentToCastCount.java @@ -59,6 +59,10 @@ public class ManaSpentToCastCount implements DynamicValue{ return new ManaSpentToCastCount(); } + @Override + public String toString() { + return "X"; + } @Override public String getMessage() { diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index b2f37ffa56d..83a486f23bb 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -56,6 +56,7 @@ import mage.constants.Layer; import mage.constants.Outcome; import mage.constants.SpellAbilityType; import mage.constants.SubLayer; +import mage.constants.Zone; import mage.filter.FilterCard; import mage.filter.predicate.Predicate; import mage.filter.predicate.Predicates; @@ -65,6 +66,7 @@ import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.target.common.TargetCardInHand; +import org.apache.log4j.Logger; /** * @@ -72,6 +74,8 @@ import mage.target.common.TargetCardInHand; */ public class ContinuousEffects implements Serializable { + private static final transient Logger logger = Logger.getLogger(ContinuousEffects.class); + private Date lastSetTimestamp; //transient Continuous effects @@ -81,20 +85,19 @@ public class ContinuousEffects implements Serializable { private ContinuousEffectsList requirementEffects = new ContinuousEffectsList(); private ContinuousEffectsList restrictionEffects = new ContinuousEffectsList(); private ContinuousEffectsList restrictionUntapNotMoreThanEffects = new ContinuousEffectsList(); - private Map> asThoughEffectsMap = new EnumMap>(AsThoughEffectType.class); private ContinuousEffectsList costModificationEffects = new ContinuousEffectsList(); private ContinuousEffectsList spliceCardEffects = new ContinuousEffectsList(); - private List> allEffectsLists = new ArrayList>(); - + private final Map> asThoughEffectsMap = new EnumMap>(AsThoughEffectType.class); + private final List> allEffectsLists = new ArrayList>(); private final ApplyCountersEffect applyCounters; private final PlaneswalkerRedirectionEffect planeswalkerRedirectionEffect; private final AuraReplacementEffect auraReplacementEffect; - private List previous = new ArrayList(); + private final List previous = new ArrayList(); // effect.id -> sourceId - which effect was added by which sourceId - private Map sources = new HashMap(); + private final Map sources = new HashMap(); public ContinuousEffects() { applyCounters = new ApplyCountersEffect(); @@ -474,7 +477,6 @@ public class ContinuousEffects implements Serializable { * * @param abilityToModify * @param game - * @return */ public void costModification ( Ability abilityToModify, Game game ) { List costEffects = getApplicableCostModificationEffects(game); @@ -518,7 +520,6 @@ public class ContinuousEffects implements Serializable { * * @param abilityToModify * @param game - * @return */ public void applySpliceEffects ( Ability abilityToModify, Game game ) { if ( ((SpellAbility) abilityToModify).getSpellAbilityType().equals(SpellAbilityType.SPLICE)) { @@ -832,8 +833,14 @@ public class ContinuousEffects implements Serializable { for (Effect effect : effects) { HashSet abilities = effects.getAbility(effect.getId()); for (Ability ability : abilities) { - if (ability.getSourceId().equals(cardId)) { - ability.setControllerId(controllerId); + if (ability.getSourceId() != null) { + if (ability.getSourceId().equals(cardId)) { + ability.setControllerId(controllerId); + } + } else { + if (!ability.getZone().equals(Zone.COMMAND)) { + logger.fatal(new StringBuilder("No sourceId Ability: ").append(ability)); + } } } } @@ -851,6 +858,7 @@ public class ContinuousEffects implements Serializable { * Removes effects granted by sourceId * * @param sourceId + * @return */ public List removeGainedEffectsForSource(UUID sourceId) { List effects = new ArrayList(); diff --git a/Mage/src/mage/game/combat/CombatGroup.java b/Mage/src/mage/game/combat/CombatGroup.java index 527e18f1889..a1c0a969ecf 100644 --- a/Mage/src/mage/game/combat/CombatGroup.java +++ b/Mage/src/mage/game/combat/CombatGroup.java @@ -29,17 +29,24 @@ package mage.game.combat; import java.io.Serializable; -import java.util.*; -import mage.constants.Outcome; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; import mage.abilities.common.DamageAsThoughNotBlockedAbility; -import mage.abilities.keyword.*; +import mage.abilities.keyword.CantBlockAloneAbility; +import mage.abilities.keyword.DeathtouchAbility; +import mage.abilities.keyword.DoubleStrikeAbility; +import mage.abilities.keyword.FirstStrikeAbility; +import mage.abilities.keyword.TrampleAbility; +import mage.constants.Outcome; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.permanent.Permanent; import mage.players.Player; import mage.util.Copyable; - /** * * @author BetaSteward_at_googlemail.com