void Bw_DoWork1(object sender, DoWorkEventArgs e) { if (Config.Beelogin) { bgWorker.ReportProgress(2); if (!Config.Beemod) { string fh = Beelogin.Bee_login(Config.beeurl, Config.UserName, Config.Beepsw, ip); if (fh != "yes") { Ts("登录失败", "详细信息:" + fh); bgWorker.ReportProgress(233); return; } } else { var jsondir = core.GetVersionJsonPath(ver.JarId); string tdir = Beelogin.GetLeft(jsondir, "\\") + "\\config"; if (!Directory.Exists(tdir)) { Directory.CreateDirectory(tdir);//创建文件夹 } string fh = Beelogin.Beemodlogin_token(Config.beeurl, Config.UserName, Config.Beepsw, (Config.LaunchMode ? rundir + @".minecraft\config\BeeLogin.cfg" : tdir + "\\BeeLogin.cfg"), ip); if (fh != "yes") { Ts("登录失败", "详细信息:" + fh); bgWorker.ReportProgress(233); } } } }
/// <summary> /// 获取Version信息,当出现错误时会返回null /// </summary> /// <param name="id">版本id</param> /// <returns>Version的信息</returns> internal Version GetVersionInternal(string id) { try { if (_locatingVersion.Contains(id)) { return(null); } _locatingVersion.Add(id); if (_versions.TryGetValue(id, out Version version)) { return(version); } var jver = LoadVersion(_core.GetVersionJsonPath(id)); if (jver == null) { return(null); } version = new Version(); if (string.IsNullOrWhiteSpace(jver.Id)) { return(null); } if (jver.arguments == null && string.IsNullOrWhiteSpace(jver.MinecraftArguments)) { return(null); } if (string.IsNullOrWhiteSpace(jver.MainClass)) { return(null); } if (string.IsNullOrWhiteSpace(jver.Assets)) { jver.Assets = "legacy"; } if (jver.Libraries == null) { return(null); } version.Id = jver.Id; version.Type = jver.Type; if (jver.AssetsIndex != null) { version.AssetsIndex = new GameFileInfo() { ID = jver.AssetsIndex.ID, Path = jver.AssetsIndex.Path, SHA1 = jver.AssetsIndex.SHA1, Size = jver.AssetsIndex.Size, TotalSize = jver.AssetsIndex.TotalSize, Url = jver.AssetsIndex.Url }; } if (jver.Downloads != null) { version.Downloads = new Download() { Client = jver.Downloads.Client != null ? new GameFileInfo() { SHA1 = jver.Downloads.Client.SHA1, Size = jver.Downloads.Client.Size, Url = jver.Downloads.Client.Url } : null, Server = jver.Downloads.Server != null ? new GameFileInfo() { SHA1 = jver.Downloads.Server.SHA1, Size = jver.Downloads.Server.Size, Url = jver.Downloads.Server.Url } : null }; } version.MinecraftArguments = jver.MinecraftArguments ?? UsefulTools.PrintfArray(jver.arguments.game); version.Assets = jver.Assets; version.MainClass = jver.MainClass; version.JarId = jver.JarId; version.Time = jver.Time; version.ReleaseTime = jver.ReleaseTime; version.Libraries = new List <Library>(); version.Natives = new List <Native>(); foreach (var lib in jver.Libraries) { if (string.IsNullOrWhiteSpace(lib.Name)) { continue; } var names = lib.Name.Split(':'); if (names.Length != 3) { continue; } if (lib.Natives == null) //Library { if (!IfAllowed(lib.Rules)) { continue; } Library tmp = new Library { NS = names[0], Name = names[1], Version = names[2] }; if (lib.DownloadsInfo != null) { tmp.Url = lib.DownloadsInfo.Artifact?.Url; tmp.SHA1 = lib.DownloadsInfo.Artifact?.SHA1; } else { tmp.Url = lib.Url; tmp.checksums = lib.checksums; } version.Libraries.Add(tmp); } else //Native { if (!IfAllowed(lib.Rules)) { continue; } var native = new Native { NS = names[0], Name = names[1], Version = names[2], NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch()) }; if (lib.DownloadsInfo != null && lib.DownloadsInfo.ClassifiersInternal != null) { JToken obj = null; lib.DownloadsInfo.ClassifiersInternal.TryGetValue(native.NativeSuffix, out obj); JDownloadInfo info = obj?.ToObject <JDownloadInfo>(); native.Url = info?.Url; native.checksum = info?.SHA1; } else { native.Url = lib.Url; } version.Natives.Add(native); if (lib.Extract != null) { native.Options = new UnzipOptions { Exclude = lib.Extract.Exculde }; } } } if (jver.InheritsVersion != null) { var target = GetVersionInternal(jver.InheritsVersion); if (target == null) { return(null); } else { if (version.Assets == "legacy") { version.Assets = null; } version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex; version.Downloads = version.Downloads ?? target.Downloads; version.Assets = version.Assets ?? target.Assets; version.JarId = version.JarId ?? target.JarId; version.MainClass = version.MainClass ?? target.MainClass; version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments; version.Natives.AddRange(target.Natives); version.Libraries.AddRange(target.Libraries); version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex; } } version.JarId = version.JarId ?? version.Id; _versions.Add(version.Id, version); return(version); } catch (System.Exception ex) { return(null); } finally { _locatingVersion.Remove(id); } }
/// <summary> /// 获取Version信息,当出现错误时会返回null /// </summary> /// <param name="id">版本id</param> /// <returns>Version的信息</returns> internal Version GetVersionInternal(string id) { try { if (_locatingVersion.Contains(id)) { return(null); } _locatingVersion.Add(id); Version version; if (_versions.TryGetValue(id, out version)) { return(version); } var jver = LoadVersion(_core.GetVersionJsonPath(id)); if (jver == null) { return(null); } version = new Version(); if (string.IsNullOrWhiteSpace(jver.Id)) { return(null); } if (string.IsNullOrWhiteSpace(jver.MinecraftArguments)) { return(null); } if (string.IsNullOrWhiteSpace(jver.MainClass)) { return(null); } if (string.IsNullOrWhiteSpace(jver.Assets)) { jver.Assets = "legacy"; } if (jver.Libraries == null) { return(null); } version.Id = jver.Id; version.MinecraftArguments = jver.MinecraftArguments; version.Assets = jver.Assets; version.MainClass = jver.MainClass; version.JarId = jver.JarId; version.Libraries = new List <Library>(); version.Natives = new List <Native>(); foreach (var lib in jver.Libraries) { if (string.IsNullOrWhiteSpace(lib.Name)) { continue; } var names = lib.Name.Split(':'); if (names.Length != 3) { continue; } if (lib.Natives == null) { if (!IfAllowed(lib.Rules)) { continue; } version.Libraries.Add(new Library { NS = names[0], Name = names[1], Version = names[2] }); } else { if (!IfAllowed(lib.Rules)) { continue; } var native = new Native { NS = names[0], Name = names[1], Version = names[2], NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch()) }; version.Natives.Add(native); if (lib.Extract != null) { native.Options = new UnzipOptions { Exclude = lib.Extract.Exculde }; } } } if (jver.InheritsVersion != null) { var target = GetVersionInternal(jver.InheritsVersion); if (target == null) { return(null); } else { version.Assets = version.Assets ?? target.Assets; version.JarId = version.JarId ?? target.JarId; version.MainClass = version.MainClass ?? target.MainClass; version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments; version.Natives.AddRange(target.Natives); version.Libraries.AddRange(target.Libraries); } } version.JarId = version.JarId ?? version.Id; _versions.Add(version.Id, version); return(version); } catch { return(null); } finally { _locatingVersion.Remove(id); } }
private async void Btn_启动_Click(object sender, RoutedEventArgs e) { if (设置框.IsVisible) { Nosave(); return; } Btn_启动.IsEnabled = false; runts.Text = "正在启动中"; runts.Visibility = Visibility.Visible; if (ListVersions.Items.Count == 0) { await this.ShowMessageAsync("无法启动游戏", "没有读取到游戏版本", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" }); Btn_启动.IsEnabled = true; runts.Text = null; load.Visibility = Visibility.Hidden; return; } if (DownWindow.bgWorker.IsBusy) { //bgWorker.IsBusy await this.ShowMessageAsync("正在下载", "正在下载资源文件", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" }); // new downWindow { Owner = this }.ShowDialog(); //downWindow.Showdown(); downw.ShowDialog(); //this.Hide(); //down.Show(); } else { runts.Text = "检查支持库"; lostFlie.Clear();//清空列表,防止重新启动后,列表重复 ver = (Version)ListVersions.SelectedItem; core = LauncherCore.Create(); var version = ver;//设置读取的版本配置为当前选择的项 var jarid = ver.JarId; // MessageBox.Show(core.GetVersionJsonPath(jarid)); if (!File.Exists(core.GetVersionJsonPath(jarid))) { Ts("无法启动游戏", "游戏核心不存在,请确认已选择正确的核心版本!"); runts.Visibility = Visibility.Hidden; Btn_启动.Content = "启动游戏"; load.Visibility = Visibility.Hidden; return; } try { var libs = version.Libraries.Select(lib => core.GetLibPath(lib)); var natives = version.Natives.Select(native => core.GetNativePath(native)); foreach (string libflie in libs) { if (!File.Exists(libflie)) { lostFlie.Add(libflie); // MessageBox.Show("当前缺少的Libraries文件有:" + file); } } foreach (string libflie in natives) { if (!File.Exists(libflie)) { lostFlie.Add(libflie); //MessageBox.Show("当前缺少的Libraries-natives文件有:" + file); } } if (lostFlie.Count != 0) { //返回一个值,中止继续执行后面的代码 new DownWindow { Owner = this }.ShowDialog(); } } catch { Ts("无法启动游戏", "版本信息获取失败,无法读取所需的支持库,请确认已选择正确的核心版本!"); runts.Visibility = Visibility.Hidden; Btn_启动.Content = "启动游戏"; load.Visibility = Visibility.Hidden; return; } lostFlie.Clear(); lostasset.Clear(); lostlegacyasset.Clear(); runts.Text = "检查资源文件"; if (!Directory.Exists(rundir + ".minecraft/assets/indexes")) { Directory.CreateDirectory(rundir + ".minecraft/assets/indexes");//创建文件夹 } if (!Directory.Exists(rundir + ".minecraft/assets/objects")) { Directory.CreateDirectory(rundir + ".minecraft/assets/objects");//创建文件夹 } var jsondir = core.GetVersionJsonPath(jarid); string json = File.ReadAllText(jsondir); // MessageBox.Show(core.VersionLocator); JsonData data = JsonMapper.ToObject(json); string type; string url; try { type = data["assetIndex"]["id"].ToString(); url = data["assetIndex"]["url"].ToString().Replace("https://launchermeta.mojang.com", "http://download.mcbbs.net"); if (type != "legacy") { string jsonindex; if (File.Exists(rundir + @".minecraft\assets\indexes\" + type + ".json")) { jsonindex = File.ReadAllText(rundir + @".minecraft\assets\indexes\" + type + ".json"); } else { jsonindex = Beelogin.GetGeneralContent(url); File.WriteAllText(rundir + @".minecraft\assets\indexes\" + type + ".json", jsonindex, Encoding.Default); } JsonData jdata = JsonMapper.ToObject(jsonindex); jdata = jdata["objects"]; string hash; string two; string lj; for (int i = 0; i < jdata.Count; i++) { hash = jdata[i]["hash"].ToString(); two = hash.Substring(0, 2); lj = two + "\\" + hash; if (!File.Exists(rundir + @".minecraft\assets\objects\" + lj)) { lostasset.Add(hash); } } } else if (type == "legacy") { string jsonindex; if (File.Exists(rundir + @".minecraft\assets\indexes\legacy.json")) { jsonindex = File.ReadAllText(rundir + ".minecraft/assets/indexes/legacy.json"); } else { jsonindex = Beelogin.GetGeneralContent(url); } File.WriteAllText(rundir + @".minecraft\assets\indexes\legacy.json", jsonindex, Encoding.Default); JObject jdata = (JObject)JsonConvert.DeserializeObject(jsonindex); jdata = (JObject)jdata["objects"]; // jdata = jdata["objects"]; foreach (var name in jdata) { //MessageBox.Show(rundir + @".minecraft\assets\" + name.Key); if (!File.Exists(rundir + @".minecraft\assets\" + name.Key)) { lostlegacyasset.Add(name.Key.Replace("/", "\\")); } } } } catch { type = data["assets"].ToString(); url = "null"; if (type != "legacy") { string jsonindex; if (File.Exists(rundir + @".minecraft\assets\indexes\" + type + ".json")) { jsonindex = File.ReadAllText(rundir + @".minecraft\assets\indexes\" + type + ".json"); JsonData jdata = JsonMapper.ToObject(jsonindex); jdata = jdata["objects"]; string hash; string two; string lj; for (int i = 0; i < jdata.Count; i++) { hash = jdata[i]["hash"].ToString(); two = hash.Substring(0, 2); lj = two + "\\" + hash; if (!File.Exists(rundir + @".minecraft\assets\objects\" + lj)) { lostasset.Add(hash); } } lostassets = false; } else { lostassets = true; } } else if (type == "legacy") { string jsonindex; if (File.Exists(rundir + @".minecraft\assets\indexes\legacy.json")) { jsonindex = File.ReadAllText(rundir + ".minecraft/assets/indexes/legacy.json"); File.WriteAllText(rundir + @".minecraft\assets\indexes\legacy.json", jsonindex, Encoding.Default); JObject jdata = (JObject)JsonConvert.DeserializeObject(jsonindex); jdata = (JObject)jdata["objects"]; // jdata = jdata["objects"]; foreach (var name in jdata) { //MessageBox.Show(rundir + @".minecraft\assets\" + name.Key); if (!File.Exists(rundir + @".minecraft\assets\" + name.Key)) { lostlegacyasset.Add(name.Key.Replace("/", "\\")); } } lostassets = false; } else { lostassets = true; } } } try { if (lostasset.Count != 0 || lostlegacyasset.Count != 0) { if (url == "null") { await this.ShowMessageAsync("资源文件缺失", "发现缺少了" + (lostasset.Count != 0 ? lostasset.Count.ToString() : lostlegacyasset.Count != 0 ? lostlegacyasset.Count.ToString() : null) + "个资源文件,这可能导致游戏声音丢失\n但您的游戏核心版本较旧,不能自动补全.\n建议前往下载游戏窗口下载新版本客户端!", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" }); // Ts("资源文件缺失", "发现缺少了" + (lostasset.Count != 0 ? lostasset.Count.ToString() : lostlegacyasset.Count != 0 ? lostlegacyasset.Count.ToString() : null) + "个资源文件,但您的游戏核心版本较旧,不能自动补全.\n建议前往下载游戏窗口下载新版本客户端!"); } else { // new downWindow { Owner = this }.ShowDialog(); downw.Owner = this; downw.ShowDialog(); } } } catch { //ts("错误", "尝试检查资源文件时失败,建议前往下载游戏窗口下载新版本客户端!"); lostassets = true; // await this.ShowMessageAsync("错误", "尝试检查资源文件时失败,建议前往下载游戏窗口下载新版本客户端!", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" }); } } if (!bgWorker.IsBusy) { //MessageBox.Show("1"); // bgWorker.CancelAsync(); //bgWorker.Dispose(); if (islaunch) { bgWorker.RunWorkerAsync(); } else { bgWorker.WorkerReportsProgress = true; bgWorker.ProgressChanged += new ProgressChangedEventHandler(Bw_ProgressChanged); bgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted); bgWorker.DoWork += new DoWorkEventHandler(Bw_DoWork1); bgWorker.RunWorkerAsync(); islaunch = true; } } }
/// <summary> /// 获取Version信息,当出现错误时会返回null /// </summary> /// <param name="id">版本id</param> /// <returns>Version的信息</returns> internal Version GetVersionInternal(string id) { try { if (_locatingVersion.Contains(id)) { return(null); } _locatingVersion.Add(id); if (_versions.TryGetValue(id, out Version version)) { return(version); } var jver = LoadVersion(_core.GetVersionJsonPath(id)); if (jver == null) { return(null); } version = new Version(); if (string.IsNullOrWhiteSpace(jver.Id)) { return(null); } if (jver.arguments == null && string.IsNullOrWhiteSpace(jver.MinecraftArguments)) { return(null); } if (string.IsNullOrWhiteSpace(jver.MainClass)) { return(null); } if (string.IsNullOrWhiteSpace(jver.Assets)) { jver.Assets = "legacy"; } if (jver.Libraries == null) { return(null); } version.Id = jver.Id; if (jver.AssetsIndex != null) { version.AssetsIndex = new GameFileInfo() { ID = jver.AssetsIndex.ID, Path = jver.AssetsIndex.Path, SHA1 = jver.AssetsIndex.SHA1, Size = jver.AssetsIndex.Size, TotalSize = jver.AssetsIndex.TotalSize, Url = jver.AssetsIndex.Url }; } if (jver.Downloads != null) { version.Downloads = new Download() { Client = jver.Downloads.Client != null ? new GameFileInfo() { SHA1 = jver.Downloads.Client.SHA1, Size = jver.Downloads.Client.Size, Url = jver.Downloads.Client.Url } : null, Server = jver.Downloads.Server != null ? new GameFileInfo() { SHA1 = jver.Downloads.Server.SHA1, Size = jver.Downloads.Server.Size, Url = jver.Downloads.Server.Url } : null }; } if (!string.IsNullOrEmpty(jver.MinecraftArguments)) { version.MinecraftArguments = jver.MinecraftArguments; } else { StringBuilder printf = new StringBuilder(); version.FeatureArguments = new Dictionary <string, string>(); if (jver.arguments.game != null) { jver.arguments.game.ToList().ForEach(a => { if (a.GetJsonType() != JsonType.String) { try { StringBuilder sb2 = new StringBuilder(); if (a["value"].GetJsonType() == JsonType.Array) { for (int i = 0; i < a["value"].Count; i++) { sb2.Append(a["value"][i].ToString()).Append(" "); } } else { sb2.Append(a["value"].ToString()); } version.FeatureArguments.Add(a["rules"][0]["features"].Keys.First(), sb2.ToString()); } catch { } } else { printf.Append(a + " "); } }); } version.MinecraftArguments = printf.ToString(); } version.Assets = jver.Assets; version.MainClass = jver.MainClass; version.JarId = jver.JarId; version.Libraries = new List <Library>(); version.Natives = new List <Native>(); foreach (var lib in jver.Libraries) { if (string.IsNullOrWhiteSpace(lib.Name)) { continue; } var names = lib.Name.Split(':'); if (names.Length != 3) { continue; } if (lib.Natives == null) { if (!IfAllowed(lib.Rules)) { continue; } version.Libraries.Add(new Library { NS = names[0], Name = names[1], Version = names[2] }); } else { if (!IfAllowed(lib.Rules)) { continue; } var native = new Native { NS = names[0], Name = names[1], Version = names[2], NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch()) }; version.Natives.Add(native); if (lib.Extract != null) { native.Options = new UnzipOptions { Exclude = lib.Extract.Exculde }; } } } if (jver.InheritsVersion != null) { var target = GetVersionInternal(jver.InheritsVersion); if (target == null) { return(null); } else { if (version.Assets == "legacy") { version.Assets = null; } version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex; version.Downloads = version.Downloads ?? target.Downloads; version.Assets = version.Assets ?? target.Assets; version.JarId = version.JarId ?? target.JarId; version.MainClass = version.MainClass ?? target.MainClass; if (!string.IsNullOrEmpty(jver.MinecraftArguments)) { version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments; } else { version.MinecraftArguments = version.MinecraftArguments + target.MinecraftArguments; } if (target.FeatureArguments != null) { version.FeatureArguments = version.FeatureArguments.Concat(target.FeatureArguments).ToDictionary(k => k.Key, v => v.Value); } version.Natives.AddRange(target.Natives); version.Libraries.AddRange(target.Libraries); version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex; } } version.JarId = version.JarId ?? version.Id; _versions.Add(version.Id, version); return(version); } catch (System.Exception ex) { return(null); } finally { _locatingVersion.Remove(id); } }