- [Core] changes to AssetsHelper.

- [CLI] changes to `AssetsHelper`.
- [GUI] Added option to load external `CABMap` files
This commit is contained in:
Razmoth
2023-10-25 18:16:17 +04:00
parent 57d78dbb5c
commit fabdaec614
4 changed files with 88 additions and 39 deletions

View File

@@ -80,7 +80,7 @@ namespace AssetStudio.CLI
} }
if (o.MapOp.HasFlag(MapOpType.Load)) if (o.MapOp.HasFlag(MapOpType.Load))
{ {
AssetsHelper.LoadCABMap(o.MapName); AssetsHelper.LoadCABMapInternal(o.MapName);
assetsManager.ResolveDependencies = true; assetsManager.ResolveDependencies = true;
} }
if (o.MapOp.HasFlag(MapOpType.AssetMap)) if (o.MapOp.HasFlag(MapOpType.AssetMap))

View File

@@ -114,6 +114,7 @@ namespace AssetStudio.GUI
toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox(); assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox();
buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
assetMapTypeMenuItem = new System.Windows.Forms.ToolStripMenuItem();
toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -171,7 +172,7 @@ namespace AssetStudio.GUI
exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); exportAnimatorwithselectedAnimationClipMenuItem = new System.Windows.Forms.ToolStripMenuItem();
goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); goToSceneHierarchyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
showOriginalFileToolStripMenuItem = 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(); menuStrip1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit();
splitContainer1.Panel1.SuspendLayout(); splitContainer1.Panel1.SuspendLayout();
@@ -723,7 +724,7 @@ namespace AssetStudio.GUI
// //
// miscToolStripMenuItem // 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.Name = "miscToolStripMenuItem";
miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20); miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20);
miscToolStripMenuItem.Text = "Misc."; miscToolStripMenuItem.Text = "Misc.";
@@ -774,6 +775,13 @@ namespace AssetStudio.GUI
buildAssetMapToolStripMenuItem.Text = "Build AssetMap"; buildAssetMapToolStripMenuItem.Text = "Build AssetMap";
buildAssetMapToolStripMenuItem.Click += buildAssetMapToolStripMenuItem_Click; 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
// //
toolStripSeparator8.Name = "toolStripSeparator8"; toolStripSeparator8.Name = "toolStripSeparator8";
@@ -1337,12 +1345,12 @@ namespace AssetStudio.GUI
showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Visible = false;
showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click;
// //
// assetMapTypeMenuItem // loadCABMapToolStripMenuItem
// //
assetMapTypeMenuItem.Name = "assetMapTypeMenuItem"; loadCABMapToolStripMenuItem.Name = "loadCABMapToolStripMenuItem";
assetMapTypeMenuItem.Size = new System.Drawing.Size(181, 22); loadCABMapToolStripMenuItem.Size = new System.Drawing.Size(181, 22);
assetMapTypeMenuItem.Text = "AssetMap Type"; loadCABMapToolStripMenuItem.Text = "Load CABMap";
assetMapTypeMenuItem.DropDownItemClicked += assetMapTypeMenuItem_DropDownItemClicked; loadCABMapToolStripMenuItem.Click += loadCABMapToolStripMenuItem_Click;
// //
// MainForm // MainForm
// //
@@ -1533,6 +1541,7 @@ namespace AssetStudio.GUI
private System.Windows.Forms.ToolStripMenuItem enableVerbose; private System.Windows.Forms.ToolStripMenuItem enableVerbose;
private System.Windows.Forms.ToolStripMenuItem sceneHierarchy; private System.Windows.Forms.ToolStripMenuItem sceneHierarchy;
private System.Windows.Forms.ToolStripMenuItem assetMapTypeMenuItem; private System.Windows.Forms.ToolStripMenuItem assetMapTypeMenuItem;
private System.Windows.Forms.ToolStripMenuItem loadCABMapToolStripMenuItem;
} }
} }

View File

@@ -146,7 +146,7 @@ namespace AssetStudio.GUI
{ {
var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType; var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType;
var assetMapTypes = Enum.GetValues<ExportListType>().ToArray()[1..]; var assetMapTypes = Enum.GetValues<ExportListType>().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 }; var menuItem = new ToolStripMenuItem(mapType.ToString()) { CheckOnClick = true, Checked = assetMapType.HasFlag(mapType), Tag = (int)mapType };
assetMapTypeMenuItem.DropDownItems.Add(menuItem); assetMapTypeMenuItem.DropDownItems.Add(menuItem);
@@ -166,7 +166,7 @@ namespace AssetStudio.GUI
MapNameComboBox.SelectedIndexChanged += new EventHandler(specifyNameComboBox_SelectedIndexChanged); MapNameComboBox.SelectedIndexChanged += new EventHandler(specifyNameComboBox_SelectedIndexChanged);
if (!string.IsNullOrEmpty(Properties.Settings.Default.selectedCABMapName)) 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.selectedCABMapName = "";
Properties.Settings.Default.Save(); Properties.Settings.Default.Save();
@@ -2111,7 +2111,7 @@ namespace AssetStudio.GUI
var name = MapNameComboBox.SelectedItem.ToString(); var name = MapNameComboBox.SelectedItem.ToString();
await Task.Run(() => await Task.Run(() =>
{ {
if (AssetsHelper.LoadCABMap(name)) if (AssetsHelper.LoadCABMapInternal(name))
{ {
Properties.Settings.Default.selectedCABMapName = name; Properties.Settings.Default.selectedCABMapName = name;
Properties.Settings.Default.Save(); 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) private void clearConsoleToolStripMenuItem_Click(object sender, EventArgs e)
{ {
Console.Clear(); Console.Clear();

View File

@@ -10,6 +10,7 @@ using System.Text.RegularExpressions;
using System.Xml; using System.Xml;
using System.Text; using System.Text;
using MessagePack; using MessagePack;
using System.Reflection.Metadata.Ecma335;
namespace AssetStudio namespace AssetStudio
{ {
@@ -244,14 +245,50 @@ namespace AssetStudio
} }
} }
public static bool LoadCABMap(string mapName) public static bool LoadCABMapInternal(string mapName)
{ {
Logger.Info($"Loading {mapName}"); Logger.Info($"Loading {mapName}...");
try try
{ {
CABMap.Clear(); CABMap.Clear();
using (var fs = File.OpenRead(Path.Combine(MapName, $"{mapName}.bin"))) using var fs = File.OpenRead(Path.Combine(MapName, $"{mapName}.bin"));
using (var reader = new BinaryReader(fs)) 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;
}
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(); BaseFolder = reader.ReadString();
var count = reader.ReadInt32(); var count = reader.ReadInt32();
@@ -275,17 +312,6 @@ namespace AssetStudio
CABMap.Add(cab, entry); CABMap.Add(cab, entry);
} }
} }
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;
}
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) 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)
{ {