1
0
Fork 0
forked from aly/qstbak
qstbak/Questionable/Questionable.Controller.Steps.Shared/SubRegionTransport.cs
2026-08-17 20:29:32 +10:00

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;
}
}
}