From 2dbae055226d1dfb85662b2d68df92926a6ea343 Mon Sep 17 00:00:00 2001 From: MidoriKami Date: Sun, 7 Dec 2025 16:45:59 -0800 Subject: [PATCH] Add very thurough exception handling --- .../Game/Addon/Lifecycle/AddonVirtualTable.cs | 498 +++++++++++------- 1 file changed, 318 insertions(+), 180 deletions(-) diff --git a/Dalamud/Game/Addon/Lifecycle/AddonVirtualTable.cs b/Dalamud/Game/Addon/Lifecycle/AddonVirtualTable.cs index 8fbf77534..47ff92c3d 100644 --- a/Dalamud/Game/Addon/Lifecycle/AddonVirtualTable.cs +++ b/Dalamud/Game/Addon/Lifecycle/AddonVirtualTable.cs @@ -136,14 +136,30 @@ internal unsafe class AddonVirtualTable : IDisposable private AtkEventListener* OnAddonDestructor(AtkUnitBase* thisPtr, byte freeFlags) { - this.LogEvent(EnableLogging); + AtkEventListener* result = null; - var result = this.originalVirtualTable->Dtor(thisPtr, freeFlags); - - if ((freeFlags & 1) == 1) + try { - IMemorySpace.Free(this.modifiedVirtualTable, 0x8 * VirtualTableEntryCount); - AddonLifecycle.AllocatedTables.Remove(this); + this.LogEvent(EnableLogging); + + try + { + result = this.originalVirtualTable->Dtor(thisPtr, freeFlags); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Dtor. This may be a bug in the game or another plugin hooking this method."); + } + + if ((freeFlags & 1) == 1) + { + IMemorySpace.Free(this.modifiedVirtualTable, 0x8 * VirtualTableEntryCount); + AddonLifecycle.AllocatedTables.Remove(this); + } + } + catch (Exception e) + { + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonDestructor."); } return result; @@ -151,338 +167,460 @@ internal unsafe class AddonVirtualTable : IDisposable private void OnAddonSetup(AtkUnitBase* addon, uint valueCount, AtkValue* values) { - this.LogEvent(EnableLogging); - - this.setupArgs.Addon = addon; - this.setupArgs.AtkValueCount = valueCount; - this.setupArgs.AtkValues = (nint)values; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreSetup, this.setupArgs); - - valueCount = this.setupArgs.AtkValueCount; - values = (AtkValue*)this.setupArgs.AtkValues; - try { - this.originalVirtualTable->OnSetup(addon, valueCount, values); + this.LogEvent(EnableLogging); + + this.setupArgs.Addon = addon; + this.setupArgs.AtkValueCount = valueCount; + this.setupArgs.AtkValues = (nint)values; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreSetup, this.setupArgs); + + valueCount = this.setupArgs.AtkValueCount; + values = (AtkValue*)this.setupArgs.AtkValues; + + try + { + this.originalVirtualTable->OnSetup(addon, valueCount, values); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnSetup. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostSetup, this.setupArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonSetup. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonSetup."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostSetup, this.setupArgs); } private void OnAddonFinalize(AtkUnitBase* thisPtr) { - this.LogEvent(EnableLogging); - - this.finalizeArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreFinalize, this.finalizeArgs); - try { - this.originalVirtualTable->Finalizer(thisPtr); + this.LogEvent(EnableLogging); + + this.finalizeArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreFinalize, this.finalizeArgs); + + try + { + this.originalVirtualTable->Finalizer(thisPtr); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Finalizer. This may be a bug in the game or another plugin hooking this method."); + } } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonFinalize. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonFinalize."); } } private void OnAddonDraw(AtkUnitBase* addon) { - this.LogEvent(EnableLogging); - - this.drawArgs.Addon = addon; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreDraw, this.drawArgs); - try { - this.originalVirtualTable->Draw(addon); + this.LogEvent(EnableLogging); + + this.drawArgs.Addon = addon; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreDraw, this.drawArgs); + + try + { + this.originalVirtualTable->Draw(addon); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Draw. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostDraw, this.drawArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonDraw. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonDraw."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostDraw, this.drawArgs); } private void OnAddonUpdate(AtkUnitBase* addon, float delta) { - this.LogEvent(EnableLogging); - - this.updateArgs.Addon = addon; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreUpdate, this.updateArgs); - - // Note: Do not pass or allow manipulation of delta. - // It's realistically not something that should be needed. - try { - this.originalVirtualTable->Update(addon, delta); + this.LogEvent(EnableLogging); + + this.updateArgs.Addon = addon; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreUpdate, this.updateArgs); + + // Note: Do not pass or allow manipulation of delta. + // It's realistically not something that should be needed. + // And even if someone does, they are encouraged to hook Update themselves. + + try + { + this.originalVirtualTable->Update(addon, delta); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Update. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostUpdate, this.updateArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonUpdate. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonUpdate."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostUpdate, this.updateArgs); } private bool OnAddonRefresh(AtkUnitBase* addon, uint valueCount, AtkValue* values) { - this.LogEvent(EnableLogging); - var result = false; - this.refreshArgs.Addon = addon; - this.refreshArgs.AtkValueCount = valueCount; - this.refreshArgs.AtkValues = (nint)values; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreRefresh, this.refreshArgs); - - valueCount = this.refreshArgs.AtkValueCount; - values = (AtkValue*)this.refreshArgs.AtkValues; - try { - result = this.originalVirtualTable->OnRefresh(addon, valueCount, values); + this.LogEvent(EnableLogging); + + this.refreshArgs.Addon = addon; + this.refreshArgs.AtkValueCount = valueCount; + this.refreshArgs.AtkValues = (nint)values; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreRefresh, this.refreshArgs); + + valueCount = this.refreshArgs.AtkValueCount; + values = (AtkValue*)this.refreshArgs.AtkValues; + + try + { + result = this.originalVirtualTable->OnRefresh(addon, valueCount, values); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnRefresh. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostRefresh, this.refreshArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonRefresh. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonRefresh."); } - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostRefresh, this.refreshArgs); return result; } private void OnRequestedUpdate(AtkUnitBase* addon, NumberArrayData** numberArrayData, StringArrayData** stringArrayData) { - this.LogEvent(EnableLogging); - - this.requestedUpdateArgs.Addon = addon; - this.requestedUpdateArgs.NumberArrayData = (nint)numberArrayData; - this.requestedUpdateArgs.StringArrayData = (nint)stringArrayData; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreRequestedUpdate, this.requestedUpdateArgs); - - numberArrayData = (NumberArrayData**)this.requestedUpdateArgs.NumberArrayData; - stringArrayData = (StringArrayData**)this.requestedUpdateArgs.StringArrayData; - try { - this.originalVirtualTable->OnRequestedUpdate(addon, numberArrayData, stringArrayData); + this.LogEvent(EnableLogging); + + this.requestedUpdateArgs.Addon = addon; + this.requestedUpdateArgs.NumberArrayData = (nint)numberArrayData; + this.requestedUpdateArgs.StringArrayData = (nint)stringArrayData; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreRequestedUpdate, this.requestedUpdateArgs); + + numberArrayData = (NumberArrayData**)this.requestedUpdateArgs.NumberArrayData; + stringArrayData = (StringArrayData**)this.requestedUpdateArgs.StringArrayData; + + try + { + this.originalVirtualTable->OnRequestedUpdate(addon, numberArrayData, stringArrayData); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnRequestedUpdate. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostRequestedUpdate, this.requestedUpdateArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonRequestedUpdate. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnRequestedUpdate."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostRequestedUpdate, this.requestedUpdateArgs); } private void OnAddonReceiveEvent(AtkUnitBase* addon, AtkEventType eventType, int eventParam, AtkEvent* atkEvent, AtkEventData* atkEventData) { - this.LogEvent(EnableLogging); - - this.receiveEventArgs.Addon = (nint)addon; - this.receiveEventArgs.AtkEventType = (byte)eventType; - this.receiveEventArgs.EventParam = eventParam; - this.receiveEventArgs.AtkEvent = (IntPtr)atkEvent; - this.receiveEventArgs.AtkEventData = (nint)atkEventData; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreReceiveEvent, this.receiveEventArgs); - - eventType = (AtkEventType)this.receiveEventArgs.AtkEventType; - eventParam = this.receiveEventArgs.EventParam; - atkEvent = (AtkEvent*)this.receiveEventArgs.AtkEvent; - atkEventData = (AtkEventData*)this.receiveEventArgs.AtkEventData; - try { - this.originalVirtualTable->ReceiveEvent(addon, eventType, eventParam, atkEvent, atkEventData); + this.LogEvent(EnableLogging); + + this.receiveEventArgs.Addon = (nint)addon; + this.receiveEventArgs.AtkEventType = (byte)eventType; + this.receiveEventArgs.EventParam = eventParam; + this.receiveEventArgs.AtkEvent = (IntPtr)atkEvent; + this.receiveEventArgs.AtkEventData = (nint)atkEventData; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreReceiveEvent, this.receiveEventArgs); + + eventType = (AtkEventType)this.receiveEventArgs.AtkEventType; + eventParam = this.receiveEventArgs.EventParam; + atkEvent = (AtkEvent*)this.receiveEventArgs.AtkEvent; + atkEventData = (AtkEventData*)this.receiveEventArgs.AtkEventData; + + try + { + this.originalVirtualTable->ReceiveEvent(addon, eventType, eventParam, atkEvent, atkEventData); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon ReceiveEvent. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostReceiveEvent, this.receiveEventArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonReceiveEvent. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonReceiveEvent."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostReceiveEvent, this.receiveEventArgs); } private bool OnAddonOpen(AtkUnitBase* thisPtr, uint depthLayer) { - this.LogEvent(EnableLogging); - var result = false; - this.openArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreOpen, this.openArgs); - try { - result = this.originalVirtualTable->Open(thisPtr, depthLayer); + this.LogEvent(EnableLogging); + + this.openArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreOpen, this.openArgs); + + try + { + result = this.originalVirtualTable->Open(thisPtr, depthLayer); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Open. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostOpen, this.openArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonOpen. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonOpen."); } - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostOpen, this.openArgs); - return result; } private bool OnAddonClose(AtkUnitBase* thisPtr, bool fireCallback) { - this.LogEvent(EnableLogging); - var result = false; - this.closeArgs.Addon = thisPtr; - this.closeArgs.FireCallback = fireCallback; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreClose, this.closeArgs); - - fireCallback = this.closeArgs.FireCallback; - try { - result = this.originalVirtualTable->Close(thisPtr, fireCallback); + this.LogEvent(EnableLogging); + + this.closeArgs.Addon = thisPtr; + this.closeArgs.FireCallback = fireCallback; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreClose, this.closeArgs); + + fireCallback = this.closeArgs.FireCallback; + + try + { + result = this.originalVirtualTable->Close(thisPtr, fireCallback); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Close. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostClose, this.closeArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonClose. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonClose."); } - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostClose, this.closeArgs); - return result; } private void OnAddonShow(AtkUnitBase* thisPtr, bool silenceOpenSoundEffect, uint unsetShowHideFlags) { - this.LogEvent(EnableLogging); - - this.showArgs.Addon = thisPtr; - this.showArgs.SilenceOpenSoundEffect = silenceOpenSoundEffect; - this.showArgs.UnsetShowHideFlags = unsetShowHideFlags; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreShow, this.showArgs); - - silenceOpenSoundEffect = this.showArgs.SilenceOpenSoundEffect; - unsetShowHideFlags = this.showArgs.UnsetShowHideFlags; - try { - this.originalVirtualTable->Show(thisPtr, silenceOpenSoundEffect, unsetShowHideFlags); + this.LogEvent(EnableLogging); + + this.showArgs.Addon = thisPtr; + this.showArgs.SilenceOpenSoundEffect = silenceOpenSoundEffect; + this.showArgs.UnsetShowHideFlags = unsetShowHideFlags; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreShow, this.showArgs); + + silenceOpenSoundEffect = this.showArgs.SilenceOpenSoundEffect; + unsetShowHideFlags = this.showArgs.UnsetShowHideFlags; + + try + { + this.originalVirtualTable->Show(thisPtr, silenceOpenSoundEffect, unsetShowHideFlags); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Show. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostShow, this.showArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonShow. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonShow."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostShow, this.showArgs); } private void OnAddonHide(AtkUnitBase* thisPtr, bool unkBool, bool callHideCallback, uint setShowHideFlags) { - this.LogEvent(EnableLogging); - - this.hideArgs.Addon = thisPtr; - this.hideArgs.UnknownBool = unkBool; - this.hideArgs.CallHideCallback = callHideCallback; - this.hideArgs.SetShowHideFlags = setShowHideFlags; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreHide, this.hideArgs); - - unkBool = this.hideArgs.UnknownBool; - callHideCallback = this.hideArgs.CallHideCallback; - setShowHideFlags = this.hideArgs.SetShowHideFlags; - try { - this.originalVirtualTable->Hide(thisPtr, unkBool, callHideCallback, setShowHideFlags); + this.LogEvent(EnableLogging); + + this.hideArgs.Addon = thisPtr; + this.hideArgs.UnknownBool = unkBool; + this.hideArgs.CallHideCallback = callHideCallback; + this.hideArgs.SetShowHideFlags = setShowHideFlags; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreHide, this.hideArgs); + + unkBool = this.hideArgs.UnknownBool; + callHideCallback = this.hideArgs.CallHideCallback; + setShowHideFlags = this.hideArgs.SetShowHideFlags; + + try + { + this.originalVirtualTable->Hide(thisPtr, unkBool, callHideCallback, setShowHideFlags); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Hide. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostHide, this.hideArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original AddonHide. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonHide."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostHide, this.hideArgs); } private void OnAddonMove(AtkUnitBase* thisPtr) { - this.LogEvent(EnableLogging); - - this.onMoveArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMove, this.onMoveArgs); - try { - this.originalVirtualTable->OnMove(thisPtr); + this.LogEvent(EnableLogging); + + this.onMoveArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMove, this.onMoveArgs); + + try + { + this.originalVirtualTable->OnMove(thisPtr); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnMove. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMove, this.onMoveArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original OnAddonMove. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonMove."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMove, this.onMoveArgs); } private void OnAddonMouseOver(AtkUnitBase* thisPtr) { - this.LogEvent(EnableLogging); - - this.onMouseOverArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMouseOver, this.onMouseOverArgs); - try { - this.originalVirtualTable->OnMouseOver(thisPtr); + this.LogEvent(EnableLogging); + + this.onMouseOverArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMouseOver, this.onMouseOverArgs); + + try + { + this.originalVirtualTable->OnMouseOver(thisPtr); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnMouseOver. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMouseOver, this.onMouseOverArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original OnAddonMouseOver. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonMouseOver."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMouseOver, this.onMouseOverArgs); } private void OnAddonMouseOut(AtkUnitBase* thisPtr) { - this.LogEvent(EnableLogging); - - this.onMouseOutArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMouseOut, this.onMouseOutArgs); - try { - this.originalVirtualTable->OnMouseOut(thisPtr); + this.LogEvent(EnableLogging); + + this.onMouseOutArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreMouseOut, this.onMouseOutArgs); + + try + { + this.originalVirtualTable->OnMouseOut(thisPtr); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon OnMouseOut. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMouseOut, this.onMouseOutArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original OnAddonMouseOut. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonMouseOut."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostMouseOut, this.onMouseOutArgs); } private void OnAddonFocus(AtkUnitBase* thisPtr) { - this.LogEvent(EnableLogging); - - this.focusArgs.Addon = thisPtr; - this.lifecycleService.InvokeListenersSafely(AddonEvent.PreFocus, this.focusArgs); - try { - this.originalVirtualTable->Focus(thisPtr); + this.LogEvent(EnableLogging); + + this.focusArgs.Addon = thisPtr; + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PreFocus, this.focusArgs); + + try + { + this.originalVirtualTable->Focus(thisPtr); + } + catch (Exception e) + { + Log.Error(e, "Caught exception when calling original Addon Focus. This may be a bug in the game or another plugin hooking this method."); + } + + this.lifecycleService.InvokeListenersSafely(AddonEvent.PostFocus, this.focusArgs); } catch (Exception e) { - Log.Error(e, "Caught exception when calling original OnAddonFocus. This may be a bug in the game or another plugin hooking this method."); + Log.Error(e, "Caught exception from Dalamud when attempting to process OnAddonFocus."); } - - this.lifecycleService.InvokeListenersSafely(AddonEvent.PostFocus, this.focusArgs); } [Conditional("DEBUG")]