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); } }