From 868cd4d8fd2693f0b3ce8b929024e1a00b8e3ced Mon Sep 17 00:00:00 2001 From: Susucre <34709007+Susucre@users.noreply.github.com> Date: Sun, 28 Apr 2024 14:21:43 +0200 Subject: [PATCH] clean all usage of GameEvent::setSourceId --- Mage/src/main/java/mage/game/GameImpl.java | 4 +- .../java/mage/game/events/AttachEvent.java | 3 +- .../java/mage/game/events/AttachedEvent.java | 4 +- .../game/events/AttackerDeclaredEvent.java | 3 +- .../java/mage/game/events/BatchEvent.java | 22 +++++++--- .../game/events/BlockerDeclaredEvent.java | 3 +- .../mage/game/events/CoinFlippedEvent.java | 3 +- .../game/events/CopiedStackObjectEvent.java | 3 +- .../java/mage/game/events/DamageEvent.java | 3 +- .../game/events/DamagedBatchAllEvent.java | 2 +- .../DamagedBatchCouldHaveFiredEvent.java | 4 +- .../DamagedBatchForOnePermanentEvent.java | 2 +- .../events/DamagedBatchForOnePlayerEvent.java | 2 +- .../DamagedBatchForPermanentsEvent.java | 2 +- .../events/DamagedBatchForPlayersEvent.java | 2 +- .../java/mage/game/events/DamagedEvent.java | 3 +- .../game/events/DeclareAttackerEvent.java | 3 +- .../mage/game/events/DeclareBlockerEvent.java | 3 +- .../game/events/DefenderAttackedEvent.java | 3 +- .../java/mage/game/events/DrawCardEvent.java | 8 +++- .../java/mage/game/events/DrawCardsEvent.java | 8 +++- .../java/mage/game/events/DrewCardEvent.java | 13 +++--- .../mage/game/events/EnchantPlayerEvent.java | 4 +- .../game/events/EnchantedPlayerEvent.java | 4 +- .../main/java/mage/game/events/GameEvent.java | 42 ++++++++++--------- .../mage/game/events/LifeLostBatchEvent.java | 2 +- .../game/events/MadnessCardExiledEvent.java | 3 +- .../java/mage/game/events/ManaPaidEvent.java | 3 +- .../game/events/NumberOfTriggersEvent.java | 12 ++++-- .../mage/game/events/PhaseChangedEvent.java | 3 +- .../mage/game/events/PreventDamageEvent.java | 4 +- .../game/events/PreventedDamageEvent.java | 3 +- .../mage/game/events/StayAttachedEvent.java | 6 +-- .../mage/game/events/TappedBatchEvent.java | 2 +- .../java/mage/game/events/TargetEvent.java | 6 +-- .../java/mage/game/events/UnattachEvent.java | 4 +- .../mage/game/events/UnattachedEvent.java | 4 +- .../mage/game/events/UntappedBatchEvent.java | 2 +- .../java/mage/game/events/UntappedEvent.java | 4 +- .../game/events/ZoneChangeGroupEvent.java | 3 +- 40 files changed, 114 insertions(+), 100 deletions(-) diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 3bc1d7003c2..c477a6ee83a 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1959,9 +1959,9 @@ public abstract class GameImpl implements Game { informPlayers("You have planeswalked to " + newPlane.getLogName()); // Fire off the planeswalked event - GameEvent event = new GameEvent(GameEvent.EventType.PLANESWALK, newPlane.getId(), null, newPlane.getId(), 0, true); + GameEvent event = new GameEvent(GameEvent.EventType.PLANESWALK, newPlane.getId(), (Ability) null, newPlane.getId(), 0, true); if (!replaceEvent(event)) { - GameEvent ge = new GameEvent(GameEvent.EventType.PLANESWALKED, newPlane.getId(), null, newPlane.getId(), 0, true); + GameEvent ge = new GameEvent(GameEvent.EventType.PLANESWALKED, newPlane.getId(), (Ability) null, newPlane.getId(), 0, true); fireEvent(ge); } diff --git a/Mage/src/main/java/mage/game/events/AttachEvent.java b/Mage/src/main/java/mage/game/events/AttachEvent.java index a6b423f119e..b5f94ec7d23 100644 --- a/Mage/src/main/java/mage/game/events/AttachEvent.java +++ b/Mage/src/main/java/mage/game/events/AttachEvent.java @@ -11,7 +11,6 @@ import java.util.UUID; public class AttachEvent extends GameEvent { public AttachEvent(UUID targetPermanentId, Permanent attachment, Ability source) { - super(GameEvent.EventType.ATTACH, targetPermanentId, null, attachment.getControllerId()); - this.setSourceId(attachment.getId()); + super(GameEvent.EventType.ATTACH, targetPermanentId, attachment.getId(), attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/AttachedEvent.java b/Mage/src/main/java/mage/game/events/AttachedEvent.java index bc4bde6fe99..f5632b0fe89 100644 --- a/Mage/src/main/java/mage/game/events/AttachedEvent.java +++ b/Mage/src/main/java/mage/game/events/AttachedEvent.java @@ -10,8 +10,8 @@ import java.util.UUID; */ public class AttachedEvent extends GameEvent { + // TODO: investigate why source is provided but not used at all? public AttachedEvent(UUID targetPermanentId, Permanent attachment, Ability source) { - super(GameEvent.EventType.ATTACHED, targetPermanentId, null, attachment.getControllerId()); - this.setSourceId(attachment.getId()); + super(GameEvent.EventType.ATTACHED, targetPermanentId, attachment.getId(), attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/AttackerDeclaredEvent.java b/Mage/src/main/java/mage/game/events/AttackerDeclaredEvent.java index 2ee7243fc7f..91a9caf7c9b 100644 --- a/Mage/src/main/java/mage/game/events/AttackerDeclaredEvent.java +++ b/Mage/src/main/java/mage/game/events/AttackerDeclaredEvent.java @@ -8,7 +8,6 @@ import java.util.UUID; public class AttackerDeclaredEvent extends GameEvent { public AttackerDeclaredEvent(UUID targetId, UUID attackerId, UUID attackerControllerId) { - super(GameEvent.EventType.ATTACKER_DECLARED, targetId, null, attackerControllerId); - this.setSourceId(attackerId); + super(GameEvent.EventType.ATTACKER_DECLARED, targetId, attackerId, attackerControllerId); } } diff --git a/Mage/src/main/java/mage/game/events/BatchEvent.java b/Mage/src/main/java/mage/game/events/BatchEvent.java index 65c005c9568..a24a31011cb 100644 --- a/Mage/src/main/java/mage/game/events/BatchEvent.java +++ b/Mage/src/main/java/mage/game/events/BatchEvent.java @@ -9,21 +9,25 @@ import java.util.stream.Collectors; /** * Special events created by game engine to track batches of events that occur simultaneously, * for triggers that need such information + * * @author xenohedron */ public abstract class BatchEvent extends GameEvent { private final Set events = new HashSet<>(); private final boolean singleTargetId; + private final boolean singleSourceId; /** - * @param eventType specific type of event + * @param eventType specific type of event + * @param singleSourceId if true, all included events must have same source id * @param singleTargetId if true, all included events must have same target id - * @param firstEvent added to initialize the batch (batch is never empty) + * @param firstEvent added to initialize the batch (batch is never empty) */ - protected BatchEvent(EventType eventType, boolean singleTargetId, T firstEvent) { - super(eventType, (singleTargetId ? firstEvent.getTargetId() : null), null, null); + protected BatchEvent(EventType eventType, boolean singleTargetId, boolean singleSourceId, T firstEvent) { + super(eventType, (singleTargetId ? firstEvent.getTargetId() : null), (singleSourceId ? firstEvent.getSourceId() : null), null); this.singleTargetId = singleTargetId; + this.singleSourceId = singleSourceId; if (firstEvent instanceof BatchEvent) { // sanity check, if you need it then think twice and research carefully throw new UnsupportedOperationException("Wrong code usage: nesting batch events not supported"); } @@ -34,14 +38,18 @@ public abstract class BatchEvent extends GameEvent { * For alternate event structure logic used by ZoneChangeBatchEvent, list of events starts empty. */ protected BatchEvent(EventType eventType) { - super(eventType, null, null, null); + super(eventType, null, (UUID) null, null); this.singleTargetId = false; + this.singleSourceId = false; } public void addEvent(T event) { if (singleTargetId && !getTargetId().equals(event.getTargetId())) { throw new IllegalStateException("Wrong code usage. Batch event initiated with single target id, but trying to add event with different target id"); } + if (singleSourceId && !getSourceId().equals(event.getSourceId())) { + throw new IllegalStateException("Wrong code usage. Batch event initiated with single source id, but trying to add event with different target id"); + } this.events.add(event); } @@ -87,8 +95,10 @@ public abstract class BatchEvent extends GameEvent { } @Override // events can store a diff value, so search it from events list instead - @Deprecated // no use case currently supported public UUID getSourceId() { + if (singleSourceId) { + return super.getSourceId(); + } throw new IllegalStateException("Wrong code usage. Must search value from a getEvents list"); } diff --git a/Mage/src/main/java/mage/game/events/BlockerDeclaredEvent.java b/Mage/src/main/java/mage/game/events/BlockerDeclaredEvent.java index 1789f5ceb0e..d109e713eb1 100644 --- a/Mage/src/main/java/mage/game/events/BlockerDeclaredEvent.java +++ b/Mage/src/main/java/mage/game/events/BlockerDeclaredEvent.java @@ -8,7 +8,6 @@ import java.util.UUID; public class BlockerDeclaredEvent extends GameEvent { public BlockerDeclaredEvent(UUID attackerId, UUID blockerId, UUID blockerControllerId) { - super(GameEvent.EventType.BLOCKER_DECLARED, attackerId, null, blockerControllerId); - this.setSourceId(blockerId); + super(GameEvent.EventType.BLOCKER_DECLARED, attackerId, blockerId, blockerControllerId); } } diff --git a/Mage/src/main/java/mage/game/events/CoinFlippedEvent.java b/Mage/src/main/java/mage/game/events/CoinFlippedEvent.java index e4b45285f2e..c30fb1d1fd6 100644 --- a/Mage/src/main/java/mage/game/events/CoinFlippedEvent.java +++ b/Mage/src/main/java/mage/game/events/CoinFlippedEvent.java @@ -15,12 +15,11 @@ public class CoinFlippedEvent extends GameEvent { private final int flipCount; // Number of flips that lead to this event. see [[Krark's Thumb]] CoinFlippedEvent(UUID playerId, UUID sourceId, int flipCount, boolean result, boolean chosen, boolean winnable) { - super(GameEvent.EventType.COIN_FLIPPED, playerId, null, playerId); + super(GameEvent.EventType.COIN_FLIPPED, playerId, sourceId, playerId); this.result = result; this.chosen = chosen; this.winnable = winnable; this.flipCount = flipCount; - this.setSourceId(sourceId); } public boolean getResult() { diff --git a/Mage/src/main/java/mage/game/events/CopiedStackObjectEvent.java b/Mage/src/main/java/mage/game/events/CopiedStackObjectEvent.java index c7b56eae337..3715a83397a 100644 --- a/Mage/src/main/java/mage/game/events/CopiedStackObjectEvent.java +++ b/Mage/src/main/java/mage/game/events/CopiedStackObjectEvent.java @@ -10,7 +10,6 @@ import java.util.UUID; public class CopiedStackObjectEvent extends GameEvent { public CopiedStackObjectEvent(MageObject target, MageObject newCopy, UUID newControllerId) { - super(GameEvent.EventType.COPIED_STACKOBJECT, newCopy.getId(), null, newControllerId); - this.setSourceId(target.getId()); + super(GameEvent.EventType.COPIED_STACKOBJECT, newCopy.getId(), target.getId(), newControllerId); } } diff --git a/Mage/src/main/java/mage/game/events/DamageEvent.java b/Mage/src/main/java/mage/game/events/DamageEvent.java index 431d1f74479..9fa174d4337 100644 --- a/Mage/src/main/java/mage/game/events/DamageEvent.java +++ b/Mage/src/main/java/mage/game/events/DamageEvent.java @@ -12,9 +12,8 @@ public abstract class DamageEvent extends GameEvent { private boolean asThoughWither = false; public DamageEvent(EventType type, UUID targetId, UUID damageSourceId, UUID targetControllerId, int amount, boolean preventable, boolean combat) { - super(type, targetId, null, targetControllerId, amount, preventable); + super(type, targetId, damageSourceId, targetControllerId, amount, preventable); this.combat = combat; - this.setSourceId(damageSourceId); } public boolean isCombatDamage() { diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchAllEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchAllEvent.java index f57161ea7c3..341b59de02c 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchAllEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchAllEvent.java @@ -6,6 +6,6 @@ package mage.game.events; public class DamagedBatchAllEvent extends BatchEvent { public DamagedBatchAllEvent(DamagedEvent firstEvent) { - super(EventType.DAMAGED_BATCH_FOR_ALL, false, firstEvent); + super(EventType.DAMAGED_BATCH_FOR_ALL, false, false, firstEvent); } } diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchCouldHaveFiredEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchCouldHaveFiredEvent.java index 6a2ecdcaae3..d999dbece28 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchCouldHaveFiredEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchCouldHaveFiredEvent.java @@ -1,5 +1,7 @@ package mage.game.events; +import mage.abilities.Ability; + /** * Does not contain any info on damage events, and can fire even when all damage is prevented. * Fire any time a DAMAGED_BATCH_FOR_ALL could have fired (combat & noncombat). @@ -10,6 +12,6 @@ package mage.game.events; public class DamagedBatchCouldHaveFiredEvent extends GameEvent { public DamagedBatchCouldHaveFiredEvent(boolean combat) { - super(EventType.DAMAGED_BATCH_COULD_HAVE_FIRED, null, null, null, 0, combat); + super(EventType.DAMAGED_BATCH_COULD_HAVE_FIRED, null, (Ability) null, null, 0, combat); } } diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchForOnePermanentEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchForOnePermanentEvent.java index fbf5d254095..b6cd7d817a7 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchForOnePermanentEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchForOnePermanentEvent.java @@ -3,7 +3,7 @@ package mage.game.events; public class DamagedBatchForOnePermanentEvent extends BatchEvent { public DamagedBatchForOnePermanentEvent(DamagedPermanentEvent firstEvent) { - super(GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PERMANENT, true, firstEvent); + super(GameEvent.EventType.DAMAGED_BATCH_FOR_ONE_PERMANENT, true, false, firstEvent); } public boolean isCombatDamage() { diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchForOnePlayerEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchForOnePlayerEvent.java index 121120f804d..b537fa60aa7 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchForOnePlayerEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchForOnePlayerEvent.java @@ -6,7 +6,7 @@ package mage.game.events; public class DamagedBatchForOnePlayerEvent extends BatchEvent { public DamagedBatchForOnePlayerEvent(DamagedPlayerEvent firstEvent) { - super(EventType.DAMAGED_BATCH_FOR_ONE_PLAYER, true, firstEvent); + super(EventType.DAMAGED_BATCH_FOR_ONE_PLAYER, true, false, firstEvent); } public boolean isCombatDamage() { diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchForPermanentsEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchForPermanentsEvent.java index 4f7b1f6a776..b31839d341c 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchForPermanentsEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchForPermanentsEvent.java @@ -6,6 +6,6 @@ package mage.game.events; public class DamagedBatchForPermanentsEvent extends BatchEvent { public DamagedBatchForPermanentsEvent(DamagedPermanentEvent firstEvent) { - super(EventType.DAMAGED_BATCH_FOR_PERMANENTS, false, firstEvent); + super(EventType.DAMAGED_BATCH_FOR_PERMANENTS, false, false, firstEvent); } } diff --git a/Mage/src/main/java/mage/game/events/DamagedBatchForPlayersEvent.java b/Mage/src/main/java/mage/game/events/DamagedBatchForPlayersEvent.java index 172a4bcf6d1..70f41bfc07d 100644 --- a/Mage/src/main/java/mage/game/events/DamagedBatchForPlayersEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedBatchForPlayersEvent.java @@ -6,6 +6,6 @@ package mage.game.events; public class DamagedBatchForPlayersEvent extends BatchEvent { public DamagedBatchForPlayersEvent(DamagedPlayerEvent firstEvent) { - super(GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS, false, firstEvent); + super(GameEvent.EventType.DAMAGED_BATCH_FOR_PLAYERS, false, false, firstEvent); } } diff --git a/Mage/src/main/java/mage/game/events/DamagedEvent.java b/Mage/src/main/java/mage/game/events/DamagedEvent.java index 40778542b75..bbd56ae762b 100644 --- a/Mage/src/main/java/mage/game/events/DamagedEvent.java +++ b/Mage/src/main/java/mage/game/events/DamagedEvent.java @@ -11,10 +11,9 @@ public abstract class DamagedEvent extends GameEvent { protected int excess; public DamagedEvent(EventType type, UUID targetId, UUID attackerId, UUID playerId, int amount, boolean combat) { - super(type, targetId, null, playerId, amount, false); + super(type, targetId, attackerId, playerId, amount, false); this.combat = combat; this.excess = 0; - this.setSourceId(attackerId); } public boolean isCombatDamage() { diff --git a/Mage/src/main/java/mage/game/events/DeclareAttackerEvent.java b/Mage/src/main/java/mage/game/events/DeclareAttackerEvent.java index 52bf9a958d0..7ff0c8630c4 100644 --- a/Mage/src/main/java/mage/game/events/DeclareAttackerEvent.java +++ b/Mage/src/main/java/mage/game/events/DeclareAttackerEvent.java @@ -8,7 +8,6 @@ import java.util.UUID; public class DeclareAttackerEvent extends GameEvent { public DeclareAttackerEvent(UUID targetId, UUID attackerId, UUID attackerControllerId) { - super(GameEvent.EventType.DECLARE_ATTACKER, targetId, null, attackerControllerId); - this.setSourceId(attackerId); + super(GameEvent.EventType.DECLARE_ATTACKER, targetId, attackerId, attackerControllerId); } } diff --git a/Mage/src/main/java/mage/game/events/DeclareBlockerEvent.java b/Mage/src/main/java/mage/game/events/DeclareBlockerEvent.java index 410f1c5d2a8..04151bf5308 100644 --- a/Mage/src/main/java/mage/game/events/DeclareBlockerEvent.java +++ b/Mage/src/main/java/mage/game/events/DeclareBlockerEvent.java @@ -8,7 +8,6 @@ import java.util.UUID; public class DeclareBlockerEvent extends GameEvent { public DeclareBlockerEvent(UUID attackerId, UUID blockerId, UUID blockerControllerId) { - super(GameEvent.EventType.DECLARE_BLOCKER, attackerId, null, blockerControllerId); - this.setSourceId(blockerId); + super(GameEvent.EventType.DECLARE_BLOCKER, attackerId, blockerId, blockerControllerId); } } diff --git a/Mage/src/main/java/mage/game/events/DefenderAttackedEvent.java b/Mage/src/main/java/mage/game/events/DefenderAttackedEvent.java index 2f215c36977..682a5c3ea55 100644 --- a/Mage/src/main/java/mage/game/events/DefenderAttackedEvent.java +++ b/Mage/src/main/java/mage/game/events/DefenderAttackedEvent.java @@ -1,6 +1,7 @@ package mage.game.events; import mage.MageObjectReference; +import mage.abilities.Ability; import mage.game.Game; import mage.game.permanent.Permanent; @@ -15,7 +16,7 @@ public class DefenderAttackedEvent extends GameEvent { private final Set morSet = new HashSet<>(); public DefenderAttackedEvent(UUID targetId, UUID playerId) { - super(EventType.DEFENDER_ATTACKED, targetId, null, playerId); + super(EventType.DEFENDER_ATTACKED, targetId, (Ability) null, playerId); } diff --git a/Mage/src/main/java/mage/game/events/DrawCardEvent.java b/Mage/src/main/java/mage/game/events/DrawCardEvent.java index f72aa989cf9..a5c121622c4 100644 --- a/Mage/src/main/java/mage/game/events/DrawCardEvent.java +++ b/Mage/src/main/java/mage/game/events/DrawCardEvent.java @@ -10,12 +10,16 @@ import java.util.UUID; public class DrawCardEvent extends GameEvent { public DrawCardEvent(UUID playerId, Ability source, GameEvent originalDrawEvent) { - super(GameEvent.EventType.DRAW_CARD, playerId, source, playerId, 0, false); + super(GameEvent.EventType.DRAW_CARD, playerId, + // source of draw events must be kept between replacements, example: UnpredictableCycloneTest + originalDrawEvent == null + ? source == null ? null : source.getSourceId() + : originalDrawEvent.getSourceId(), + playerId, 0, false); // source of draw events must be kept between replacements, example: UnpredictableCycloneTest if (originalDrawEvent != null) { this.addAppliedEffects(originalDrawEvent.getAppliedEffects()); - this.setSourceId(originalDrawEvent.getSourceId()); } } } diff --git a/Mage/src/main/java/mage/game/events/DrawCardsEvent.java b/Mage/src/main/java/mage/game/events/DrawCardsEvent.java index 31a18d3ed28..aa2c82f7054 100644 --- a/Mage/src/main/java/mage/game/events/DrawCardsEvent.java +++ b/Mage/src/main/java/mage/game/events/DrawCardsEvent.java @@ -10,12 +10,16 @@ import java.util.UUID; public class DrawCardsEvent extends GameEvent { public DrawCardsEvent(UUID playerId, Ability source, GameEvent originalDrawEvent, int amount) { - super(GameEvent.EventType.DRAW_CARDS, playerId, source, playerId, amount, false); + super(GameEvent.EventType.DRAW_CARDS, playerId, + // source of draw events must be kept between replacements, example: UnpredictableCycloneTest + originalDrawEvent == null + ? source == null ? null : source.getSourceId() + : originalDrawEvent.getSourceId(), + playerId, amount, false); // source of draw events must be kept between replacements, example: UnpredictableCycloneTest if (originalDrawEvent != null) { this.addAppliedEffects(originalDrawEvent.getAppliedEffects()); - this.setSourceId(originalDrawEvent.getSourceId()); } } } diff --git a/Mage/src/main/java/mage/game/events/DrewCardEvent.java b/Mage/src/main/java/mage/game/events/DrewCardEvent.java index 6650134b42d..194a4020217 100644 --- a/Mage/src/main/java/mage/game/events/DrewCardEvent.java +++ b/Mage/src/main/java/mage/game/events/DrewCardEvent.java @@ -10,12 +10,11 @@ import java.util.UUID; public class DrewCardEvent extends GameEvent { public DrewCardEvent(UUID cardId, UUID playerId, Ability source, GameEvent originalDrawEvent) { - super(EventType.DREW_CARD, cardId, source, playerId, 0, false); - - // source of draw events must be kept between replacements, example: UnpredictableCycloneTest - if (originalDrawEvent != null) { - //this.addAppliedEffects(originalDrawEvent.getAppliedEffects()); // event can't used for replace, so no needs in applied effects - this.setSourceId(originalDrawEvent.getSourceId()); - } + super(EventType.DREW_CARD, cardId, + // source of draw events must be kept between replacements, example: UnpredictableCycloneTest + originalDrawEvent == null + ? source == null ? null : source.getSourceId() + : originalDrawEvent.getSourceId(), + playerId, 0, false); } } diff --git a/Mage/src/main/java/mage/game/events/EnchantPlayerEvent.java b/Mage/src/main/java/mage/game/events/EnchantPlayerEvent.java index 182466e725c..5562ef7e7f5 100644 --- a/Mage/src/main/java/mage/game/events/EnchantPlayerEvent.java +++ b/Mage/src/main/java/mage/game/events/EnchantPlayerEvent.java @@ -10,8 +10,8 @@ import java.util.UUID; */ public class EnchantPlayerEvent extends GameEvent { + // TODO: investigate why source is provided but not used at all? public EnchantPlayerEvent(UUID targetId, Permanent attachment, Ability source) { - super(GameEvent.EventType.ENCHANT_PLAYER, targetId, null, attachment.getControllerId()); - this.setSourceId(attachment.getId()); + super(GameEvent.EventType.ENCHANT_PLAYER, targetId, attachment.getId(), attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/EnchantedPlayerEvent.java b/Mage/src/main/java/mage/game/events/EnchantedPlayerEvent.java index f5c2a78b00d..cef27ed8f0c 100644 --- a/Mage/src/main/java/mage/game/events/EnchantedPlayerEvent.java +++ b/Mage/src/main/java/mage/game/events/EnchantedPlayerEvent.java @@ -10,8 +10,8 @@ import java.util.UUID; */ public class EnchantedPlayerEvent extends GameEvent { + // TODO: investigate why source is provided but not used at all? public EnchantedPlayerEvent(UUID targetId, Permanent attachment, Ability source) { - super(GameEvent.EventType.ENCHANTED_PLAYER, targetId, null, attachment.getControllerId()); - this.setSourceId(attachment.getId()); + super(GameEvent.EventType.ENCHANTED_PLAYER, targetId, attachment.getId(), attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/GameEvent.java b/Mage/src/main/java/mage/game/events/GameEvent.java index 35d192ae231..e1e6d80c35f 100644 --- a/Mage/src/main/java/mage/game/events/GameEvent.java +++ b/Mage/src/main/java/mage/game/events/GameEvent.java @@ -641,23 +641,31 @@ public class GameEvent implements Serializable { } public GameEvent(EventType type, UUID targetId, Ability source, UUID playerId) { - this(type, null, targetId, source, playerId, 0, false); + this(type, null, targetId, source == null ? null : source.getSourceId(), playerId, 0, false); + } + + protected GameEvent(EventType type, UUID targetId, UUID sourceId, UUID playerId) { + this(type, null, targetId, sourceId, playerId, 0, false); } public GameEvent(EventType type, UUID targetId, Ability source, UUID playerId, ApprovingObject approvingObject) { - this(type, null, targetId, source, playerId, 0, false, approvingObject); + this(type, null, targetId, source == null ? null : source.getSourceId(), playerId, 0, false, approvingObject); } public GameEvent(EventType type, UUID targetId, Ability source, UUID playerId, int amount, boolean flag) { - this(type, null, targetId, source, playerId, amount, flag); + this(type, null, targetId, source == null ? null : source.getSourceId(), playerId, amount, flag); + } + + public GameEvent(EventType type, UUID targetId, UUID sourceId, UUID playerId, int amount, boolean flag) { + this(type, null, targetId, sourceId, playerId, amount, flag); } public GameEvent(UUID customEventType, UUID targetId, Ability source, UUID playerId) { - this(EventType.CUSTOM_EVENT, customEventType, targetId, source, playerId, 0, false); + this(EventType.CUSTOM_EVENT, customEventType, targetId, source == null ? null : source.getSourceId(), playerId, 0, false); } public GameEvent(UUID customEventType, UUID targetId, Ability source, UUID playerId, int amount, boolean flag) { - this(EventType.CUSTOM_EVENT, customEventType, targetId, source, playerId, amount, flag); + this(EventType.CUSTOM_EVENT, customEventType, targetId, source == null ? null : source.getSourceId(), playerId, amount, flag); } public static GameEvent getEvent(EventType type, UUID targetId, Ability source, UUID playerId, int amount) { @@ -674,7 +682,7 @@ public class GameEvent implements Serializable { @Deprecated // usage must be replaced by getEvent with source ability public static GameEvent getEvent(EventType type, UUID targetId, UUID playerId) { - return new GameEvent(type, targetId, null, playerId); + return new GameEvent(type, targetId, (UUID) null, playerId); } public static GameEvent getEvent(EventType type, UUID targetId, Ability source, UUID playerId, String data, int amount) { @@ -692,16 +700,21 @@ public class GameEvent implements Serializable { return new GameEvent(customEventType, targetId, source, playerId); } - private GameEvent(EventType type, UUID customEventType, UUID targetId, Ability source, UUID playerId, int amount, boolean flag) { - this(type, customEventType, targetId, source, playerId, amount, flag, null); + private GameEvent(EventType type, UUID customEventType, + UUID targetId, UUID sourceId, UUID playerId, + int amount, boolean flag + ) { + this(type, customEventType, targetId, sourceId, playerId, amount, flag, null); } private GameEvent(EventType type, UUID customEventType, - UUID targetId, Ability source, UUID playerId, int amount, boolean flag, ApprovingObject approvingObject) { + UUID targetId, UUID sourceId, UUID playerId, + int amount, boolean flag, ApprovingObject approvingObject + ) { this.type = type; this.customEventType = customEventType; this.targetId = targetId; - this.sourceId = source == null ? null : source.getSourceId(); + this.sourceId = sourceId; this.amount = amount; this.playerId = playerId; this.flag = flag; @@ -850,15 +863,6 @@ public class GameEvent implements Serializable { return identifier.equals(approvingObject.getApprovingAbility().getIdentifier()); } - /** - * Custom sourceId setup for some events (use it in constructor). TODO: replace all custom sourceId to normal event classes - * - * @param sourceId - */ - protected void setSourceId(UUID sourceId) { - this.sourceId = sourceId; - } - @Override public String toString() { return this.type.toString(); diff --git a/Mage/src/main/java/mage/game/events/LifeLostBatchEvent.java b/Mage/src/main/java/mage/game/events/LifeLostBatchEvent.java index bed29be5456..fd2d386920b 100644 --- a/Mage/src/main/java/mage/game/events/LifeLostBatchEvent.java +++ b/Mage/src/main/java/mage/game/events/LifeLostBatchEvent.java @@ -8,7 +8,7 @@ import java.util.UUID; public class LifeLostBatchEvent extends BatchEvent { public LifeLostBatchEvent(LifeLostEvent firstEvent) { - super(EventType.LOST_LIFE_BATCH, false, firstEvent); + super(EventType.LOST_LIFE_BATCH, false, false, firstEvent); } public int getLifeLostByPlayer(UUID playerID) { diff --git a/Mage/src/main/java/mage/game/events/MadnessCardExiledEvent.java b/Mage/src/main/java/mage/game/events/MadnessCardExiledEvent.java index ffb8c42bf68..dbaf77d6209 100644 --- a/Mage/src/main/java/mage/game/events/MadnessCardExiledEvent.java +++ b/Mage/src/main/java/mage/game/events/MadnessCardExiledEvent.java @@ -10,7 +10,6 @@ import java.util.UUID; public class MadnessCardExiledEvent extends GameEvent { public MadnessCardExiledEvent(UUID cardId, Ability source, UUID controllerId) { - super(GameEvent.EventType.MADNESS_CARD_EXILED, cardId, null, controllerId); - this.setSourceId(source.getOriginalId()); // save ability's id + super(GameEvent.EventType.MADNESS_CARD_EXILED, cardId, source.getOriginalId(), controllerId); } } diff --git a/Mage/src/main/java/mage/game/events/ManaPaidEvent.java b/Mage/src/main/java/mage/game/events/ManaPaidEvent.java index 58e01508388..febe076f1af 100644 --- a/Mage/src/main/java/mage/game/events/ManaPaidEvent.java +++ b/Mage/src/main/java/mage/game/events/ManaPaidEvent.java @@ -16,8 +16,7 @@ public class ManaPaidEvent extends GameEvent { private final ManaType manaType; public ManaPaidEvent(Ability abilityToPay, UUID manaSourceId, boolean manaFlag, UUID manaOriginalId, MageObject sourceObject, ManaType manaType) { - super(GameEvent.EventType.MANA_PAID, abilityToPay.getId(), null, abilityToPay.getControllerId(), 0, manaFlag); - this.setSourceId(manaSourceId); + super(GameEvent.EventType.MANA_PAID, abilityToPay.getId(), manaSourceId, abilityToPay.getControllerId(), 0, manaFlag); this.setData(manaOriginalId.toString()); this.sourcePaidId = abilityToPay.getSourceId(); this.sourceObject = sourceObject; diff --git a/Mage/src/main/java/mage/game/events/NumberOfTriggersEvent.java b/Mage/src/main/java/mage/game/events/NumberOfTriggersEvent.java index 014dc5d40fa..d93862935a4 100644 --- a/Mage/src/main/java/mage/game/events/NumberOfTriggersEvent.java +++ b/Mage/src/main/java/mage/game/events/NumberOfTriggersEvent.java @@ -1,8 +1,6 @@ package mage.game.events; -import mage.abilities.Ability; - -import java.util.UUID; +import mage.abilities.TriggeredAbility; /** * Raise events for normal triggers, ignore state based triggers from StateTriggeredAbility @@ -12,14 +10,20 @@ import java.util.UUID; public class NumberOfTriggersEvent extends GameEvent { private final GameEvent sourceEvent; + private final TriggeredAbility sourceTrigger; - public NumberOfTriggersEvent(Ability triggeredAbility, GameEvent sourceEvent) { + public NumberOfTriggersEvent(TriggeredAbility triggeredAbility, GameEvent sourceEvent) { super(GameEvent.EventType.NUMBER_OF_TRIGGERS, null, triggeredAbility, triggeredAbility.getControllerId()); this.sourceEvent = sourceEvent; + this.sourceTrigger = triggeredAbility; this.amount = 1; // Number of times to trigger. Panharmonicon can change this. } public GameEvent getSourceEvent() { return sourceEvent; } + + public TriggeredAbility getSourceTrigger() { + return sourceTrigger; + } } diff --git a/Mage/src/main/java/mage/game/events/PhaseChangedEvent.java b/Mage/src/main/java/mage/game/events/PhaseChangedEvent.java index ba35cdc0ac6..6251b9e32e1 100644 --- a/Mage/src/main/java/mage/game/events/PhaseChangedEvent.java +++ b/Mage/src/main/java/mage/game/events/PhaseChangedEvent.java @@ -10,7 +10,6 @@ import java.util.UUID; public class PhaseChangedEvent extends GameEvent { public PhaseChangedEvent(UUID playerId, TurnMod extraTurnMode) { - super(GameEvent.EventType.PHASE_CHANGED, playerId, null, playerId); - this.setSourceId(extraTurnMode == null ? null : extraTurnMode.getId()); + super(GameEvent.EventType.PHASE_CHANGED, playerId, extraTurnMode == null ? null : extraTurnMode.getId(), playerId); } } diff --git a/Mage/src/main/java/mage/game/events/PreventDamageEvent.java b/Mage/src/main/java/mage/game/events/PreventDamageEvent.java index e57898a31c8..5527a01c86a 100644 --- a/Mage/src/main/java/mage/game/events/PreventDamageEvent.java +++ b/Mage/src/main/java/mage/game/events/PreventDamageEvent.java @@ -9,9 +9,9 @@ import java.util.UUID; */ public class PreventDamageEvent extends GameEvent { + // TODO: investigate why source is provided but not used? public PreventDamageEvent(UUID targetId, UUID attackerId, Ability source, UUID playerId, int damageToPrevent, boolean isCombatDamage) { - super(GameEvent.EventType.PREVENT_DAMAGE, targetId, null, playerId, damageToPrevent, isCombatDamage); - this.setSourceId(attackerId); + super(GameEvent.EventType.PREVENT_DAMAGE, targetId, attackerId, playerId, damageToPrevent, isCombatDamage); } public boolean isCombatDamage() { diff --git a/Mage/src/main/java/mage/game/events/PreventedDamageEvent.java b/Mage/src/main/java/mage/game/events/PreventedDamageEvent.java index e490667f5c2..2e2a99585a7 100644 --- a/Mage/src/main/java/mage/game/events/PreventedDamageEvent.java +++ b/Mage/src/main/java/mage/game/events/PreventedDamageEvent.java @@ -10,7 +10,6 @@ import java.util.UUID; public class PreventedDamageEvent extends GameEvent { public PreventedDamageEvent(UUID targetId, UUID attackerId, Ability source, UUID playerId, int preventedDamage) { - super(GameEvent.EventType.PREVENTED_DAMAGE, targetId, null, playerId, preventedDamage, false); - this.setSourceId(attackerId); + super(GameEvent.EventType.PREVENTED_DAMAGE, targetId, attackerId, playerId, preventedDamage, false); } } diff --git a/Mage/src/main/java/mage/game/events/StayAttachedEvent.java b/Mage/src/main/java/mage/game/events/StayAttachedEvent.java index ee9efa920a1..b84278fdd82 100644 --- a/Mage/src/main/java/mage/game/events/StayAttachedEvent.java +++ b/Mage/src/main/java/mage/game/events/StayAttachedEvent.java @@ -1,18 +1,16 @@ package mage.game.events; import mage.abilities.Ability; -import mage.game.permanent.Permanent; import java.util.UUID; /** - * * @author JayDi85 */ public class StayAttachedEvent extends GameEvent { + // TODO: investigate why source is not used as source for the event? public StayAttachedEvent(UUID targetId, UUID attachmentId, Ability source) { - super(GameEvent.EventType.STAY_ATTACHED, targetId, null, null); - this.setSourceId(attachmentId); + super(GameEvent.EventType.STAY_ATTACHED, targetId, attachmentId, null); } } diff --git a/Mage/src/main/java/mage/game/events/TappedBatchEvent.java b/Mage/src/main/java/mage/game/events/TappedBatchEvent.java index 18d82863927..133509e36e5 100644 --- a/Mage/src/main/java/mage/game/events/TappedBatchEvent.java +++ b/Mage/src/main/java/mage/game/events/TappedBatchEvent.java @@ -6,7 +6,7 @@ package mage.game.events; public class TappedBatchEvent extends BatchEvent { public TappedBatchEvent(TappedEvent firstEvent) { - super(EventType.TAPPED_BATCH, false, firstEvent); + super(EventType.TAPPED_BATCH, false, false, firstEvent); } } diff --git a/Mage/src/main/java/mage/game/events/TargetEvent.java b/Mage/src/main/java/mage/game/events/TargetEvent.java index f2c90ebc87b..63d93a5df38 100644 --- a/Mage/src/main/java/mage/game/events/TargetEvent.java +++ b/Mage/src/main/java/mage/game/events/TargetEvent.java @@ -17,13 +17,11 @@ public class TargetEvent extends GameEvent { * @param sourceControllerId can be different from real controller (example: ability instructs another player to targeting) */ public TargetEvent(Card target, UUID sourceId, UUID sourceControllerId) { - super(GameEvent.EventType.TARGET, target.getId(), null, sourceControllerId); - this.setSourceId(sourceId); + super(GameEvent.EventType.TARGET, target.getId(), sourceId, sourceControllerId); } public TargetEvent(Player target, UUID sourceId, UUID sourceControllerId) { - super(GameEvent.EventType.TARGET, target.getId(), null, sourceControllerId); - this.setSourceId(sourceId); + super(GameEvent.EventType.TARGET, target.getId(), sourceId, sourceControllerId); } /** diff --git a/Mage/src/main/java/mage/game/events/UnattachEvent.java b/Mage/src/main/java/mage/game/events/UnattachEvent.java index d7a84058990..51719082dea 100644 --- a/Mage/src/main/java/mage/game/events/UnattachEvent.java +++ b/Mage/src/main/java/mage/game/events/UnattachEvent.java @@ -10,8 +10,8 @@ import java.util.UUID; */ public class UnattachEvent extends GameEvent { + // TODO: investigate why source is not used as source for the event? public UnattachEvent(UUID targetId, UUID attachmentId, Permanent attachment, Ability source) { - super(GameEvent.EventType.UNATTACH, targetId, null, attachment == null ? null : attachment.getControllerId()); - this.setSourceId(attachmentId); + super(GameEvent.EventType.UNATTACH, targetId, attachmentId, attachment == null ? null : attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/UnattachedEvent.java b/Mage/src/main/java/mage/game/events/UnattachedEvent.java index 3f155d303d2..35348abf145 100644 --- a/Mage/src/main/java/mage/game/events/UnattachedEvent.java +++ b/Mage/src/main/java/mage/game/events/UnattachedEvent.java @@ -10,8 +10,8 @@ import java.util.UUID; */ public class UnattachedEvent extends GameEvent { + // TODO: investigate why source is provided but not used at all? public UnattachedEvent(UUID targetId, UUID attachmentId, Permanent attachment, Ability source) { - super(GameEvent.EventType.UNATTACHED, targetId, null, attachment == null ? null : attachment.getControllerId()); - this.setSourceId(attachmentId); + super(GameEvent.EventType.UNATTACHED, targetId, attachmentId, attachment == null ? null : attachment.getControllerId()); } } diff --git a/Mage/src/main/java/mage/game/events/UntappedBatchEvent.java b/Mage/src/main/java/mage/game/events/UntappedBatchEvent.java index 65387957ec5..a358d8ebf68 100644 --- a/Mage/src/main/java/mage/game/events/UntappedBatchEvent.java +++ b/Mage/src/main/java/mage/game/events/UntappedBatchEvent.java @@ -6,7 +6,7 @@ package mage.game.events; public class UntappedBatchEvent extends BatchEvent { public UntappedBatchEvent(UntappedEvent firstEvent) { - super(EventType.UNTAPPED_BATCH, false, firstEvent); + super(EventType.UNTAPPED_BATCH, false, false, firstEvent); } } diff --git a/Mage/src/main/java/mage/game/events/UntappedEvent.java b/Mage/src/main/java/mage/game/events/UntappedEvent.java index 03b3dfcbc5f..b96c2c157d6 100644 --- a/Mage/src/main/java/mage/game/events/UntappedEvent.java +++ b/Mage/src/main/java/mage/game/events/UntappedEvent.java @@ -1,5 +1,7 @@ package mage.game.events; +import mage.abilities.Ability; + import java.util.UUID; /** @@ -8,7 +10,7 @@ import java.util.UUID; public class UntappedEvent extends GameEvent { public UntappedEvent(UUID targetId, UUID playerId, boolean duringUntapPhase) { - super(EventType.UNTAPPED, targetId, null, playerId, 0, duringUntapPhase); + super(EventType.UNTAPPED, targetId, (Ability) null, playerId, 0, duringUntapPhase); } public boolean isAnUntapStepEvent() { diff --git a/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java b/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java index 4477fd7d207..4b43c66f482 100644 --- a/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java +++ b/Mage/src/main/java/mage/game/events/ZoneChangeGroupEvent.java @@ -19,8 +19,9 @@ public class ZoneChangeGroupEvent extends GameEvent { private final Set tokens; /* added this */ Ability source; + // TODO: investigate why we just discard sourceId and provide source directly? public ZoneChangeGroupEvent(Set cards, Set tokens, UUID sourceId, Ability source, UUID playerId, Zone fromZone, Zone toZone) { - super(GameEvent.EventType.ZONE_CHANGE_GROUP, null, null, playerId); + super(GameEvent.EventType.ZONE_CHANGE_GROUP, null, (Ability) null, playerId); this.fromZone = fromZone; this.toZone = toZone; this.cards = cards;