From fabdaec614be5ddc4f5b494faca62d5f1a18c549 Mon Sep 17 00:00:00 2001 From: Razmoth <32140579+Razmoth@users.noreply.github.com> Date: Wed, 25 Oct 2023 18:16:17 +0400 Subject: [PATCH] - [Core] changes to `AssetsHelper`. - [CLI] changes to `AssetsHelper`. - [GUI] Added option to load external `CABMap` files --- AssetStudio.CLI/Program.cs | 2 +- AssetStudio.GUI/MainForm.Designer.cs | 23 +++++--- AssetStudio.GUI/MainForm.cs | 22 ++++++-- AssetStudio/AssetsHelper.cs | 80 ++++++++++++++++++---------- 4 files changed, 88 insertions(+), 39 deletions(-) diff --git a/AssetStudio.CLI/Program.cs b/AssetStudio.CLI/Program.cs index 58a4519..defc344 100644 --- a/AssetStudio.CLI/Program.cs +++ b/AssetStudio.CLI/Program.cs @@ -80,7 +80,7 @@ namespace AssetStudio.CLI } if (o.MapOp.HasFlag(MapOpType.Load)) { - AssetsHelper.LoadCABMap(o.MapName); + AssetsHelper.LoadCABMapInternal(o.MapName); assetsManager.ResolveDependencies = true; } if (o.MapOp.HasFlag(MapOpType.AssetMap)) diff --git a/AssetStudio.GUI/MainForm.Designer.cs b/AssetStudio.GUI/MainForm.Designer.cs index 4a20012..7305781 100644 --- a/AssetStudio.GUI/MainForm.Designer.cs +++ b/AssetStudio.GUI/MainForm.Designer.cs @@ -114,6 +114,7 @@ namespace AssetStudio.GUI toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox(); buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + assetMapTypeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -171,7 +172,7 @@ namespace AssetStudio.GUI exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); showOriginalFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - assetMapTypeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + loadCABMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); @@ -723,7 +724,7 @@ namespace AssetStudio.GUI // // miscToolStripMenuItem // - miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeMenuItem, toolStripSeparator8, loadAIToolStripMenuItem, assetBrowserToolStripMenuItem }); + miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeMenuItem, toolStripSeparator8, loadAIToolStripMenuItem, loadCABMapToolStripMenuItem, assetBrowserToolStripMenuItem }); miscToolStripMenuItem.Name = "miscToolStripMenuItem"; miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20); miscToolStripMenuItem.Text = "Misc."; @@ -774,6 +775,13 @@ namespace AssetStudio.GUI buildAssetMapToolStripMenuItem.Text = "Build AssetMap"; buildAssetMapToolStripMenuItem.Click += buildAssetMapToolStripMenuItem_Click; // + // assetMapTypeMenuItem + // + assetMapTypeMenuItem.Name = "assetMapTypeMenuItem"; + assetMapTypeMenuItem.Size = new System.Drawing.Size(181, 22); + assetMapTypeMenuItem.Text = "AssetMap Type"; + assetMapTypeMenuItem.DropDownItemClicked += assetMapTypeMenuItem_DropDownItemClicked; + // // toolStripSeparator8 // toolStripSeparator8.Name = "toolStripSeparator8"; @@ -1337,12 +1345,12 @@ namespace AssetStudio.GUI showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; // - // assetMapTypeMenuItem + // loadCABMapToolStripMenuItem // - assetMapTypeMenuItem.Name = "assetMapTypeMenuItem"; - assetMapTypeMenuItem.Size = new System.Drawing.Size(181, 22); - assetMapTypeMenuItem.Text = "AssetMap Type"; - assetMapTypeMenuItem.DropDownItemClicked += assetMapTypeMenuItem_DropDownItemClicked; + loadCABMapToolStripMenuItem.Name = "loadCABMapToolStripMenuItem"; + loadCABMapToolStripMenuItem.Size = new System.Drawing.Size(181, 22); + loadCABMapToolStripMenuItem.Text = "Load CABMap"; + loadCABMapToolStripMenuItem.Click += loadCABMapToolStripMenuItem_Click; // // MainForm // @@ -1533,6 +1541,7 @@ namespace AssetStudio.GUI private System.Windows.Forms.ToolStripMenuItem enableVerbose; private System.Windows.Forms.ToolStripMenuItem sceneHierarchy; private System.Windows.Forms.ToolStripMenuItem assetMapTypeMenuItem; + private System.Windows.Forms.ToolStripMenuItem loadCABMapToolStripMenuItem; } } diff --git a/AssetStudio.GUI/MainForm.cs b/AssetStudio.GUI/MainForm.cs index e3bcdc6..be1ba93 100644 --- a/AssetStudio.GUI/MainForm.cs +++ b/AssetStudio.GUI/MainForm.cs @@ -146,7 +146,7 @@ namespace AssetStudio.GUI { var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType; var assetMapTypes = Enum.GetValues().ToArray()[1..]; - foreach(var mapType in assetMapTypes) + foreach (var mapType in assetMapTypes) { var menuItem = new ToolStripMenuItem(mapType.ToString()) { CheckOnClick = true, Checked = assetMapType.HasFlag(mapType), Tag = (int)mapType }; assetMapTypeMenuItem.DropDownItems.Add(menuItem); @@ -166,7 +166,7 @@ namespace AssetStudio.GUI MapNameComboBox.SelectedIndexChanged += new EventHandler(specifyNameComboBox_SelectedIndexChanged); if (!string.IsNullOrEmpty(Properties.Settings.Default.selectedCABMapName)) { - if (!AssetsHelper.LoadCABMap(Properties.Settings.Default.selectedCABMapName)) + if (!AssetsHelper.LoadCABMapInternal(Properties.Settings.Default.selectedCABMapName)) { Properties.Settings.Default.selectedCABMapName = ""; Properties.Settings.Default.Save(); @@ -2063,7 +2063,7 @@ namespace AssetStudio.GUI Properties.Settings.Default.assetMapType = assetMapType; Properties.Settings.Default.Save(); } - + } private void modelsOnly_CheckedChanged(object sender, EventArgs e) { @@ -2111,7 +2111,7 @@ namespace AssetStudio.GUI var name = MapNameComboBox.SelectedItem.ToString(); await Task.Run(() => { - if (AssetsHelper.LoadCABMap(name)) + if (AssetsHelper.LoadCABMapInternal(name)) { Properties.Settings.Default.selectedCABMapName = name; Properties.Settings.Default.Save(); @@ -2340,6 +2340,20 @@ namespace AssetStudio.GUI } } + private async void loadCABMapToolStripMenuItem_Click(object sender, EventArgs e) + { + miscToolStripMenuItem.DropDown.Visible = false; + + var openFileDialog = new OpenFileDialog() { Multiselect = false, Filter = "CABMap File|*.bin" }; + if (openFileDialog.ShowDialog(this) == DialogResult.OK) + { + var path = openFileDialog.FileName; + InvokeUpdate(loadCABMapToolStripMenuItem, false); + await Task.Run(() => AssetsHelper.LoadCABMap(path)); + InvokeUpdate(loadCABMapToolStripMenuItem, true); + } + } + private void clearConsoleToolStripMenuItem_Click(object sender, EventArgs e) { Console.Clear(); diff --git a/AssetStudio/AssetsHelper.cs b/AssetStudio/AssetsHelper.cs index 439b473..c7e39d3 100644 --- a/AssetStudio/AssetsHelper.cs +++ b/AssetStudio/AssetsHelper.cs @@ -10,6 +10,7 @@ using System.Text.RegularExpressions; using System.Xml; using System.Text; using MessagePack; +using System.Reflection.Metadata.Ecma335; namespace AssetStudio { @@ -244,37 +245,15 @@ namespace AssetStudio } } - public static bool LoadCABMap(string mapName) + public static bool LoadCABMapInternal(string mapName) { - Logger.Info($"Loading {mapName}"); + Logger.Info($"Loading {mapName}..."); try { CABMap.Clear(); - using (var fs = File.OpenRead(Path.Combine(MapName, $"{mapName}.bin"))) - using (var reader = new BinaryReader(fs)) - { - BaseFolder = reader.ReadString(); - var count = reader.ReadInt32(); - for (int i = 0; i < count; i++) - { - var cab = reader.ReadString(); - var path = reader.ReadString(); - var offset = reader.ReadInt64(); - var depCount = reader.ReadInt32(); - var dependencies = new string[depCount]; - for (int j = 0; j < depCount; j++) - { - dependencies[j] = reader.ReadString(); - } - var entry = new Entry() - { - Path = path, - Offset = offset, - Dependencies = dependencies - }; - CABMap.Add(cab, entry); - } - } + using var fs = File.OpenRead(Path.Combine(MapName, $"{mapName}.bin")); + using var reader = new BinaryReader(fs); + ParseCABMap(reader); Logger.Verbose($"Initialized CABMap with {CABMap.Count} entries"); Logger.Info($"Loaded {mapName} !!"); } @@ -287,6 +266,53 @@ namespace AssetStudio return true; } + public static bool LoadCABMap(string path) + { + var mapName = Path.GetFileNameWithoutExtension(path); + Logger.Info($"Loading {mapName}..."); + try + { + CABMap.Clear(); + using var fs = File.OpenRead(path); + using var reader = new BinaryReader(fs); + ParseCABMap(reader); + Logger.Verbose($"Initialized CABMap with {CABMap.Count} entries"); + Logger.Info($"Loaded {mapName} !!"); + } + catch (Exception e) + { + Logger.Warning($"{mapName} was not loaded, {e}"); + return false; + } + + return true; + } + + private static void ParseCABMap(BinaryReader reader) + { + BaseFolder = reader.ReadString(); + var count = reader.ReadInt32(); + for (int i = 0; i < count; i++) + { + var cab = reader.ReadString(); + var path = reader.ReadString(); + var offset = reader.ReadInt64(); + var depCount = reader.ReadInt32(); + var dependencies = new string[depCount]; + for (int j = 0; j < depCount; j++) + { + dependencies[j] = reader.ReadString(); + } + var entry = new Entry() + { + Path = path, + Offset = offset, + Dependencies = dependencies + }; + CABMap.Add(cab, entry); + } + } + public static void BuildAssetMap(string[] files, string mapName, Game game, string savePath, ExportListType exportListType, ManualResetEvent resetEvent = null, ClassIDType[] typeFilters = null, Regex[] nameFilters = null, Regex[] containerFilters = null) { Logger.Info("Building AssetMap...");