Skip to content

Commit

Permalink
Patch time correction and BZ.EXP Sentry fix
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
MrPurple6411 committed May 12, 2021
1 parent e9317ec commit 94c24ea
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 24 deletions.
Binary file added Dependencies/BZ.EXP/Sentry.dll
Binary file not shown.
11 changes: 1 addition & 10 deletions QModManager/Patching/Initializer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,7 @@ internal Initializer(QModGame currentlyRunningGame)
currentGame = currentlyRunningGame;
}

internal void InitializeMods(List<QMod> 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<QMod> modsToInitialize, PatchingOrder order)
internal void InitializeMods(List<QMod> modsToInitialize, PatchingOrder order)
{
foreach (QMod mod in modsToInitialize)
{
Expand Down
4 changes: 4 additions & 0 deletions QModManager/QModManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,10 @@
<HintPath>..\Dependencies\$(Configuration)\Newtonsoft.Json.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Sentry">
<HintPath>..\Dependencies\$(Configuration)\Sentry.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System" />
<Reference Include="UnityEngine">
<HintPath>..\Dependencies\$(Configuration)\UnityEngine.dll</HintPath>
Expand Down
68 changes: 55 additions & 13 deletions QModPluginEmulator/QModPluginGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using TypeloaderCache = System.Collections.Generic.Dictionary<string, BepInEx.Bootstrap.CachedAssembly<BepInEx.PluginInfo>>;
using QMMAssemblyCache = System.Collections.Generic.Dictionary<string, long>;
using QModManager.API.ModLoading;
using System.Collections;

namespace QModManager
{
Expand All @@ -42,7 +43,9 @@ public static class QModPluginGenerator
internal static Dictionary<string, QMod> QModsToLoadById;
internal static Dictionary<string, PluginInfo> QModPluginInfos;
internal static List<PluginInfo> InitialisedQModPlugins;

private static Initializer Initializer;
private static List<QMod> ModsToLoad;
private static Harmony Harmony;
internal static IVersionParser VersionParserService { get; set; } = new VersionParser();

private static TypeloaderCache PluginCache;
Expand All @@ -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)
{
Expand All @@ -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
Expand Down Expand Up @@ -224,6 +265,7 @@ private static TypeloaderCache GetPluginCache()
[Obsolete("Should not be used!", true)]
public static void TypeLoaderFindPluginTypesPostfix(ref Dictionary<string, List<PluginInfo>> __result, string directory)
{
Harmony.PatchAll(typeof(QModPluginGenerator));
if (directory != Paths.PluginPath)
return;

Expand Down
6 changes: 5 additions & 1 deletion Unit Tests/ModLoadingSimulationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit 94c24ea

Please sign in to comment.