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