/// <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 }; } version.MinecraftArguments = jver.MinecraftArguments ?? UsefulTools.PrintfArray(jver.arguments.game); 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[GetOSSpecifiedNative()].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; 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) { return(null); } finally { _locatingVersion.Remove(id); } }
/// <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 (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.MinecraftArguments = jver.MinecraftArguments ?? UsefulTools.PrintfArray(jver.arguments.game); 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.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); } }