Drop targets when switching to a more restrictive stance.
This commit is contained in:
@@ -17,22 +17,26 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
public class FlyAttack : Activity
|
||||
public class FlyAttack : Activity, IActivityNotifyStanceChanged
|
||||
{
|
||||
readonly Aircraft aircraft;
|
||||
readonly AttackAircraft attackAircraft;
|
||||
readonly Rearmable rearmable;
|
||||
readonly bool forceAttack;
|
||||
readonly int ticksUntilTurn;
|
||||
|
||||
Target target;
|
||||
Target lastVisibleTarget;
|
||||
WDist lastVisibleMaximumRange;
|
||||
BitSet<TargetableType> lastVisibleTargetTypes;
|
||||
Player lastVisibleOwner;
|
||||
bool useLastVisibleTarget;
|
||||
bool hasTicked;
|
||||
|
||||
public FlyAttack(Actor self, Target target)
|
||||
public FlyAttack(Actor self, Target target, bool forceAttack)
|
||||
{
|
||||
this.target = target;
|
||||
this.forceAttack = forceAttack;
|
||||
aircraft = self.Trait<Aircraft>();
|
||||
attackAircraft = self.Trait<AttackAircraft>();
|
||||
rearmable = self.TraitOrDefault<Rearmable>();
|
||||
@@ -45,6 +49,17 @@ namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
lastVisibleTarget = Target.FromPos(target.CenterPosition);
|
||||
lastVisibleMaximumRange = attackAircraft.GetMaximumRangeVersusTarget(target);
|
||||
|
||||
if (target.Type == TargetType.Actor)
|
||||
{
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
else if (target.Type == TargetType.FrozenActor)
|
||||
{
|
||||
lastVisibleOwner = target.FrozenActor.Owner;
|
||||
lastVisibleTargetTypes = target.FrozenActor.TargetTypes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,6 +107,8 @@ namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
lastVisibleTarget = Target.FromTargetPositions(target);
|
||||
lastVisibleMaximumRange = attackAircraft.GetMaximumRangeVersusTarget(target);
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
|
||||
var oldUseLastVisibleTarget = useLastVisibleTarget;
|
||||
@@ -144,5 +161,15 @@ namespace OpenRA.Mods.Common.Activities
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
void IActivityNotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance)
|
||||
{
|
||||
// Cancel non-forced targets when switching to a more restrictive stance if they are no longer valid for auto-targeting
|
||||
if (newStance > oldStance || forceAttack)
|
||||
return;
|
||||
|
||||
if (!autoTarget.HasValidTargetPriority(self, lastVisibleOwner, lastVisibleTargetTypes))
|
||||
attackAircraft.RequestedTarget = Target.Invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,21 +17,25 @@ using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
public class HeliAttack : Activity
|
||||
public class HeliAttack : Activity, IActivityNotifyStanceChanged
|
||||
{
|
||||
readonly Aircraft aircraft;
|
||||
readonly AttackAircraft attackAircraft;
|
||||
readonly Rearmable rearmable;
|
||||
readonly bool forceAttack;
|
||||
|
||||
Target target;
|
||||
Target lastVisibleTarget;
|
||||
WDist lastVisibleMaximumRange;
|
||||
BitSet<TargetableType> lastVisibleTargetTypes;
|
||||
Player lastVisibleOwner;
|
||||
bool useLastVisibleTarget;
|
||||
bool hasTicked;
|
||||
|
||||
public HeliAttack(Actor self, Target target)
|
||||
public HeliAttack(Actor self, Target target, bool forceAttack)
|
||||
{
|
||||
this.target = target;
|
||||
this.forceAttack = forceAttack;
|
||||
aircraft = self.Trait<Aircraft>();
|
||||
attackAircraft = self.Trait<AttackAircraft>();
|
||||
rearmable = self.TraitOrDefault<Rearmable>();
|
||||
@@ -43,6 +47,17 @@ namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
lastVisibleTarget = Target.FromPos(target.CenterPosition);
|
||||
lastVisibleMaximumRange = attackAircraft.GetMaximumRangeVersusTarget(target);
|
||||
|
||||
if (target.Type == TargetType.Actor)
|
||||
{
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
else if (target.Type == TargetType.FrozenActor)
|
||||
{
|
||||
lastVisibleOwner = target.FrozenActor.Owner;
|
||||
lastVisibleTargetTypes = target.FrozenActor.TargetTypes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,6 +105,8 @@ namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
lastVisibleTarget = Target.FromTargetPositions(target);
|
||||
lastVisibleMaximumRange = attackAircraft.GetMaximumRangeVersusTarget(target);
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
|
||||
var oldUseLastVisibleTarget = useLastVisibleTarget;
|
||||
@@ -156,5 +173,15 @@ namespace OpenRA.Mods.Common.Activities
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
void IActivityNotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance)
|
||||
{
|
||||
// Cancel non-forced targets when switching to a more restrictive stance if they are no longer valid for auto-targeting
|
||||
if (newStance > oldStance || forceAttack)
|
||||
return;
|
||||
|
||||
if (!autoTarget.HasValidTargetPriority(self, lastVisibleOwner, lastVisibleTargetTypes))
|
||||
attackAircraft.RequestedTarget = Target.Invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ using OpenRA.Traits;
|
||||
namespace OpenRA.Mods.Common.Activities
|
||||
{
|
||||
/* non-turreted attack */
|
||||
public class Attack : Activity
|
||||
public class Attack : Activity, IActivityNotifyStanceChanged
|
||||
{
|
||||
[Flags]
|
||||
protected enum AttackStatus { UnableToAttack, NeedsToTurn, NeedsToMove, Attacking }
|
||||
@@ -35,6 +35,8 @@ namespace OpenRA.Mods.Common.Activities
|
||||
protected Target target;
|
||||
Target lastVisibleTarget;
|
||||
WDist lastVisibleMaximumRange;
|
||||
BitSet<TargetableType> lastVisibleTargetTypes;
|
||||
Player lastVisibleOwner;
|
||||
bool useLastVisibleTarget;
|
||||
bool wasMovingWithinRange;
|
||||
|
||||
@@ -62,6 +64,17 @@ namespace OpenRA.Mods.Common.Activities
|
||||
lastVisibleTarget = Target.FromPos(target.CenterPosition);
|
||||
lastVisibleMaximumRange = attackTraits.Where(x => !x.IsTraitDisabled)
|
||||
.Min(x => x.GetMaximumRangeVersusTarget(target));
|
||||
|
||||
if (target.Type == TargetType.Actor)
|
||||
{
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
else if (target.Type == TargetType.FrozenActor)
|
||||
{
|
||||
lastVisibleOwner = target.FrozenActor.Owner;
|
||||
lastVisibleTargetTypes = target.FrozenActor.TargetTypes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,6 +101,9 @@ namespace OpenRA.Mods.Common.Activities
|
||||
lastVisibleTarget = Target.FromTargetPositions(target);
|
||||
lastVisibleMaximumRange = attackTraits.Where(x => !x.IsTraitDisabled)
|
||||
.Min(x => x.GetMaximumRangeVersusTarget(target));
|
||||
|
||||
lastVisibleOwner = target.Actor.Owner;
|
||||
lastVisibleTargetTypes = target.Actor.GetEnabledTargetTypes();
|
||||
}
|
||||
|
||||
var oldUseLastVisibleTarget = useLastVisibleTarget;
|
||||
@@ -211,5 +227,15 @@ namespace OpenRA.Mods.Common.Activities
|
||||
foreach (var a in armaments)
|
||||
a.CheckFire(self, facing, target);
|
||||
}
|
||||
|
||||
void IActivityNotifyStanceChanged.StanceChanged(Actor self, AutoTarget autoTarget, UnitStance oldStance, UnitStance newStance)
|
||||
{
|
||||
// Cancel non-forced targets when switching to a more restrictive stance if they are no longer valid for auto-targeting
|
||||
if (newStance > oldStance || forceAttack)
|
||||
return;
|
||||
|
||||
if (!autoTarget.HasValidTargetPriority(self, lastVisibleOwner, lastVisibleTargetTypes))
|
||||
target = Target.Invalid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user