From c3d75b0f57c8b085e65de5727bdef42fe0a7d3bb Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Fri, 17 May 2019 19:50:53 +0000 Subject: [PATCH] Disable AutoTarget damage response if targeting a persistent fallback. --- OpenRA.Mods.Common/Activities/Air/FlyAttack.cs | 1 + OpenRA.Mods.Common/Activities/Air/HeliAttack.cs | 1 + .../Traits/Attack/AttackFollow.cs | 17 ++++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs index 45f963fa5c69..59432b8f7408 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs @@ -68,6 +68,7 @@ public override Activity Tick(Actor self) { 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 143f2ae67ec5..c4f941f967b3 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs @@ -66,6 +66,7 @@ public override Activity Tick(Actor self) { 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 bc029af45994..3604ad2b7910 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -29,7 +29,7 @@ public class AttackFollowInfo : AttackBaseInfo 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 @@ public class AttackFollow : AttackBase, INotifyOwnerChanged public int RequestedTargetLastTick; public Target OpportunityTarget; public bool OpportunityForceAttack; + public bool OpportunityTargetIsPersistentTarget; + Mobile mobile; AutoTarget autoTarget; @@ -74,7 +76,10 @@ protected bool CanAimAtTarget(Actor self, Target target, bool forceAttack) protected override void Tick(Actor self) { if (IsTraitDisabled) + { RequestedTarget = OpportunityTarget = Target.Invalid; + OpportunityTargetIsPersistentTarget = false; + } if (RequestedTargetLastTick != self.World.WorldTick) { @@ -106,6 +111,7 @@ protected override void Tick(Actor self) { OpportunityTarget = autoTarget.ScanForTarget(self, false, false); OpportunityForceAttack = false; + OpportunityTargetIsPersistentTarget = false; if (OpportunityTarget.Type != TargetType.Invalid) IsAiming = CanAimAtTarget(self, OpportunityTarget, OpportunityForceAttack); @@ -139,12 +145,20 @@ public override void OnQueueAttackActivity(Actor self, Target target, bool queue 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 @@ public override Activity Tick(Actor self) { attack.OpportunityTarget = attack.RequestedTarget; attack.OpportunityForceAttack = attack.RequestedForceAttack; + attack.OpportunityTargetIsPersistentTarget = true; } attack.RequestedTarget = Target.Invalid;