/// <summary> /// 获取lib文件的绝对路径 /// </summary> /// <param name="lib"></param> /// <returns></returns> public static string BuildLibPath(Libraryies lib) { var libp = new StringBuilder(Environment.CurrentDirectory + @"\.minecraft\libraries\"); string[] split = lib.name.Split(':');//0 包;1 名字;2 版本 if (split.Count() != 3) { throw new UnSupportVersionException(); } libp.Append(split[0].Replace('.', '\\')); libp.Append("\\"); libp.Append(split[1]).Append("\\"); libp.Append(split[2]).Append("\\"); libp.Append(split[1]).Append("-"); libp.Append(split[2]).Append(".jar"); return(libp.ToString()); }
/// <summary> /// 获取native文件的绝对路径 /// </summary> /// <param name="lib"></param> /// <returns></returns> public static string BuildNativePath(Libraryies lib) { var libp = new StringBuilder(Environment.CurrentDirectory + @"\.minecraft\libraries\"); string[] split = lib.name.Split(':');//0 包;1 名字;2 版本 libp.Append(split[0].Replace('.', '\\')); libp.Append("\\"); libp.Append(split[1]).Append("\\"); libp.Append(split[2]).Append("\\"); libp.Append(split[1]).Append("-").Append(split[2]).Append("-").Append(lib.natives.windows); libp.Append(".jar"); if (split[0] == "tv.twitch") { libp.Replace("${arch}", Environment.Is64BitOperatingSystem ? "64" : "32"); } return(libp.ToString()); }
private void Run() { _game.StartInfo.UseShellExecute = false; OnStateChangeEvent(LangManager.GetLangFromResource("LauncherSettingupEnvoriement")); var arg = new StringBuilder("-Xincgc -Xmx"); arg.Append(_javaxmx); arg.Append("M "); arg.Append(Extarg); arg.Append(" "); arg.Append("-Djava.library.path=\""); arg.Append(Environment.CurrentDirectory).Append(@"\.minecraft\versions\"); arg.Append(_name).Append("\\").Append(_version).Append("-natives-").Append(_timestamp.ToString(CultureInfo.InvariantCulture)); arg.Append("\" -cp \""); foreach (Libraryies lib in _info.libraries) { if (lib.natives != null) { continue; } if (lib.rules != null) { bool goflag = false; foreach (rules rule in lib.rules) { if (rule.action == "disallow") { if (rule.os == null) { goflag = false; break; } if (rule.os.name.ToLower().Trim() == "windows") { goflag = false; break; } } { if (rule.os == null) { goflag = true; break; } if (rule.os.name.ToLower().Trim() == "windows") { goflag = true; break; } } } if (!goflag) { continue; } } OnStateChangeEvent(LangManager.GetLangFromResource("LauncherSolveLib") + lib.name); string libp = BuildLibPath(lib); if (GetFileLength(libp) == 0) { BMCLV4.Logger.Log("未找到依赖" + lib.name + "开始下载", BMCLV4.Logger.LogType.Error); try { if (lib.url == null) { OnStateChangeEvent(LangManager.GetLangFromResource("LauncherDownloadLib") + lib.name); Downloading++; if (!Directory.Exists(Path.GetDirectoryName(libp))) { Directory.CreateDirectory(Path.GetDirectoryName(libp)); } #if DEBUG System.Windows.MessageBox.Show(_urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); #endif BMCLV4.Logger.Log(_urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); _downer.DownloadFile( _urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("/", "\\"), libp); } else { string urlLib = lib.url; OnStateChangeEvent(LangManager.GetLangFromResource("LauncherDownloadLib") + lib.name); Downloading++; /* * DownLib downer = new DownLib(lib); * downLibEvent(lib); * downer.DownFinEvent += downfin; * downer.startdownload(); */ if (!Directory.Exists(Path.GetDirectoryName(libp))) { Directory.CreateDirectory(Path.GetDirectoryName(libp)); } #if DEBUG System.Windows.MessageBox.Show(urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); #endif BMCLV4.Logger.Log(urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); _downer.DownloadFile(urlLib + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/"), libp); } } catch (WebException ex) { BMCLV4.Logger.Log(ex); BMCLV4.Logger.Log("原地址下载失败,尝试作者源" + lib.name); try { _downer.DownloadFile(DownloadSource.DownloadSourceManage.GetUrlFromResource("UrlDownloadBase") + "libraries/" + libp.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("/", "\\"), libp); } catch (WebException exception) { Libraryies lib1 = lib; BmclCore.Invoke(new Action(() => MessageBox.Show(BmclCore.MainWindow, "下载" + lib1.name + "遇到错误:" + exception.Message))); return; } } } arg.Append(BuildLibPath(lib) + ";"); } OnStateChangeEvent(LangManager.GetLangFromResource("LauncherBuildMCArg")); var mcpath = new StringBuilder(Environment.CurrentDirectory + @"\.minecraft\versions\"); mcpath.Append(_name).Append("\\").Append(_version).Append(".jar\" "); mcpath.Append(_info.mainClass); arg.Append(mcpath); //" --username ${auth_player_name} --session ${auth_session} --version ${version_name} --gameDir ${game_directory} --assetsDir ${game_assets}" var mcarg = new StringBuilder(_info.minecraftArguments); mcarg.Replace("${auth_player_name}", _username); mcarg.Replace("${version_name}", _version); mcarg.Replace("${game_directory}", @"."); mcarg.Replace("${game_assets}", @"assets"); mcarg.Replace("${assets_root}", @"assets"); mcarg.Replace("${user_type}", "Legacy"); mcarg.Replace("${assets_index_name}", _info.assets); if (!string.IsNullOrEmpty(_li.OutInfo)) { string[] replace = _li.OutInfo.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); foreach (string str in replace) { int sp = str.IndexOf(":", System.StringComparison.Ordinal); mcarg.Replace(str.Substring(0, sp), str.Substring(sp + 1)); mcarg = new StringBuilder(Microsoft.VisualBasic.Strings.Replace(mcarg.ToString(), str.Split(':')[0], str.Split(':')[1], 1, -1, Microsoft.VisualBasic.CompareMethod.Text)); } } else { mcarg.Replace("{auth_session}", _li.SID); } mcarg.Replace("${auth_uuid}", "{}"); mcarg.Replace("${auth_access_token}", "{}"); mcarg.Replace("${user_properties}", "{}"); arg.Append(" "); arg.Append(mcarg); _game.StartInfo.Arguments = arg.ToString(); #if DEBUG System.Windows.MessageBox.Show(_game.StartInfo.Arguments); #endif BMCLV4.Logger.Log(_game.StartInfo.Arguments); OnStateChangeEvent(LangManager.GetLangFromResource("LauncherCreateNativeDir")); var nativePath = new StringBuilder(Environment.CurrentDirectory + @"\.minecraft\versions\"); nativePath.Append(_name).Append("\\"); var oldnative = new DirectoryInfo(nativePath.ToString()); foreach (DirectoryInfo dir in oldnative.GetDirectories()) { if (dir.FullName.Contains("-natives-")) { Directory.Delete(dir.FullName, true); } } nativePath.Append(_version).Append("-natives-").Append(_timestamp); if (!Directory.Exists(nativePath.ToString())) { Directory.CreateDirectory(nativePath.ToString()); } foreach (Libraries.Libraryies lib in _info.libraries) { if (lib.natives == null) { continue; } if (lib.rules != null) { bool goflag = false; foreach (rules rule in lib.rules) { if (rule.action == "disallow") { if (rule.os == null) { goflag = false; break; } if (rule.os.name.ToLower().Trim() == "windows") { goflag = false; break; } } { if (rule.os == null) { goflag = true; break; } if (rule.os.name.ToLower().Trim() == "windows") { goflag = true; break; } } } if (!goflag) { continue; } } OnStateChangeEvent(LangManager.GetLangFromResource("LauncherUnpackNative") + lib.name); string[] split = lib.name.Split(':');//0 包;1 名字;2 版本 if (split.Count() != 3) { throw new UnSupportVersionException(); } string libp = BuildNativePath(lib); if (GetFileLength(libp) == 0) { { BMCLV4.Logger.Log("未找到依赖" + lib.name + "开始下载", BMCLV4.Logger.LogType.Error); if (lib.url == null) { try { OnStateChangeEvent(LangManager.GetLangFromResource("LauncherDownloadLib") + lib.name); string nativep = BuildNativePath(lib); if (!Directory.Exists(Path.GetDirectoryName(nativep))) { Directory.CreateDirectory(Path.GetDirectoryName(nativep)); } #if DEBUG System.Windows.MessageBox.Show(_urlLib + nativep.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); BMCLV4.Logger.Log(_urlLib + nativep.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/")); #endif _downer.DownloadFile(_urlLib + nativep.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("\\", "/"), nativep); } catch (WebException ex) { BMCLV4.Logger.Log(ex); BMCLV4.Logger.Log("原地址下载失败,尝试作者源" + lib.name); string nativep = BuildLibPath(lib); try { _downer.DownloadFile( DownloadSource.DownloadSourceManage.GetUrlFromResource("UrlDownloadBase") + "libraries/" + nativep.Remove(0, Environment.CurrentDirectory.Length + 22).Replace("/", "\\"), nativep); } catch (WebException exception) { Libraryies lib1 = lib; BmclCore.Invoke(new Action(() => MessageBox.Show(BmclCore.MainWindow, "下载" + lib1.name + "遇到错误:" + exception.Message))); return; } } } else { try { string urlLib = lib.url; OnStateChangeEvent(LangManager.GetLangFromResource("LauncherDownloadLib") + lib.name); /* * DownNative downer = new DownNative(lib); * downNativeEvent(lib); * downer.startdownload(); */ string nativep = BuildNativePath(lib); if (!Directory.Exists(Path.GetDirectoryName(nativep))) { Directory.CreateDirectory(Path.GetDirectoryName(nativep)); } #if DEBUG System.Windows.MessageBox.Show(urlLib.Replace("\\", "/")); BMCLV4.Logger.Log(urlLib.Replace("\\", "/")); #endif _downer.DownloadFile(urlLib + nativep.Replace("/", "\\"), nativep); } catch (WebException ex) { BMCLV4.Logger.Log(ex); BMCLV4.Logger.Log("原地址下载失败,尝试作者源" + lib.name); string nativep = BuildLibPath(lib); _downer.DownloadFile(DownloadSource.DownloadSourceManage.GetUrlFromResource("UrlDownloadBase") + "libraries/" + nativep.Replace("/", "\\"), nativep); } } } } BMCLV4.Logger.Log("解压native"); var zipfile = new ZipInputStream(System.IO.File.OpenRead(libp)); ZipEntry theEntry; while ((theEntry = zipfile.GetNextEntry()) != null) { bool exc = false; if (lib.extract.exclude != null) { if (lib.extract.exclude.Any(excfile => theEntry.Name.Contains(excfile))) { exc = true; } } if (exc) { continue; } var filepath = new StringBuilder(nativePath.ToString()); filepath.Append("\\").Append(theEntry.Name); BMCLV4.Logger.Log(filepath.ToString()); FileStream fileWriter = File.Create(filepath.ToString()); var data = new byte[2048]; while (true) { int size = zipfile.Read(data, 0, data.Length); if (size > 0) { fileWriter.Write(data, 0, size); } else { break; } } fileWriter.Close(); } } OnStateChangeEvent(LangManager.GetLangFromResource("LauncherSolveMod")); BMCLV4.Logger.Log("处理Mods"); if (Directory.Exists(@".minecraft\versions\" + _name + @"\mods")) { if (Directory.Exists(@".minecraft\Config")) { BMCLV4.Logger.Log("找到旧的配置文件,备份并应用新配置文件"); Directory.Move(@".minecraft\Config", @".minecraft\Config" + _timestamp); if (Directory.Exists(@".minecraft\versions\" + _name + @"\Config")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\Config", @".minecraft\Config"); } } else { BMCLV4.Logger.Log("应用新配置文件"); if (Directory.Exists(@".minecraft\versions\" + _name + @"\Config")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\Config", @".minecraft\Config"); } } if (Directory.Exists(@".minecraft\mods")) { BMCLV4.Logger.Log("找到旧的mod文件,备份并应用新mod文件"); Directory.Move(@".minecraft\mods", @".minecraft\mods" + _timestamp); if (Directory.Exists(@".minecraft\versions\" + _name + @"\mods")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\mods", @".minecraft\mods"); } } else { BMCLV4.Logger.Log("应用新mod文件"); if (Directory.Exists(@".minecraft\versions\" + _name + @"\mods")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\mods", @".minecraft\mods"); } } if (Directory.Exists(@".minecraft\coremods")) { BMCLV4.Logger.Log("找到旧的coremod文件,备份并应用新coremod文件"); Directory.Move(@".minecraft\coremods", @".minecraft\coremods" + _timestamp); if (Directory.Exists(@".minecraft\versions\" + _name + @"\coremods")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\coremods", @".minecraft\coremods"); } } else { BMCLV4.Logger.Log("应用新coremod文件"); if (Directory.Exists(@".minecraft\versions\" + _name + @"\coremods")) { FileHelper.Dircopy(@".minecraft\versions\" + _name + @"\coremods", @".minecraft\coremods"); } } if (Directory.Exists(@".minecraft\versions\" + _name + @"\moddir")) { var moddirs = new DirectoryInfo(@".minecraft\versions\" + _name + @"\moddir"); foreach (DirectoryInfo moddir in moddirs.GetDirectories()) { BMCLV4.Logger.Log("复制ModDir " + moddir.Name); FileHelper.Dircopy(moddir.FullName, ".minecraft\\" + moddir.Name); } foreach (FileInfo modfile in moddirs.GetFiles()) { BMCLV4.Logger.Log("复制ModDir " + modfile.Name); File.Copy(modfile.FullName, ".minecraft\\" + modfile.Name, true); } } } OnStateChangeEvent(LangManager.GetLangFromResource("LauncherGo")); //game.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\.minecraft\\versions\\" + version; Environment.SetEnvironmentVariable("APPDATA", Environment.CurrentDirectory); _game.EnableRaisingEvents = true; _game.Exited += game_Exited; _game.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\.minecraft"; try { _game.Start(); if (BMCLV4.Logger.Debug) { _gameoutput = _game.StandardOutput; _gameerror = _game.StandardError; _logthread = new Thread(Logger); _logthread.Start(); } OnGameStartUp(true); } catch { OnGameStartUp(false); } }