/// <summary> /// 反序列化基础游戏JSON信息,以供解析器处理。 /// Deserialize basic JSON data of the game to make the data processable for the analyzer. /// </summary> /// <param name="id">游戏文件夹名。Name of the game's folder.</param> /// <returns></returns> public override RawVersionModel ParseRawVersion(string id) { // 预防I/O的错误。 // Prevents errors related to I/O. if (!Directory.Exists(Path.Combine(RootPath, GamePathHelper.GetGamePath(id)))) { return(null); } if (!File.Exists(GamePathHelper.GetGameJsonPath(RootPath, id))) { return(null); } var versionJson = JsonConvert.DeserializeObject <RawVersionModel>( File.ReadAllText(GamePathHelper.GetGameJsonPath(RootPath, id))); if (string.IsNullOrEmpty(versionJson.MainClass)) { return(null); } if (string.IsNullOrEmpty(versionJson.MinecraftArguments) && versionJson.Arguments == null) { return(null); } return(versionJson); }
public async Task <string> InstallTaskAsync() { InvokeStatusChangedEvent("开始安装", 0); var jsonUrl = "https://fabricmc.net/download/technic/?yarn=" + Uri.EscapeDataString(YarnArtifact.Version) + "&loader=" + Uri.EscapeDataString(LoaderArtifact.Loader.Version); var jsonContentRes = await HttpHelper.Get(jsonUrl); var jsonContent = await jsonContentRes.Content.ReadAsStringAsync(); var versionModel = JsonConvert.DeserializeObject <RawVersionModel>(jsonContent); var id = string.IsNullOrEmpty(CustomId) ? $"{YarnArtifact.GameVersion}-fabric{YarnArtifact.Version}-{LoaderArtifact.Loader.Version}" : CustomId; versionModel.Id = id; versionModel.InheritsFrom = YarnArtifact.GameVersion; InvokeStatusChangedEvent("解析 Libraries 完成", 23.3333); var dir = Path.Combine(RootPath, GamePathHelper.GetGamePath(id)); var di = new DirectoryInfo(dir); if (!di.Exists) { di.Create(); } else { DirectoryHelper.CleanDirectory(di.FullName); } var resultJson = JsonConvert.SerializeObject(versionModel, JsonHelper.CamelCasePropertyNamesSettings); InvokeStatusChangedEvent("生成版本总成", 70); var jsonPath = GamePathHelper.GetGameJsonPath(RootPath, id); InvokeStatusChangedEvent("将版本 Json 写入文件", 90); await File.WriteAllTextAsync(jsonPath, resultJson); InvokeStatusChangedEvent("安装完成", 100); return(id); }
/// <summary> /// 解析基础游戏JSON信息 /// </summary> /// <param name="id"></param> /// <returns></returns> private protected override RawVersionModel ParseRawVersion(string id) { if (!Directory.Exists(GamePathHelper.GetGamePath(RootPath, id))) { return(null); } if (!File.Exists(GamePathHelper.GetGameJsonPath(RootPath, id))) { return(null); } var versionJson = JsonConvert.DeserializeObject <RawVersionModel>(File.ReadAllText(GamePathHelper.GetGameJsonPath(RootPath, id))); if (string.IsNullOrEmpty(versionJson.MainClass)) { return(null); } if (string.IsNullOrEmpty(versionJson.MinecraftArguments) && versionJson.Arguments == null) { return(null); } return(versionJson); }
public async IAsyncEnumerable <IGameResource> ResolveResourceAsync() { var id = VersionInfo.RootVersion ?? VersionInfo.DirName; var versionJson = GamePathHelper.GetGameJsonPath(BasePath, id); if (!File.Exists(versionJson)) { yield break; } var fileContent = await File.ReadAllTextAsync(versionJson); var rawVersionModel = JsonConvert.DeserializeObject <RawVersionModel>(fileContent); if (rawVersionModel?.Downloads?.Client == null) { yield break; } var clientDownload = rawVersionModel.Downloads.Client; var jarPath = GamePathHelper.GetVersionJar(BasePath, id); var downloadInfo = new VersionJarDownloadInfo { CheckSum = clientDownload.Sha1, FileName = $"{id}.jar", FileSize = clientDownload.Size, Path = Path.Combine(BasePath, GamePathHelper.GetGamePath(id)), Title = $"{id}.jar", Type = "GameJar", Uri = clientDownload.Url }; if (!File.Exists(jarPath)) { yield return(downloadInfo); } else { if (string.IsNullOrEmpty(clientDownload.Sha1)) { yield break; } using var hash = SHA1.Create(); var computedHash = await CryptoHelper.ComputeFileHashAsync(jarPath, hash); if (computedHash.Equals(clientDownload.Sha1, StringComparison.OrdinalIgnoreCase)) { yield break; } try { File.Delete(jarPath); } catch (Exception) { } yield return(downloadInfo); } }