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