diff --git a/StarMap.Core/ModRepository/DocumentsPathPatch.cs b/StarMap.Core/ModRepository/DocumentsPathPatch.cs new file mode 100644 index 0000000..c2a9cfd --- /dev/null +++ b/StarMap.Core/ModRepository/DocumentsPathPatch.cs @@ -0,0 +1,47 @@ +using HarmonyLib; +using KSA; + +namespace StarMap.Core.ModRepository +{ + internal static class DocumentsPathPatch + { + private const string CliFlag = "-InstancePath"; + private const string EnvVarName = "INSTANCE_PATH"; + private const string HarmonyId = "com.starmap.core.documentspathoverride"; + + public static void Apply() + { + // Check if an override path is provided via command-line argument or environment variable + var overridePath = TryGetOverride(); + if (string.IsNullOrEmpty(overridePath)) + return; + + // Apply the Harmony patch to override the DocumentsFolderPath property + var harmony = new Harmony(HarmonyId); + var original = AccessTools.PropertyGetter(typeof(Constants), nameof(Constants.DocumentsFolderPath)); + var prefix = new HarmonyMethod(typeof(DocumentsPathPatch), nameof(Prefix)); + harmony.Patch(original, prefix: prefix); + Console.WriteLine($"StarMap - Using Instance Path: {overridePath}"); + } + + private static bool Prefix(ref string __result) + { + __result = TryGetOverride()!; + return false; + } + + private static string? TryGetOverride() + { + var args = Environment.GetCommandLineArgs(); + for (int i = 0; i < args.Length - 1; i++) + { + if (string.Equals(args[i], CliFlag, StringComparison.OrdinalIgnoreCase)) + { + return args[i + 1]; + } + } + + return Environment.GetEnvironmentVariable(EnvVarName); + } + } +} diff --git a/StarMap.Core/ModRepository/ModLoader.cs b/StarMap.Core/ModRepository/ModLoader.cs index 5c8714d..5c4b326 100644 --- a/StarMap.Core/ModRepository/ModLoader.cs +++ b/StarMap.Core/ModRepository/ModLoader.cs @@ -44,6 +44,7 @@ public ModLoader(AssemblyLoadContext coreAssemblyLoadContext) public void Init() { + DocumentsPathPatch.Apply(); PrepareMods(); } @@ -60,7 +61,7 @@ private void PrepareMods() { if (!mod.Enabled) { - Console.WriteLine($"StarMap - Nod loading mod: {mod.Id} because it is disable in manifest"); + Console.WriteLine($"StarMap - Not loading mod: {mod.Id} because it is disabled in manifest"); continue; } diff --git a/StarMap.Loader/Program.cs b/StarMap.Loader/Program.cs index 63b75c7..a93b2a0 100644 --- a/StarMap.Loader/Program.cs +++ b/StarMap.Loader/Program.cs @@ -8,7 +8,9 @@ internal class Program { static void Main(string[] args) { - if (args.Length < 1) + var (instanceOverrideArgs, remainingArgs) = ExtractInstanceOverride(args); + + if (remainingArgs.Length < 1) { Console.WriteLine("StarMap - Running Starmap in solo mode!"); SoleModeInner(); @@ -17,12 +19,35 @@ static void Main(string[] args) Console.WriteLine("StarMap - Running Starmap in loader mode."); - var pipeName = args[0]; + var pipeName = remainingArgs[0]; Console.WriteLine($"StarMap - Connection to pipe: {pipeName}"); MainInner(pipeName).GetAwaiter().GetResult(); } + private static (string[] instanceOverrideArgs, string[] remainingArgs) ExtractInstanceOverride(string[] args) + { + const string CliFlag = "-InstancePath"; + + var remaining = new List(); + var extracted = new List(); + + for (int i = 0; i < args.Length; i++) + { + if (string.Equals(args[i], CliFlag, StringComparison.OrdinalIgnoreCase) && i + 1 < args.Length) + { + extracted.Add(args[i]); + extracted.Add(args[i + 1]); + i++; // skip the value too + continue; + } + + remaining.Add(args[i]); + } + + return (extracted.ToArray(), remaining.ToArray()); + } + static void SoleModeInner() { var gameConfig = new LoaderConfig();