From 92c52ac1087a679f82a5b67e1c45076e79c317d4 Mon Sep 17 00:00:00 2001 From: Razmoth <32140579+Razmoth@users.noreply.github.com> Date: Wed, 18 Oct 2023 18:26:29 +0400 Subject: [PATCH] - [Core] Export multiple `AssetMap` formats --- AssetStudio.GUI/App.config | 2 +- AssetStudio.GUI/MainForm.Designer.cs | 20 ++-- AssetStudio.GUI/MainForm.cs | 54 +++++----- .../Properties/Settings.Designer.cs | 8 +- AssetStudio.GUI/Properties/Settings.settings | 2 +- AssetStudio/AssetsHelper.cs | 98 ++++++++++--------- AssetStudio/ExportTypeList.cs | 21 ++-- 7 files changed, 101 insertions(+), 104 deletions(-) diff --git a/AssetStudio.GUI/App.config b/AssetStudio.GUI/App.config index c9dad67..257108c 100644 --- a/AssetStudio.GUI/App.config +++ b/AssetStudio.GUI/App.config @@ -82,7 +82,7 @@ True - + 0 diff --git a/AssetStudio.GUI/MainForm.Designer.cs b/AssetStudio.GUI/MainForm.Designer.cs index 0204467..4a20012 100644 --- a/AssetStudio.GUI/MainForm.Designer.cs +++ b/AssetStudio.GUI/MainForm.Designer.cs @@ -114,7 +114,6 @@ namespace AssetStudio.GUI toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); assetMapNameTextBox = new System.Windows.Forms.ToolStripTextBox(); buildAssetMapToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - assetMapTypeComboBox = new System.Windows.Forms.ToolStripComboBox(); toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); loadAIToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); assetBrowserToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); @@ -172,6 +171,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(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); splitContainer1.Panel1.SuspendLayout(); @@ -723,7 +723,7 @@ namespace AssetStudio.GUI // // miscToolStripMenuItem // - miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeComboBox, toolStripSeparator8, loadAIToolStripMenuItem, assetBrowserToolStripMenuItem }); + miscToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { MapNameComboBox, buildMapToolStripMenuItem, buildBothToolStripMenuItem, clearMapToolStripMenuItem, toolStripSeparator7, assetMapNameTextBox, buildAssetMapToolStripMenuItem, assetMapTypeMenuItem, toolStripSeparator8, loadAIToolStripMenuItem, assetBrowserToolStripMenuItem }); miscToolStripMenuItem.Name = "miscToolStripMenuItem"; miscToolStripMenuItem.Size = new System.Drawing.Size(47, 20); miscToolStripMenuItem.Text = "Misc."; @@ -774,13 +774,6 @@ namespace AssetStudio.GUI buildAssetMapToolStripMenuItem.Text = "Build AssetMap"; buildAssetMapToolStripMenuItem.Click += buildAssetMapToolStripMenuItem_Click; // - // assetMapTypeComboBox - // - assetMapTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - assetMapTypeComboBox.Name = "assetMapTypeComboBox"; - assetMapTypeComboBox.Size = new System.Drawing.Size(121, 23); - assetMapTypeComboBox.SelectedIndexChanged += assetMapTypeComboBox_SelectedIndexChanged; - // // toolStripSeparator8 // toolStripSeparator8.Name = "toolStripSeparator8"; @@ -1344,6 +1337,13 @@ namespace AssetStudio.GUI showOriginalFileToolStripMenuItem.Visible = false; showOriginalFileToolStripMenuItem.Click += showOriginalFileToolStripMenuItem_Click; // + // assetMapTypeMenuItem + // + assetMapTypeMenuItem.Name = "assetMapTypeMenuItem"; + assetMapTypeMenuItem.Size = new System.Drawing.Size(181, 22); + assetMapTypeMenuItem.Text = "AssetMap Type"; + assetMapTypeMenuItem.DropDownItemClicked += assetMapTypeMenuItem_DropDownItemClicked; + // // MainForm // AllowDrop = true; @@ -1513,7 +1513,6 @@ namespace AssetStudio.GUI private System.Windows.Forms.ToolStripMenuItem loadAIToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem clearConsoleToolStripMenuItem; private System.Windows.Forms.ToolStripTextBox assetMapNameTextBox; - private System.Windows.Forms.ToolStripComboBox assetMapTypeComboBox; private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; private System.Windows.Forms.ToolStripSeparator toolStripSeparator8; private System.Windows.Forms.ToolStripMenuItem buildMapToolStripMenuItem; @@ -1533,6 +1532,7 @@ namespace AssetStudio.GUI private System.Windows.Forms.ToolStripMenuItem enableFileLogging; private System.Windows.Forms.ToolStripMenuItem enableVerbose; private System.Windows.Forms.ToolStripMenuItem sceneHierarchy; + private System.Windows.Forms.ToolStripMenuItem assetMapTypeMenuItem; } } diff --git a/AssetStudio.GUI/MainForm.cs b/AssetStudio.GUI/MainForm.cs index e3e0ec1..274110a 100644 --- a/AssetStudio.GUI/MainForm.cs +++ b/AssetStudio.GUI/MainForm.cs @@ -143,8 +143,13 @@ namespace AssetStudio.GUI private void InitalizeOptions() { - assetMapTypeComboBox.Items.AddRange(Enum.GetValues().Cast().ToArray()); - assetMapTypeComboBox.SelectedIndex = Properties.Settings.Default.selectedAssetMapType; + var assetMapType = (ExportListType)Properties.Settings.Default.assetMapType; + var assetMapTypes = Enum.GetValues().ToArray()[1..]; + foreach(var mapType in assetMapTypes) + { + var menuItem = new ToolStripMenuItem(mapType.ToString()) { CheckOnClick = true, Checked = assetMapType.HasFlag(mapType), Tag = (int)mapType }; + assetMapTypeMenuItem.DropDownItems.Add(menuItem); + } specifyGame.Items.AddRange(GameManager.GetGames()); specifyGame.SelectedIndex = Properties.Settings.Default.selectedGame; @@ -1281,7 +1286,7 @@ namespace AssetStudio.GUI var model = new ModelConverter(m_Animator, Properties.Settings.Default.convertType, Studio.Game, false, Array.Empty()); PreviewModel(model); } - + private void PreviewAnimationClip(AnimationClip clip) { var str = clip.Convert(); @@ -2017,10 +2022,24 @@ namespace AssetStudio.GUI SkipContainer = skipContainer.Checked; } - private void assetMapTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) + private void assetMapTypeMenuItem_DropDownItemClicked(object sender, ToolStripItemClickedEventArgs e) { - Properties.Settings.Default.selectedAssetMapType = assetMapTypeComboBox.SelectedIndex; - Properties.Settings.Default.Save(); + var assetMapType = Properties.Settings.Default.assetMapType; + if (e.ClickedItem is ToolStripMenuItem item) + { + if (item.Checked) + { + assetMapType -= (int)item.Tag; + } + else + { + assetMapType += (int)item.Tag; + } + + Properties.Settings.Default.assetMapType = assetMapType; + Properties.Settings.Default.Save(); + } + } private void modelsOnly_CheckedChanged(object sender, EventArgs e) { @@ -2143,7 +2162,7 @@ namespace AssetStudio.GUI var input = MapNameComboBox.Text; var selectedText = MapNameComboBox.SelectedText; - var exportListType = (ExportListType)assetMapTypeComboBox.SelectedItem; + var exportListType = (ExportListType)assetMapTypeMenuItem.DropDownItems.Cast().Select(x => x.Checked ? (int)x.Tag : 0).Sum(); var name = ""; if (!string.IsNullOrEmpty(selectedText)) @@ -2192,15 +2211,6 @@ namespace AssetStudio.GUI saveFolderDialog.Title = "Select Output Folder"; if (saveFolderDialog.ShowDialog(this) == DialogResult.OK) { - if (File.Exists(Path.Combine(saveFolderDialog.Folder, $"{name}{exportListType.GetExtension()}"))) - { - var acceptOverride = MessageBox.Show("AssetMap already exist, Do you want to override it ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (acceptOverride != DialogResult.Yes) - { - InvokeUpdate(miscToolStripMenuItem, true); - return; - } - } saveDirectoryBackup = saveFolderDialog.Folder; AssetsHelper.SetUnityVersion(version); await Task.Run(() => AssetsHelper.BuildBoth(files, name, openFolderDialog.Folder, Studio.Game, saveFolderDialog.Folder, exportListType)); @@ -2317,7 +2327,7 @@ namespace AssetStudio.GUI InvokeUpdate(miscToolStripMenuItem, false); var input = assetMapNameTextBox.Text; - var exportListType = (ExportListType)assetMapTypeComboBox.SelectedItem; + var exportListType = (ExportListType)assetMapTypeMenuItem.DropDownItems.Cast().Select(x => x.Checked ? (int)x.Tag : 0).Sum(); var name = "assets_map"; if (!string.IsNullOrEmpty(input)) @@ -2346,16 +2356,6 @@ namespace AssetStudio.GUI saveFolderDialog.Title = "Select Output Folder"; if (saveFolderDialog.ShowDialog(this) == DialogResult.OK) { - if (File.Exists(Path.Combine(saveFolderDialog.Folder, $"{name}{exportListType.GetExtension()}"))) - { - var acceptOverride = MessageBox.Show("AssetMap already exist, Do you want to override it ?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); - if (acceptOverride != DialogResult.Yes) - { - InvokeUpdate(miscToolStripMenuItem, true); - return; - } - } - saveDirectoryBackup = saveFolderDialog.Folder; AssetsHelper.SetUnityVersion(version); await Task.Run(() => AssetsHelper.BuildAssetMap(files, name, Studio.Game, saveFolderDialog.Folder, exportListType)); } diff --git a/AssetStudio.GUI/Properties/Settings.Designer.cs b/AssetStudio.GUI/Properties/Settings.Designer.cs index 461e9ff..a7ea93a 100644 --- a/AssetStudio.GUI/Properties/Settings.Designer.cs +++ b/AssetStudio.GUI/Properties/Settings.Designer.cs @@ -12,7 +12,7 @@ namespace AssetStudio.GUI.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.8.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.7.0.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); @@ -338,12 +338,12 @@ namespace AssetStudio.GUI.Properties { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Configuration.DefaultSettingValueAttribute("0")] - public int selectedAssetMapType { + public int assetMapType { get { - return ((int)(this["selectedAssetMapType"])); + return ((int)(this["assetMapType"])); } set { - this["selectedAssetMapType"] = value; + this["assetMapType"] = value; } } diff --git a/AssetStudio.GUI/Properties/Settings.settings b/AssetStudio.GUI/Properties/Settings.settings index 9664bff..39ae294 100644 --- a/AssetStudio.GUI/Properties/Settings.settings +++ b/AssetStudio.GUI/Properties/Settings.settings @@ -80,7 +80,7 @@ True - + 0 diff --git a/AssetStudio/AssetsHelper.cs b/AssetStudio/AssetsHelper.cs index 28ce3c1..439b473 100644 --- a/AssetStudio/AssetsHelper.cs +++ b/AssetStudio/AssetsHelper.cs @@ -510,56 +510,60 @@ namespace AssetStudio Progress.Reset(); - string filename = Path.Combine(savePath, $"{name}{exportListType.GetExtension()}"); - switch (exportListType) + string filename = string.Empty; + if (exportListType.Equals(ExportListType.None)) { - case ExportListType.XML: - var xmlSettings = new XmlWriterSettings() { Indent = true }; - using (XmlWriter writer = XmlWriter.Create(filename, xmlSettings)) - { - writer.WriteStartDocument(); - writer.WriteStartElement("Assets"); - writer.WriteAttributeString("filename", filename); - writer.WriteAttributeString("createdAt", DateTime.UtcNow.ToString("s")); - foreach(var asset in toExportAssets) - { - writer.WriteStartElement("Asset"); - writer.WriteElementString("Name", asset.Name); - writer.WriteElementString("Container", asset.Container); - writer.WriteStartElement("Type"); - writer.WriteAttributeString("id", ((int)asset.Type).ToString()); - writer.WriteValue(asset.Type.ToString()); - writer.WriteEndElement(); - writer.WriteElementString("PathID", asset.PathID.ToString()); - writer.WriteElementString("Source", asset.Source); - writer.WriteEndElement(); - } - writer.WriteEndElement(); - writer.WriteEndDocument(); - } - break; - case ExportListType.JSON: - using (StreamWriter file = File.CreateText(filename)) - { - var serializer = new JsonSerializer() { Formatting = Newtonsoft.Json.Formatting.Indented }; - serializer.Converters.Add(new StringEnumConverter()); - serializer.Serialize(file, toExportAssets); - } - break; - case ExportListType.MessagePack: - using (var file = File.Create(filename)) - { - var assetMap = new AssetMap - { - GameType = game.Type, - AssetEntries = toExportAssets - }; - MessagePackSerializer.Serialize(file, assetMap, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray)); - } - break; + Logger.Info($"No export list type has been selected, skipping..."); } + else + { + if (exportListType.HasFlag(ExportListType.XML)) + { + filename = Path.Combine(savePath, $"{name}.xml"); + var xmlSettings = new XmlWriterSettings() { Indent = true }; + using XmlWriter writer = XmlWriter.Create(filename, xmlSettings); + writer.WriteStartDocument(); + writer.WriteStartElement("Assets"); + writer.WriteAttributeString("filename", filename); + writer.WriteAttributeString("createdAt", DateTime.UtcNow.ToString("s")); + foreach (var asset in toExportAssets) + { + writer.WriteStartElement("Asset"); + writer.WriteElementString("Name", asset.Name); + writer.WriteElementString("Container", asset.Container); + writer.WriteStartElement("Type"); + writer.WriteAttributeString("id", ((int)asset.Type).ToString()); + writer.WriteValue(asset.Type.ToString()); + writer.WriteEndElement(); + writer.WriteElementString("PathID", asset.PathID.ToString()); + writer.WriteElementString("Source", asset.Source); + writer.WriteEndElement(); + } + writer.WriteEndElement(); + writer.WriteEndDocument(); + } + if (exportListType.HasFlag(ExportListType.JSON)) + { + filename = Path.Combine(savePath, $"{name}.json"); + using StreamWriter file = File.CreateText(filename); + var serializer = new JsonSerializer() { Formatting = Newtonsoft.Json.Formatting.Indented }; + serializer.Converters.Add(new StringEnumConverter()); + serializer.Serialize(file, toExportAssets); + } + if (exportListType.HasFlag(ExportListType.MessagePack)) + { + filename = Path.Combine(savePath, $"{name}.map"); + using var file = File.Create(filename); + var assetMap = new AssetMap + { + GameType = game.Type, + AssetEntries = toExportAssets + }; + MessagePackSerializer.Serialize(file, assetMap, MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray)); + } - Logger.Info($"Finished buidling AssetMap with {toExportAssets.Length} assets."); + Logger.Info($"Finished buidling AssetMap with {toExportAssets.Length} assets."); + } resetEvent?.Set(); }); diff --git a/AssetStudio/ExportTypeList.cs b/AssetStudio/ExportTypeList.cs index fc1574b..3292a85 100644 --- a/AssetStudio/ExportTypeList.cs +++ b/AssetStudio/ExportTypeList.cs @@ -1,20 +1,13 @@ -namespace AssetStudio +using System; + +namespace AssetStudio { + [Flags] public enum ExportListType { + None, + MessagePack, XML, - JSON, - MessagePack - } - - public static class ExportListTypeExtensions - { - public static string GetExtension(this ExportListType type) => type switch - { - ExportListType.XML => ".xml", - ExportListType.JSON => ".json", - ExportListType.MessagePack => ".map", - _ => throw new System.NotImplementedException(), - }; + JSON = 4, } }