From cfef50af0c9ac5a64e1b08ff706b03ae793def67 Mon Sep 17 00:00:00 2001 From: MidoriKami <9083275+MidoriKami@users.noreply.github.com> Date: Tue, 29 Aug 2023 14:01:53 -0700 Subject: [PATCH] [AddonLifecycle] Fixes --- Dalamud/Game/AddonLifecycle/AddonLifecycle.cs | 33 ++++++------------- Dalamud/Plugin/Services/IAddonLifecycle.cs | 7 +--- 2 files changed, 11 insertions(+), 29 deletions(-) diff --git a/Dalamud/Game/AddonLifecycle/AddonLifecycle.cs b/Dalamud/Game/AddonLifecycle/AddonLifecycle.cs index 95cb2539c..c3ec038ed 100644 --- a/Dalamud/Game/AddonLifecycle/AddonLifecycle.cs +++ b/Dalamud/Game/AddonLifecycle/AddonLifecycle.cs @@ -1,5 +1,4 @@ using System; -using System.Runtime.InteropServices; using Dalamud.Hooking; using Dalamud.IoC; @@ -29,13 +28,11 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType, IAddonLifecycl this.address.Setup(sigScanner); this.onAddonSetupHook = Hook.FromAddress(this.address.AddonSetup, this.OnAddonSetup); - this.onAddonFinalizeHook = Hook.FromAddress(this.address.AddonSetup, this.OnAddonFinalize); + this.onAddonFinalizeHook = Hook.FromAddress(this.address.AddonFinalize, this.OnAddonFinalize); } - [UnmanagedFunctionPointer(CallingConvention.ThisCall)] private delegate nint AddonSetupDelegate(AtkUnitBase* addon); - [UnmanagedFunctionPointer(CallingConvention.ThisCall)] private delegate void AddonFinalizeDelegate(AtkUnitManager* unitManager, AtkUnitBase** atkUnitBase); /// @@ -47,9 +44,6 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType, IAddonLifecycl /// public event Action? AddonPreFinalize; - /// - public event Action? AddonPostFinalize; - /// public void Dispose() { @@ -66,6 +60,9 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType, IAddonLifecycl private nint OnAddonSetup(AtkUnitBase* addon) { + if (addon is null) + return this.onAddonSetupHook.Original(addon); + try { this.AddonPreSetup?.Invoke(new IAddonLifecycle.AddonArgs { Addon = (nint)addon }); @@ -91,6 +88,12 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType, IAddonLifecycl private void OnAddonFinalize(AtkUnitManager* unitManager, AtkUnitBase** atkUnitBase) { + if (atkUnitBase is null) + { + this.onAddonFinalizeHook.Original(unitManager, atkUnitBase); + return; + } + try { this.AddonPreFinalize?.Invoke(new IAddonLifecycle.AddonArgs { Addon = (nint)atkUnitBase[0] }); @@ -101,15 +104,6 @@ internal unsafe class AddonLifecycle : IDisposable, IServiceType, IAddonLifecycl } this.onAddonFinalizeHook.Original(unitManager, atkUnitBase); - - try - { - this.AddonPostFinalize?.Invoke(new IAddonLifecycle.AddonArgs { Addon = (nint)atkUnitBase[0] }); - } - catch (Exception e) - { - Log.Error(e, "Exception in OnAddonFinalize post-finalize invoke."); - } } } @@ -135,7 +129,6 @@ internal class AddonLifecyclePluginScoped : IDisposable, IServiceType, IAddonLif this.addonLifecycleService.AddonPreSetup += this.AddonPreSetupForward; this.addonLifecycleService.AddonPostSetup += this.AddonPostSetupForward; this.addonLifecycleService.AddonPreFinalize += this.AddonPreFinalizeForward; - this.addonLifecycleService.AddonPostFinalize += this.AddonPostFinalizeForward; } /// @@ -147,16 +140,12 @@ internal class AddonLifecyclePluginScoped : IDisposable, IServiceType, IAddonLif /// public event Action? AddonPreFinalize; - /// - public event Action? AddonPostFinalize; - /// public void Dispose() { this.addonLifecycleService.AddonPreSetup -= this.AddonPreSetupForward; this.addonLifecycleService.AddonPostSetup -= this.AddonPostSetupForward; this.addonLifecycleService.AddonPreFinalize -= this.AddonPreFinalizeForward; - this.addonLifecycleService.AddonPostFinalize -= this.AddonPostFinalizeForward; } private void AddonPreSetupForward(IAddonLifecycle.AddonArgs args) => this.AddonPreSetup?.Invoke(args); @@ -164,6 +153,4 @@ internal class AddonLifecyclePluginScoped : IDisposable, IServiceType, IAddonLif private void AddonPostSetupForward(IAddonLifecycle.AddonArgs args) => this.AddonPostSetup?.Invoke(args); private void AddonPreFinalizeForward(IAddonLifecycle.AddonArgs args) => this.AddonPreFinalize?.Invoke(args); - - private void AddonPostFinalizeForward(IAddonLifecycle.AddonArgs args) => this.AddonPostFinalize?.Invoke(args); } diff --git a/Dalamud/Plugin/Services/IAddonLifecycle.cs b/Dalamud/Plugin/Services/IAddonLifecycle.cs index 7b90cf0cd..43b9fef0a 100644 --- a/Dalamud/Plugin/Services/IAddonLifecycle.cs +++ b/Dalamud/Plugin/Services/IAddonLifecycle.cs @@ -25,11 +25,6 @@ public interface IAddonLifecycle /// public event Action AddonPreFinalize; - /// - /// Event that fires after an addon is done being finalized. - /// - public event Action AddonPostFinalize; - /// /// Addon argument data for use in event subscribers. /// @@ -40,7 +35,7 @@ public interface IAddonLifecycle /// /// Gets the name of the addon this args referrers to. /// - public string AddonName => this.addonName ??= MemoryHelper.ReadString((nint)((AtkUnitBase*)this.Addon)->Name, 0x20); + public string AddonName => this.Addon == nint.Zero ? "NullAddon" : this.addonName ??= MemoryHelper.ReadString((nint)((AtkUnitBase*)this.Addon)->Name, 0x20); /// /// Gets the pointer to the addons AtkUnitBase.