fix: catch more exceptions in hooks

This commit is contained in:
Anna 2021-04-18 12:32:55 -04:00
parent 4f7d0930f2
commit 63f75a65ad
Signed by: anna
GPG Key ID: 0B391D8F06FCD9E0
2 changed files with 27 additions and 8 deletions

View File

@ -55,11 +55,22 @@ namespace XivCommon.Functions {
this.AddBattleTalkHook?.Dispose(); 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) { 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 rawSender = Util.ReadTerminated(senderPtr);
var rawMessage = Util.ReadTerminated(messagePtr); var rawMessage = Util.ReadTerminated(messagePtr);
@ -75,7 +86,7 @@ namespace XivCommon.Functions {
try { try {
this.OnBattleTalk?.Invoke(ref sender, ref message, ref options, ref handled); this.OnBattleTalk?.Invoke(ref sender, ref message, ref options, ref handled);
} catch (Exception ex) { } catch (Exception ex) {
PluginLog.Log(ex, "Exception in BattleTalk detour"); PluginLog.Log(ex, "Exception in BattleTalk event");
} }
if (handled) { if (handled) {

View File

@ -62,10 +62,20 @@ namespace XivCommon.Functions {
private void AddonTalkV45Detour(IntPtr addon, IntPtr a2, IntPtr data) { private void AddonTalkV45Detour(IntPtr addon, IntPtr a2, IntPtr data) {
if (this.OnTalk == null) { if (this.OnTalk == null) {
this.AddonTalkV45Hook!.Original(addon, a2, data); goto Return;
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 rawName = Util.ReadTerminated(Marshal.ReadIntPtr(data + NameOffset + 8));
var rawText = Util.ReadTerminated(Marshal.ReadIntPtr(data + TextOffset + 8)); var rawText = Util.ReadTerminated(Marshal.ReadIntPtr(data + TextOffset + 8));
var style = (TalkStyle) Marshal.ReadByte(data + StyleOffset); var style = (TalkStyle) Marshal.ReadByte(data + StyleOffset);
@ -76,7 +86,7 @@ namespace XivCommon.Functions {
try { try {
this.OnTalk?.Invoke(ref name, ref text, ref style); this.OnTalk?.Invoke(ref name, ref text, ref style);
} catch (Exception ex) { } catch (Exception ex) {
PluginLog.LogError(ex, "Exception in Talk detour"); PluginLog.LogError(ex, "Exception in Talk event");
} }
var newName = name.Encode().Terminate(); var newName = name.Encode().Terminate();
@ -90,8 +100,6 @@ namespace XivCommon.Functions {
this.SetAtkValueString(data + TextOffset, (IntPtr) textPtr); this.SetAtkValueString(data + TextOffset, (IntPtr) textPtr);
} }
} }
this.AddonTalkV45Hook!.Original(addon, a2, data);
} }
} }