From 42b1ad1024aca0824df563c625e7132532d16e30 Mon Sep 17 00:00:00 2001 From: Kei-Luna Date: Fri, 15 May 2026 09:19:00 +0900 Subject: [PATCH] Changed the location where client save data is stored to the MikuSB directory. --- Common/Util/ConfigManager.cs | 22 ++++++++++++++++++++++ MikuSB.Loader/GameLaunchService.cs | 30 +++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/Common/Util/ConfigManager.cs b/Common/Util/ConfigManager.cs index 70e72bf..c5ac375 100644 --- a/Common/Util/ConfigManager.cs +++ b/Common/Util/ConfigManager.cs @@ -19,6 +19,11 @@ public static class ConfigManager //LoadHotfixData(); } + public static void SaveConfig() + { + SaveData(Config, ConfigFilePath); + } + private static void LoadConfigData() { var file = new FileInfo(ConfigFilePath); @@ -43,9 +48,26 @@ public static class ConfigManager Config = JsonConvert.DeserializeObject(json)!; } + Config.Loader.Arguments = NormalizeLoaderArguments(Config.Loader.Arguments); SaveData(Config, ConfigFilePath); } + private static string[] NormalizeLoaderArguments(string[]? arguments) + { + var result = new List(arguments ?? []); + var userDataDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "Client_User_Data")); + Directory.CreateDirectory(userDataDirectory); + + var userDirArgument = $"-userdir={userDataDirectory}"; + var existingIndex = result.FindIndex(x => x.StartsWith("-userdir=", StringComparison.OrdinalIgnoreCase)); + if (existingIndex >= 0) + result[existingIndex] = userDirArgument; + else + result.Add(userDirArgument); + + return result.ToArray(); + } + private static void LoadHotfixData() { var file = new FileInfo(HotfixFilePath); diff --git a/MikuSB.Loader/GameLaunchService.cs b/MikuSB.Loader/GameLaunchService.cs index 23cf723..a09529b 100644 --- a/MikuSB.Loader/GameLaunchService.cs +++ b/MikuSB.Loader/GameLaunchService.cs @@ -293,11 +293,14 @@ public sealed class LaunchOptions public static LaunchOptions FromConfig(IEnumerable? extraGameArguments = null) { var config = ConfigManager.Config; + var serverBaseDirectory = AppContext.BaseDirectory; var gamePath = ResolvePath(config.Loader.GamePath, AppContext.BaseDirectory); - var patchPaths = ResolvePatchPaths(config.Loader.PatchPaths, AppContext.BaseDirectory); + var patchPaths = ResolvePatchPaths(config.Loader.PatchPaths, serverBaseDirectory); var gameArgs = new List(config.Loader.Arguments ?? []); if (extraGameArguments is not null) gameArgs.AddRange(extraGameArguments.Where(x => !string.IsNullOrWhiteSpace(x))); + gameArgs = EnsureUserDirArgument(gameArgs, serverBaseDirectory); + PersistResolvedArgumentsIfChanged(config, gameArgs); var env = new Dictionary(StringComparer.OrdinalIgnoreCase); if (config.Loader.SetAllProxy && config.Proxy.Enabled) @@ -330,6 +333,31 @@ public sealed class LaunchOptions }; } + private static List EnsureUserDirArgument(List gameArgs, string baseDirectory) + { + var userDataDirectory = Path.GetFullPath(Path.Combine(baseDirectory, "Client_User_Data")); + Directory.CreateDirectory(userDataDirectory); + + var userDirArgument = $"-userdir={userDataDirectory}"; + var existingIndex = gameArgs.FindIndex(x => x.StartsWith("-userdir=", StringComparison.OrdinalIgnoreCase)); + if (existingIndex >= 0) + gameArgs[existingIndex] = userDirArgument; + else + gameArgs.Add(userDirArgument); + + return gameArgs; + } + + private static void PersistResolvedArgumentsIfChanged(Configuration.ConfigContainer config, List gameArgs) + { + var currentArgs = config.Loader.Arguments ?? []; + if (currentArgs.SequenceEqual(gameArgs, StringComparer.Ordinal)) + return; + + config.Loader.Arguments = gameArgs.ToArray(); + ConfigManager.SaveConfig(); + } + private static string? ResolvePath(string? value, string baseDirectory) { if (string.IsNullOrWhiteSpace(value))