コード例 #1
0
ファイル: MainWindow.xaml.cs プロジェクト: LSKLW/BeeLauncher
 void Bw_DoWork1(object sender, DoWorkEventArgs e)
 {
     if (Config.Beelogin)
     {
         bgWorker.ReportProgress(2);
         if (!Config.Beemod)
         {
             string fh = Beelogin.Bee_login(Config.beeurl, Config.UserName, Config.Beepsw, ip);
             if (fh != "yes")
             {
                 Ts("登录失败", "详细信息:" + fh);
                 bgWorker.ReportProgress(233);
                 return;
             }
         }
         else
         {
             var    jsondir = core.GetVersionJsonPath(ver.JarId);
             string tdir    = Beelogin.GetLeft(jsondir, "\\") + "\\config";
             if (!Directory.Exists(tdir))
             {
                 Directory.CreateDirectory(tdir);//创建文件夹
             }
             string fh = Beelogin.Beemodlogin_token(Config.beeurl, Config.UserName, Config.Beepsw, (Config.LaunchMode ? rundir + @".minecraft\config\BeeLogin.cfg" : tdir + "\\BeeLogin.cfg"), ip);
             if (fh != "yes")
             {
                 Ts("登录失败", "详细信息:" + fh);
                 bgWorker.ReportProgress(233);
             }
         }
     }
 }
コード例 #2
0
        /// <summary>
        ///     获取Version信息,当出现错误时会返回null
        /// </summary>
        /// <param name="id">版本id</param>
        /// <returns>Version的信息</returns>
        internal Version GetVersionInternal(string id)
        {
            try
            {
                if (_locatingVersion.Contains(id))
                {
                    return(null);
                }
                _locatingVersion.Add(id);

                if (_versions.TryGetValue(id, out Version version))
                {
                    return(version);
                }

                var jver = LoadVersion(_core.GetVersionJsonPath(id));
                if (jver == null)
                {
                    return(null);
                }

                version = new Version();
                if (string.IsNullOrWhiteSpace(jver.Id))
                {
                    return(null);
                }
                if (jver.arguments == null && string.IsNullOrWhiteSpace(jver.MinecraftArguments))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.MainClass))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.Assets))
                {
                    jver.Assets = "legacy";
                }
                if (jver.Libraries == null)
                {
                    return(null);
                }
                version.Id   = jver.Id;
                version.Type = jver.Type;
                if (jver.AssetsIndex != null)
                {
                    version.AssetsIndex = new GameFileInfo()
                    {
                        ID        = jver.AssetsIndex.ID,
                        Path      = jver.AssetsIndex.Path,
                        SHA1      = jver.AssetsIndex.SHA1,
                        Size      = jver.AssetsIndex.Size,
                        TotalSize = jver.AssetsIndex.TotalSize,
                        Url       = jver.AssetsIndex.Url
                    };
                }
                if (jver.Downloads != null)
                {
                    version.Downloads = new Download()
                    {
                        Client = jver.Downloads.Client != null ? new GameFileInfo()
                        {
                            SHA1 = jver.Downloads.Client.SHA1,
                            Size = jver.Downloads.Client.Size,
                            Url  = jver.Downloads.Client.Url
                        } : null,
                        Server = jver.Downloads.Server != null ? new GameFileInfo()
                        {
                            SHA1 = jver.Downloads.Server.SHA1,
                            Size = jver.Downloads.Server.Size,
                            Url  = jver.Downloads.Server.Url
                        } : null
                    };
                }
                version.MinecraftArguments = jver.MinecraftArguments ?? UsefulTools.PrintfArray(jver.arguments.game);
                version.Assets             = jver.Assets;
                version.MainClass          = jver.MainClass;
                version.JarId       = jver.JarId;
                version.Time        = jver.Time;
                version.ReleaseTime = jver.ReleaseTime;
                version.Libraries   = new List <Library>();
                version.Natives     = new List <Native>();
                foreach (var lib in jver.Libraries)
                {
                    if (string.IsNullOrWhiteSpace(lib.Name))
                    {
                        continue;
                    }
                    var names = lib.Name.Split(':');
                    if (names.Length != 3)
                    {
                        continue;
                    }
                    if (lib.Natives == null)                     //Library
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        Library tmp = new Library
                        {
                            NS      = names[0],
                            Name    = names[1],
                            Version = names[2]
                        };
                        if (lib.DownloadsInfo != null)
                        {
                            tmp.Url  = lib.DownloadsInfo.Artifact?.Url;
                            tmp.SHA1 = lib.DownloadsInfo.Artifact?.SHA1;
                        }
                        else
                        {
                            tmp.Url       = lib.Url;
                            tmp.checksums = lib.checksums;
                        }
                        version.Libraries.Add(tmp);
                    }
                    else                     //Native
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        var native = new Native
                        {
                            NS           = names[0],
                            Name         = names[1],
                            Version      = names[2],
                            NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch())
                        };
                        if (lib.DownloadsInfo != null && lib.DownloadsInfo.ClassifiersInternal != null)
                        {
                            JToken obj = null;
                            lib.DownloadsInfo.ClassifiersInternal.TryGetValue(native.NativeSuffix, out obj);
                            JDownloadInfo info = obj?.ToObject <JDownloadInfo>();

                            native.Url      = info?.Url;
                            native.checksum = info?.SHA1;
                        }
                        else
                        {
                            native.Url = lib.Url;
                        }
                        version.Natives.Add(native);
                        if (lib.Extract != null)
                        {
                            native.Options = new UnzipOptions {
                                Exclude = lib.Extract.Exculde
                            };
                        }
                    }
                }

                if (jver.InheritsVersion != null)
                {
                    var target = GetVersionInternal(jver.InheritsVersion);
                    if (target == null)
                    {
                        return(null);
                    }
                    else
                    {
                        if (version.Assets == "legacy")
                        {
                            version.Assets = null;
                        }
                        version.AssetsIndex        = version.AssetsIndex ?? target.AssetsIndex;
                        version.Downloads          = version.Downloads ?? target.Downloads;
                        version.Assets             = version.Assets ?? target.Assets;
                        version.JarId              = version.JarId ?? target.JarId;
                        version.MainClass          = version.MainClass ?? target.MainClass;
                        version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments;
                        version.Natives.AddRange(target.Natives);
                        version.Libraries.AddRange(target.Libraries);
                        version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex;
                    }
                }


                version.JarId = version.JarId ?? version.Id;
                _versions.Add(version.Id, version);
                return(version);
            }
            catch (System.Exception ex)
            {
                return(null);
            }
            finally
            {
                _locatingVersion.Remove(id);
            }
        }
コード例 #3
0
ファイル: JVersionLocator.cs プロジェクト: huangshize/KMCCC
        /// <summary>
        ///     获取Version信息,当出现错误时会返回null
        /// </summary>
        /// <param name="id">版本id</param>
        /// <returns>Version的信息</returns>
        internal Version GetVersionInternal(string id)
        {
            try
            {
                if (_locatingVersion.Contains(id))
                {
                    return(null);
                }
                _locatingVersion.Add(id);

                Version version;
                if (_versions.TryGetValue(id, out version))
                {
                    return(version);
                }

                var jver = LoadVersion(_core.GetVersionJsonPath(id));
                if (jver == null)
                {
                    return(null);
                }

                version = new Version();
                if (string.IsNullOrWhiteSpace(jver.Id))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.MinecraftArguments))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.MainClass))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.Assets))
                {
                    jver.Assets = "legacy";
                }
                if (jver.Libraries == null)
                {
                    return(null);
                }
                version.Id = jver.Id;
                version.MinecraftArguments = jver.MinecraftArguments;
                version.Assets             = jver.Assets;
                version.MainClass          = jver.MainClass;
                version.JarId     = jver.JarId;
                version.Libraries = new List <Library>();
                version.Natives   = new List <Native>();
                foreach (var lib in jver.Libraries)
                {
                    if (string.IsNullOrWhiteSpace(lib.Name))
                    {
                        continue;
                    }
                    var names = lib.Name.Split(':');
                    if (names.Length != 3)
                    {
                        continue;
                    }
                    if (lib.Natives == null)
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        version.Libraries.Add(new Library
                        {
                            NS      = names[0],
                            Name    = names[1],
                            Version = names[2]
                        });
                    }
                    else
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        var native = new Native
                        {
                            NS           = names[0],
                            Name         = names[1],
                            Version      = names[2],
                            NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch())
                        };
                        version.Natives.Add(native);
                        if (lib.Extract != null)
                        {
                            native.Options = new UnzipOptions {
                                Exclude = lib.Extract.Exculde
                            };
                        }
                    }
                }
                if (jver.InheritsVersion != null)
                {
                    var target = GetVersionInternal(jver.InheritsVersion);
                    if (target == null)
                    {
                        return(null);
                    }
                    else
                    {
                        version.Assets             = version.Assets ?? target.Assets;
                        version.JarId              = version.JarId ?? target.JarId;
                        version.MainClass          = version.MainClass ?? target.MainClass;
                        version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments;
                        version.Natives.AddRange(target.Natives);
                        version.Libraries.AddRange(target.Libraries);
                    }
                }
                version.JarId = version.JarId ?? version.Id;
                _versions.Add(version.Id, version);
                return(version);
            }
            catch
            {
                return(null);
            }
            finally
            {
                _locatingVersion.Remove(id);
            }
        }
コード例 #4
0
ファイル: MainWindow.xaml.cs プロジェクト: LSKLW/BeeLauncher
        private async void Btn_启动_Click(object sender, RoutedEventArgs e)
        {
            if (设置框.IsVisible)
            {
                Nosave();
                return;
            }
            Btn_启动.IsEnabled = false;
            runts.Text       = "正在启动中";
            runts.Visibility = Visibility.Visible;
            if (ListVersions.Items.Count == 0)
            {
                await this.ShowMessageAsync("无法启动游戏", "没有读取到游戏版本", MessageDialogStyle.Affirmative, new MetroDialogSettings()
                {
                    AffirmativeButtonText = "确定"
                });

                Btn_启动.IsEnabled = true;
                runts.Text       = null;
                load.Visibility  = Visibility.Hidden;
                return;
            }

            if (DownWindow.bgWorker.IsBusy)
            {
                //bgWorker.IsBusy await this.ShowMessageAsync("正在下载", "正在下载资源文件", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" });
                // new downWindow { Owner = this }.ShowDialog();
                //downWindow.Showdown();
                downw.ShowDialog();
                //this.Hide();
                //down.Show();
            }
            else
            {
                runts.Text = "检查支持库";
                lostFlie.Clear();//清空列表,防止重新启动后,列表重复
                ver  = (Version)ListVersions.SelectedItem;
                core = LauncherCore.Create();
                var version = ver;//设置读取的版本配置为当前选择的项


                var jarid = ver.JarId;

                //      MessageBox.Show(core.GetVersionJsonPath(jarid));
                if (!File.Exists(core.GetVersionJsonPath(jarid)))
                {
                    Ts("无法启动游戏", "游戏核心不存在,请确认已选择正确的核心版本!");
                    runts.Visibility = Visibility.Hidden;
                    Btn_启动.Content   = "启动游戏";
                    load.Visibility  = Visibility.Hidden;
                    return;
                }
                try
                {
                    var libs = version.Libraries.Select(lib => core.GetLibPath(lib));

                    var natives = version.Natives.Select(native => core.GetNativePath(native));

                    foreach (string libflie in libs)
                    {
                        if (!File.Exists(libflie))
                        {
                            lostFlie.Add(libflie);
                            //  MessageBox.Show("当前缺少的Libraries文件有:" + file);
                        }
                    }
                    foreach (string libflie in natives)
                    {
                        if (!File.Exists(libflie))
                        {
                            lostFlie.Add(libflie);
                            //MessageBox.Show("当前缺少的Libraries-natives文件有:" + file);
                        }
                    }
                    if (lostFlie.Count != 0)
                    {
                        //返回一个值,中止继续执行后面的代码
                        new DownWindow {
                            Owner = this
                        }.ShowDialog();
                    }
                }
                catch
                {
                    Ts("无法启动游戏", "版本信息获取失败,无法读取所需的支持库,请确认已选择正确的核心版本!");
                    runts.Visibility = Visibility.Hidden;
                    Btn_启动.Content   = "启动游戏";
                    load.Visibility  = Visibility.Hidden;
                    return;
                }
                lostFlie.Clear();
                lostasset.Clear();
                lostlegacyasset.Clear();
                runts.Text = "检查资源文件";
                if (!Directory.Exists(rundir + ".minecraft/assets/indexes"))
                {
                    Directory.CreateDirectory(rundir + ".minecraft/assets/indexes");//创建文件夹
                }
                if (!Directory.Exists(rundir + ".minecraft/assets/objects"))
                {
                    Directory.CreateDirectory(rundir + ".minecraft/assets/objects");//创建文件夹
                }

                var    jsondir = core.GetVersionJsonPath(jarid);
                string json    = File.ReadAllText(jsondir);
                // MessageBox.Show(core.VersionLocator);
                JsonData data = JsonMapper.ToObject(json);
                string   type;
                string   url;
                try
                {
                    type = data["assetIndex"]["id"].ToString();
                    url  = data["assetIndex"]["url"].ToString().Replace("https://launchermeta.mojang.com", "http://download.mcbbs.net");
                    if (type != "legacy")
                    {
                        string jsonindex;

                        if (File.Exists(rundir + @".minecraft\assets\indexes\" + type + ".json"))
                        {
                            jsonindex = File.ReadAllText(rundir + @".minecraft\assets\indexes\" + type + ".json");
                        }
                        else
                        {
                            jsonindex = Beelogin.GetGeneralContent(url);
                            File.WriteAllText(rundir + @".minecraft\assets\indexes\" + type + ".json", jsonindex, Encoding.Default);
                        }
                        JsonData jdata = JsonMapper.ToObject(jsonindex);
                        jdata = jdata["objects"];
                        string hash;
                        string two;
                        string lj;
                        for (int i = 0; i < jdata.Count; i++)
                        {
                            hash = jdata[i]["hash"].ToString();
                            two  = hash.Substring(0, 2);
                            lj   = two + "\\" + hash;
                            if (!File.Exists(rundir + @".minecraft\assets\objects\" + lj))
                            {
                                lostasset.Add(hash);
                            }
                        }
                    }
                    else if (type == "legacy")
                    {
                        string jsonindex;
                        if (File.Exists(rundir + @".minecraft\assets\indexes\legacy.json"))
                        {
                            jsonindex = File.ReadAllText(rundir + ".minecraft/assets/indexes/legacy.json");
                        }
                        else
                        {
                            jsonindex = Beelogin.GetGeneralContent(url);
                        }
                        File.WriteAllText(rundir + @".minecraft\assets\indexes\legacy.json", jsonindex, Encoding.Default);
                        JObject jdata = (JObject)JsonConvert.DeserializeObject(jsonindex);
                        jdata = (JObject)jdata["objects"];
                        //  jdata = jdata["objects"];
                        foreach (var name in jdata)
                        {
                            //MessageBox.Show(rundir + @".minecraft\assets\" + name.Key);
                            if (!File.Exists(rundir + @".minecraft\assets\" + name.Key))
                            {
                                lostlegacyasset.Add(name.Key.Replace("/", "\\"));
                            }
                        }
                    }
                }
                catch
                {
                    type = data["assets"].ToString();
                    url  = "null";
                    if (type != "legacy")
                    {
                        string jsonindex;

                        if (File.Exists(rundir + @".minecraft\assets\indexes\" + type + ".json"))
                        {
                            jsonindex = File.ReadAllText(rundir + @".minecraft\assets\indexes\" + type + ".json");
                            JsonData jdata = JsonMapper.ToObject(jsonindex);
                            jdata = jdata["objects"];
                            string hash;
                            string two;
                            string lj;
                            for (int i = 0; i < jdata.Count; i++)
                            {
                                hash = jdata[i]["hash"].ToString();
                                two  = hash.Substring(0, 2);
                                lj   = two + "\\" + hash;
                                if (!File.Exists(rundir + @".minecraft\assets\objects\" + lj))
                                {
                                    lostasset.Add(hash);
                                }
                            }
                            lostassets = false;
                        }
                        else
                        {
                            lostassets = true;
                        }
                    }
                    else if (type == "legacy")
                    {
                        string jsonindex;
                        if (File.Exists(rundir + @".minecraft\assets\indexes\legacy.json"))
                        {
                            jsonindex = File.ReadAllText(rundir + ".minecraft/assets/indexes/legacy.json");
                            File.WriteAllText(rundir + @".minecraft\assets\indexes\legacy.json", jsonindex, Encoding.Default);
                            JObject jdata = (JObject)JsonConvert.DeserializeObject(jsonindex);
                            jdata = (JObject)jdata["objects"];
                            //  jdata = jdata["objects"];
                            foreach (var name in jdata)
                            {
                                //MessageBox.Show(rundir + @".minecraft\assets\" + name.Key);
                                if (!File.Exists(rundir + @".minecraft\assets\" + name.Key))
                                {
                                    lostlegacyasset.Add(name.Key.Replace("/", "\\"));
                                }
                            }
                            lostassets = false;
                        }
                        else
                        {
                            lostassets = true;
                        }
                    }
                }

                try
                {
                    if (lostasset.Count != 0 || lostlegacyasset.Count != 0)
                    {
                        if (url == "null")
                        {
                            await this.ShowMessageAsync("资源文件缺失", "发现缺少了" + (lostasset.Count != 0 ? lostasset.Count.ToString() : lostlegacyasset.Count != 0 ? lostlegacyasset.Count.ToString() : null) + "个资源文件,这可能导致游戏声音丢失\n但您的游戏核心版本较旧,不能自动补全.\n建议前往下载游戏窗口下载新版本客户端!", MessageDialogStyle.Affirmative, new MetroDialogSettings()
                            {
                                AffirmativeButtonText = "确定"
                            });

                            //   Ts("资源文件缺失", "发现缺少了" + (lostasset.Count != 0 ? lostasset.Count.ToString() : lostlegacyasset.Count != 0 ? lostlegacyasset.Count.ToString() : null) + "个资源文件,但您的游戏核心版本较旧,不能自动补全.\n建议前往下载游戏窗口下载新版本客户端!");
                        }
                        else
                        {
                            // new downWindow { Owner = this }.ShowDialog();

                            downw.Owner = this;
                            downw.ShowDialog();
                        }
                    }
                }
                catch
                {
                    //ts("错误", "尝试检查资源文件时失败,建议前往下载游戏窗口下载新版本客户端!");
                    lostassets = true;

                    // await this.ShowMessageAsync("错误", "尝试检查资源文件时失败,建议前往下载游戏窗口下载新版本客户端!", MessageDialogStyle.Affirmative, new MetroDialogSettings() { AffirmativeButtonText = "确定" });
                }
            }


            if (!bgWorker.IsBusy)
            {
                //MessageBox.Show("1");
                // bgWorker.CancelAsync();
                //bgWorker.Dispose();
                if (islaunch)
                {
                    bgWorker.RunWorkerAsync();
                }
                else
                {
                    bgWorker.WorkerReportsProgress = true;
                    bgWorker.ProgressChanged      += new ProgressChangedEventHandler(Bw_ProgressChanged);
                    bgWorker.RunWorkerCompleted   += new RunWorkerCompletedEventHandler(Bw_RunWorkerCompleted);
                    bgWorker.DoWork += new DoWorkEventHandler(Bw_DoWork1);
                    bgWorker.RunWorkerAsync();
                    islaunch = true;
                }
            }
        }
コード例 #5
0
        /// <summary>
        ///     获取Version信息,当出现错误时会返回null
        /// </summary>
        /// <param name="id">版本id</param>
        /// <returns>Version的信息</returns>
        internal Version GetVersionInternal(string id)
        {
            try
            {
                if (_locatingVersion.Contains(id))
                {
                    return(null);
                }
                _locatingVersion.Add(id);

                if (_versions.TryGetValue(id, out Version version))
                {
                    return(version);
                }

                var jver = LoadVersion(_core.GetVersionJsonPath(id));
                if (jver == null)
                {
                    return(null);
                }

                version = new Version();
                if (string.IsNullOrWhiteSpace(jver.Id))
                {
                    return(null);
                }
                if (jver.arguments == null && string.IsNullOrWhiteSpace(jver.MinecraftArguments))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.MainClass))
                {
                    return(null);
                }
                if (string.IsNullOrWhiteSpace(jver.Assets))
                {
                    jver.Assets = "legacy";
                }
                if (jver.Libraries == null)
                {
                    return(null);
                }
                version.Id = jver.Id;
                if (jver.AssetsIndex != null)
                {
                    version.AssetsIndex = new GameFileInfo()
                    {
                        ID        = jver.AssetsIndex.ID,
                        Path      = jver.AssetsIndex.Path,
                        SHA1      = jver.AssetsIndex.SHA1,
                        Size      = jver.AssetsIndex.Size,
                        TotalSize = jver.AssetsIndex.TotalSize,
                        Url       = jver.AssetsIndex.Url
                    };
                }
                if (jver.Downloads != null)
                {
                    version.Downloads = new Download()
                    {
                        Client = jver.Downloads.Client != null ? new GameFileInfo()
                        {
                            SHA1 = jver.Downloads.Client.SHA1,
                            Size = jver.Downloads.Client.Size,
                            Url  = jver.Downloads.Client.Url
                        } : null,
                        Server = jver.Downloads.Server != null ? new GameFileInfo()
                        {
                            SHA1 = jver.Downloads.Server.SHA1,
                            Size = jver.Downloads.Server.Size,
                            Url  = jver.Downloads.Server.Url
                        } : null
                    };
                }
                if (!string.IsNullOrEmpty(jver.MinecraftArguments))
                {
                    version.MinecraftArguments = jver.MinecraftArguments;
                }
                else
                {
                    StringBuilder printf = new StringBuilder();
                    version.FeatureArguments = new Dictionary <string, string>();
                    if (jver.arguments.game != null)
                    {
                        jver.arguments.game.ToList().ForEach(a =>
                        {
                            if (a.GetJsonType() != JsonType.String)
                            {
                                try
                                {
                                    StringBuilder sb2 = new StringBuilder();
                                    if (a["value"].GetJsonType() == JsonType.Array)
                                    {
                                        for (int i = 0; i < a["value"].Count; i++)
                                        {
                                            sb2.Append(a["value"][i].ToString()).Append(" ");
                                        }
                                    }
                                    else
                                    {
                                        sb2.Append(a["value"].ToString());
                                    }
                                    version.FeatureArguments.Add(a["rules"][0]["features"].Keys.First(), sb2.ToString());
                                }
                                catch { }
                            }
                            else
                            {
                                printf.Append(a + " ");
                            }
                        });
                    }

                    version.MinecraftArguments = printf.ToString();
                }
                version.Assets    = jver.Assets;
                version.MainClass = jver.MainClass;
                version.JarId     = jver.JarId;
                version.Libraries = new List <Library>();
                version.Natives   = new List <Native>();
                foreach (var lib in jver.Libraries)
                {
                    if (string.IsNullOrWhiteSpace(lib.Name))
                    {
                        continue;
                    }
                    var names = lib.Name.Split(':');
                    if (names.Length != 3)
                    {
                        continue;
                    }
                    if (lib.Natives == null)
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        version.Libraries.Add(new Library
                        {
                            NS      = names[0],
                            Name    = names[1],
                            Version = names[2]
                        });
                    }
                    else
                    {
                        if (!IfAllowed(lib.Rules))
                        {
                            continue;
                        }
                        var native = new Native
                        {
                            NS           = names[0],
                            Name         = names[1],
                            Version      = names[2],
                            NativeSuffix = lib.Natives["windows"].Replace("${arch}", SystemTools.GetArch())
                        };
                        version.Natives.Add(native);
                        if (lib.Extract != null)
                        {
                            native.Options = new UnzipOptions {
                                Exclude = lib.Extract.Exculde
                            };
                        }
                    }
                }

                if (jver.InheritsVersion != null)
                {
                    var target = GetVersionInternal(jver.InheritsVersion);
                    if (target == null)
                    {
                        return(null);
                    }
                    else
                    {
                        if (version.Assets == "legacy")
                        {
                            version.Assets = null;
                        }
                        version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex;
                        version.Downloads   = version.Downloads ?? target.Downloads;
                        version.Assets      = version.Assets ?? target.Assets;
                        version.JarId       = version.JarId ?? target.JarId;
                        version.MainClass   = version.MainClass ?? target.MainClass;
                        if (!string.IsNullOrEmpty(jver.MinecraftArguments))
                        {
                            version.MinecraftArguments = version.MinecraftArguments ?? target.MinecraftArguments;
                        }
                        else
                        {
                            version.MinecraftArguments = version.MinecraftArguments + target.MinecraftArguments;
                        }
                        if (target.FeatureArguments != null)
                        {
                            version.FeatureArguments = version.FeatureArguments.Concat(target.FeatureArguments).ToDictionary(k => k.Key, v => v.Value);
                        }
                        version.Natives.AddRange(target.Natives);
                        version.Libraries.AddRange(target.Libraries);
                        version.AssetsIndex = version.AssetsIndex ?? target.AssetsIndex;
                    }
                }


                version.JarId = version.JarId ?? version.Id;
                _versions.Add(version.Id, version);
                return(version);
            }
            catch (System.Exception ex)
            {
                return(null);
            }
            finally
            {
                _locatingVersion.Remove(id);
            }
        }