Merge fix

This commit is contained in:
Oleg Agafonov 2023-09-13 03:49:59 +04:00
parent 316e0dc1f3
commit ba3b0e4cb7
2 changed files with 28 additions and 46 deletions

View file

@ -5,19 +5,23 @@ import mage.abilities.effects.Effect;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.DamagedBatchForPlayersEvent;
import mage.game.events.DamagedEvent;
import mage.game.events.GameEvent;
import mage.game.permanent.Permanent;
import mage.target.targetpointer.FixedTarget;
import java.util.UUID;
/**
* A triggered ability for whenever one or more creatures deal combat damage to
* you. Has an optional component for setting the target pointer to the opponent
* whose creatures dealt combat damage to you.
*
*
* @author alexander-novo
*/
public class CombatDamageDealtToYouTriggeredAbility extends TriggeredAbilityImpl {
// Whether or not the ability should set a target targetting the opponent who
// Whether the ability should set a target targetting the opponent who
// controls the creatures who dealt damage to you
private final boolean setTarget;
@ -47,7 +51,7 @@ public class CombatDamageDealtToYouTriggeredAbility extends TriggeredAbilityImpl
* @param optional Whether or not the ability is optional
*/
public CombatDamageDealtToYouTriggeredAbility(Zone zone, Effect effect, boolean setTarget,
boolean optional) {
boolean optional) {
super(zone, effect, optional);
this.setTarget = setTarget;
@ -68,19 +72,29 @@ public class CombatDamageDealtToYouTriggeredAbility extends TriggeredAbilityImpl
@Override
public boolean checkTrigger(GameEvent event, Game game) {
DamagedBatchForPlayersEvent damageEvent = (DamagedBatchForPlayersEvent) event;
boolean check = damageEvent.getEvents()
.stream()
.anyMatch(c -> c.isCombatDamage() && c.getPlayerId() == this.controllerId);
DamagedBatchForPlayersEvent dEvent = (DamagedBatchForPlayersEvent) event;
if (check) {
if (this.setTarget) {
this.getEffects().setTargetPointer(
new FixedTarget(game.getPermanent(damageEvent.getSourceId()).getControllerId()));
boolean isDamaged = false;
UUID damageSourceControllerID = null;
for (DamagedEvent damagedEvent : dEvent.getEvents()) {
if (damagedEvent.isCombatDamage() && damagedEvent.getPlayerId() == this.controllerId) {
isDamaged = true;
// TODO: current code support only one controller
// (it's can be potentially bugged in team mode with multiple attack players)
Permanent damageSource = game.getPermanent(damagedEvent.getSourceId());
if (damageSource != null) {
damageSourceControllerID = damageSource.getControllerId();
}
}
}
if (isDamaged) {
if (this.setTarget && damageSourceControllerID != null) {
this.getEffects().setTargetPointer(new FixedTarget(damageSourceControllerID));
}
return true;
}
return false;
}

View file

@ -1,10 +1,8 @@
package mage.game.events;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @author TheElk801
@ -31,46 +29,16 @@ public abstract class DamagedBatchEvent extends GameEvent {
.sum();
}
public Set<UUID> getTargetIds() {
return events
.stream()
.map(GameEvent::getTargetId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
}
@Override
@Deprecated // events can store a diff value, so search it from events list instead
public UUID getTargetId() {
// TODO: replace it by getTargetIds or seearch in getEvents, enable exception
//throw new IllegalStateException("Wrong code usage. Must search batch value from a list");
return events
.stream()
.map(GameEvent::getTargetId)
.filter(Objects::nonNull)
.findFirst()
.orElse(null);
}
public Set<UUID> getSourceIds() {
return events
.stream()
.map(GameEvent::getSourceId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
throw new IllegalStateException("Wrong code usage. Must search value from a getEvents list.");
}
@Override
@Deprecated // events can store a diff value, so search it from events list instead
public UUID getSourceId() {
// TODO: replace it by getSourceIds or seearch in getEvents, enable exception
//throw new IllegalStateException("Wrong code usage. Must search batch value from a list");
return events
.stream()
.map(GameEvent::getSourceId)
.filter(Objects::nonNull)
.findFirst()
.orElse(null);
throw new IllegalStateException("Wrong code usage. Must search value from a getEvents list.");
}
public void addEvent(DamagedEvent event) {
@ -90,7 +58,7 @@ public abstract class DamagedBatchEvent extends GameEvent {
event = new DamagedBatchForPermanentsEvent();
event.addEvent(damagedEvent);
} else {
event = null;
throw new IllegalArgumentException("Wrong code usage. Unknown damage event for a new batch: " + damagedEvent.getClass().getName());
}
return event;
}