using System.Collections; using System.Collections.Generic; using Dalamud.IoC; using Dalamud.IoC.Internal; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game.UI; using Serilog; namespace Dalamud.Game.ClientState.Aetherytes; /// /// This collection represents the list of available Aetherytes in the Teleport window. /// [PluginInterface] [InterfaceVersion("1.0")] [ServiceManager.BlockingEarlyLoadedService] #pragma warning disable SA1015 [ResolveVia] #pragma warning restore SA1015 public sealed unsafe partial class AetheryteList : IServiceType, IAetheryteList { [ServiceManager.ServiceDependency] private readonly ClientState clientState = Service.Get(); private readonly Telepo* telepoInstance = Telepo.Instance(); [ServiceManager.ServiceConstructor] private AetheryteList() { Log.Verbose($"Teleport address 0x{((nint)this.telepoInstance).ToInt64():X}"); } /// public int Length { get { if (this.clientState.LocalPlayer == null) return 0; this.Update(); if (this.telepoInstance->TeleportList.First == this.telepoInstance->TeleportList.Last) return 0; return (int)this.telepoInstance->TeleportList.Size(); } } /// public AetheryteEntry? this[int index] { get { if (index < 0 || index >= this.Length) { return null; } if (this.clientState.LocalPlayer == null) return null; return new AetheryteEntry(this.telepoInstance->TeleportList.Get((ulong)index)); } } private void Update() { // this is very very important as otherwise it crashes if (this.clientState.LocalPlayer == null) return; this.telepoInstance->UpdateAetheryteList(); } } /// /// This collection represents the list of available Aetherytes in the Teleport window. /// public sealed partial class AetheryteList { /// public int Count => this.Length; /// public IEnumerator GetEnumerator() { for (var i = 0; i < this.Length; i++) { yield return this[i]; } } /// IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } }