Exemplo n.º 1
0
        /// <summary>
        /// リストからアセットをダウンロードします。
        /// </summary>
        /// <param name="index">ダウンロードするアセットのリスト</param>
        /// <param name="assetsDirectory">アセットディレクトリの場所</param>
        /// <param name="onProgressChanged">進捗状況が変化したときのイベントハンドラ</param>
        public static void DownloadAssets(this AssetIndex index, string assetsDirectory,
                                          MinecraftProgressEventHandler onProgressChanged = null)
        {
            var objects = index.Objects;
            var keys    = objects.Keys.ToArray();

            for (var i = 0; i < objects.Count; i++)
            {
                var name = keys[i];
                var obj  = objects[name];
                var hash = obj.Hash;

                onProgressChanged?.Invoke(
                    new MinecraftProgressEventArgs(
                        objects.Count,
                        i + 1,
                        name
                        )
                    );

                var hashHeader    = hash.Substring(0, 2);
                var path          = hashHeader + "/" + hash;
                var directoryBase = assetsDirectory + "/objects/";
                var directory     = directoryBase + hashHeader;
                var file          = directoryBase + path;
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                if (File.Exists(file))
                {
                    continue;
                }

                DownloadFile(AssetsUrlBase + path, file);
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// ネイティブライブラリを展開して配置します。
        /// </summary>
        /// <param name="extracts">展開するネイティブライブラリの場所と展開ルールのディクショナリ</param>
        /// <param name="directory">展開先ディレクトリの場所</param>
        /// <param name="onProgressChanged">進捗状況が変化したときのイベントハンドラ</param>
        public static void ExtractNatives(Dictionary <string, ExtractRule> extracts, string directory,
                                          MinecraftProgressEventHandler onProgressChanged)
        {
            var keys = extracts.Keys.ToArray();

            for (var i = 0; i < extracts.Count; i++)
            {
                var path     = keys[i];
                var excludes = extracts[path].Excludes;

                onProgressChanged?.Invoke(
                    new MinecraftProgressEventArgs(
                        extracts.Count,
                        i + 1,
                        Path.GetFileName(path)
                        )
                    );

                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }
                using (var archive = ZipFile.OpenRead(path))
                {
                    foreach (var entry in archive.Entries)
                    {
                        if (excludes.ContainsWhere(e => entry.FullName.StartsWith(e)))
                        {
                            continue;
                        }

                        entry.ExtractToFile($"{directory}/{entry.Name}", true);
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// バージョンの詳細からライブラリをダウンロードします。
        /// </summary>
        /// <param name="detail">ライブラリをダウンロードするバージョンの詳細</param>
        /// <param name="librariesDirectory">ライブラリディレクトリの場所</param>
        /// <param name="onProgressChanged">進捗状況が変化したときのイベントハンドラ</param>
        /// <returns>クラスパスなどを含むダウンロードの結果</returns>
        public static LibrariesDownloadResult DownloadLibraries(this VersionDetail detail, string librariesDirectory,
                                                                MinecraftProgressEventHandler onProgressChanged = null)
        {
            var classpath = new List <string>();
            var extracts  = new Dictionary <string, ExtractRule>();
            var libraries = detail.Libraries;

            for (var i = 0; i < libraries.Length; i++)
            {
                var library = libraries[i];

                onProgressChanged?.Invoke(
                    new MinecraftProgressEventArgs(
                        libraries.Length,
                        i + 1,
                        library.Name
                        )
                    );

                var location = library.Downloads.Artifact;
                if (location != null)
                {
                    classpath.Add(location.DownloadLibrary(librariesDirectory));
                }

                var rules = library.NativeRules;
                if (rules != null)
                {
                    if (rules.ContainsWhere(r => r.Action == NativeRuleAction.Disallow) &&
                        rules.Where(r => r.Action == NativeRuleAction.Disallow)
                        .ContainsWhere(r => r.OS.Type == NativeOSType.Windows))
                    {
                        continue;
                    }

                    if (!rules.ContainsWhere(r => r.Action == NativeRuleAction.Disallow) &&
                        !rules.Where(r => r.Action == NativeRuleAction.Allow)
                        .ContainsWhere(r => r.OS.Type == NativeOSType.Windows))
                    {
                        continue;
                    }
                }

                if (library.Natives == null ||
                    !library.Natives.ContainsKey(NativeOSType.Windows))
                {
                    continue;
                }

                var arch       = Environment.Is64BitOperatingSystem ? "64" : "32";
                var nativeName = library.Natives[NativeOSType.Windows].Replace("${arch}", arch);
                var classifier = library.Downloads.Classifiers[nativeName];
                extracts.Add(classifier.DownloadLibrary(librariesDirectory), library.ExtractRule);
            }

            return(new LibrariesDownloadResult
            {
                Classpath = classpath,
                Extracts = extracts
            });
        }