diff --git a/BedrockLauncher.Core/BedrockCore.cs b/BedrockLauncher.Core/BedrockCore.cs
index 69ca208..ca96be8 100644
--- a/BedrockLauncher.Core/BedrockCore.cs
+++ b/BedrockLauncher.Core/BedrockCore.cs
@@ -267,6 +267,7 @@ private static DateTime GetStartTimeSafe(Process proc)
return DateTime.MinValue;
}
}
+
///
/// Launch the Minecraft game process based on the specified launch options
///
@@ -280,24 +281,24 @@ public async Task LaunchGameAsync(LaunchOptions options)
options.Progress?.Report(LaunchState.Launching);
string targetExe = "Minecraft.Windows.exe";
string fullPath = Path.Combine(options.GameFolder, targetExe);
- string processName = Path.GetFileNameWithoutExtension(targetExe);
+ string processName = Path.GetFileNameWithoutExtension(targetExe);
-
var beforeSnapshot = Process.GetProcessesByName(processName)
.ToDictionary(p => p.Id, p => GetStartTimeSafe(p));
-
DateTime launchTime = DateTime.Now;
Process.Start(new ProcessStartInfo
{
- FileName = "explorer.exe",
- Arguments = fullPath,
- UseShellExecute = true
+ FileName = "cmd.exe",
+ ArgumentList =
+ { "/c", "start", fullPath, string.IsNullOrEmpty(options.LaunchArgs) ? "" : options.LaunchArgs },
+ UseShellExecute = false,
+ CreateNoWindow = true
});
Process minecraftProcess = null;
-
+
for (int i = 0; i < 10; i++)
{
var currentProcesses = Process.GetProcessesByName(processName);
@@ -310,7 +311,7 @@ public async Task LaunchGameAsync(LaunchOptions options)
DateTime startTime = GetStartTimeSafe(proc);
if (startTime == DateTime.MinValue)
- continue;
+ continue;
if (startTime >= launchTime.AddMilliseconds(-200))
{
@@ -323,8 +324,9 @@ public async Task LaunchGameAsync(LaunchOptions options)
break;
Thread.Sleep(500);
-
+
}
+
process = minecraftProcess;
options.Progress?.Report(LaunchState.Launched);
@@ -345,10 +347,12 @@ public async Task LaunchGameAsync(LaunchOptions options)
MinecraftGameTypeVersion.Release => "Microsoft.MinecraftUWP",
MinecraftGameTypeVersion.Preview => "Microsoft.MinecraftWindowsBeta"
};
+
if (!File.Exists(manifest))
{
throw new IOException("File doesn't exist");
}
+
PackageManager packageManager = new PackageManager();
bool twice_launch = false;
foreach (var package in packageManager.FindPackagesForUser(string.Empty))
@@ -361,6 +365,7 @@ public async Task LaunchGameAsync(LaunchOptions options)
}
}
}
+
bool is_installed = UwpRegister.UwpRegister.IsPackageInstalled(packageName);
var config = new DeploymentOptionsConfig();
options.Progress?.Report(LaunchState.Registering);
@@ -370,6 +375,7 @@ public async Task LaunchGameAsync(LaunchOptions options)
? DeploymentOptions.DevelopmentMode | DeploymentOptions.ForceUpdateFromAnyVersion
: DeploymentOptions.DevelopmentMode;
config.ProgressCallback = options.RegisterProgress;
+
if (!twice_launch && is_installed || !is_installed)
{
var appxAsync = await UwpRegister.UwpRegister.RegisterAppxAsync(config);
@@ -385,7 +391,7 @@ public async Task LaunchGameAsync(LaunchOptions options)
var appDiagnosticInfos = AppDiagnosticInfo.RequestInfoForPackageAsync(packageFamily).AsTask().Result;
if (appDiagnosticInfos.Count != 0)
{
- await appDiagnosticInfos[0].LaunchAsync();
+ await appDiagnosticInfos[0].LaunchAsync();
}
}
else
@@ -394,23 +400,78 @@ public async Task LaunchGameAsync(LaunchOptions options)
{
TargetApplicationPackageFamilyName = packageFamily
};
- if (options?.LaunchArgs == string.Empty)
- {
- await Launcher.LaunchUriAsync(new Uri(options.LaunchArgs), options_st);
- }
- else
+
+ // 构建启动 URI
+ string uriString = "minecraft://launch";
+
+ if (!string.IsNullOrEmpty(options?.LaunchArgs))
{
- await Launcher.LaunchUriAsync(new Uri("minecraft://launch"), options_st);
+ string queryString = string.Empty;
+ string launchArgs = options.LaunchArgs;
+
+ if (launchArgs.StartsWith("minecraft://", StringComparison.OrdinalIgnoreCase))
+ {
+ int questionMarkIndex = launchArgs.IndexOf('?');
+ if (questionMarkIndex >= 0 && questionMarkIndex < launchArgs.Length - 1)
+ {
+ queryString = launchArgs.Substring(questionMarkIndex + 1);
+ }
+ else
+ {
+ string path = launchArgs.Substring("minecraft://".Length).TrimStart('/');
+ if (!string.IsNullOrEmpty(path))
+ {
+ queryString = $"{path}=true";
+ }
+ }
+ }
+ else
+ {
+ // 如果传入的不是 minecraft:// 格式,直接作为参数
+ // 检查是否已经是 key=value 格式
+ if (launchArgs.Contains('=') && !launchArgs.Contains(' '))
+ {
+ queryString = launchArgs;
+ }
+ else if (launchArgs.Contains('=') && launchArgs.Contains(' '))
+ {
+ var pairs = launchArgs.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
+ .Where(arg => arg.Contains('='))
+ .Select(arg => arg.Trim())
+ .ToArray();
+ if (pairs.Length > 0)
+ {
+ queryString = string.Join("&", pairs);
+ }
+ else
+ {
+ queryString = $"args={Uri.EscapeDataString(launchArgs)}";
+ }
+ }
+ else
+ {
+ queryString = $"args={Uri.EscapeDataString(launchArgs)}";
+ }
+ }
+
+ if (!string.IsNullOrEmpty(queryString))
+ {
+ uriString = $"minecraft://launch?{queryString}";
+ }
}
-
+
+ await Launcher.LaunchUriAsync(new Uri(uriString), options_st);
}
+
Process[] processes = Process.GetProcessesByName("Minecraft.Windows");
Process[] process_oldVersion = Process.GetProcessesByName("Minecraft.Win10.DX11");
processes = processes.Concat(process_oldVersion).ToArray();
process = processes.OrderBy(p => p.StartTime).Last();
}
+
return process;
}
+
///
/// Remove Uwp Minecraft Game
///
diff --git a/BedrockLauncher.Core/BedrockLauncher.Core.csproj b/BedrockLauncher.Core/BedrockLauncher.Core.csproj
index 59a717a..b893b52 100644
--- a/BedrockLauncher.Core/BedrockLauncher.Core.csproj
+++ b/BedrockLauncher.Core/BedrockLauncher.Core.csproj
@@ -20,11 +20,11 @@
true
- 2.0.4.3-dev
+ 2.0.4.4-dev
- 2.0.4.3
+ 2.0.4.4
diff --git a/TestProject/Program.cs b/TestProject/Program.cs
index 592d848..50b31f2 100644
--- a/TestProject/Program.cs
+++ b/TestProject/Program.cs
@@ -12,10 +12,10 @@ static void Main(string[] args)
bedrockCore.InitAsync().Wait();
var launchOptions = new LaunchOptions()
{
- GameFolder = Path.GetFullPath(@"E:\Bedrock\bedrock_versions\1.21.11401"),
- MinecraftBuildType = MinecraftBuildTypeVersion.UWP,
+ GameFolder = "D:\\BedrockBoot\\bedrock_versions\\1.21.11401",
GameType = MinecraftGameTypeVersion.Release,
- LaunchArgs = null
+ MinecraftBuildType = MinecraftBuildTypeVersion.UWP,
+ LaunchArgs = "minecraft://creator/?Editor=true"
};
var process = bedrockCore.LaunchGameAsync(launchOptions).Result;
Console.WriteLine(process.Id);