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;
}
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;
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()
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;
IClientState clientState,
ICondition condition,
IDataManager dataManager,
+ Mount.MountEvaluator mountEvaluator,
IServiceProvider serviceProvider)
{
_movementController = movementController;
_clientState = clientState;
_condition = condition;
_serviceProvider = serviceProvider;
+ _mountEvaluator = mountEvaluator;
_cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
}
? 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;
return ETaskResult.StillRunning;
}
- else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor })
+ else if (_mountDuringMovement is { Executor: { } mountDuringMoveExecutor, Task: {} mountTask })
{
if (mountDuringMoveExecutor.Update() == ETaskResult.TaskComplete)
{
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;
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;
}