diff --git a/installer/PSLauncher.iss b/installer/PSLauncher.iss
index 2ee832d..3bfb45e 100644
--- a/installer/PSLauncher.iss
+++ b/installer/PSLauncher.iss
@@ -11,7 +11,7 @@
#define MyAppName "PROSERVE Launcher"
#define MyAppShortName "PS_Launcher"
-#define MyAppVersion "1.0.12"
+#define MyAppVersion "1.0.13"
#define MyAppPublisher "ASTERION VR"
#define MyAppURL "https://asterionvr.com"
#define MyAppExeName "PS_Launcher.exe"
diff --git a/src/PSLauncher.App/PSLauncher.App.csproj b/src/PSLauncher.App/PSLauncher.App.csproj
index c34c715..c016863 100644
--- a/src/PSLauncher.App/PSLauncher.App.csproj
+++ b/src/PSLauncher.App/PSLauncher.App.csproj
@@ -18,9 +18,9 @@
PROSERVE Launcher
© 2026 ASTERION VR — All rights reserved
PSLauncher.App
- 1.0.12
- 1.0.12.0
- 1.0.12.0
+ 1.0.13
+ 1.0.13.0
+ 1.0.13.0
true
diff --git a/src/PSLauncher.App/ViewModels/MainViewModel.cs b/src/PSLauncher.App/ViewModels/MainViewModel.cs
index 21e7b50..600c3e8 100644
--- a/src/PSLauncher.App/ViewModels/MainViewModel.cs
+++ b/src/PSLauncher.App/ViewModels/MainViewModel.cs
@@ -1186,13 +1186,22 @@ public sealed partial class MainViewModel : ObservableObject
try
{
- // Si on lance la version désignée comme "auto", on passe les CLI args
- // configurés (ex: -autoconnect -login=Jerome2 -password=… -ipserver=10.0.4.100).
- // Pour les lancements manuels d'autres versions, args = null (comportement standard).
+ // Composition des CLI args passés à PROSERVE_UE_*.exe :
+ // 1. _config.DefaultLaunchArgs — appliqués à CHAQUE lancement (auto ou manuel).
+ // Contenu type : -nosplash, -log, -fps=90.
+ // 2. _config.AutoMode.Args — appliqués UNIQUEMENT si la version lancée est la
+ // version auto désignée. Contenu type : -autoconnect, -login=Jerome,
+ // -password=…, -ipserver=10.0.4.100.
+ // Concaténation dans cet ordre → Unreal FParse lit dans l'ordre, la dernière
+ // occurrence d'une clé gagne : les auto args écrasent les default args sur un
+ // même key (comportement intentionnel : un opérateur peut avoir -fps=90 en
+ // default et -fps=120 en auto sans conflit).
var isAutoVersion = _config.AutoMode.FeatureEnabled
&& !string.IsNullOrEmpty(_config.AutoMode.SelectedVersion)
&& string.Equals(_config.AutoMode.SelectedVersion, row.Version, StringComparison.Ordinal);
- string[]? cliArgs = isAutoVersion ? BuildAutoModeCliArgs(_config.AutoMode.Args) : null;
+ var argList = new List(_config.DefaultLaunchArgs);
+ if (isAutoVersion) argList.AddRange(_config.AutoMode.Args);
+ string[]? cliArgs = argList.Count > 0 ? BuildAutoModeCliArgs(argList) : null;
var proc = _processLauncher.Launch(row.Installed, cliArgs);
_runningProserve = proc;
diff --git a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
index d33a18a..dbff4f5 100644
--- a/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
+++ b/src/PSLauncher.App/ViewModels/SettingsViewModel.cs
@@ -129,6 +129,10 @@ public sealed partial class SettingsViewModel : ObservableObject
public System.Collections.ObjectModel.ObservableCollection LanDiscoveredPeers { get; } = new();
public bool HasLanDiscoveredPeers => LanDiscoveredPeers.Count > 0;
+ // ----- Args par défaut (chaque lancement) -----
+ /// Args édités dans la UI. Persiste vers _config.DefaultLaunchArgs au Save.
+ public System.Collections.ObjectModel.ObservableCollection DefaultLaunchArgs { get; } = new();
+
// ----- Mode auto -----
[ObservableProperty] private bool _autoModeFeatureEnabled;
[ObservableProperty] private int _autoModeGraceSeconds;
@@ -276,6 +280,9 @@ public sealed partial class SettingsViewModel : ObservableObject
Environment.NewLine,
config.SteamVr.ProcessesToKill ?? new List());
+ foreach (var a in config.DefaultLaunchArgs ?? new List())
+ DefaultLaunchArgs.Add(new AutoModeArgRowViewModel(a.Key, a.Value, RemoveDefaultLaunchArg));
+
_autoModeFeatureEnabled = config.AutoMode.FeatureEnabled;
_autoModeGraceSeconds = config.AutoMode.GracePeriodSeconds;
_autoModeSelectedVersion = config.AutoMode.SelectedVersion ?? string.Empty;
@@ -465,6 +472,15 @@ public sealed partial class SettingsViewModel : ObservableObject
.Distinct(StringComparer.OrdinalIgnoreCase)
.ToList();
+ _config.DefaultLaunchArgs = DefaultLaunchArgs
+ .Select(r => new AutoModeArg
+ {
+ Key = (r.Key ?? string.Empty).Trim(),
+ Value = string.IsNullOrEmpty(r.Value) ? null : r.Value.Trim(),
+ })
+ .Where(a => !string.IsNullOrWhiteSpace(a.Key))
+ .ToList();
+
_config.AutoMode.FeatureEnabled = AutoModeFeatureEnabled;
_config.AutoMode.GracePeriodSeconds = Math.Clamp(AutoModeGraceSeconds, 1, 60);
_config.AutoMode.SelectedVersion = string.IsNullOrWhiteSpace(AutoModeSelectedVersion)
@@ -1057,6 +1073,19 @@ public sealed partial class SettingsViewModel : ObservableObject
}
}
+ // ===================== DEFAULT LAUNCH ARGS =====================
+
+ [RelayCommand]
+ private void AddDefaultLaunchArg()
+ {
+ DefaultLaunchArgs.Add(new AutoModeArgRowViewModel(string.Empty, null, RemoveDefaultLaunchArg));
+ }
+
+ private void RemoveDefaultLaunchArg(AutoModeArgRowViewModel row)
+ {
+ DefaultLaunchArgs.Remove(row);
+ }
+
// ===================== AUTO MODE ARGS =====================
[RelayCommand]
diff --git a/src/PSLauncher.App/Views/SettingsDialog.xaml b/src/PSLauncher.App/Views/SettingsDialog.xaml
index 20c4b85..6ca18a3 100644
--- a/src/PSLauncher.App/Views/SettingsDialog.xaml
+++ b/src/PSLauncher.App/Views/SettingsDialog.xaml
@@ -696,6 +696,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
T(
+ "ARGUMENTS DE LANCEMENT",
+ "LAUNCH ARGUMENTS",
+ "启动参数",
+ "อาร์กิวเมนต์การเปิด",
+ "وسائط التشغيل",
+ "ARGUMENTOS DE INICIO",
+ "STARTARGUMENTE"
+ );
+ public static string SettingsLaunchArgsHelp => T(
+ "Arguments CLI appliqués à CHAQUE lancement de PROSERVE (mode auto ou manuel). Les arguments du mode auto ci-dessous s'ajoutent en plus, uniquement pour la version désignée AUTO.",
+ "CLI arguments applied to EVERY PROSERVE launch (auto or manual). Auto mode arguments below are added on top, only for the version marked AUTO.",
+ "应用于每次 PROSERVE 启动的 CLI 参数(自动或手动)。下方的自动模式参数仅对标记为 AUTO 的版本额外附加。",
+ "อาร์กิวเมนต์ CLI ที่ใช้กับการเปิด PROSERVE ทุกครั้ง (อัตโนมัติหรือด้วยตนเอง) อาร์กิวเมนต์โหมดอัตโนมัติด้านล่างจะเพิ่มเฉพาะสำหรับเวอร์ชันที่ตั้งเป็น AUTO",
+ "وسائط CLI مطبقة على كل تشغيل لـ PROSERVE (تلقائي أو يدوي). وسائط الوضع التلقائي أدناه تُضاف فقط للنسخة المحددة AUTO.",
+ "Argumentos CLI aplicados a CADA inicio de PROSERVE (auto o manual). Los argumentos del modo auto de abajo se añaden encima solo para la versión marcada AUTO.",
+ "CLI-Argumente, die bei JEDEM Start von PROSERVE angewendet werden (Auto oder manuell). Die Auto-Modus-Argumente unten werden nur für die als AUTO markierte Version zusätzlich angehängt."
+ );
+
// ---- Section Settings → Avancés → Mode auto ----
public static string SettingsAutoMode => T("MODE AUTO", "AUTO MODE", "自动模式", "โหมดอัตโนมัติ", "الوضع التلقائي");
public static string SettingsAutoModeFeatureEnabled => T(
diff --git a/src/PSLauncher.Models/LocalConfig.cs b/src/PSLauncher.Models/LocalConfig.cs
index 2566cba..c2fec0d 100644
--- a/src/PSLauncher.Models/LocalConfig.cs
+++ b/src/PSLauncher.Models/LocalConfig.cs
@@ -7,6 +7,17 @@ public sealed class LocalConfig
public string InstallRoot { get; set; } = string.Empty;
public string? LastLaunchedVersion { get; set; }
+ ///
+ /// Arguments CLI appliqués à CHAQUE lancement de PROSERVE (mode auto ou manuel).
+ /// Format identique à : flag -{Key} si
+ /// Value null/vide, sinon -{Key}={Value}. Concaténés en premier ;
+ /// si la version lancée est aussi la version auto, les
+ /// s'ajoutent DERRIÈRE (Unreal FParse lit dans l'ordre — la dernière occurrence
+ /// gagne sur un même key). Éditable dans Settings → « Arguments de lancement ».
+ /// Exemples typiques : -nosplash, -log, -fps=90.
+ ///
+ public List DefaultLaunchArgs { get; set; } = new();
+
///
/// Code de langue de l'UI : "auto" (suit la langue Windows), "fr", "en",
/// "zh", "th" ou "ar". Tout changement nécessite un redémarrage du launcher.