Exemple #1
0
        /// <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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        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);
            }
        }