return;
}
+ if (Destination is { IsFlying: true } && _condition[ConditionFlag.Swimming])
+ {
+ _logger.LogInformation("Flying but swimming, restarting as non-flying path...");
+ var dest = Destination;
+ Stop();
+
+ if (dest.UseNavmesh)
+ NavigateTo(EMovementType.None, dest.DataId, dest.Position, false, false, dest.StopDistance);
+ else
+ NavigateTo(EMovementType.None, dest.DataId, [dest.Position], false, false, dest.StopDistance);
+ return;
+ }
+
Vector3 localPlayerPosition = _clientState.LocalPlayer?.Position ?? Vector3.Zero;
if ((localPlayerPosition - Destination.Position).Length() < Destination.StopDistance)
{
}
private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint,
- float? stopDistance)
+ float? stopDistance, bool useNavmesh)
{
ResetPathfinding();
_gameFunctions.ExecuteCommand("/automove off");
}
- Destination = new DestinationData(dataId, to, stopDistance ?? (DefaultStopDistance - 0.2f), fly, sprint);
+ Destination = new DestinationData(dataId, to, stopDistance ?? (DefaultStopDistance - 0.2f), fly, sprint,
+ useNavmesh);
MovementStartedAt = DateTime.MaxValue;
}
float? stopDistance = null)
{
fly |= _condition[ConditionFlag.Diving];
- PrepareNavigation(type, dataId, to, fly, sprint, stopDistance);
+ PrepareNavigation(type, dataId, to, fly, sprint, stopDistance, true);
_logger.LogInformation("Pathfinding to {Destination}", Destination);
_cancellationTokenSource = new();
float? stopDistance)
{
fly |= _condition[ConditionFlag.Diving];
- PrepareNavigation(type, dataId, to.Last(), fly, sprint, stopDistance);
+ PrepareNavigation(type, dataId, to.Last(), fly, sprint, stopDistance, false);
_logger.LogInformation("Moving to {Destination}", Destination);
_navmeshIpc.MoveTo(to, fly);
Vector3 Position,
float StopDistance,
bool IsFlying,
- bool CanSprint);
+ bool CanSprint,
+ bool UseNavmesh);
public sealed class PathfindingFailedException : Exception
{