Cancel the attack when no traits are active.

This commit is contained in:
Matthias Mailänder
2020-03-08 12:09:39 +01:00
committed by abcdefg30
parent a3f79503ed
commit 3bce55ac44

View File

@@ -25,7 +25,7 @@ namespace OpenRA.Mods.Common.Activities
[Flags] [Flags]
protected enum AttackStatus { UnableToAttack, NeedsToTurn, NeedsToMove, Attacking } protected enum AttackStatus { UnableToAttack, NeedsToTurn, NeedsToMove, Attacking }
readonly AttackFrontal[] attackTraits; readonly IEnumerable<AttackFrontal> attackTraits;
readonly RevealsShroud[] revealsShroud; readonly RevealsShroud[] revealsShroud;
readonly IMove move; readonly IMove move;
readonly IFacing facing; readonly IFacing facing;
@@ -51,7 +51,7 @@ namespace OpenRA.Mods.Common.Activities
this.targetLineColor = targetLineColor; this.targetLineColor = targetLineColor;
this.forceAttack = forceAttack; this.forceAttack = forceAttack;
attackTraits = self.TraitsImplementing<AttackFrontal>().ToArray(); attackTraits = self.TraitsImplementing<AttackFrontal>().ToArray().Where(Exts.IsTraitEnabled);
revealsShroud = self.TraitsImplementing<RevealsShroud>().ToArray(); revealsShroud = self.TraitsImplementing<RevealsShroud>().ToArray();
facing = self.Trait<IFacing>(); facing = self.Trait<IFacing>();
positionable = self.Trait<IPositionable>(); positionable = self.Trait<IPositionable>();
@@ -90,13 +90,19 @@ namespace OpenRA.Mods.Common.Activities
if (IsCanceling) if (IsCanceling)
return true; return true;
if (!attackTraits.Any())
{
Cancel(self);
return false;
}
bool targetIsHiddenActor; bool targetIsHiddenActor;
target = RecalculateTarget(self, out targetIsHiddenActor); target = RecalculateTarget(self, out targetIsHiddenActor);
if (!targetIsHiddenActor && target.Type == TargetType.Actor) if (!targetIsHiddenActor && target.Type == TargetType.Actor)
{ {
lastVisibleTarget = Target.FromTargetPositions(target); lastVisibleTarget = Target.FromTargetPositions(target);
lastVisibleMaximumRange = attackTraits.Where(x => !x.IsTraitDisabled) lastVisibleMaximumRange = attackTraits.Min(x => x.GetMaximumRangeVersusTarget(target));
.Min(x => x.GetMaximumRangeVersusTarget(target));
lastVisibleOwner = target.Actor.Owner; lastVisibleOwner = target.Actor.Owner;
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes(); lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
@@ -132,7 +138,7 @@ namespace OpenRA.Mods.Common.Activities
attackStatus = AttackStatus.UnableToAttack; attackStatus = AttackStatus.UnableToAttack;
foreach (var attack in attackTraits.Where(x => !x.IsTraitDisabled)) foreach (var attack in attackTraits)
{ {
var status = TickAttack(self, attack); var status = TickAttack(self, attack);
attack.IsAiming = status == AttackStatus.Attacking || status == AttackStatus.NeedsToTurn; attack.IsAiming = status == AttackStatus.Attacking || status == AttackStatus.NeedsToTurn;