From fcee4d13da6bdcb8ac49552110115672450bbdc4 Mon Sep 17 00:00:00 2001 From: Tianyi Cao Date: Wed, 7 Feb 2024 20:01:49 -0800 Subject: [PATCH] Fix crash during call to CommonMonitor.SetCharacterSlot --- AquaMai/Fix/FixCharaCrash.cs | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/AquaMai/Fix/FixCharaCrash.cs b/AquaMai/Fix/FixCharaCrash.cs index 02407fe8..87d9c60b 100644 --- a/AquaMai/Fix/FixCharaCrash.cs +++ b/AquaMai/Fix/FixCharaCrash.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using HarmonyLib; using Process; using Util; @@ -5,24 +7,32 @@ using Util; namespace AquaMai.Fix { /** - * Fix character selection crashing because get map color returns null + * Fix character selection crashing due to missing character data */ - public class FixCharaCrash - { + public class FixCharaCrash { // Check if the return is null. If it is, make up a color [HarmonyPostfix] [HarmonyPatch(typeof(CharacterSelectProces), "GetMapColorData")] - public static void GetMapColorData(ref CharacterSelectProces __instance, ref CharacterMapColorData __result) - { - if (__result != null) return; - + public static void GetMapColorData(ref CharacterSelectProces __instance, ref CharacterMapColorData __result) { + if (__result != null) + return; + // 1 is a color that definitely exists - if (MapMaster.GetSlotData(1) == null) - { + if (MapMaster.GetSlotData(1) == null) { MapMaster.GetSlotData(1).Load(); } __result = MapMaster.GetSlotData(1); } - + + [HarmonyPrefix] + [HarmonyPatch(typeof(Monitor.CommonMonitor), "SetCharacterSlot", new Type[] { typeof(MessageCharactorInfomationData) })] + public static bool SetCharacterSlot(ref MessageCharactorInfomationData data, Dictionary ____characterSlotData) { + if (!____characterSlotData.ContainsKey(data.MapKey)) { + Console.Log($"Could not get CharacterSlotData for character [Index={data.Index}, MapKey={data.MapKey}], ignoring..."); + return false; + } + + return true; + } } -} \ No newline at end of file +}