forked from aly/qstbak
59 lines
1.7 KiB
C#
59 lines
1.7 KiB
C#
using System;
|
|
using System.Numerics;
|
|
using Dalamud.Game.ClientState.Objects.SubKinds;
|
|
using Dalamud.Plugin.Services;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace Questionable.Controller.Steps.Shared;
|
|
|
|
internal static class SubRegionTransport
|
|
{
|
|
internal sealed record Task(Vector3 SourcePosition, Vector3 DestPosition, ushort TerritoryId) : ITask
|
|
{
|
|
public bool ShouldRedoOnInterrupt()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return $"SubRegionTransport({TerritoryId}, {SourcePosition} -> {DestPosition})";
|
|
}
|
|
}
|
|
|
|
internal sealed class DoSubRegionTransport(IObjectTable objectTable, ILogger<DoSubRegionTransport> logger) : TaskExecutor<Task>()
|
|
{
|
|
private Vector3 _startPosition;
|
|
|
|
private long _startTime;
|
|
|
|
protected override bool Start()
|
|
{
|
|
_startPosition = objectTable.LocalPlayer?.Position ?? Vector3.Zero;
|
|
_startTime = Environment.TickCount64;
|
|
logger.LogDebug("SubRegionTransport: Waiting for transport pad activation at {Position}", base.Task.SourcePosition);
|
|
return true;
|
|
}
|
|
|
|
public override ETaskResult Update()
|
|
{
|
|
IPlayerCharacter localPlayer = objectTable.LocalPlayer;
|
|
if (localPlayer != null && Vector3.Distance(localPlayer.Position, _startPosition) > 5f)
|
|
{
|
|
logger.LogDebug("SubRegionTransport: Position changed ({Distance:F1}y), transport complete", Vector3.Distance(localPlayer.Position, _startPosition));
|
|
return ETaskResult.TaskComplete;
|
|
}
|
|
if (Environment.TickCount64 - _startTime > 15000)
|
|
{
|
|
logger.LogWarning("SubRegionTransport: Timed out waiting for transport activation");
|
|
return ETaskResult.RetryStep;
|
|
}
|
|
return ETaskResult.StillRunning;
|
|
}
|
|
|
|
public override bool ShouldInterruptOnDamage()
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|