From 47de726b27021fc8625824da2f4981c56c1fde54 Mon Sep 17 00:00:00 2001 From: Sam Byass Date: Sat, 16 Mar 2024 16:39:20 -0700 Subject: [PATCH] Initial port to 1.4 --- 1.4/Assemblies/BetterLoading.dll | Bin 0 -> 92672 bytes 1.4/Assemblies/Tomlet.dll | Bin 0 -> 70144 bytes About/About.xml | 1 + LoadFolders.xml | 28 ++++---- Source/BetterLoading.csproj | 8 +-- Source/BetterLoadingConfig.cs | 3 + .../Stage/InitialLoad/3StageApplyPatches.cs | 4 +- .../7StageRunPostLoadPreFinalizeCallbacks.cs | 28 +++++--- .../InitialLoad/8StageRunStaticCctors.cs | 65 ++++++++++++++---- .../9StageRunPostFinalizeCallbacks.cs | 8 +-- Source/Utils.cs | 6 ++ 11 files changed, 107 insertions(+), 44 deletions(-) create mode 100644 1.4/Assemblies/BetterLoading.dll create mode 100644 1.4/Assemblies/Tomlet.dll diff --git a/1.4/Assemblies/BetterLoading.dll b/1.4/Assemblies/BetterLoading.dll new file mode 100644 index 0000000000000000000000000000000000000000..fbcca3f6d254b986cdf22477c9e11c371827dc0d GIT binary patch literal 92672 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 literal 0 HcmV?d00001 diff --git a/1.4/Assemblies/Tomlet.dll b/1.4/Assemblies/Tomlet.dll new file mode 100644 index 0000000000000000000000000000000000000000..a2dfea7d85c4106f628a63f17e6258be1556dc1b GIT binary patch literal 70144 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 T7h`|;`uA&s|3B{k%M|!O2(qjt literal 0 HcmV?d00001 diff --git a/About/About.xml b/About/About.xml index 3e5ddd9..e5ee1ad 100755 --- a/About/About.xml +++ b/About/About.xml @@ -9,6 +9,7 @@
  • 1.1
  • 1.2
  • 1.3
  • +
  • 1.4
  • Ludeon.RimWorld
  • diff --git a/LoadFolders.xml b/LoadFolders.xml index 1ed4d4d..a295e35 100644 --- a/LoadFolders.xml +++ b/LoadFolders.xml @@ -1,14 +1,18 @@ - -
  • 1.1-1.2
  • -
  • -
    - -
  • 1.1-1.2
  • -
  • -
    - -
  • 1.3
  • -
  • -
    + +
  • 1.1-1.2
  • +
  • +
    + +
  • 1.1-1.2
  • +
  • +
    + +
  • 1.3
  • +
  • +
    + +
  • 1.4
  • +
  • +
    \ No newline at end of file diff --git a/Source/BetterLoading.csproj b/Source/BetterLoading.csproj index 5b93658..0bed12d 100755 --- a/Source/BetterLoading.csproj +++ b/Source/BetterLoading.csproj @@ -9,12 +9,12 @@ true - ..\1.3\Assemblies\ - ..\1.3\Assemblies\ + ..\1.4\Assemblies\ + ..\1.4\Assemblies\ - ..\1.3\Assemblies\ - ..\1.3\Assemblies\ + ..\1.4\Assemblies\ + ..\1.4\Assemblies\ diff --git a/Source/BetterLoadingConfig.cs b/Source/BetterLoadingConfig.cs index d3f4864..44f3388 100644 --- a/Source/BetterLoadingConfig.cs +++ b/Source/BetterLoadingConfig.cs @@ -8,6 +8,9 @@ public class BetterLoadingConfig [TomlPrecedingComment("The TipCache caches information about loading screen tips so that they can be displayed as soon as the loading screen starts after the first run.")] public TipCacheConfig TipCache; + [TomlPrecedingComment("Enable verbose logging for BetterLoading. This is useful for debugging, but may slow down the game.")] + public bool VerboseLogging = false; + public BetterLoadingConfig() { TipCache = new(); diff --git a/Source/Stage/InitialLoad/3StageApplyPatches.cs b/Source/Stage/InitialLoad/3StageApplyPatches.cs index fde5575..e5dd682 100755 --- a/Source/Stage/InitialLoad/3StageApplyPatches.cs +++ b/Source/Stage/InitialLoad/3StageApplyPatches.cs @@ -102,11 +102,11 @@ public static void PreLoadPatches(ModContentPack __instance) BetterLoadingApi.DispatchChange(inst); } - public static void PostLoadPatches(List ___patches) + public static void PostLoadPatches(IEnumerable __result) { if (_hasFinished) return; - _numPatches = ___patches.Count; + _numPatches = __result.Count(); _currentPatch = 0; _loadingPatches = false; BetterLoadingApi.DispatchChange(inst); diff --git a/Source/Stage/InitialLoad/7StageRunPostLoadPreFinalizeCallbacks.cs b/Source/Stage/InitialLoad/7StageRunPostLoadPreFinalizeCallbacks.cs index 79df644..f141027 100755 --- a/Source/Stage/InitialLoad/7StageRunPostLoadPreFinalizeCallbacks.cs +++ b/Source/Stage/InitialLoad/7StageRunPostLoadPreFinalizeCallbacks.cs @@ -29,15 +29,21 @@ public StageRunPostLoadPreFinalizeCallbacks(Harmony instance) : base(instance) public override string GetStageName() { - return "Running Post Content Load Callbacks"; + return "Running Pre-Static-Constructor Long Events"; } public override string? GetCurrentStepName() { if (_currentAction == null) return "Waiting for tasks to start being processed..."; + + if(_currentAction is { Target: ModContentPack mcp, Method.Name: nameof(ModContentPack.ReloadContent) + "Int" }) + return $"Reloading content for {mcp.Name}"; - return (_currentAction.Method.DeclaringType?.FullName ?? "") + (_currentAction.Target != null ? $" ({_currentAction.Target})" : ""); + var methodDeclaringType = _currentAction.Method.DeclaringType?.FullName ?? ""; + var methodName = _currentAction.Method?.Name ?? ""; + var target = _currentAction.Target != null ? $"{_currentAction.Target}" : ""; + return $"{methodDeclaringType}::{methodName} (on instance {target})"; } public override bool IsCompleted() @@ -93,7 +99,13 @@ public static bool PreExecToExecWhenFinished(List ___toExecuteWhenFinish // Debug.Log($"BL Debug: types declared in PDL: {declaredInPDL.Select(a => a.Method).ToStringSafeEnumerable()}"); - var targetMethodName = VersionControl.CurrentMinor == 3 ? "b__4_3" : "b__4_2"; + var targetMethodName = VersionControl.CurrentMinor switch + { + 2 => "b__4_2", + 3 => "b__4_3", + 4 => "b__4_5", + _ => throw new ArgumentOutOfRangeException() + }; // Log.Message($"BL Debug: Tasks defined in PDL: {string.Join(", ", declaredInPDL.Select(task => task.Method.FullDescription()))}"); @@ -135,20 +147,18 @@ public static bool PreExecToExecWhenFinished(List ___toExecuteWhenFinish LongEventHandler.QueueLongEvent(() => { // Log.Message("[BetterLoading] Blocking loading screen from being dismissed until post-load actions are complete."); - Thread.Sleep(1000); + Thread.Sleep(0); while (!_finishedExecuting) { - Thread.Sleep(200); //Wait + Thread.Sleep(0); //Wait } Log.Message($"[BetterLoading] Obtained synclock, assuming post-load actions are complete and starting static constructors."); + + _done = true; runStaticCtors(); - - Thread.Sleep(0); - - _done = true; }, null, false, null); return false; diff --git a/Source/Stage/InitialLoad/8StageRunStaticCctors.cs b/Source/Stage/InitialLoad/8StageRunStaticCctors.cs index 26c8334..b4f49e7 100755 --- a/Source/Stage/InitialLoad/8StageRunStaticCctors.cs +++ b/Source/Stage/InitialLoad/8StageRunStaticCctors.cs @@ -5,6 +5,7 @@ using System.Runtime.CompilerServices; using System.Threading; using HarmonyLib; +using RimWorld; using UnityEngine; using Verse; @@ -29,11 +30,14 @@ public StageRunStaticCctors(Harmony instance) : base(instance) public override string GetStageName() { - return "Finalizing Mods"; + return "Executing Static Constructors"; } public override string? GetCurrentStepName() { + if((_numRun == (_toRun?.Count ?? 1)) && !_finishedProcessing) + return VersionControl.CurrentMinor == 4 ? "Baking static atlases and cleaning up" : "Cleaning up..."; + var result = _modType?.FullName ?? "Waiting..."; if (HasError()) result = $"WARNING: An error has occurred previously, now processing {result}"; @@ -53,13 +57,24 @@ public override int GetMaximumProgress() public override bool IsCompleted() { - return _numRun == _toRun?.Count; + return _numRun == _toRun?.Count && _finishedProcessing; } public override void DoPatching(Harmony instance) { - instance.Patch(AccessTools.Method(typeof(StaticConstructorOnStartupUtility), nameof(StaticConstructorOnStartupUtility.CallAll)), new(typeof(StageRunStaticCctors), nameof(PreCallAll))); - // instance.Patch(AccessTools.Method(typeof(RuntimeHelpers), nameof(RuntimeHelpers.RunClassConstructor), new []{typeof(RuntimeTypeHandle)}), new HarmonyMethod(typeof(StageRunStaticCctors), nameof(PreRunClassConstructor))); + if (VersionControl.CurrentMinor == 4) + { + //1.4, we need to patch the entire b__4_5 method and make it not run, instead of just CallAll, because there's 2 other method calls in that anon method which we don't wanna do until after static constructors + var anonType = typeof(PlayDataLoader).GetNestedTypes(AccessTools.all).First(t => t.Name.Contains("<>")); + var method = AccessTools.Method(anonType, "b__4_5"); + instance.Patch(method, new HarmonyMethod(typeof(StageRunStaticCctors), nameof(PreCallAll))); + } + else + { + //Pre-1.4, we can just patch CallAll + instance.Patch(AccessTools.Method(typeof(StaticConstructorOnStartupUtility), nameof(StaticConstructorOnStartupUtility.CallAll)), new(typeof(StageRunStaticCctors), nameof(PreCallAll))); + // instance.Patch(AccessTools.Method(typeof(RuntimeHelpers), nameof(RuntimeHelpers.RunClassConstructor), new []{typeof(RuntimeTypeHandle)}), new HarmonyMethod(typeof(StageRunStaticCctors), nameof(PreRunClassConstructor))); + } } public override bool HasError() @@ -74,7 +89,7 @@ public override void BecomeActive() var patches = Harmony.GetPatchInfo(AccessTools.Method(typeof(StaticConstructorOnStartupUtility), nameof(StaticConstructorOnStartupUtility.CallAll))); //We register a prefix, others may have a postfix which will run on a background thread (probably not what they want) - if (patches.Postfixes.Count > 0) + if (patches?.Postfixes?.Count > 0) { Log.Warning("[BetterLoading] One or more mods have Harmony-Postfixed StaticConstructorOnStartupUtility#CallAll. This is likely to cause errors or undesired behavior, as BetterLoading changes this method to be called from another Thread than the UI one. A list of patches follows."); Log.Warning("[BetterLoading] In addition, when BetterLoading is installed, this postfix will run before any static constructors do, so it likely will not behave as the modder intended anyway."); @@ -95,8 +110,10 @@ public static IEnumerator StaticConstructAll() throw new InvalidOperationException("StaticConstructAll called before _queue was set!"); GlobalTimingData.TicksStartedCctors = DateTime.UtcNow.Ticks; - Log.Message("[BetterLoading] Starting Antifreeze(tm) StaticConstructorCaller. Synchronizing retransmission chronicity..."); + Log.Message("[BetterLoading] Starting StaticConstructAll() to run class constructors without freezing the game..."); + Utils.DebugLog($"Going to run class constructor on {_toRun.Count} types"); Application.runInBackground = true; + foreach (var type in _toRun) { try @@ -117,12 +134,13 @@ public static IEnumerator StaticConstructAll() yield return null; } - Application.runInBackground = Prefs.RunInBackground; - try { Log.Message("[BetterLoading] Finished calling static constructors at " + DateTime.Now.ToLongTimeString() + "."); var existing = LongEventHandlerMirror.ToExecuteWhenFinished; + + Utils.DebugLog($"Finished running class constructors. ToExecuteWhenFinished length (tasks added as a result of calling QueueLongEvent while running static cctors) is {existing.Count}, " + + $"_queue length is {_queue.Count}"); // Log.Message($"[BetterLoading] Restoring original job queue of {_queue.Count} item/s and merging with any just added (looking at you, Fluffy) ({existing.Count} entries have been added)."); if (existing.Count > 0 && _queue.Count == 0) @@ -148,6 +166,14 @@ public static IEnumerator StaticConstructAll() // Log.Message($"[BetterLoading] Job queue restored. Running GC..."); StaticConstructorOnStartupUtility.coreStaticAssetsLoaded = true; + + var isOnePointFour = VersionControl.CurrentMajor == 1 && VersionControl.CurrentMinor == 4; + if (isOnePointFour) + { + Utils.DebugLog("1.4 detected, calling BakeStaticAtlases"); + GlobalTextureAtlasManager.BakeStaticAtlases(); + Utils.DebugLog("BakeStaticAtlases finished"); + } GC.Collect(int.MaxValue, GCCollectionMode.Forced); //Copied from PlayDataLoader @@ -161,32 +187,45 @@ public static IEnumerator StaticConstructAll() { StageRunPostFinalizeCallbacks.ShouldInterceptNext = true; _finishedProcessing = true; + Application.runInBackground = Prefs.RunInBackground; // Log.Message("[BetterLoading] Lock released."); } } public static bool PreCallAll() { - // Log.Message("Static constructors? Oh, sit down, vanilla, I'll do it myself. Starting now, at " + DateTime.Now.ToLongTimeString(), true); _toRun = GenTypes.AllTypesWithAttribute().ToList(); - BetterLoadingMain.LoadingScreen!.StartCoroutine(StaticConstructAll()); - // Log.Message("[BetterLoading] Overriding LongEventHandler's toExecuteWhenFinished", true); var result = LongEventHandlerMirror.ToExecuteWhenFinished; + + Utils.DebugLog($"Harmony prefix on StaticConstructorOnStartupUtility.CallAll() called. Found {_toRun.Count} types with StaticConstructorOnStartup attribute, and {result.Count} actions in ToExecuteWhenFinished."); + if (BetterLoadingConfigManager.Config.VerboseLogging) + { + Utils.DebugLog("Entries in ToExecuteWhenFinished:"); + result.ForEach(action => Utils.DebugLog($" - {action.Method.DeclaringType?.Name} :: {action.Method.Name} ({action.Method.DeclaringType})")); + Utils.DebugLog("End of ToExecuteWhenFinished entries"); + } // Log.Message($"[BetterLoading] Got list of pending actions: {result}. Removing up to and including the static constructor call...", true); - var staticCallIdx = result.FindIndex(i => i.Method.DeclaringType?.Name == "PlayDataLoader" && i.Method.Name.Contains("m__2")); + var isOnePointFour = VersionControl.CurrentMajor == 1 && VersionControl.CurrentMinor == 4; + var methodNameSubstring = isOnePointFour ? "b__4_5" : "m__2"; + var staticCallIdx = result.FindIndex(i => i.Method.DeclaringType?.DeclaringType?.Name == nameof(PlayDataLoader) && i.Method.Name.Contains(methodNameSubstring)); // Log.Message($"[BetterLoading] (Which is at index {staticCallIdx} of {result.Count})", true); + + Utils.DebugLog($"PlayDataLoader static constructor call index is at position {staticCallIdx} of {result.Count} in the queue. Everything before this will be removed, and the remaining tasks saved"); result = result.Skip(staticCallIdx + 1).Take(int.MaxValue).ToList(); //Remove the static constructor call _queue = result; + + Utils.DebugLog($"After removing the static constructor call, the queue has {result.Count} items. Saving this for later."); + + BetterLoadingMain.LoadingScreen!.StartCoroutine(StaticConstructAll()); - // Log.Message($"[BetterLoading] Updating field in LEH to a new list of size {result.Count}...", true); LongEventHandlerMirror.ToExecuteWhenFinished = new(); LongEventHandler.QueueLongEvent(WaitForStaticCtors, null, true, null); diff --git a/Source/Stage/InitialLoad/9StageRunPostFinalizeCallbacks.cs b/Source/Stage/InitialLoad/9StageRunPostFinalizeCallbacks.cs index 9272ecd..5a79c67 100755 --- a/Source/Stage/InitialLoad/9StageRunPostFinalizeCallbacks.cs +++ b/Source/Stage/InitialLoad/9StageRunPostFinalizeCallbacks.cs @@ -27,7 +27,7 @@ public StageRunPostFinalizeCallbacks(Harmony instance) : base(instance) public override string GetStageName() { - return "Running Post-Finalize Callbacks"; + return "Running Post-Static-Constructor Long Events"; } public override string? GetCurrentStepName() @@ -110,24 +110,24 @@ public static bool PreExecToExecWhenFinished(List ___toExecuteWhenFinish { if (initialNumTasksToRun != _numTasksToRun) Log.Message($"[BetterLoading] Processed an additional {_numTasksToRun - initialNumTasksToRun} post-finalize tasks."); + GlobalTimingData.TicksFinishedPostFinalize = DateTime.UtcNow.Ticks; _finishedExecuting = true; }) ); LongEventHandler.QueueLongEvent(() => { - Thread.Sleep(500); + Thread.Sleep(0); // Log.Message("[BetterLoading] Blocking loading screen from being dismissed until post-finalize actions are complete."); while (!_finishedExecuting) { - Thread.Sleep(500); //Wait + Thread.Sleep(0); //Wait } Log.Message("[BetterLoading] Obtained lock, assuming we're done with post-finalize."); Thread.Sleep(0); - GlobalTimingData.TicksFinishedPostFinalize = DateTime.UtcNow.Ticks; _finishedExecuting = true; }, null, true, null); diff --git a/Source/Utils.cs b/Source/Utils.cs index dada7c1..4a82b82 100755 --- a/Source/Utils.cs +++ b/Source/Utils.cs @@ -27,5 +27,11 @@ public static bool HarmonyPatchCancelMethod() { return false; } + + public static void DebugLog(string message) + { + if (BetterLoadingConfigManager.Config.VerboseLogging) + Verse.Log.Message($"[BetterLoading Verbose] {message}"); + } } } \ No newline at end of file