Fix AttackFollow ignoring allowMove flag when auto-targeting.
This commit is contained in:
@@ -42,6 +42,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
Activity requestedTargetPresetForActivity;
|
Activity requestedTargetPresetForActivity;
|
||||||
bool opportunityForceAttack;
|
bool opportunityForceAttack;
|
||||||
bool opportunityTargetIsPersistentTarget;
|
bool opportunityTargetIsPersistentTarget;
|
||||||
|
bool scanningForOpportunityTarget;
|
||||||
|
|
||||||
public void SetRequestedTarget(Actor self, Target target, bool isForceAttack = false)
|
public void SetRequestedTarget(Actor self, Target target, bool isForceAttack = false)
|
||||||
{
|
{
|
||||||
@@ -137,7 +138,10 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (!IsAiming && Info.OpportunityFire && autoTarget != null &&
|
if (!IsAiming && Info.OpportunityFire && autoTarget != null &&
|
||||||
!autoTarget.IsTraitDisabled && autoTarget.Stance >= UnitStance.Defend)
|
!autoTarget.IsTraitDisabled && autoTarget.Stance >= UnitStance.Defend)
|
||||||
{
|
{
|
||||||
|
scanningForOpportunityTarget = true;
|
||||||
OpportunityTarget = autoTarget.ScanForTarget(self, false, false);
|
OpportunityTarget = autoTarget.ScanForTarget(self, false, false);
|
||||||
|
scanningForOpportunityTarget = false;
|
||||||
|
|
||||||
opportunityForceAttack = false;
|
opportunityForceAttack = false;
|
||||||
opportunityTargetIsPersistentTarget = false;
|
opportunityTargetIsPersistentTarget = false;
|
||||||
|
|
||||||
@@ -182,8 +186,13 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
opportunityTargetIsPersistentTarget = false;
|
opportunityTargetIsPersistentTarget = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IDisableAutoTarget.DisableAutoTarget(Actor self)
|
bool IDisableAutoTarget.DisableAutoTarget(Actor self, bool allowMove)
|
||||||
{
|
{
|
||||||
|
// HACK: Disable standard AutoTarget scanning, which we want to be
|
||||||
|
// controlled by the opportunity target logic in this trait
|
||||||
|
if (!allowMove && !scanningForOpportunityTarget)
|
||||||
|
return true;
|
||||||
|
|
||||||
return RequestedTarget.Type != TargetType.Invalid ||
|
return RequestedTarget.Type != TargetType.Invalid ||
|
||||||
(opportunityTargetIsPersistentTarget && OpportunityTarget.Type != TargetType.Invalid);
|
(opportunityTargetIsPersistentTarget && OpportunityTarget.Type != TargetType.Invalid);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,8 +236,9 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (attacker.Disposed)
|
if (attacker.Disposed)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
var allowMove = allowMovement && Stance > UnitStance.Defend;
|
||||||
foreach (var dat in disableAutoTarget)
|
foreach (var dat in disableAutoTarget)
|
||||||
if (dat.DisableAutoTarget(self))
|
if (dat.DisableAutoTarget(self, allowMove))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!attacker.IsInWorld)
|
if (!attacker.IsInWorld)
|
||||||
@@ -249,7 +250,6 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Don't fire at an invisible enemy when we can't move to reveal it
|
// Don't fire at an invisible enemy when we can't move to reveal it
|
||||||
var allowMove = allowMovement && Stance > UnitStance.Defend;
|
|
||||||
if (!allowMove && !attacker.CanBeViewedByPlayer(self.Owner))
|
if (!allowMove && !attacker.CanBeViewedByPlayer(self.Owner))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -293,7 +293,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
nextScanTime = self.World.SharedRandom.Next(Info.MinimumScanTimeInterval, Info.MaximumScanTimeInterval);
|
nextScanTime = self.World.SharedRandom.Next(Info.MinimumScanTimeInterval, Info.MaximumScanTimeInterval);
|
||||||
|
|
||||||
foreach (var dat in disableAutoTarget)
|
foreach (var dat in disableAutoTarget)
|
||||||
if (dat.DisableAutoTarget(self))
|
if (dat.DisableAutoTarget(self, allowMove))
|
||||||
return Target.Invalid;
|
return Target.Invalid;
|
||||||
|
|
||||||
foreach (var ab in ActiveAttackBases)
|
foreach (var ab in ActiveAttackBases)
|
||||||
|
|||||||
@@ -310,7 +310,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
[RequireExplicitImplementation]
|
[RequireExplicitImplementation]
|
||||||
public interface IDisableAutoTarget
|
public interface IDisableAutoTarget
|
||||||
{
|
{
|
||||||
bool DisableAutoTarget(Actor self);
|
bool DisableAutoTarget(Actor self, bool allowMove);
|
||||||
}
|
}
|
||||||
|
|
||||||
[RequireExplicitImplementation]
|
[RequireExplicitImplementation]
|
||||||
|
|||||||
Reference in New Issue
Block a user