From: Liza Carvelli Date: Tue, 1 Apr 2025 18:09:56 +0000 (+0200) Subject: Fix movement X-Git-Tag: v5.3^0 X-Git-Url: https://git.jacobcasper.com/?a=commitdiff_plain;h=11978e645a0c53795891aabfbdf3d66bcb88fbdf;p=Questionable.git Fix movement --- diff --git a/Directory.Build.targets b/Directory.Build.targets index b304561e..b03482c0 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -1,5 +1,5 @@ - 5.2 + 5.3 diff --git a/Questionable/Controller/Steps/Common/Mount.cs b/Questionable/Controller/Steps/Common/Mount.cs index f1850056..157e84ac 100644 --- a/Questionable/Controller/Steps/Common/Mount.cs +++ b/Questionable/Controller/Steps/Common/Mount.cs @@ -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 logger) : TaskExecutor + ILogger 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 logger) : TaskExecutor + { + 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() diff --git a/Questionable/Controller/Steps/Movement/MoveExecutor.cs b/Questionable/Controller/Steps/Movement/MoveExecutor.cs index a4403a0e..16181d17 100644 --- a/Questionable/Controller/Steps/Movement/MoveExecutor.cs +++ b/Questionable/Controller/Steps/Movement/MoveExecutor.cs @@ -23,6 +23,7 @@ internal sealed class MoveExecutor : TaskExecutor, IToastAware private readonly ILogger _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, IToastAware IClientState clientState, ICondition condition, IDataManager dataManager, + Mount.MountEvaluator mountEvaluator, IServiceProvider serviceProvider) { _movementController = movementController; @@ -48,6 +50,7 @@ internal sealed class MoveExecutor : TaskExecutor, IToastAware _clientState = clientState; _condition = condition; _serviceProvider = serviceProvider; + _mountEvaluator = mountEvaluator; _cannotExecuteAtThisTime = dataManager.GetString(579, x => x.Text)!; } @@ -117,8 +120,9 @@ internal sealed class MoveExecutor : TaskExecutor, IToastAware ? Mount.EMountIf.Always : Mount.EMountIf.AwayFromPosition; var mountTask = new Mount.MountTask(Task.TerritoryId, mountIf, _destination); + DateTime retryAt = DateTime.Now; _mountDuringMovement = (_serviceProvider.GetRequiredService(), 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, 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, 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, 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; } diff --git a/Questionable/QuestionablePlugin.cs b/Questionable/QuestionablePlugin.cs index 3cd60658..d283f571 100644 --- a/Questionable/QuestionablePlugin.cs +++ b/Questionable/QuestionablePlugin.cs @@ -115,6 +115,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton();