From 2327426ae5df6b001021b63fec72856a1cc785ad Mon Sep 17 00:00:00 2001
From: Liza Carvelli <liza@carvel.li>
Date: Tue, 11 Jun 2024 17:35:30 +0200
Subject: [PATCH] Hopefully fix diving to swimming transition

---
 Questionable/Controller/MovementController.cs | 25 +++++++++++++++----
 1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/Questionable/Controller/MovementController.cs b/Questionable/Controller/MovementController.cs
index a802434f..200c1a79 100644
--- a/Questionable/Controller/MovementController.cs
+++ b/Questionable/Controller/MovementController.cs
@@ -118,6 +118,19 @@ internal sealed class MovementController : IDisposable
                 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)
             {
@@ -174,7 +187,7 @@ internal sealed class MovementController : IDisposable
     }
 
     private void PrepareNavigation(EMovementType type, uint? dataId, Vector3 to, bool fly, bool sprint,
-        float? stopDistance)
+        float? stopDistance, bool useNavmesh)
     {
         ResetPathfinding();
 
@@ -184,7 +197,8 @@ internal sealed class MovementController : IDisposable
             _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;
     }
 
@@ -192,7 +206,7 @@ internal sealed class MovementController : IDisposable
         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();
@@ -205,7 +219,7 @@ internal sealed class MovementController : IDisposable
         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);
@@ -252,7 +266,8 @@ internal sealed class MovementController : IDisposable
         Vector3 Position,
         float StopDistance,
         bool IsFlying,
-        bool CanSprint);
+        bool CanSprint,
+        bool UseNavmesh);
 
     public sealed class PathfindingFailedException : Exception
     {