From 6089599b3f1f362a3fc23bb81cf231c32c65e108 Mon Sep 17 00:00:00 2001 From: reaperrr Date: Sat, 14 May 2016 12:43:49 +0200 Subject: [PATCH] Make AutoTarget handling of AttackFollow more robust At least in theory, it's possible for an actor to have multiple AttackFollow traits, or AttackFollow is disabled initially but enabled via upgrade later. To avoid crashes or other issues, let's play it safe and take the same approach as with AttackBase look-ups. --- OpenRA.Mods.Common/Traits/AutoTarget.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/AutoTarget.cs b/OpenRA.Mods.Common/Traits/AutoTarget.cs index 7954f23daf..1ec70432ed 100644 --- a/OpenRA.Mods.Common/Traits/AutoTarget.cs +++ b/OpenRA.Mods.Common/Traits/AutoTarget.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Traits public class AutoTarget : UpgradableTrait, INotifyIdle, INotifyDamage, ITick, IResolveOrder, ISync { readonly AttackBase[] attackBases; - readonly AttackFollow attackFollow; + readonly AttackFollow[] attackFollows; [Sync] int nextScanTime = 0; public UnitStance Stance; @@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Traits Stance = self.Owner.IsBot || !self.Owner.Playable ? info.InitialStanceAI : info.InitialStance; PredictedStance = Stance; - attackFollow = self.TraitsImplementing().FirstOrDefault(Exts.IsTraitEnabled); + attackFollows = self.TraitsImplementing().ToArray(); } public void ResolveOrder(Actor self, Order order) @@ -118,7 +118,7 @@ namespace OpenRA.Mods.Common.Traits Aggressor = attacker; var allowMove = Info.AllowMovement && Stance != UnitStance.Defend; - if (attackFollow == null || !attackFollow.IsReachableTarget(attackFollow.Target, allowMove)) + if (attackFollows.All(a => a.IsTraitDisabled || !a.IsReachableTarget(a.Target, allowMove))) Attack(self, Aggressor, allowMove); } @@ -131,7 +131,7 @@ namespace OpenRA.Mods.Common.Traits return; var allowMove = Info.AllowMovement && Stance != UnitStance.Defend; - if (attackFollow == null || !attackFollow.IsReachableTarget(attackFollow.Target, allowMove)) + if (attackFollows.All(a => a.IsTraitDisabled || !a.IsReachableTarget(a.Target, allowMove))) ScanAndAttack(self, allowMove); }