From fcee4d13da6bdcb8ac49552110115672450bbdc4 Mon Sep 17 00:00:00 2001 From: Tianyi Cao Date: Wed, 7 Feb 2024 20:01:49 -0800 Subject: [PATCH 1/3] 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 +} From cc1a91e5cde9ea6f7b7692a092517c53f02b6a0e Mon Sep 17 00:00:00 2001 From: Tianyi Cao Date: Wed, 7 Feb 2024 20:04:15 -0800 Subject: [PATCH 2/3] Update and restore unintentionally-changed formatting --- AquaMai/Fix/FixCharaCrash.cs | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/AquaMai/Fix/FixCharaCrash.cs b/AquaMai/Fix/FixCharaCrash.cs index 87d9c60b..2ef9c4df 100644 --- a/AquaMai/Fix/FixCharaCrash.cs +++ b/AquaMai/Fix/FixCharaCrash.cs @@ -9,16 +9,18 @@ namespace AquaMai.Fix /** * 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); @@ -26,8 +28,10 @@ namespace AquaMai.Fix [HarmonyPrefix] [HarmonyPatch(typeof(Monitor.CommonMonitor), "SetCharacterSlot", new Type[] { typeof(MessageCharactorInfomationData) })] - public static bool SetCharacterSlot(ref MessageCharactorInfomationData data, Dictionary ____characterSlotData) { - if (!____characterSlotData.ContainsKey(data.MapKey)) { + 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; } From f76a027b3208e78ecacb3b6ff94b2af1e90ca6ff Mon Sep 17 00:00:00 2001 From: Tianyi Cao Date: Wed, 7 Feb 2024 20:08:33 -0800 Subject: [PATCH 3/3] add a few more comments --- AquaMai/Fix/FixCharaCrash.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/AquaMai/Fix/FixCharaCrash.cs b/AquaMai/Fix/FixCharaCrash.cs index 2ef9c4df..36d58b3f 100644 --- a/AquaMai/Fix/FixCharaCrash.cs +++ b/AquaMai/Fix/FixCharaCrash.cs @@ -26,10 +26,12 @@ namespace AquaMai.Fix __result = MapMaster.GetSlotData(1); } + // This is called when loading the music selection screen, to display characters on the top screen [HarmonyPrefix] [HarmonyPatch(typeof(Monitor.CommonMonitor), "SetCharacterSlot", new Type[] { typeof(MessageCharactorInfomationData) })] public static bool SetCharacterSlot(ref MessageCharactorInfomationData data, Dictionary ____characterSlotData) { + // Some characters are not found in this dictionary. We simply skip loading those characters if (!____characterSlotData.ContainsKey(data.MapKey)) { Console.Log($"Could not get CharacterSlotData for character [Index={data.Index}, MapKey={data.MapKey}], ignoring...");