Make the Enter activity use the closest target position.
This commit is contained in:
committed by
Oliver Brakmann
parent
995a3da43a
commit
4b4172f757
@@ -126,6 +126,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
ReserveStatus TryReserveElseTryAlternateReserve(Actor self)
|
ReserveStatus TryReserveElseTryAlternateReserve(Actor self)
|
||||||
{
|
{
|
||||||
for (var tries = 0;;)
|
for (var tries = 0;;)
|
||||||
|
{
|
||||||
switch (Reserve(self))
|
switch (Reserve(self))
|
||||||
{
|
{
|
||||||
case ReserveStatus.None:
|
case ReserveStatus.None:
|
||||||
@@ -145,7 +146,10 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
Target t = target;
|
Target t = target;
|
||||||
if (!TryGetAlternateTarget(self, tries, ref t))
|
if (!TryGetAlternateTarget(self, tries, ref t))
|
||||||
return ReserveStatus.TooFar;
|
return ReserveStatus.TooFar;
|
||||||
if ((target.CenterPosition - self.CenterPosition).HorizontalLengthSquared <= (t.CenterPosition - self.CenterPosition).HorizontalLengthSquared)
|
|
||||||
|
var targetPosition = target.Positions.PositionClosestTo(self.CenterPosition);
|
||||||
|
var alternatePosition = t.Positions.PositionClosestTo(self.CenterPosition);
|
||||||
|
if ((targetPosition - self.CenterPosition).HorizontalLengthSquared <= (alternatePosition - self.CenterPosition).HorizontalLengthSquared)
|
||||||
return ReserveStatus.TooFar;
|
return ReserveStatus.TooFar;
|
||||||
target = t;
|
target = t;
|
||||||
continue;
|
continue;
|
||||||
@@ -154,6 +158,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
case ReserveStatus.Ready:
|
case ReserveStatus.Ready:
|
||||||
return ReserveStatus.Ready;
|
return ReserveStatus.Ready;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EnterState FindAndTransitionToNextState(Actor self)
|
EnterState FindAndTransitionToNextState(Actor self)
|
||||||
@@ -169,8 +174,12 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
case ReserveStatus.None:
|
case ReserveStatus.None:
|
||||||
return EnterState.Done; // No available target -> abort to next activity
|
return EnterState.Done; // No available target -> abort to next activity
|
||||||
case ReserveStatus.TooFar:
|
case ReserveStatus.TooFar:
|
||||||
inner = move.MoveToTarget(self, repathWhileMoving ? target : Target.FromPos(target.CenterPosition)); // Approach
|
{
|
||||||
|
var moveTarget = repathWhileMoving ? target : Target.FromPos(target.Positions.PositionClosestTo(self.CenterPosition));
|
||||||
|
inner = move.MoveToTarget(self, moveTarget); // Approach
|
||||||
return EnterState.ApproachingOrEntering;
|
return EnterState.ApproachingOrEntering;
|
||||||
|
}
|
||||||
|
|
||||||
case ReserveStatus.Pending:
|
case ReserveStatus.Pending:
|
||||||
return EnterState.ApproachingOrEntering; // Retry next tick
|
return EnterState.ApproachingOrEntering; // Retry next tick
|
||||||
case ReserveStatus.Ready:
|
case ReserveStatus.Ready:
|
||||||
@@ -198,7 +207,7 @@ namespace OpenRA.Mods.Common.Activities
|
|||||||
nextState = EnterState.Inside;
|
nextState = EnterState.Inside;
|
||||||
|
|
||||||
// Otherwise, try to recover from moving target
|
// Otherwise, try to recover from moving target
|
||||||
else if (target.CenterPosition != self.CenterPosition)
|
else if (target.Positions.PositionClosestTo(self.CenterPosition) != self.CenterPosition)
|
||||||
{
|
{
|
||||||
nextState = EnterState.ApproachingOrEntering;
|
nextState = EnterState.ApproachingOrEntering;
|
||||||
Unreserve(self, false);
|
Unreserve(self, false);
|
||||||
|
|||||||
@@ -959,7 +959,7 @@ namespace OpenRA.Mods.Common.Traits
|
|||||||
if (target.Type == TargetType.Invalid)
|
if (target.Type == TargetType.Invalid)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
return VisualMove(self, self.CenterPosition, target.CenterPosition);
|
return VisualMove(self, self.CenterPosition, target.Positions.PositionClosestTo(self.CenterPosition));
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CanEnterTargetNow(Actor self, Target target)
|
public bool CanEnterTargetNow(Actor self, Target target)
|
||||||
|
|||||||
Reference in New Issue
Block a user