using System.Linq; using Dalamud.Hooking; using FFXIVClientStructs.FFXIV.Component.GUI; using KamiToolKit.Classes; namespace KamiToolKit; public abstract unsafe partial class NativeAddon { private static Hook? fireCallbackHook; private static void InitializeCloseCallback() { fireCallbackHook ??= DalamudInterface.Instance.GameInteropProvider .HookFromAddress(AtkUnitBase.Addresses.FireCallback.Value, OnFireCallback); fireCallbackHook.Enable(); } private static bool OnFireCallback(AtkUnitBase* thisPtr, uint valueCount, AtkValue* values, bool close) { Log.Excessive($"[{thisPtr->NameString}] OnFireCallback"); foreach (var addon in CreatedAddons) { if (addon == thisPtr && close && addon is { RespectCloseAll: true, IsOverlayAddon: false }) { addon.Close(); return true; } } return fireCallbackHook!.Original(thisPtr, valueCount, values, close); } private static void DisposeCloseCallback() { if (CreatedAddons.Count is 0 || CreatedAddons.All(addon => addon.IsOverlayAddon)) { fireCallbackHook?.Dispose(); fireCallbackHook = null; } } }