/// <summary> /// Download all required library files /// </summary> public void DownloadLibraries() { int index = 0; int maxCount = profile.Libraries.Length; foreach (var item in profile.Libraries) { try { if (CheckDownloadRequireLibrary(item)) { Directory.CreateDirectory(Path.GetDirectoryName(item.Path)); web.DownloadFile(item.Url, item.Path); } } catch { } l(MFile.Library, item.Name, maxCount, ++index); // event } }
public string CheckJava(string binaryName) { var javapath = Path.Combine(RuntimeDirectory, "bin", binaryName); if (!File.Exists(javapath)) { string json = ""; var WorkingPath = Path.Combine(Path.GetTempPath(), "temp_download_runtime"); if (Directory.Exists(WorkingPath)) { IOUtil.DeleteDirectory(WorkingPath); } Directory.CreateDirectory(WorkingPath); var javaUrl = ""; using (var wc = new WebClient()) { json = wc.DownloadString(MojangServer.LauncherMeta); var job = JObject.Parse(json)[MRule.OSName]; javaUrl = job[MRule.Arch]?["jre"]?["url"]?.ToString(); if (string.IsNullOrEmpty(javaUrl)) { throw new Exception("unsupport os"); } Directory.CreateDirectory(RuntimeDirectory); } var downloader = new WebDownload(); downloader.DownloadProgressChangedEvent += Downloader_DownloadProgressChangedEvent; downloader.DownloadFile(javaUrl, Path.Combine(WorkingPath, "javatemp.lzma")); DownloadCompleted?.Invoke(this, new EventArgs()); var lzma = Path.Combine(WorkingPath, "javatemp.lzma"); var zip = Path.Combine(WorkingPath, "javatemp.zip"); var szip = new SevenZipWrapper(); szip.ProgressChange += Szip_ProgressChange; szip.DecompressFileLZMA(lzma, zip); var z = new SharpZip(zip); z.ProgressEvent += Z_ProgressEvent; z.Unzip(RuntimeDirectory); if (!File.Exists(javapath)) { IOUtil.DeleteDirectory(WorkingPath); throw new Exception("Failed Download"); } if (MRule.OSName != "windows") { IOUtil.Chmod(javapath, IOUtil.Chmod755); } } return(javapath); }
public void InstallForge(string mcversion, string forgeversion) { FileChanged?.Invoke(new DownloadFileChangedEventArgs() { FileKind = MFile.Library, FileName = "installer", ProgressedFileCount = 0, TotalFileCount = 2 }); var versionname = $"{mcversion}-forge{mcversion}-{forgeversion}"; var manifest = Path.Combine( Minecraft.Versions, versionname, versionname + ".json" ); var installer = $"{MavenServer}{mcversion}-{forgeversion}/forge-{mcversion}-{forgeversion}-installer.jar"; var jsondata = new StringBuilder(); var res = WebRequest.Create(installer).GetResponse().GetResponseStream(); using (res) using (var s = new ZipInputStream(res)) { ZipEntry e; while ((e = s.GetNextEntry()) != null) { if (!e.IsFile || e.Name != "install_profile.json") { continue; } var buffer = new byte[1024]; while (true) { int size = s.Read(buffer, 0, buffer.Length); if (size == 0) { break; } jsondata.Append(Encoding.UTF8.GetString(buffer, 0, size)); } } } if (jsondata.Length == 0) { throw new Exception("can't find profile file"); } var libraries = JObject.Parse(jsondata.ToString())["versionInfo"]; FileChanged?.Invoke(new DownloadFileChangedEventArgs() { FileKind = MFile.Library, FileName = "universal", ProgressedFileCount = 1, TotalFileCount = 2 }); var universalUrl = $"{MavenServer}{mcversion}-{forgeversion}/forge-{mcversion}-{forgeversion}-universal.jar"; var dest = Path.Combine( Minecraft.Library, "net", "minecraftforge", "forge", $"{mcversion}-{forgeversion}", $"forge-{mcversion}-{forgeversion}.jar" ); Directory.CreateDirectory(Path.GetDirectoryName(dest)); var downloader = new WebDownload(); downloader.DownloadFile(universalUrl, dest); Directory.CreateDirectory(Path.GetDirectoryName(manifest)); File.WriteAllText(manifest, libraries.ToString()); FileChanged?.Invoke(new DownloadFileChangedEventArgs() { FileKind = MFile.Library, FileName = "universal", ProgressedFileCount = 2, TotalFileCount = 2 }); }