Unmount: Make sure to call twice if you've been in flight initially
authorLiza Carvelli <liza@carvel.li>
Sat, 15 Jun 2024 20:22:00 +0000 (22:22 +0200)
committerLiza Carvelli <liza@carvel.li>
Sat, 15 Jun 2024 20:22:00 +0000 (22:22 +0200)
Questionable/Controller/Steps/BaseTasks/UnmountTask.cs

index 9a11cd49232d09e9d2dbf5b97183fa696aff0042..761f87b5b378896318f2f4e964fae17e05c3e550 100644 (file)
@@ -9,7 +9,7 @@ internal sealed class UnmountTask(ICondition condition, ILogger<UnmountTask> log
     : ITask
 {
     private bool _unmountTriggered;
-    private DateTime _unmountedAt = DateTime.MinValue;
+    private DateTime _continueAt = DateTime.MinValue;
 
     public bool Start()
     {
@@ -17,26 +17,34 @@ internal sealed class UnmountTask(ICondition condition, ILogger<UnmountTask> log
             return false;
 
         logger.LogInformation("Step explicitly wants no mount, trying to unmount...");
+        if (condition[ConditionFlag.InFlight])
+        {
+            gameFunctions.Unmount();
+            return true;
+        }
+
         _unmountTriggered = gameFunctions.Unmount();
-        if (_unmountTriggered)
-            _unmountedAt = DateTime.Now;
+        _continueAt = DateTime.Now.AddSeconds(1);
         return true;
     }
 
     public ETaskResult Update()
     {
+        if (_continueAt >= DateTime.Now)
+            return ETaskResult.StillRunning;
+
         if (!_unmountTriggered)
         {
-            _unmountTriggered = gameFunctions.Unmount();
-            if (_unmountTriggered)
-                _unmountedAt = DateTime.Now;
+            // if still flying, we still need to land
+            if (condition[ConditionFlag.InFlight])
+                gameFunctions.Unmount();
+            else
+                _unmountTriggered = gameFunctions.Unmount();
 
+            _continueAt = DateTime.Now.AddSeconds(0.5);
             return ETaskResult.StillRunning;
         }
 
-        if (DateTime.Now < _unmountedAt.AddSeconds(1))
-            return ETaskResult.StillRunning;
-
         return condition[ConditionFlag.Mounted]
             ? ETaskResult.StillRunning
             : ETaskResult.TaskComplete;