diff --git a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs index 02ed77caea..386814d65b 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs @@ -43,6 +43,7 @@ namespace OpenRA.Mods.Common.Activities this.target = target; this.forceAttack = forceAttack; this.targetLineColor = targetLineColor; + ChildHasPriority = false; aircraft = self.Trait(); attackAircraft = self.Trait(); @@ -73,6 +74,12 @@ namespace OpenRA.Mods.Common.Activities public override bool Tick(Actor self) { + if (!IsCanceling && !HasArmamentsFor(target)) + Cancel(self, true); + + if (!TickChild(self)) + return false; + returnToBase = false; // Refuse to take off if it would land immediately again. @@ -198,6 +205,11 @@ namespace OpenRA.Mods.Common.Activities yield return new TargetLineNode(useLastVisibleTarget ? lastVisibleTarget : target, targetLineColor.Value); } } + + bool HasArmamentsFor(Target target) + { + return !attackAircraft.IsTraitDisabled && attackAircraft.ChooseArmamentsForTarget(target, forceAttack).Any(); + } } sealed class FlyAttackRun : Activity diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index e8cb2cf743..efc81cb0aa 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -51,6 +51,7 @@ namespace OpenRA.Mods.Common.Activities this.target = target; this.targetLineColor = targetLineColor; this.forceAttack = forceAttack; + ChildHasPriority = false; attackTraits = self.TraitsImplementing().ToArray().Where(t => !t.IsTraitDisabled); revealsShroud = self.TraitsImplementing().ToArray(); @@ -94,15 +95,15 @@ namespace OpenRA.Mods.Common.Activities public override bool Tick(Actor self) { + if (!IsCanceling && !HasArmamentsFor(target)) + Cancel(self, true); + + if (!TickChild(self)) + return false; + if (IsCanceling) return true; - if (!attackTraits.Any()) - { - Cancel(self); - return false; - } - target = RecalculateTarget(self, out var targetIsHiddenActor); if (!targetIsHiddenActor && target.Type == TargetType.Actor) @@ -273,5 +274,10 @@ namespace OpenRA.Mods.Common.Activities if (targetLineColor != null) yield return new TargetLineNode(useLastVisibleTarget ? lastVisibleTarget : target, targetLineColor.Value); } + + bool HasArmamentsFor(Target target) + { + return attackTraits.Any(attack => attack.ChooseArmamentsForTarget(target, forceAttack).Any()); + } } } diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index 5aec629a3f..772833af31 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -263,6 +263,7 @@ namespace OpenRA.Mods.Common.Traits this.targetLineColor = targetLineColor; this.source = source; isAircraft = self.Info.HasTraitInfo(); + ChildHasPriority = false; // The target may become hidden between the initial order request and the first tick (e.g. if queued) // Moving to any position (even if quite stale) is still better than immediately giving up @@ -288,6 +289,12 @@ namespace OpenRA.Mods.Common.Traits public override bool Tick(Actor self) { + if (!IsCanceling && !HasArmamentsFor(target)) + Cancel(self, true); + + if (!TickChild(self)) + return false; + returnToBase = false; if (IsCanceling) @@ -440,6 +447,11 @@ namespace OpenRA.Mods.Common.Traits yield return new TargetLineNode(useLastVisibleTarget ? lastVisibleTarget : target, targetLineColor.Value); } } + + bool HasArmamentsFor(Target target) + { + return !attack.IsTraitDisabled && attack.ChooseArmamentsForTarget(target, forceAttack).Any(); + } } } }