From 63f75a65ad037e9f13704c09a16cb1ff185eab83 Mon Sep 17 00:00:00 2001 From: Anna Clemens Date: Sun, 18 Apr 2021 12:32:55 -0400 Subject: [PATCH] fix: catch more exceptions in hooks --- XivCommon/Functions/BattleTalk.cs | 17 ++++++++++++++--- XivCommon/Functions/Talk.cs | 18 +++++++++++++----- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/XivCommon/Functions/BattleTalk.cs b/XivCommon/Functions/BattleTalk.cs index 0c2bd1e..89b0e2a 100755 --- a/XivCommon/Functions/BattleTalk.cs +++ b/XivCommon/Functions/BattleTalk.cs @@ -55,11 +55,22 @@ namespace XivCommon.Functions { this.AddBattleTalkHook?.Dispose(); } - private unsafe byte AddBattleTalkDetour(IntPtr uiModule, IntPtr senderPtr, IntPtr messagePtr, float duration, byte style) { + private byte AddBattleTalkDetour(IntPtr uiModule, IntPtr senderPtr, IntPtr messagePtr, float duration, byte style) { if (this.OnBattleTalk == null) { - return this.AddBattleTalkHook!.Original(uiModule, senderPtr, messagePtr, duration, style); + goto Return; } + try { + return this.AddBattleTalkDetourInner(uiModule, senderPtr, messagePtr, duration, style); + } catch (Exception ex) { + PluginLog.LogError(ex, "Exception in BattleTalk detour"); + } + + Return: + return this.AddBattleTalkHook!.Original(uiModule, senderPtr, messagePtr, duration, style); + } + + private unsafe byte AddBattleTalkDetourInner(IntPtr uiModule, IntPtr senderPtr, IntPtr messagePtr, float duration, byte style) { var rawSender = Util.ReadTerminated(senderPtr); var rawMessage = Util.ReadTerminated(messagePtr); @@ -75,7 +86,7 @@ namespace XivCommon.Functions { try { this.OnBattleTalk?.Invoke(ref sender, ref message, ref options, ref handled); } catch (Exception ex) { - PluginLog.Log(ex, "Exception in BattleTalk detour"); + PluginLog.Log(ex, "Exception in BattleTalk event"); } if (handled) { diff --git a/XivCommon/Functions/Talk.cs b/XivCommon/Functions/Talk.cs index 3f370c2..a28f387 100755 --- a/XivCommon/Functions/Talk.cs +++ b/XivCommon/Functions/Talk.cs @@ -62,10 +62,20 @@ namespace XivCommon.Functions { private void AddonTalkV45Detour(IntPtr addon, IntPtr a2, IntPtr data) { if (this.OnTalk == null) { - this.AddonTalkV45Hook!.Original(addon, a2, data); - return; + goto Return; } + try { + this.AddonTalkV45DetourInner(data); + } catch (Exception ex) { + PluginLog.LogError(ex, "Exception in Talk detour"); + } + + Return: + this.AddonTalkV45Hook!.Original(addon, a2, data); + } + + private void AddonTalkV45DetourInner(IntPtr data) { var rawName = Util.ReadTerminated(Marshal.ReadIntPtr(data + NameOffset + 8)); var rawText = Util.ReadTerminated(Marshal.ReadIntPtr(data + TextOffset + 8)); var style = (TalkStyle) Marshal.ReadByte(data + StyleOffset); @@ -76,7 +86,7 @@ namespace XivCommon.Functions { try { this.OnTalk?.Invoke(ref name, ref text, ref style); } catch (Exception ex) { - PluginLog.LogError(ex, "Exception in Talk detour"); + PluginLog.LogError(ex, "Exception in Talk event"); } var newName = name.Encode().Terminate(); @@ -90,8 +100,6 @@ namespace XivCommon.Functions { this.SetAtkValueString(data + TextOffset, (IntPtr) textPtr); } } - - this.AddonTalkV45Hook!.Original(addon, a2, data); } }