diff --git a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs index 45f963fa5c..59432b8f74 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs @@ -68,6 +68,7 @@ namespace OpenRA.Mods.Common.Activities { attackAircraft.OpportunityTarget = attackAircraft.RequestedTarget; attackAircraft.OpportunityForceAttack = attackAircraft.RequestedForceAttack; + attackAircraft.OpportunityTargetIsPersistentTarget = true; } attackAircraft.RequestedTarget = Target.Invalid; diff --git a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs index 143f2ae67e..c4f941f967 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs @@ -66,6 +66,7 @@ namespace OpenRA.Mods.Common.Activities { attackAircraft.OpportunityTarget = attackAircraft.RequestedTarget; attackAircraft.OpportunityForceAttack = attackAircraft.RequestedForceAttack; + attackAircraft.OpportunityTargetIsPersistentTarget = true; } attackAircraft.RequestedTarget = Target.Invalid; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index bc029af459..3604ad2b79 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -29,7 +29,7 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new AttackFollow(init.Self, this); } } - public class AttackFollow : AttackBase, INotifyOwnerChanged + public class AttackFollow : AttackBase, INotifyOwnerChanged, IDisableAutoTarget { public new readonly AttackFollowInfo Info; public Target RequestedTarget; @@ -37,6 +37,8 @@ namespace OpenRA.Mods.Common.Traits public int RequestedTargetLastTick; public Target OpportunityTarget; public bool OpportunityForceAttack; + public bool OpportunityTargetIsPersistentTarget; + Mobile mobile; AutoTarget autoTarget; @@ -74,7 +76,10 @@ namespace OpenRA.Mods.Common.Traits protected override void Tick(Actor self) { if (IsTraitDisabled) + { RequestedTarget = OpportunityTarget = Target.Invalid; + OpportunityTargetIsPersistentTarget = false; + } if (RequestedTargetLastTick != self.World.WorldTick) { @@ -106,6 +111,7 @@ namespace OpenRA.Mods.Common.Traits { OpportunityTarget = autoTarget.ScanForTarget(self, false, false); OpportunityForceAttack = false; + OpportunityTargetIsPersistentTarget = false; if (OpportunityTarget.Type != TargetType.Invalid) IsAiming = CanAimAtTarget(self, OpportunityTarget, OpportunityForceAttack); @@ -139,12 +145,20 @@ namespace OpenRA.Mods.Common.Traits public override void OnStopOrder(Actor self) { RequestedTarget = OpportunityTarget = Target.Invalid; + OpportunityTargetIsPersistentTarget = false; base.OnStopOrder(self); } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) { RequestedTarget = OpportunityTarget = Target.Invalid; + OpportunityTargetIsPersistentTarget = false; + } + + bool IDisableAutoTarget.DisableAutoTarget(Actor self) + { + return RequestedTarget.Type != TargetType.Invalid || + (OpportunityTargetIsPersistentTarget && OpportunityTarget.Type != TargetType.Invalid); } class AttackActivity : Activity @@ -198,6 +212,7 @@ namespace OpenRA.Mods.Common.Traits { attack.OpportunityTarget = attack.RequestedTarget; attack.OpportunityForceAttack = attack.RequestedForceAttack; + attack.OpportunityTargetIsPersistentTarget = true; } attack.RequestedTarget = Target.Invalid;