Fix movement v5.3
authorLiza Carvelli <liza@carvel.li>
Tue, 1 Apr 2025 18:09:56 +0000 (20:09 +0200)
committerLiza Carvelli <liza@carvel.li>
Tue, 1 Apr 2025 18:09:56 +0000 (20:09 +0200)
Directory.Build.targets
Questionable/Controller/Steps/Common/Mount.cs
Questionable/Controller/Steps/Movement/MoveExecutor.cs
Questionable/QuestionablePlugin.cs

index b304561..b03482c 100644 (file)
@@ -1,5 +1,5 @@
 <Project>
     <PropertyGroup Condition="$(MSBuildProjectName) != 'GatheringPathRenderer'">
-        <Version>5.2</Version>
+        <Version>5.3</Version>
     </PropertyGroup>
 </Project>
index f185005..157e84a 100644 (file)
@@ -27,26 +27,23 @@ internal static class Mount
         public override string ToString() => "Mount";
     }
 
-    internal sealed class MountExecutor(
+    internal sealed class MountEvaluator(
         GameFunctions gameFunctions,
         ICondition condition,
         TerritoryData territoryData,
         IClientState clientState,
-        ILogger<MountTask> logger) : TaskExecutor<MountTask>
+        ILogger<MountEvaluator> logger)
     {
-        private bool _mountTriggered;
-        private DateTime _retryAt = DateTime.MinValue;
-
-        public unsafe MountResult EvaluateMountState(bool dryRun)
+        public unsafe MountResult EvaluateMountState(MountTask task, bool dryRun, ref DateTime retryAt)
         {
             if (condition[ConditionFlag.Mounted])
                 return MountResult.DontMount;
 
             LogLevel logLevel = dryRun ? LogLevel.None : LogLevel.Information;
 
-            if (!territoryData.CanUseMount(Task.TerritoryId))
+            if (!territoryData.CanUseMount(task.TerritoryId))
             {
-                logger.Log(logLevel, "Can't use mount in current territory {Id}", Task.TerritoryId);
+                logger.Log(logLevel, "Can't use mount in current territory {Id}", task.TerritoryId);
                 return MountResult.DontMount;
             }
 
@@ -56,11 +53,11 @@ internal static class Mount
                 return MountResult.DontMount;
             }
 
-            if (Task.MountIf == EMountIf.AwayFromPosition)
+            if (task.MountIf == EMountIf.AwayFromPosition)
             {
                 Vector3 playerPosition = clientState.LocalPlayer?.Position ?? Vector3.Zero;
-                float distance = System.Numerics.Vector3.Distance(playerPosition, Task.Position.GetValueOrDefault());
-                if (Task.TerritoryId == clientState.TerritoryType && distance < 30f && !Conditions.Instance()->Diving)
+                float distance = System.Numerics.Vector3.Distance(playerPosition, task.Position.GetValueOrDefault());
+                if (task.TerritoryId == clientState.TerritoryType && distance < 30f && !Conditions.Instance()->Diving)
                 {
                     logger.Log(logLevel, "Not using mount, as we're close to the target");
                     return MountResult.DontMount;
@@ -68,25 +65,35 @@ internal static class Mount
 
                 logger.Log(logLevel,
                     "Want to use mount if away from destination ({Distance} yalms), trying (in territory {Id})...",
-                    distance, Task.TerritoryId);
+                    distance, task.TerritoryId);
             }
             else
-                logger.Log(logLevel, "Want to use mount, trying (in territory {Id})...", Task.TerritoryId);
+                logger.Log(logLevel, "Want to use mount, trying (in territory {Id})...", task.TerritoryId);
 
             if (!condition[ConditionFlag.InCombat])
             {
                 if (dryRun)
-                    _retryAt = DateTime.Now.AddSeconds(0.5);
+                    retryAt = DateTime.Now.AddSeconds(0.5);
                 return MountResult.Mount;
             }
             else
                 return MountResult.WhenOutOfCombat;
         }
+    }
+
+    internal sealed class MountExecutor(
+        GameFunctions gameFunctions,
+        ICondition condition,
+        MountEvaluator mountEvaluator,
+        ILogger<MountExecutor> logger) : TaskExecutor<MountTask>
+    {
+        private bool _mountTriggered;
+        private DateTime _retryAt = DateTime.MinValue;
 
         protected override bool Start()
         {
             _mountTriggered = false;
-            return EvaluateMountState(false) == MountResult.Mount;
+            return mountEvaluator.EvaluateMountState(Task, false, ref _retryAt) == MountResult.Mount;
         }
 
         public override ETaskResult Update()
index a4403a0..16181d1 100644 (file)
@@ -23,6 +23,7 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
     private readonly ILogger<MoveExecutor> _logger;
     private readonly IClientState _clientState;
     private readonly ICondition _condition;
+    private readonly Mount.MountEvaluator _mountEvaluator;
     private readonly IServiceProvider _serviceProvider;
 
     private Action? _startAction;
@@ -40,6 +41,7 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
         IClientState clientState,
         ICondition condition,
         IDataManager dataManager,
+        Mount.MountEvaluator mountEvaluator,
         IServiceProvider serviceProvider)
     {
         _movementController = movementController;
@@ -48,6 +50,7 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
         _clientState = clientState;
         _condition = condition;
         _serviceProvider = serviceProvider;
+        _mountEvaluator = mountEvaluator;
         _cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
     }
 
@@ -117,8 +120,9 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
                         ? Mount.EMountIf.Always
                         : Mount.EMountIf.AwayFromPosition;
                 var mountTask = new Mount.MountTask(Task.TerritoryId, mountIf, _destination);
+                DateTime retryAt = DateTime.Now;
                 _mountDuringMovement = (_serviceProvider.GetRequiredService<Mount.MountExecutor>(), mountTask);
-                if (_mountDuringMovement.Value.Executor.EvaluateMountState(true) != Mount.MountResult.DontMount)
+                if (_mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) != Mount.MountResult.DontMount)
                     _mountDuringMovement.Value.Executor.Start(mountTask);
                 else
                     _mountDuringMovement = null;
@@ -192,7 +196,7 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
 
             return ETaskResult.StillRunning;
         }
-        else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor })
+        else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor, Task: {} mountTask })
         {
             if (mountDuringMoveExecutor.Update() == ETaskResult.TaskComplete)
             {
@@ -201,7 +205,8 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
                 return null;
             }
 
-            if (mountDuringMoveExecutor.EvaluateMountState(true) == Mount.MountResult.DontMount)
+            DateTime retryAt = DateTime.Now;
+            if (_mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) == Mount.MountResult.DontMount)
             {
                 _logger.LogInformation("MountDuringMovement implicitly complete (shouldn't mount anymore)");
                 _mountDuringMovement = null;
@@ -216,9 +221,10 @@ internal sealed class MoveExecutor : TaskExecutor<MoveTask>, IToastAware
 
     public override bool WasInterrupted()
     {
+        DateTime retryAt = DateTime.Now;
         if (Task.Fly && _condition[ConditionFlag.InCombat] && !_condition[ConditionFlag.Mounted] &&
-            _mountBeforeMovement is { Executor: {} mountExecutor } &&
-            mountExecutor.EvaluateMountState(true) == Mount.MountResult.WhenOutOfCombat)
+            _mountBeforeMovement is { Task: {} mountTask } &&
+            _mountEvaluator.EvaluateMountState(mountTask, true, ref retryAt) == Mount.MountResult.WhenOutOfCombat)
         {
             return true;
         }
index 3cd6065..d283f57 100644 (file)
@@ -115,6 +115,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         serviceCollection.AddSingleton<QuestFunctions>();
         serviceCollection.AddSingleton<AlliedSocietyQuestFunctions>();
         serviceCollection.AddSingleton<DalamudReflector>();
+        serviceCollection.AddSingleton<Mount.MountEvaluator>();
 
         serviceCollection.AddSingleton<AetherCurrentData>();
         serviceCollection.AddSingleton<AetheryteData>();