Refactor ControlledCreaturesDealCombatDamagePlayerTriggeredAbility. (#5163)

It now triggers once for each player damaged.

Fixes https://github.com/magefree/mage/issues/5162
This commit is contained in:
Samuel Sandeen 2018-07-29 08:16:07 -04:00 committed by GitHub
parent 14520097a5
commit e5c1dfc4b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 160 additions and 64 deletions

View file

@ -4,6 +4,7 @@ package mage.abilities.common;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.effects.Effect;
import mage.constants.Zone;
@ -11,8 +12,8 @@ import mage.game.Game;
import mage.game.events.DamagedPlayerEvent;
import mage.game.events.GameEvent;
import mage.game.events.GameEvent.EventType;
import mage.game.events.ZoneChangeEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
/**
*
@ -20,22 +21,25 @@ import mage.game.permanent.Permanent;
*/
public class ControlledCreaturesDealCombatDamagePlayerTriggeredAbility extends TriggeredAbilityImpl {
private boolean madeDamage = false;
private Set<UUID> damagedPlayerIds = new HashSet<>();
private boolean setTargetPointer;
public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Effect effect) {
this(Zone.BATTLEFIELD, effect);
}
public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone zone, Effect effect) {
this(zone, effect, false);
}
public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(Zone zone, Effect effect, boolean setTargetPointer) {
super(zone, effect, false);
this.setTargetPointer = setTargetPointer;
}
public ControlledCreaturesDealCombatDamagePlayerTriggeredAbility(final ControlledCreaturesDealCombatDamagePlayerTriggeredAbility ability) {
super(ability);
this.madeDamage = ability.madeDamage;
this.damagedPlayerIds = new HashSet<>();
this.damagedPlayerIds.addAll(ability.damagedPlayerIds);
}
@Override
@ -55,28 +59,19 @@ public class ControlledCreaturesDealCombatDamagePlayerTriggeredAbility extends T
if (event.getType() == EventType.DAMAGED_PLAYER) {
DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event;
Permanent p = game.getPermanent(event.getSourceId());
if (damageEvent.isCombatDamage() && p != null && p.isControlledBy(this.getControllerId())) {
madeDamage = true;
if (damageEvent.isCombatDamage() && p != null && p.isControlledBy(this.getControllerId()) && !damagedPlayerIds.contains(event.getPlayerId())) {
damagedPlayerIds.add(event.getPlayerId());
}
}
if (event.getType() == EventType.COMBAT_DAMAGE_STEP_PRIORITY) {
if (madeDamage) {
Set<UUID> damagedPlayersCopy = new HashSet<>();
damagedPlayersCopy.addAll(damagedPlayerIds);
for (Effect effect : this.getEffects()) {
effect.setValue("damagedPlayers", damagedPlayersCopy);
if (setTargetPointer) {
for (Effect effect : this.getEffects()) {
effect.setTargetPointer(new FixedTarget(event.getPlayerId()));
}
}
damagedPlayerIds.clear();
madeDamage = false;
return true;
}
}
if (event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(getSourceId())) {
ZoneChangeEvent zEvent = (ZoneChangeEvent) event;
if (zEvent.getFromZone() == Zone.GRAVEYARD) {
damagedPlayerIds.clear();
}
if (event.getType() == EventType.COMBAT_DAMAGE_STEP_PRIORITY ||
(event.getType() == EventType.ZONE_CHANGE && event.getTargetId().equals(getSourceId()))) {
damagedPlayerIds.clear();
}
return false;
}