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 logger) : TaskExecutor() { 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; } } }