Пример #1
0
        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安装器成功安装");
            }
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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安装器成功安装");
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 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));
        }
Пример #8
0
        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);
        }
Пример #9
0
 private static (MinecraftVersion minecraftVersion, ForgeVersion forgeVersion) CreateVersionTuple(MinecraftVersion minecraftVersion, ForgeVersion forgeVersion)
 {
     return(minecraftVersion, forgeVersion);
 }
Пример #10
0
        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);
        }
Пример #11
0
 public FileInfo GetForgeZipFile(MinecraftVersion minecraftVersion, ForgeVersion forgeVersion)
 {
     return(GetRootDirectory().ResolveDir(minecraftVersion.Id).Resolve(forgeVersion.Id + ".zip"));
 }