diff --git a/Dalamud/Interface/Internal/Windows/Data/Widgets/HookWidget.cs b/Dalamud/Interface/Internal/Windows/Data/Widgets/HookWidget.cs index c5ae1d8f0..f3e25caf8 100644 --- a/Dalamud/Interface/Internal/Windows/Data/Widgets/HookWidget.cs +++ b/Dalamud/Interface/Internal/Windows/Data/Widgets/HookWidget.cs @@ -5,8 +5,8 @@ using System.Threading.Tasks; using Dalamud.Bindings.ImGui; using Dalamud.Game; -using Dalamud.Game.ClientState; using Dalamud.Hooking; +using FFXIVClientStructs.FFXIV.Component.GUI; using Serilog; using Windows.Win32.Foundation; using Windows.Win32.UI.WindowsAndMessaging; @@ -16,7 +16,7 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets; /// /// Widget for displaying hook information. /// -internal class HookWidget : IDataWindowWidget +internal unsafe class HookWidget : IDataWindowWidget { private readonly List hookStressTestList = []; @@ -31,9 +31,9 @@ internal class HookWidget : IDataWindowWidget private bool hookStressTestRunning = false; private MessageBoxWDelegate? messageBoxWOriginal; - private HandleZoneInitPacketDelegate? zoneInitOriginal; + private AddonFinalizeDelegate? addonFinalizeOriginal; - private ClientStateAddressResolver? address; + private nint address; private delegate int MessageBoxWDelegate( IntPtr hWnd, @@ -41,12 +41,12 @@ internal class HookWidget : IDataWindowWidget [MarshalAs(UnmanagedType.LPWStr)] string caption, MESSAGEBOX_STYLE type); - private delegate void HandleZoneInitPacketDelegate(nint a1, uint localPlayerEntityId, nint packet, byte type); + private delegate void AddonFinalizeDelegate(AtkUnitManager* unitManager, AtkUnitBase** atkUnitBase); private enum StressTestHookTarget { MessageBoxW, - ZoneInit, + AddonFinalize, Random, } @@ -54,7 +54,7 @@ internal class HookWidget : IDataWindowWidget public string DisplayName { get; init; } = "Hook"; /// - public string[]? CommandShortcuts { get; init; } = { "hook" }; + public string[]? CommandShortcuts { get; init; } = ["hook"]; /// public bool Ready { get; set; } @@ -64,8 +64,8 @@ internal class HookWidget : IDataWindowWidget { this.Ready = true; - this.address = new ClientStateAddressResolver(); - this.address.Setup(Service.Get()); + var sigScanner = Service.Get(); + this.address = sigScanner.ScanText("E8 ?? ?? ?? ?? 48 83 EF 01 75 D5"); } /// @@ -178,7 +178,7 @@ internal class HookWidget : IDataWindowWidget return target switch { StressTestHookTarget.MessageBoxW => "MessageBoxW (Hook)", - StressTestHookTarget.ZoneInit => "ZoneInit (Hook)", + StressTestHookTarget.AddonFinalize => "AddonFinalize (Hook)", _ => target.ToString(), }; } @@ -197,10 +197,15 @@ internal class HookWidget : IDataWindowWidget return result; } - private void OnZoneInit(IntPtr a1, uint localPlayerEntityId, IntPtr packet, byte type) + private void OnAddonFinalize(AtkUnitManager* unitManager, AtkUnitBase** atkUnitBase) { - Log.Information("OnZoneInit"); - this.zoneInitOriginal!.Invoke(a1, localPlayerEntityId, packet, type); + Log.Information("OnAddonFinalize"); + this.addonFinalizeOriginal!(unitManager, atkUnitBase); + } + + private void OnAddonUpdate(AtkUnitBase* thisPtr, float delta) + { + Log.Information("OnAddonUpdate"); } private IDalamudHook HookMessageBoxW() @@ -216,11 +221,11 @@ internal class HookWidget : IDataWindowWidget return hook; } - private IDalamudHook HookZoneInit() + private IDalamudHook HookAddonFinalize() { - var hook = Hook.FromAddress(this.address!.HandleZoneInitPacket, this.OnZoneInit); + var hook = Hook.FromAddress(this.address, this.OnAddonFinalize); - this.zoneInitOriginal = hook.Original; + this.addonFinalizeOriginal = hook.Original; hook.Enable(); return hook; } @@ -235,7 +240,7 @@ internal class HookWidget : IDataWindowWidget return target switch { StressTestHookTarget.MessageBoxW => this.HookMessageBoxW(), - StressTestHookTarget.ZoneInit => this.HookZoneInit(), + StressTestHookTarget.AddonFinalize => this.HookAddonFinalize(), _ => throw new ArgumentOutOfRangeException(nameof(target), target, null), }; }