From d6c1e8069d46ba7727d19e5f13ec1541d937af1d Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:52:49 -0600 Subject: [PATCH] feat: parsing --- .vscode/settings.json | 1 + src/BlitzKit.CLI/Functions/Mangler.cs | 49 +++++++++++++++++++++++- src/BlitzKit.CLI/Models/BlitzProvider.cs | 23 ++++++++--- src/BlitzKit.CLI/Utils/PrettyLog.cs | 31 +++++++++++++++ submodules/blitzkit-closed | 2 +- 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 src/BlitzKit.CLI/Utils/PrettyLog.cs diff --git a/.vscode/settings.json b/.vscode/settings.json index 9f1f75861..854a7674a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -197,6 +197,7 @@ "Unregistering", "unrotate", "unwrapper", + "Usmap", "vercel", "vickers", "vitepress", diff --git a/src/BlitzKit.CLI/Functions/Mangler.cs b/src/BlitzKit.CLI/Functions/Mangler.cs index 870793487..9102f839f 100644 --- a/src/BlitzKit.CLI/Functions/Mangler.cs +++ b/src/BlitzKit.CLI/Functions/Mangler.cs @@ -1,4 +1,6 @@ using BlitzKit.CLI.Models; +using BlitzKit.CLI.Utils; +using CUE4Parse.FileProvider.Objects; namespace BlitzKit.CLI.Functions { @@ -15,9 +17,52 @@ namespace BlitzKit.CLI.Functions foreach (var tank in nation.Value.Directories) { - if (!tank.Value.HasFile($"DA_{tank.Key}_Attributes.uasset")) + if (tank.Key != "R90_IS_4") + continue; + + var attributeFileName = $"DA_{tank.Key}_Attributes.uasset"; + var hasAttributesFile = tank.Value.HasFile(attributeFileName); + GameFile? attributes = null; + + if (hasAttributesFile) { - Console.WriteLine($"{nation.Key}/{tank.Key}"); + attributes = tank.Value.GetFile(attributeFileName); + } + else + { + PrettyLog.Warn( + $"No attributes file found for {nation.Key}/{tank.Key}, it may be misspelled; finding any attributes file..." + ); + + foreach (var file in tank.Value.Files) + { + if (file.Key.EndsWith("_Attributes.uasset")) + { + attributes = file.Value; + break; + } + } + + if (attributes == null) + { + PrettyLog.Error( + $"No suffixed attributes file found for {nation.Key}/{tank.Key}; skipping..." + ); + continue; + } + } + + var objects = provider.LoadAllObjects(attributes.Path); + var objectsCount = objects.Count(); + + if (objectsCount != 1) + { + throw new Exception($"Expected 1 object for attribute objects, got {objectsCount}"); + } + + foreach (var obj in objects) + { + Console.WriteLine(obj.Properties); } } } diff --git a/src/BlitzKit.CLI/Models/BlitzProvider.cs b/src/BlitzKit.CLI/Models/BlitzProvider.cs index e06cca77a..c7b864c63 100644 --- a/src/BlitzKit.CLI/Models/BlitzProvider.cs +++ b/src/BlitzKit.CLI/Models/BlitzProvider.cs @@ -1,5 +1,7 @@ using CUE4Parse.FileProvider; using CUE4Parse.FileProvider.Objects; +using CUE4Parse.MappingsProvider; +using CUE4Parse.UE4.Versions; namespace BlitzKit.CLI.Models { @@ -10,6 +12,8 @@ namespace BlitzKit.CLI.Models $"C:/Users/{LOCAL_USER}/AppData/Local/Blitz/Saved/PersistentDownloadDir/Dlc/PakCache"; private static readonly string LOCAL_BUNDLED_CONTAINERS_PATH = "C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest/Blitz/Content/Paks"; + private static readonly string LOCAL_MAPPINGS_PATH = + "../../submodules/blitzkit-closed/blitz.usmap"; public readonly VfsDirectory RootDirectory = new(); @@ -17,9 +21,12 @@ namespace BlitzKit.CLI.Models : base( directory: new DirectoryInfo(LOCAL_BUNDLED_CONTAINERS_PATH), extraDirectories: [new(LOCAL_DLC_CONTAINERS_PATH)], - searchOption: SearchOption.TopDirectoryOnly + searchOption: SearchOption.TopDirectoryOnly, + versions: new(EGame.GAME_UE5_3) ) { + MappingsContainer = new FileUsmapTypeMappingsProvider(LOCAL_MAPPINGS_PATH); + Initialize(); Mount(); @@ -62,7 +69,15 @@ namespace BlitzKit.CLI.Models public bool HasFile(string name) => Files.ContainsKey(name); - public GameFile GetFile(string name) => Files[name]; + public GameFile GetFile(string name) + { + var directoryPath = Path.GetDirectoryName(name); + var fileName = Path.GetFileName(name); + var directory = + directoryPath == null || directoryPath.Length == 0 ? this : GetDirectory(directoryPath); + + return directory.Files[name]; + } public bool HasDirectory(string name) => Directories.ContainsKey(name); @@ -73,14 +88,12 @@ namespace BlitzKit.CLI.Models foreach (var segment in segments) { - directory = directory.GetImmediateDirectory(segment); + directory = directory.Directories[segment]; } return directory; } - private VfsDirectory GetImmediateDirectory(string name) => Directories[name]; - public void AddDirectory(string name, VfsDirectory directory) => Directories.Add(name, directory); } diff --git a/src/BlitzKit.CLI/Utils/PrettyLog.cs b/src/BlitzKit.CLI/Utils/PrettyLog.cs new file mode 100644 index 000000000..db213c031 --- /dev/null +++ b/src/BlitzKit.CLI/Utils/PrettyLog.cs @@ -0,0 +1,31 @@ +namespace BlitzKit.CLI.Utils +{ + public static class PrettyLog + { + public static void Log(string message) + { + Console.WriteLine(message); + } + + public static void Warn(string message) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine(message); + Console.ResetColor(); + } + + public static void Error(string message) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.WriteLine(message); + Console.ResetColor(); + } + + public static void Success(string message) + { + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine(message); + Console.ResetColor(); + } + } +} diff --git a/submodules/blitzkit-closed b/submodules/blitzkit-closed index c1d631764..d79d47a6a 160000 --- a/submodules/blitzkit-closed +++ b/submodules/blitzkit-closed @@ -1 +1 @@ -Subproject commit c1d631764f74f8050660aa95c1da071baaadde43 +Subproject commit d79d47a6aadf012103843b67323daac176dbdbb9