From f35978dc685cd592dd122d5a820c16e4b8ba234e Mon Sep 17 00:00:00 2001 From: VaDiM Date: Fri, 19 Jun 2026 20:52:43 +0300 Subject: [PATCH] [CLI] Some minor fixes --- AssetStudioCLI/Options/CLIOptions.cs | 55 +++++++++++++--------------- AssetStudioCLI/Studio.cs | 11 ++---- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/AssetStudioCLI/Options/CLIOptions.cs b/AssetStudioCLI/Options/CLIOptions.cs index 7101f2c..4c22cd4 100644 --- a/AssetStudioCLI/Options/CLIOptions.cs +++ b/AssetStudioCLI/Options/CLIOptions.cs @@ -90,6 +90,7 @@ namespace AssetStudioCLI.Options public static bool isParsed; public static string[] cliArgs; public static List inputPathList; + private static string defaultCachePath; public static FilterBy filterBy; private static Dictionary optionsDict; private static Dictionary flagsDict; @@ -113,8 +114,8 @@ namespace AssetStudioCLI.Options public static Option o_audioFormat; //live2d public static Option o_l2dGroupOption; - public static Option f_l2dAssetSearchByFilename; public static Option o_l2dMotionMode; + public static Option f_l2dAssetSearchByFilename; public static Option f_l2dForceBezier; //fbx public static Option o_fbxScaleFactor; @@ -247,8 +248,8 @@ namespace AssetStudioCLI.Options "Type - Group exported assets by type name\n" + "Container - Group exported assets by container path\n" + "ContainerFull - Group exported assets by full container path (e.g. with prefab name)\n" + - "SceneHierarchy - Group exported assets by their node path in scene hierarchy\n" + - "FileName - Group exported assets by source file name\n", + "FileName - Group exported assets by source file name\n" + + "SceneHierarchy - Group exported assets by their node path in scene hierarchy\n", optionExample: "Example: \"-g containerFull\"\n", optionHelpGroup: HelpGroups.General ); @@ -425,7 +426,8 @@ namespace AssetStudioCLI.Options optionName: "--fbx-dump-materials", optionDescription: "(Flag) If specified, Studio will dump model-related Material assets along with a model\n", optionExample: "", - optionHelpGroup: HelpGroups.FBX + optionHelpGroup: HelpGroups.FBX, + isFlag: true ); f_fbxUvsAsDiffuseMaps = new GroupedOption ( @@ -435,7 +437,8 @@ namespace AssetStudioCLI.Options "Сan be useful if you cannot find some UVs after exporting (e.g. in Blender)\n" + "(But can also cause some bugs with UVs)\n", optionExample: "", - optionHelpGroup: HelpGroups.FBX + optionHelpGroup: HelpGroups.FBX, + isFlag: true ); f_fbxAsciiFormat = new GroupedOption ( @@ -444,7 +447,8 @@ namespace AssetStudioCLI.Options optionDescription: "(Flag) If specified, Studio will export FBX in ASCII format.\n" + "If not specified, Binary format will be used", optionExample: "", - optionHelpGroup: HelpGroups.FBX + optionHelpGroup: HelpGroups.FBX, + isFlag: true ); #endregion @@ -514,7 +518,7 @@ namespace AssetStudioCLI.Options optionDefaultValue: null, optionName: "--unity-version ", optionDescription: "Specify Unity version\n", - optionExample: "Example: \"--unity-version 2017.4.39f1\"\n", + optionExample: "Example: \"--unity-version 2022.3.2f1\"\n", optionHelpGroup: HelpGroups.Import ); o_cachePath = new GroupedOption @@ -557,7 +561,7 @@ namespace AssetStudioCLI.Options ( optionDefaultValue: false, optionName: "--decompress-to-disk", - optionDescription: "(Flag) If not specified, only bundles larger than 2GB will be decompressed to disk\ninstead of RAM", + optionDescription: "(Flag) If not specified, only bundles larger than 2GB will be decompressed\nto disk(cache dir) instead of RAM", optionExample: "", optionHelpGroup: HelpGroups.Import, isFlag: true @@ -643,7 +647,7 @@ namespace AssetStudioCLI.Options ( optionDefaultValue: false, optionName: "--load-all", - optionDescription: "(Flag) If specified, Studio will load assets of all types\n(Only for Dump, Info and ExportRaw modes)", + optionDescription: "(Flag) If specified, Studio will load assets of all types\n(Only for Dump, JsonDump, Info and ExportRaw modes)", optionExample: "", optionHelpGroup: HelpGroups.Advanced, isFlag: true @@ -803,7 +807,7 @@ namespace AssetStudioCLI.Options break; case "--fbx-dump-mats": case "--fbx-dump-materials": - if (o_workMode.Value != WorkMode.SplitObjects) + if (o_workMode.Value != WorkMode.SplitObjects && o_workMode.Value != WorkMode.Animator) { Console.WriteLine($"{"Error".Color(brightRed)} during parsing [{flag.Color(brightYellow)}] flag. This flag is not suitable for the current working mode [{o_workMode.Value}].\n"); ShowOptionDescription(o_workMode); @@ -856,7 +860,7 @@ namespace AssetStudioCLI.Options if (o_workMode.Value != WorkMode.ExportRaw) { Console.WriteLine($"{"Error".Color(brightRed)} during parsing [{flag.Color(brightYellow)}] flag. This flag is not suitable for the current working mode [{o_workMode.Value}].\n"); - ShowOptionDescription(f_rawByteArrayFromMono, isFlag: true); + ShowOptionDescription(f_rawByteArrayFromMono); return; } f_rawByteArrayFromMono.Value = true; @@ -874,7 +878,7 @@ namespace AssetStudioCLI.Options break; default: Console.WriteLine($"{"Error".Color(brightRed)} during parsing [{flag.Color(brightYellow)}] flag. This flag is not suitable for the current working mode [{o_workMode.Value}].\n"); - ShowOptionDescription(f_loadAllAssets, isFlag: true); + ShowOptionDescription(f_loadAllAssets); return; } break; @@ -1012,10 +1016,7 @@ namespace AssetStudioCLI.Options try { value = Path.GetFullPath(value); - if (!Directory.Exists(value)) - { - Directory.CreateDirectory(value); - } + Directory.CreateDirectory(value); if (!value.EndsWith($"{Path.DirectorySeparatorChar}")) { value += Path.DirectorySeparatorChar; @@ -1428,19 +1429,13 @@ namespace AssetStudioCLI.Options ? "ASExtract" : o_outputFolder.DefaultValue; var fullPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, defaultFolder + Path.DirectorySeparatorChar); - if (!Directory.Exists(fullPath)) - { - Directory.CreateDirectory(fullPath); - } + Directory.CreateDirectory(fullPath); o_outputFolder.Value = fullPath; } if (o_cachePath.Value == o_cachePath.DefaultValue) { - var defaultCachePath = Path.Combine(Directory.GetCurrentDirectory(), o_cachePath.DefaultValue + Path.DirectorySeparatorChar); - if (!Directory.Exists(defaultCachePath)) - { - Directory.CreateDirectory(defaultCachePath); - } + defaultCachePath = Path.Combine(Directory.GetCurrentDirectory(), o_cachePath.DefaultValue + Path.DirectorySeparatorChar); + Directory.CreateDirectory(defaultCachePath); o_cachePath.Value = defaultCachePath; } isParsed = true; @@ -1455,9 +1450,9 @@ namespace AssetStudioCLI.Options return value.Split(separator); } - private static void ShowOptionDescription(Option option, bool isFlag = false) + private static void ShowOptionDescription(Option option) { - var arg = isFlag ? "Flag" : "Option"; + var arg = option.IsFlag ? "Flag" : "Option"; var optionDesc = option.Description + option.Example.Color(ColorConsole.BrightCyan); Console.WriteLine($"{arg} description:\n{optionDesc}"); } @@ -1568,7 +1563,7 @@ namespace AssetStudioCLI.Options { sb.AppendLine($"# Output Path: \"{o_outputFolder}\""); } - if (f_decompressToDisk.Value || o_cachePath.Value != o_cachePath.DefaultValue) + if (f_decompressToDisk.Value || o_cachePath.Value != defaultCachePath) { var driveInfo = new DriveInfo(Directory.GetDirectoryRoot(o_cachePath.Value)); sb.AppendLine($"# Cache Folder: \"{o_cachePath}\" (Free space: {driveInfo.AvailableFreeSpace * 1.0f / 0x40000000:.00}GB)"); @@ -1577,13 +1572,13 @@ namespace AssetStudioCLI.Options sb.AppendLine($"# Log Output: {o_logOutput}"); sb.AppendLine($"# Bundle BlockInfo Compression Type: {o_bundleBlockInfoCompression}"); sb.AppendLine($"# Bundle Block Compression Type: {o_bundleBlockCompression}"); - sb.AppendLine($"# Unity Version: {unityVer}"); if (o_workMode.Value != WorkMode.Extract) { sb.AppendLine($"# Decompress Bundles To Disk: {f_decompressToDisk.Value}"); sb.AppendLine($"# Parse Assets Using TypeTree: {!f_avoidLoadingViaTypetree.Value}"); sb.AppendLine($"# Export Asset List: {o_exportAssetList}"); } + sb.AppendLine($"# Unity Version: {unityVer}"); switch (o_workMode.Value) { case WorkMode.Export: @@ -1627,7 +1622,7 @@ namespace AssetStudioCLI.Options sb.AppendLine($"# Model Group Option: {o_l2dGroupOption}"); sb.AppendFormat("# Search Model-related Assets by: {0}\n", f_l2dAssetSearchByFilename.Value ? "FileName" : "Container"); sb.AppendLine($"# Motion Export Method: {o_l2dMotionMode}"); - sb.AppendLine($"# Force Bezier: {f_l2dForceBezier}"); + sb.AppendLine($"# Smooth Motions: {f_l2dForceBezier}"); sb.AppendLine($"# Assembly Path: \"{o_assemblyPath}\""); break; case WorkMode.SplitObjects: diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index dba3720..2b28f4d 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -29,12 +29,12 @@ namespace AssetStudioCLI Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); Progress.Default = new Progress(ShowCurProgressValue); Progress.SetInstance(1, new Progress(ShowCurProgressValue)); + assetsManager.Options.CustomCachePath = CLIOptions.o_cachePath.Value; + assetsManager.Options.DecompressToDisk = CLIOptions.f_decompressToDisk.Value; assetsManager.Options.ParseByTypeTree = !CLIOptions.f_avoidLoadingViaTypetree.Value; assetsManager.Options.GameSpecific.CustomUnityVersion = CLIOptions.o_unityVersion.Value; assetsManager.Options.GameSpecific.Bundles.CustomBlockInfoCompression = CLIOptions.o_bundleBlockInfoCompression.Value; assetsManager.Options.GameSpecific.Bundles.CustomBlockCompression = CLIOptions.o_bundleBlockCompression.Value; - assetsManager.Options.CustomCachePath = CLIOptions.o_cachePath.Value; - assetsManager.Options.DecompressToDisk = CLIOptions.f_decompressToDisk.Value; assetsManager.ClearOptionLoaders(); } @@ -153,10 +153,7 @@ namespace AssetStudioCLI var filePath = Path.Combine(extractPath, file.path); var fileDirectory = Path.GetDirectoryName(filePath); - if (!Directory.Exists(fileDirectory)) - { - Directory.CreateDirectory(fileDirectory); - } + Directory.CreateDirectory(fileDirectory); if (!File.Exists(filePath)) { using (var fileStream = File.Create(filePath)) @@ -362,7 +359,7 @@ namespace AssetStudioCLI BuildTreeStructure(objectAssetItemDic); } - var log = $"Finished loading {assetsManager.AssetsFileList.Count} files with {parsedAssetsList.Count} exportable assets"; + var log = $"Finished loading {assetsManager.AssetsFileList.Count} files with {parsedAssetsList.Count} exportable asset(s)"; var m_ObjectsCount = assetsManager.AssetsFileList.Sum(x => x.m_Objects.LongCount(y => CLIOptions.o_exportAssetTypes.Value.Any(k => (int)k == y.classID))); var objectsCount = assetsManager.AssetsFileList.Sum(x => x.Objects.LongCount(y => CLIOptions.o_exportAssetTypes.Value.Any(k => k == y.type))); if (m_ObjectsCount != objectsCount)