- [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))
{
AssetsHelper.LoadCABMap(o.MapName);
AssetsHelper.LoadCABMapInternal(o.MapName);
assetsManager.ResolveDependencies = true;
}
if (o.MapOp.HasFlag(MapOpType.AssetMap))

View File

@@ -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;
}
}

View File

@@ -146,7 +146,7 @@ namespace AssetStudio.GUI
{
var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType;
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 };
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();

View File

@@ -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...");