/// <summary>
        /// 获取Forge下载
        /// </summary>
        /// <param name="downloadSource">下载源</param>
        /// <param name="forge">Forge信息</param>
        /// <returns></returns>
        public static DownloadTask GetForgeDownloadURL(DownloadSource downloadSource, APIModules.JWForge forge, MCVersion mc)
        {
            string local  = PathManager.TempDirectory + "\\forge-" + forge.Build + ".jar";
            string Source = BMCLUrl;

            switch (downloadSource)
            {
            case DownloadSource.Mojang:
                Source = BMCLUrl;
                break;

            case DownloadSource.BMCLAPI:
                Source = BMCLUrl;
                break;

            case DownloadSource.MCBBS:
                Source = MCBBSUrl;
                break;
            }

            Source += $"maven/net/minecraftforge/forge/{mc.ID}-{forge.Version}" +
                      $"/forge-{mc.ID}-{forge.Version}-installer.jar";

            DownloadTask dt = new(App.GetResourceString("String.NewDownloadTaskWindow.Core.Forge"),
                                  Source, local);

            dt.Todo = new Func <ProgressCallback, CancellationToken, Exception>((callback, cancelToken) =>
            {
                try
                {
                    IInstaller installer = new ForgeInstaller(local, new CommonInstallOptions()
                    {
                        GameRootPath   = App.Handler.GameRootPath,
                        IsClient       = true,
                        DownloadSource = App.Config.MainConfig.Download.DownloadSource,
                        Java           = App.Handler.Java
                    });
                    installer.BeginInstall(callback, cancelToken).Wait();
                    return(null);
                }
                catch (Exception ex)
                { return(ex); }
            });
            return(dt);
        }
        /// <summary>
        /// 获取Forge下载
        /// </summary>
        /// <param name="downloadSource">下载源</param>
        /// <param name="mcversion">Mc版本</param>
        /// <param name="forgeversion">Forge版本</param>
        /// <returns></returns>
        public static DownloadTask GetForgeDownloadURL(DownloadSource downloadSource, string mcversion, string forgeversion)
        {
            string local     = App.Handler.GameRootPath + "\\forge-" + mcversion + "-" + forgeversion + "-installer.jar";
            string forgePath = string.Format("maven/net/minecraftforge/forge/{0}-{1}/forge-{0}-{1}-installer.jar", mcversion, forgeversion);
            string Source    = ForgeUrl;

            switch (downloadSource)
            {
            case DownloadSource.Mojang:
                Source = ForgeUrl;
                break;

            case DownloadSource.BMCLAPI:
                Source = BMCLUrl;
                break;

            case DownloadSource.MCBBS:
                Source = MCBBSUrl;
                break;
            }

            Source += forgePath;

            DownloadTask dt = new DownloadTask(App.GetResourceString("String.NewDownloadTaskWindow.Core.Forge"),
                                               Source, local);

            dt.Todo = new Func <ProgressCallback, CancellationToken, Exception>((callback, cancelToken) =>
            {
                try
                {
                    IInstaller installer = new ForgeInstaller(local, new CommonInstallOptions()
                    {
                        GameRootPath   = App.Handler.GameRootPath,
                        IsClient       = true,
                        DownloadSource = App.Config.MainConfig.Download.DownloadSource,
                        Java           = App.Handler.Java
                    });
                    installer.BeginInstall(callback, cancelToken).Wait();
                    return(null);
                }
                catch (Exception ex)
                { return(ex); }
            });
            return(dt);
        }
        private Dictionary <string, string> DownloadForgeLibraries(ForgeInstaller Forge)
        {
            Dictionary <string, string> ClassPath = new Dictionary <string, string>(); // Library list for startup

            foreach (Json.ForgeInstaller.Library Lib in Forge.VersionInfo.Libraries)
            {
                string   sLocalPath  = LibraryDir;
                string   sRemotePath = "https://libraries.minecraft.net/";
                string   sLibPath    = null;
                string[] sLibName    = Lib.Name.Split(':');

                // use download url from Forge
                if (Lib.Url != null)
                {
                    sRemotePath = Lib.Url.ToString();
                }

                // fix for typesafe libraries
                if (sLibName[0].Contains("com.typesafe"))
                {
                    sRemotePath = "http://central.maven.org/maven2/";
                }

                sLibPath     = string.Format("{0}/{1}/{2}/{1}-{2}.jar", sLibName[0].Replace('.', '/'), sLibName[1], sLibName[2]);
                sLocalPath  += @"\" + sLibPath.Replace('/', '\\');
                sRemotePath += sLibPath;

                // dont download Forge itself
                if (!sLibName[0].Equals("net.minecraftforge") || !sLibName[1].Equals("forge"))
                {
                    dhelper.DownloadFileTo(sRemotePath, sLocalPath, true);

                    // add to classpath (replace)
                    if (ClassPath.ContainsKey(sLibName[0] + ":" + sLibName[1]))
                    {
                        ClassPath.Remove(sLibName[0] + ":" + sLibName[1]);
                    }
                    ClassPath.Add(sLibName[0] + ":" + sLibName[1], sLocalPath);
                }
            }
            return(ClassPath);
        }
 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);
 }
 private static void ExecuteInBackground(object index)
 {
     CommonData.packageName          = packageConfiguration.Packages[(int)index].PackageName.ToLower();
     CommonData.packageVersion       = packageConfiguration.Packages[(int)index].Version;
     CommonData.packageServerAddress = packageConfiguration.Packages[(int)index].ServerAddress;
     CommonData.updatePackageName();
     ManifestManager.GetAllManifests();
     if (DownloadManager.startDownload())
     {
         ForgeInstaller.installForge();
         /* start the selected version */
         MinecraftManager.StartMinecraft();
         ChangeDownloadButtonContent(null);
         ChangeDownloadButtonVisibility(Visibility.Hidden);
     }
     else
     {
         MessageBox.Show("Erreur lors du téléchargement...", "Erreur", MessageBoxButton.OK);
         ChangeDownloadButtonContent(null);
     }
     ChangeDownloadButtonContent(null);
     ChangeDownloadButtonVisibility(Visibility.Hidden);
 }
        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);
        }