Browse Source

Load preloader log data into chainloader logs

Bepis 5 years ago
parent
commit
6ee2284f44
2 changed files with 42 additions and 2 deletions
  1. 19 0
      BepInEx.Preloader/Preloader.cs
  2. 23 2
      BepInEx/Bootstrap/Chainloader.cs

+ 19 - 0
BepInEx.Preloader/Preloader.cs

@@ -8,6 +8,7 @@ using BepInEx.Configuration;
 using BepInEx.Logging;
 using BepInEx.Preloader.Patching;
 using BepInEx.Preloader.RuntimeFixes;
+using HarmonyLib;
 using Mono.Cecil;
 using Mono.Cecil.Cil;
 using MonoMod.RuntimeDetour;
@@ -198,10 +199,28 @@ namespace BepInEx.Preloader
 
 					il.InsertBefore(ins,
 						il.Create(OpCodes.Ldnull)); // gameExePath (always null, we initialize the Paths class in Entrypoint
+
 					il.InsertBefore(ins,
 						il.Create(OpCodes.Ldc_I4_0)); //startConsole (always false, we already load the console in Preloader)
+
+					il.InsertBefore(ins,
+						il.Create(OpCodes.Ldnull)); // preloaderLogEvents (load from Preloader.PreloaderLog.LogEvents)
+
+					Logger.LogDebug("1");
+
+					il.InsertBefore(ins,
+						il.Create(OpCodes.Call, assembly.MainModule.ImportReference(
+							AccessTools.PropertyGetter(typeof(Preloader), nameof(PreloaderLog)))));
+
+					Logger.LogDebug("2");
+
+					il.InsertBefore(ins,
+						il.Create(OpCodes.Call, assembly.MainModule.ImportReference(
+							AccessTools.PropertyGetter(typeof(PreloaderConsoleListener), nameof(PreloaderConsoleListener.LogEvents)))));
+
 					il.InsertBefore(ins,
 						il.Create(OpCodes.Call, initMethod)); // Chainloader.Initialize(string gamePath, string managedPath = null, bool startConsole = true)
+
 					il.InsertBefore(ins,
 						il.Create(OpCodes.Call, startMethod));
 				}

+ 23 - 2
BepInEx/Bootstrap/Chainloader.cs

@@ -33,7 +33,7 @@ namespace BepInEx.Bootstrap
 				lock (_plugins)
 				{
 					_plugins.RemoveAll(x => x == null);
-					return _plugins;
+					return _plugins.ToList();
 				}
 			}
 		}
@@ -52,7 +52,7 @@ namespace BepInEx.Bootstrap
 		/// <summary>
 		/// Initializes BepInEx to be able to start the chainloader.
 		/// </summary>
-		public static void Initialize(string gameExePath, bool startConsole = true)
+		public static void Initialize(string gameExePath, bool startConsole = true, ICollection<LogEventArgs> preloaderLogEvents = null)
 		{
 			if (_initialized)
 				return;
@@ -96,6 +96,27 @@ namespace BepInEx.Bootstrap
 				Logger.Sources.Add(new UnityLogSource());
 
 
+			// Temporarily disable the console log listener as we replay the preloader logs
+
+			var logListener = Logger.Listeners.FirstOrDefault(logger => logger is ConsoleLogListener);
+			
+			if (logListener != null)
+				Logger.Listeners.Remove(logListener);
+
+			var preloaderLogSource = Logger.CreateLogSource("Preloader");
+
+			foreach (var preloaderLogEvent in preloaderLogEvents)
+			{
+				preloaderLogSource.Log(preloaderLogEvent.Level, preloaderLogEvent.Data);
+			}
+
+			Logger.Sources.Remove(preloaderLogSource);
+
+			if (logListener != null)
+				Logger.Listeners.Add(logListener);
+
+
+
 			Logger.LogMessage("Chainloader ready");
 
 			_initialized = true;