Allow turreted actors to acquire targets while doing other activities.

This commit is contained in:
Paul Chote
2019-01-25 23:49:03 +00:00
committed by Oliver Brakmann
parent 012b17b974
commit c26e77552e

View File

@@ -20,6 +20,9 @@ namespace OpenRA.Mods.Common.Traits
[Desc("Actor will follow units until in range to attack them.")] [Desc("Actor will follow units until in range to attack them.")]
public class AttackFollowInfo : AttackBaseInfo public class AttackFollowInfo : AttackBaseInfo
{ {
[Desc("Automatically acquire and fire on targets of opportunity when not actively attacking.")]
public readonly bool OpportunityFire = true;
public override object Create(ActorInitializer init) { return new AttackFollow(init.Self, this); } public override object Create(ActorInitializer init) { return new AttackFollow(init.Self, this); }
} }
@@ -31,6 +34,7 @@ namespace OpenRA.Mods.Common.Traits
protected Target opportunityTarget; protected Target opportunityTarget;
protected bool opportunityForceAttack; protected bool opportunityForceAttack;
Mobile mobile; Mobile mobile;
AutoTarget autoTarget;
public AttackFollow(Actor self, AttackFollowInfo info) public AttackFollow(Actor self, AttackFollowInfo info)
: base(self, info) { } : base(self, info) { }
@@ -38,6 +42,7 @@ namespace OpenRA.Mods.Common.Traits
protected override void Created(Actor self) protected override void Created(Actor self)
{ {
mobile = self.TraitOrDefault<Mobile>(); mobile = self.TraitOrDefault<Mobile>();
autoTarget = self.TraitOrDefault<AutoTarget>();
base.Created(self); base.Created(self);
} }
@@ -81,14 +86,26 @@ namespace OpenRA.Mods.Common.Traits
if (IsAiming) if (IsAiming)
DoAttack(self, requestedTarget); DoAttack(self, requestedTarget);
} }
else if (opportunityTarget.Type != TargetType.Invalid) else
{ {
IsAiming = CanAimAtTarget(self, opportunityTarget, opportunityForceAttack); IsAiming = false;
if (opportunityTarget.Type != TargetType.Invalid)
IsAiming = CanAimAtTarget(self, opportunityTarget, opportunityForceAttack);
if (!IsAiming && ((AttackFollowInfo)Info).OpportunityFire && autoTarget != null &&
!autoTarget.IsTraitDisabled && autoTarget.Stance >= UnitStance.Defend)
{
opportunityTarget = autoTarget.ScanForTarget(self, false);
opportunityForceAttack = false;
if (opportunityTarget.Type != TargetType.Invalid)
IsAiming = CanAimAtTarget(self, opportunityTarget, opportunityForceAttack);
}
if (IsAiming) if (IsAiming)
DoAttack(self, opportunityTarget); DoAttack(self, opportunityTarget);
} }
else
IsAiming = false;
base.Tick(self); base.Tick(self);
} }