diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index c96c6c7757..a9a66f0ccf 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -119,8 +119,9 @@ namespace OpenRA.Mods.Common.Traits return; Aggressor = attacker; - var allowMove = Info.AllowMovement && Stance != UnitStance.Defend; - if (attackFollows.All(a => a.IsTraitDisabled || !a.IsReachableTarget(a.Target, allowMove))) + + bool allowMove; + if (ShouldAttack(out allowMove)) Attack(self, Aggressor, allowMove); } @@ -132,11 +133,23 @@ namespace OpenRA.Mods.Common.Traits if (Stance < UnitStance.Defend || !Info.TargetWhenIdle) return; - var allowMove = Info.AllowMovement && Stance != UnitStance.Defend; - if (attackFollows.All(a => a.IsTraitDisabled || !a.IsReachableTarget(a.Target, allowMove))) + bool allowMove; + if (ShouldAttack(out allowMove)) ScanAndAttack(self, allowMove); } + bool ShouldAttack(out bool allowMove) + { + allowMove = Info.AllowMovement && Stance != UnitStance.Defend; + + // PERF: Avoid LINQ. + foreach (var attackFollow in attackFollows) + if (!attackFollow.IsTraitDisabled && attackFollow.IsReachableTarget(attackFollow.Target, allowMove)) + return false; + + return true; + } + public void Tick(Actor self) { if (IsTraitDisabled)