diff --git a/Assembly-CSharp/ModHooksGlobalSettings.cs b/Assembly-CSharp/ModHooksGlobalSettings.cs index 12ab9fc7..3f005942 100644 --- a/Assembly-CSharp/ModHooksGlobalSettings.cs +++ b/Assembly-CSharp/ModHooksGlobalSettings.cs @@ -76,5 +76,10 @@ public class ModHooksGlobalSettings /// Maximum number of days to preserve modlogs for. /// public int ModlogMaxAge = 7; + + /// + /// Path to load mods from, or null for default ([game folder]/Managed/Mods). + /// + public string ModsFolder = null; } } diff --git a/Assembly-CSharp/ModLoader.cs b/Assembly-CSharp/ModLoader.cs index 6a0a19e6..1ab91ac0 100644 --- a/Assembly-CSharp/ModLoader.cs +++ b/Assembly-CSharp/ModLoader.cs @@ -85,18 +85,14 @@ public static IEnumerator LoadModsInit(GameObject coroutineHolder) Logger.APILogger.Log("Starting mod loading"); - string managed_path = SystemInfo.operatingSystemFamily switch - { - OperatingSystemFamily.Windows => Path.Combine(Application.dataPath, "Managed"), - OperatingSystemFamily.MacOSX => Path.Combine(Application.dataPath, "Resources", "Data", "Managed"), - OperatingSystemFamily.Linux => Path.Combine(Application.dataPath, "Managed"), + ModHooks.LoadGlobalSettings(); + Logger.ClearOldModlogs(); - OperatingSystemFamily.Other => null, + Logger.APILogger.LogDebug($"Loading assemblies and constructing mods"); - _ => throw new ArgumentOutOfRangeException() - }; + string mods = ModHooks.GlobalSettings.ModsFolder ?? GetDefaultModsFolder(); - if (managed_path is null) + if (mods is null) { LoadState |= ModLoadState.Loaded; @@ -105,13 +101,6 @@ public static IEnumerator LoadModsInit(GameObject coroutineHolder) yield break; } - ModHooks.LoadGlobalSettings(); - Logger.ClearOldModlogs(); - - Logger.APILogger.LogDebug($"Loading assemblies and constructing mods"); - - string mods = Path.Combine(managed_path, "Mods"); - string[] files = Directory.GetDirectories(mods) .Except(new string[] { Path.Combine(mods, "Disabled") }) .SelectMany(d => Directory.GetFiles(d, "*.dll")) @@ -294,6 +283,22 @@ Assembly Resolve(object sender, ResolveEventArgs args) UObject.Destroy(coroutineHolder.gameObject); } + private static string GetDefaultModsFolder() + { + string managed_path = SystemInfo.operatingSystemFamily switch + { + OperatingSystemFamily.Windows => Path.Combine(Application.dataPath, "Managed"), + OperatingSystemFamily.MacOSX => Path.Combine(Application.dataPath, "Resources", "Data", "Managed"), + OperatingSystemFamily.Linux => Path.Combine(Application.dataPath, "Managed"), + + OperatingSystemFamily.Other => null, + + _ => throw new ArgumentOutOfRangeException() + }; + + return Path.Combine(managed_path, "Mods"); + } + private static void GetPreloads ( ModInstance[] orderedMods,