From 94c24eaa9c71c38a530819802ac38ea8444e5804 Mon Sep 17 00:00:00 2001 From: MrPurple6411 Date: Tue, 11 May 2021 20:01:27 -0600 Subject: [PATCH] Patch time correction and BZ.EXP Sentry fix Moved Meta Pre and Pre patching to first game loading points. Moved Normal and later to after Platform Initialize for Subnautica and after Sprite Resource load for BZ Fixed BZ.EXP SentrySDK missing method exception as the SentrySDK got moved out of firstpass. --- Dependencies/BZ.EXP/Sentry.dll | Bin 0 -> 22016 bytes QModManager/Patching/Initializer.cs | 11 +--- QModManager/QModManager.csproj | 4 ++ QModPluginEmulator/QModPluginGenerator.cs | 68 +++++++++++++++++----- Unit Tests/ModLoadingSimulationTests.cs | 6 +- 5 files changed, 65 insertions(+), 24 deletions(-) create mode 100644 Dependencies/BZ.EXP/Sentry.dll diff --git a/Dependencies/BZ.EXP/Sentry.dll b/Dependencies/BZ.EXP/Sentry.dll new file mode 100644 index 0000000000000000000000000000000000000000..802fd48d6eb465ba71ad10c109261049723af020 GIT binary patch literal 22016 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 modsToInitialize) - { - InitializeMods(modsToInitialize, PatchingOrder.MetaPreInitialize); - InitializeMods(modsToInitialize, PatchingOrder.PreInitialize); - InitializeMods(modsToInitialize, PatchingOrder.NormalInitialize); - InitializeMods(modsToInitialize, PatchingOrder.PostInitialize); - InitializeMods(modsToInitialize, PatchingOrder.MetaPostInitialize); - } - - private void InitializeMods(List modsToInitialize, PatchingOrder order) + internal void InitializeMods(List modsToInitialize, PatchingOrder order) { foreach (QMod mod in modsToInitialize) { diff --git a/QModManager/QModManager.csproj b/QModManager/QModManager.csproj index 03530d82..697fdd42 100644 --- a/QModManager/QModManager.csproj +++ b/QModManager/QModManager.csproj @@ -78,6 +78,10 @@ ..\Dependencies\$(Configuration)\Newtonsoft.Json.dll False + + ..\Dependencies\$(Configuration)\Sentry.dll + False + ..\Dependencies\$(Configuration)\UnityEngine.dll diff --git a/QModPluginEmulator/QModPluginGenerator.cs b/QModPluginEmulator/QModPluginGenerator.cs index 74deaa79..74fd9e1d 100644 --- a/QModPluginEmulator/QModPluginGenerator.cs +++ b/QModPluginEmulator/QModPluginGenerator.cs @@ -20,6 +20,7 @@ using TypeloaderCache = System.Collections.Generic.Dictionary>; using QMMAssemblyCache = System.Collections.Generic.Dictionary; using QModManager.API.ModLoading; +using System.Collections; namespace QModManager { @@ -42,7 +43,9 @@ public static class QModPluginGenerator internal static Dictionary QModsToLoadById; internal static Dictionary QModPluginInfos; internal static List InitialisedQModPlugins; - + private static Initializer Initializer; + private static List ModsToLoad; + private static Harmony Harmony; internal static IVersionParser VersionParserService { get; set; } = new VersionParser(); private static TypeloaderCache PluginCache; @@ -53,11 +56,11 @@ public static void Finish() try { PluginCache = GetPluginCache(); - var harmony = new Harmony("QModManager.QModPluginGenerator"); - harmony.Patch( + Harmony = new Harmony("QModManager.QModPluginGenerator"); + Harmony.Patch( typeof(TypeLoader).GetMethod(nameof(TypeLoader.FindPluginTypes)).MakeGenericMethod(typeof(PluginInfo)), postfix: new HarmonyMethod(typeof(QModPluginGenerator).GetMethod(nameof(TypeLoaderFindPluginTypesPostfix)))); - harmony.PatchAll(typeof(QModPluginGenerator)); + } catch (Exception ex) { @@ -68,24 +71,62 @@ public static void Finish() } #if SUBNAUTICA_STABLE - [HarmonyPatch(typeof(PlatformUtils), nameof(PlatformUtils.PlatformInitAsync))] - [HarmonyPostfix] + [HarmonyPatch(typeof(SystemsSpawner), nameof(SystemsSpawner.Awake))] #else [HarmonyPatch(typeof(PreStartScreen), nameof(PreStartScreen.Start))] - [HarmonyPrefix] #endif - private static void InitializeQMM() + [HarmonyPrefix] + private static void PreInitializeQMM() { Patcher.Patch(); // Run QModManager patch - var modsToLoad = QModsToLoad.ToList(); - var initializer = new Initializer(Patcher.CurrentlyRunningGame); + ModsToLoad = QModsToLoad.ToList(); + Initializer = new Initializer(Patcher.CurrentlyRunningGame); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.MetaPreInitialize); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.PreInitialize); + + Harmony.Patch( + AccessTools.Method( +#if SUBNAUTICA + typeof(PlatformUtils), nameof(PlatformUtils.PlatformInitAsync) +#elif BELOWZERO + typeof(SpriteManager), nameof(SpriteManager.OnLoadedSpriteAtlases) +#endif + ), postfix: new HarmonyMethod(AccessTools.Method(typeof(QModPluginGenerator), nameof(QModPluginGenerator.InitializeQMM)))); + } + +#if SUBNAUTICA + private static void InitializeQMM(IEnumerator __result) + { + if(ModsToLoad != null) + { + //Had to add this as Postfixes do not seem to run at the end of coroutines but at the first yield return. + while(__result.MoveNext()) + { + + } + Initializer.InitializeMods(ModsToLoad, PatchingOrder.NormalInitialize); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.PostInitialize); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.MetaPostInitialize); - initializer.InitializeMods(modsToLoad); + SummaryLogger.ReportIssues(ModsToLoad); + SummaryLogger.LogSummaries(ModsToLoad); + } + } +#elif BELOWZERO + private static void InitializeQMM() + { + if(ModsToLoad != null) + { + Initializer.InitializeMods(ModsToLoad, PatchingOrder.NormalInitialize); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.PostInitialize); + Initializer.InitializeMods(ModsToLoad, PatchingOrder.MetaPostInitialize); - SummaryLogger.ReportIssues(modsToLoad); - SummaryLogger.LogSummaries(modsToLoad); + SummaryLogger.ReportIssues(ModsToLoad); + SummaryLogger.LogSummaries(ModsToLoad); + } } +#endif private static string[] QMMKnownAssemblyPaths = new[] { #if !SUBNAUTICA_STABLE @@ -224,6 +265,7 @@ private static TypeloaderCache GetPluginCache() [Obsolete("Should not be used!", true)] public static void TypeLoaderFindPluginTypesPostfix(ref Dictionary> __result, string directory) { + Harmony.PatchAll(typeof(QModPluginGenerator)); if (directory != Paths.PluginPath) return; diff --git a/Unit Tests/ModLoadingSimulationTests.cs b/Unit Tests/ModLoadingSimulationTests.cs index 789e1945..42fbe375 100644 --- a/Unit Tests/ModLoadingSimulationTests.cs +++ b/Unit Tests/ModLoadingSimulationTests.cs @@ -55,7 +55,11 @@ public void InitializeMods_MethodsInvoked() TestPatchClass.Reset(); var initializer = new Initializer(QModGame.Subnautica); - initializer.InitializeMods(list); + initializer.InitializeMods(list, PatchingOrder.MetaPreInitialize); + initializer.InitializeMods(list, PatchingOrder.PreInitialize); + initializer.InitializeMods(list, PatchingOrder.NormalInitialize); + initializer.InitializeMods(list, PatchingOrder.PostInitialize); + initializer.InitializeMods(list, PatchingOrder.MetaPostInitialize); Assert.AreEqual(ModStatus.Success, list[0].Status);