qstbak/LLib/LLib.GameUI/LAddon.cs
2026-08-17 20:29:32 +10:00

63 lines
1.6 KiB
C#

using System;
using Dalamud.Game.NativeWrapper;
using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Component.GUI;
namespace LLib.GameUI;
public static class LAddon
{
private const int UnitListCount = 18;
public unsafe static AtkUnitBase* GetAddonById(uint id)
{
AtkUnitList* ptr = &AtkStage.Instance()->RaptureAtkUnitManager->AtkUnitManager.DepthLayerOneList;
for (int i = 0; i < 18; i++)
{
AtkUnitList* ptr2 = ptr + i;
int num = Math.Min(ptr2->Count, ptr2->Entries.Length);
for (int j = 0; j < num; j++)
{
AtkUnitBase* value = ptr2->Entries[j].Value;
if (value != null && value->Id == id)
{
return value;
}
}
}
return null;
}
public unsafe static bool TryGetAddonByName<T>(this IGameGui gameGui, string addonName, out T* addonPtr) where T : unmanaged
{
ArgumentNullException.ThrowIfNull(gameGui, "gameGui");
ArgumentException.ThrowIfNullOrEmpty(addonName, "addonName");
AtkUnitBasePtr addonByName = gameGui.GetAddonByName(addonName);
if (!addonByName.IsNull)
{
addonPtr = (T*)addonByName.Address;
return true;
}
addonPtr = null;
return false;
}
public unsafe static bool IsAddonReady(AtkUnitBase* addon)
{
if (addon != null && addon->IsVisible)
{
return addon->UldManager.LoadedState == AtkLoadState.Loaded;
}
return false;
}
public unsafe static bool TryGetReadyAddon<T>(this IGameGui gameGui, string addonName, out T* addonPtr) where T : unmanaged
{
if (gameGui.TryGetAddonByName<T>(addonName, out addonPtr) && IsAddonReady((AtkUnitBase*)addonPtr))
{
return true;
}
addonPtr = null;
return false;
}
}