using System; using Dalamud.Game; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; namespace ConfigurableCombo; internal class PluginAddressResolver : BaseAddressResolver { public IntPtr ComboTimer { get; private set; } public IntPtr LastComboMove => ComboTimer + 0x4; public IntPtr IsActionIdReplaceable { get; private set; } /// RaptureHotbarModule.ExecuteSlotById — used to run custom combos (replace slot action before execution). public IntPtr ExecuteSlotById { get; private set; } /// ActionManager.UseAction — final execution point; hook here so custom combos work regardless of hotbar path. public IntPtr UseAction { get; private set; } /// RaptureHotbarModule.GetSlotAppearance — game calls this every frame for visible hotbar slots to get display action/icon; we override so default hotbar shows combo icon. public IntPtr GetSlotAppearance { get; private set; } protected unsafe override void Setup64Bit(ISigScanner scanner) { ComboTimer = new IntPtr(&ActionManager.Instance()->Combo.Timer); IsActionIdReplaceable = scanner.ScanText("40 53 48 83 EC 20 8B D9 48 8B 0D ?? ?? ?? ?? E8 ?? ?? ?? ?? 48 85 C0 74 1F"); ExecuteSlotById = scanner.ScanText("4C 8B C9 41 83 F8 10 73 45"); UseAction = scanner.ScanText("E8 ?? ?? ?? ?? B0 01 EB B6"); GetSlotAppearance = scanner.ScanText("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 30 48 8B DA 49 8B F0"); } }