public async Task DownloadForge(ForgeVersion forgeVersion) { if (!Directory.Exists(BmclCore.BaseDirectory + ".minecraft\\versions\\" + forgeVersion.GetMc())) { MessageBox.Show("请先下载原版"); return; } var url = forgeVersion.GetDownloadUrl(); var downer = new Downloader.Downloader(); var w = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\.minecraft\\launcher_profiles.json"); w.Write(Resource.NormalProfile.Profile); w.Close(); await downer.DownloadFileTaskAsync(url, Path.Combine(BmclCore.BaseDirectory, "forge.jar")); var stat = false; try { stat = InstallForge(forgeVersion); } catch (Exception ex) { Logger.Fatal("内置forge安装器出错:" + ex.Message); } if (!stat) { Logger.Info("将使用传统forge安装器"); InstallForgeInOldWay(); } else { Logger.Info("已使用内置forge安装器成功安装"); } }
public override Mod ReadJson(JsonReader reader, Type objectType, Mod existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject item = JObject.Load(reader); if (!item.HasValues) { return(null); } string organization = item.GetValue(nameof(Mod.Organization), StringComparison.OrdinalIgnoreCase).ToObject <string>(); McModInfo modInfo = item.GetValue(nameof(Mod.ModInfo), StringComparison.OrdinalIgnoreCase).ToObject <McModInfo>(serializer); ForgeVersion forgeVersion = item.GetValue(nameof(Mod.ForgeVersion), StringComparison.OrdinalIgnoreCase).ToObject <ForgeVersion>(serializer); ModSide side = ModSide.ClientServer; if (item.TryGetValue(nameof(Mod.Side), StringComparison.OrdinalIgnoreCase, out JToken sideValue)) { side = sideValue.ToObject <ModSide>(); } LaunchSetup launchSetup = null; if (item.TryGetValue(nameof(Mod.LaunchSetup), StringComparison.OrdinalIgnoreCase, out JToken launchValue)) { launchSetup = launchValue.ToObject <LaunchSetup>(); } WorkspaceSetup workspaceSetup = null; if (item.TryGetValue(nameof(Mod.WorkspaceSetup), StringComparison.OrdinalIgnoreCase, out JToken workspaceValue)) { workspaceSetup = workspaceValue.ToObject <WorkspaceSetup>(serializer); } return(new Mod(modInfo, organization, forgeVersion, side, launchSetup, workspaceSetup)); }
private void InstallForge(ForgeVersion forgeVersion, string installerPath) { //将installer中的forge universal提取出来 var tempDir = Path.Combine(Path.GetTempPath(), "BMCL\\ForgeInstaller"); if (Directory.Exists(tempDir)) { Directory.Delete(tempDir, true); } var archive = new ZipArchive(new FileStream(installerPath, FileMode.Open)); archive.ExtractToDirectory(tempDir); //获得universal的完整名称 var tempFolder = new DirectoryInfo(tempDir); if (!tempFolder.Exists) { tempFolder.Create(); } var tempFiles = tempFolder.GetFiles("*.jar"); if (tempFiles.Length == 0) //除非下载过来的内容错误,不然installer中一定包含universal { throw new Exception("cannot find universal.jar"); } var forge = tempFiles[0].Name; archive.Dispose(); //再从universal中提出version.json archive = new ZipArchive(new FileStream(tempDir + "\\" + forge, FileMode.Open)); archive.GetEntry("version.json").ExtractToFile(Path.Combine(tempDir, "version.json")); //从version.json中获得目标游戏版本名,并在versions文件夹中创建 var forge0 = gameinfo.Read(tempDir + "\\version.json").id; var versionFolder = BmclCore.BaseDirectory + ".minecraft\\versions\\" + forge0; Directory.CreateDirectory(versionFolder); //复制json与核心文件 File.Copy(tempDir + "\\version.json", versionFolder + "\\" + forgeVersion.GetMc() + "-" + forge0 + ".json"); File.Copy(versionFolder + "\\..\\" + forgeVersion.GetMc() + "\\" + forgeVersion.GetMc() + ".jar", versionFolder + "\\" + forge0 + ".jar"); //复制forge到libraries中 forge0 = Regex.Replace(forge0.ToLower(), forgeVersion.GetMc() + "-forge", ""); var forgeFolder = BmclCore.BaseDirectory + ".minecraft\\libraries\\net\\minecraftforge\\forge\\" + forge0; Directory.CreateDirectory(forgeFolder); File.Copy(tempDir + "\\" + forge, forgeFolder + "\\forge-" + forge0 + ".jar"); archive.Dispose(); Directory.Delete(tempDir, true); }
public async Task DownloadForge(ForgeVersion forgeVersion) { if (!Directory.Exists(BmclCore.BaseDirectory + ".minecraft\\versions\\" + forgeVersion.GetMc())) { MessageBox.Show("请先下载原版"); return; } ProcessChange("DownloadingForge"); var url = forgeVersion.GetDownloadUrl(); var downer = new Downloader.Downloader(); var w = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\.minecraft\\launcher_profiles.json"); w.Write(NormalProfile.Profile); w.Close(); var installerPath = Path.Combine(BmclCore.TempDirectory, "forge.jar"); await downer.DownloadFileTaskAsync(url, installerPath); ProcessChange("InstallingForge"); var v = int.Parse(forgeVersion.build.version.Split('.')[0]); try { if (v >= 25) { var installer = new ForgeInstaller(Path.Combine(BmclCore.MinecraftDirectory)); installer.ProgressChange += status => ProcessChange(status); await installer.Run(installerPath); } else { try { InstallForge(forgeVersion, installerPath); } catch (Exception ex) { Logger.Fatal(ex); } } } catch (Exception ex) { Logger.Fatal("内置forge安装器出错"); Logger.Fatal(ex); Logger.Info("将使用传统forge安装器"); await InstallForgeInOldWay(installerPath); Logger.Info("已使用传统forge安装器成功安装"); } }
public bool InstallForge(ForgeVersion forgeVersion) { //将installer中的forge universal提取出来 string tempDir = Path.Combine(BmclCore.BaseDirectory, "temp"); var archive = new ZipArchive(new FileStream(Path.Combine(BmclCore.BaseDirectory, "forge.jar"), FileMode.Open)); archive.ExtractToDirectory(tempDir); //获得universal的完整名称 DirectoryInfo tempFolder = new DirectoryInfo(tempDir); FileInfo[] tempFiles = tempFolder.GetFiles("*.jar"); if (tempFiles.Length == 0)//除非下载过来的内容错误,不然installer中一定包含universal { return(false); } string forge = tempFiles[0].Name; archive.Dispose(); //再从universal中提出version.json archive = new ZipArchive(new FileStream(tempDir + "\\" + forge, FileMode.Open)); archive.GetEntry("version.json").ExtractToFile(Path.Combine(tempDir, "version.json")); //从version.json中获得目标游戏版本名,并在versions文件夹中创建 string forge0 = gameinfo.Read(tempDir + "\\version.json").id; string versionFolder = BmclCore.BaseDirectory + ".minecraft\\versions\\" + forge0; Directory.CreateDirectory(versionFolder); //复制json与核心文件 File.Copy(tempDir + "\\version.json", versionFolder + "\\" + forgeVersion.GetMc() + "-" + forge0 + ".json"); File.Copy(versionFolder + "\\..\\" + forgeVersion.GetMc() + "\\" + forgeVersion.GetMc() + ".jar", versionFolder + "\\" + forge0 + ".jar"); //复制forge到libraries中 forge0 = Regex.Replace(forge0.ToLower(), forgeVersion.GetMc() + "-forge", ""); string forgeFolder = BmclCore.BaseDirectory + ".minecraft\\libraries\\net\\minecraftforge\\forge\\" + forge0; Directory.CreateDirectory(forgeFolder); File.Copy(tempDir + "\\" + forge, forgeFolder + "\\forge-" + forge0 + ".jar"); archive.Dispose(); Directory.Delete(tempDir, true); return(true); }
public GameVersion MergeArguments(GameVersion MCMojang) { if (post_1_13 == true) { ForgeVersion MCForge = ForgeVersion.FromJson(File.ReadAllText(LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion + @"\version.json").Trim()); // replace vanilla values MCMojang.MainClass = MCForge.MainClass; // append forge arguments List <GameElement> itemList = MCMojang.Arguments.Game.ToList(); List <GameElement> moreItems = MCForge.Arguments.Game.ToList(); itemList.AddRange(moreItems); MCMojang.Arguments.Game = itemList.ToArray(); } else { ForgeInstaller MCForge = ForgeInstaller.FromJson(File.ReadAllText(LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion + @"\install_profile.json").Trim()); // replace vanilla settings MCMojang.MainClass = MCForge.VersionInfo.MainClass; MCMojang.MinecraftArguments = MCForge.VersionInfo.MinecraftArguments; } return(MCMojang); }
public override McMod ReadJson(JsonReader reader, Type objectType, McMod existingValue, bool hasExistingValue, JsonSerializer serializer) { JObject item = JObject.Load(reader); if (!item.HasValues) { return(null); } string organization = item.GetValue(nameof(McMod.Organization), StringComparison.OrdinalIgnoreCase).ToObject <string>(); string modname = item.GetValue(nameof(McMod.Name), StringComparison.OrdinalIgnoreCase).ToObject <string>(); string modInfoPath = ModPaths.McModInfoFile(modname); string modInfoContent = File.ReadAllText(modInfoPath); McModInfo modInfo = JsonConvert.DeserializeObject <McModInfo>(modInfoContent, new JsonSerializerSettings { Converters = serializer.Converters }); ForgeVersion forgeVersion = item.GetValue(nameof(McMod.ForgeVersion), StringComparison.OrdinalIgnoreCase).ToObject <ForgeVersion>(serializer); ModSide side = ModSide.ClientServer; if (item.TryGetValue(nameof(McMod.Side), StringComparison.OrdinalIgnoreCase, out JToken sideValue)) { side = sideValue.ToObject <ModSide>(); } LaunchSetup launchSetup = LaunchSetup.Client; if (item.TryGetValue(nameof(McMod.LaunchSetup), StringComparison.OrdinalIgnoreCase, out JToken launchValue)) { launchSetup = launchValue.ToObject <LaunchSetup>(); } WorkspaceSetup workspaceSetup = null; if (item.TryGetValue(nameof(McMod.WorkspaceSetup), StringComparison.OrdinalIgnoreCase, out JToken workspaceValue)) { workspaceSetup = workspaceValue.ToObject <WorkspaceSetup>(serializer); } return(new McMod(modInfo, organization, forgeVersion, side, launchSetup, workspaceSetup)); }
private Dictionary <string, string> DownloadForgeLibraries(ForgeVersion forge) { Dictionary <string, string> ClassPath = new Dictionary <string, string>(); // Library list for startup foreach (Json.GameVersion.Library lib in forge.Libraries) { string[] sLibName = lib.Name.Split(':'); VersionJsonDownload download; // dont download Forge itself if (sLibName[0].Equals("net.minecraftforge") && sLibName[1].Equals("forge")) { continue; } download = lib.Downloads.Artifact; download.Path = LibraryDir + @"\" + download.Path.Replace("/", @"\"); // fix for typesafe libraries if (sLibName[0].Contains("org.apache.logging.log4j")) { download.Url = new Uri("http://central.maven.org/maven2/" + sLibName[0].Replace('.', '/') + "/" + sLibName[1] + "/" + sLibName[2] + "/" + sLibName[1] + "-" + sLibName[2] + ".jar"); } dhelper.DownloadFileTo(download.Url, download.Path); // fix for modlauncher (api) if (sLibName.Length == 4 && sLibName[0].Equals("cpw.mods") && sLibName[1].Equals("modlauncher") && sLibName[3].Equals("api")) { sLibName[1] += "-api"; continue; } // add to classpath (replace) ClassPath.Add(sLibName[0] + ":" + sLibName[1], download.Path); } return(ClassPath); }
private static (MinecraftVersion minecraftVersion, ForgeVersion forgeVersion) CreateVersionTuple(MinecraftVersion minecraftVersion, ForgeVersion forgeVersion) { return(minecraftVersion, forgeVersion); }
public Dictionary <string, string> InstallForge(string sForgeVersion) { this.sForgeVersion = sForgeVersion; Dictionary <string, string> ClassPath = new Dictionary <string, string>(); // Library list for startup sForgeVersionDir = LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion; sForgeInstallerFile = sForgeVersionDir + @"\forge-" + sForgeVersion + "-installer.jar"; string remoteFile = _sForgeMaven + _sForgeTree + sForgeVersion + "/forge-" + sForgeVersion + "-installer.jar"; //check if file exists if (!File.Exists(sForgeInstallerFile)) { dhelper.DownloadFileTo(remoteFile, sForgeInstallerFile, true, null); } // always extract files List <string> extractList = new List <string> { "install_profile.json", "version.json" }; dhelper.ExtractZipFiles(sForgeInstallerFile, sForgeVersionDir, extractList); if (File.Exists(LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion + @"\version.json")) { post_1_13 = true; } // post 1.13 files if (post_1_13 == true) { post_1_13 = true; ForgeVersion MCForge = ForgeVersion.FromJson(File.ReadAllText(LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion + @"\version.json").Trim()); // download Forge libraries ClassPath = DownloadForgeLibraries(MCForge); // extract Forge Jar extractList = new List <string> { "maven/net/minecraftforge/forge/" + sForgeVersion + "/forge-" + sForgeVersion + ".jar" }; dhelper.ExtractZipFiles(sForgeInstallerFile, sForgeVersionDir, extractList, false); // build client.jar BuildForgeClientJar(); // append Forge to classpath ClassPath.Add("net.minecraftforge:forge", sForgeVersionDir + @"\forge-" + sForgeVersion + ".jar"); } // pre 1.13 files else if (post_1_13 == false) { post_1_13 = false; ForgeInstaller MCForge = ForgeInstaller.FromJson(File.ReadAllText(LibraryDir + _sForgeTree.Replace('/', '\\') + sForgeVersion + @"\install_profile.json").Trim()); // download Forge libraries ClassPath = DownloadForgeLibraries(MCForge); // Extract Universal Jar extractList = new List <string> { "forge-" + sForgeVersion + "-universal.jar" }; dhelper.ExtractZipFiles(sForgeInstallerFile, sForgeVersionDir, extractList); // append Forge to classpath ClassPath.Add("net.minecraftforge:forge", sForgeVersionDir + @"\forge-" + sForgeVersion + "-universal.jar"); } return(ClassPath); }
public FileInfo GetForgeZipFile(MinecraftVersion minecraftVersion, ForgeVersion forgeVersion) { return(GetRootDirectory().ResolveDir(minecraftVersion.Id).Resolve(forgeVersion.Id + ".zip")); }