diff --git a/docs/technical/vfs.md b/docs/technical/vfs.md new file mode 100644 index 000000000..abe1e5414 --- /dev/null +++ b/docs/technical/vfs.md @@ -0,0 +1,7 @@ +`Blitz/Config/DefaultGameplayTags.ini` seems to have an exhaustive list of all maps, tanks, sets, game modes, legendary camouflages, consumables, skills, quick commands, UI components, etc. + +`Blitz/Config/DefaultGame.ini` seems to have all locales under the name of "Cultures" + +`Blitz/Config/DefaultDlc.ini` contains DLC info; essentially extra `pak` containers + +`Blitz/Content/TanksStuff/Common/DT_TankClasses.uasset` seems to have all tank classes diff --git a/package.json b/package.json index fc7728d0b..9b8e4fabf 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "build:ids": "cd packages/scripts && bun build:ids", "prunestrings": "cd packages/scripts && bun prunestrings", "dev:cli:unpack": "cd src/CLI && dotnet run unpack \"C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest\" --no-overwrite", - "dev:cli:buildassets": "cd src/CLI && dotnet run buildassets" + "dev:cli:mangle": "cd src/CLI && dotnet run mangle" }, "license": "MIT", "dependencies": { diff --git a/src/CLI/Functions/AssetsBuilder.cs b/src/CLI/Functions/AssetsBuilder.cs deleted file mode 100644 index 75dc73b2d..000000000 --- a/src/CLI/Functions/AssetsBuilder.cs +++ /dev/null @@ -1,32 +0,0 @@ -using CUE4Parse.FileProvider; -using CUE4Parse.FileProvider.Objects; - -namespace CLI.Functions -{ - public static class AssetsBuilder - { - private static readonly string LOCAL_USER = "coola"; - private static readonly string LOCAL_DLC_CONTAINERS_PATH = - $"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"; - - public static void Build(string[] args) - { - DefaultFileProvider provider = new( - directory: new DirectoryInfo(LOCAL_DLC_CONTAINERS_PATH), - extraDirectories: [new(LOCAL_BUNDLED_CONTAINERS_PATH)], - searchOption: SearchOption.TopDirectoryOnly - ); - - provider.Initialize(); - provider.Mount(); - - foreach (var file in provider.Files) - { - GameFile gameFile = file.Value; - Console.WriteLine(gameFile.Path); - } - } - } -} diff --git a/src/CLI/Functions/Mangler.cs b/src/CLI/Functions/Mangler.cs index 34ea0001b..7a3acd5ed 100644 --- a/src/CLI/Functions/Mangler.cs +++ b/src/CLI/Functions/Mangler.cs @@ -1,9 +1,23 @@ +using CLI.Models; + namespace CLI.Functions { public static class Mangler { - public static void Mangle() { - + public static void Mangle() + { + BlitzProvider provider = new(); + + foreach (var nation in provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories) + { + if (nation.Key == "TankStub") + continue; + + foreach (var tank in nation.Value.Directories) + { + Console.WriteLine(tank.Key); + } + } } } } diff --git a/src/CLI/Functions/Unpacker.cs b/src/CLI/Functions/Unpacker.cs index 2001bd6ad..82947e0ce 100644 --- a/src/CLI/Functions/Unpacker.cs +++ b/src/CLI/Functions/Unpacker.cs @@ -26,8 +26,6 @@ namespace CLI.Functions throw new ArgumentException("Missing required initial paks directory"); } - await AgnosticHelpers.Initialize(); - UnpackDepot(args[1]); await UnpackDLC(); } diff --git a/src/CLI/Models/BlitzProvider.cs b/src/CLI/Models/BlitzProvider.cs new file mode 100644 index 000000000..2fd17553d --- /dev/null +++ b/src/CLI/Models/BlitzProvider.cs @@ -0,0 +1,83 @@ +using CUE4Parse.FileProvider; +using CUE4Parse.FileProvider.Objects; + +namespace CLI.Models +{ + public class BlitzProvider : DefaultFileProvider + { + private static readonly string LOCAL_USER = "coola"; + private static readonly string LOCAL_DLC_CONTAINERS_PATH = + $"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"; + + public readonly VfsDirectory RootDirectory = new(); + + public BlitzProvider() + : base( + directory: new DirectoryInfo(LOCAL_BUNDLED_CONTAINERS_PATH), + extraDirectories: [new(LOCAL_DLC_CONTAINERS_PATH)], + searchOption: SearchOption.TopDirectoryOnly + ) + { + Initialize(); + Mount(); + + foreach (var file in Files) + { + var gameFile = file.Value; + var path = gameFile.Path.Split('/'); + var lastPathSegment = path.Last(); + var directory = RootDirectory; + + foreach (var segment in path) + { + bool isLastSegment = lastPathSegment == segment; + + if (isLastSegment) + { + directory.AddFile(segment, gameFile); + } + else if (directory.HasDirectory(segment)) + { + directory = directory.GetDirectory(segment); + } + else + { + VfsDirectory newDirectory = new(); + directory.AddDirectory(segment, newDirectory); + directory = newDirectory; + } + } + } + } + } + + public class VfsDirectory + { + public Dictionary Directories = []; + public Dictionary Files = []; + + public void AddFile(string name, GameFile file) => Files.TryAdd(name, file); + + public bool HasDirectory(string name) => Directories.ContainsKey(name); + + public VfsDirectory GetDirectory(string name) + { + var segments = name.Split('/'); + var directory = this; + + foreach (var segment in segments) + { + directory = directory.GetImmediateDirectory(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/CLI/Program.cs b/src/CLI/Program.cs index e07b2a91b..e7fb4f86f 100644 --- a/src/CLI/Program.cs +++ b/src/CLI/Program.cs @@ -1,4 +1,5 @@ using CLI.Functions; +using CLI.Utils; namespace CLI { @@ -6,6 +7,8 @@ namespace CLI { static async Task Main(string[] args) { + await AgnosticHelpers.Initialize(); + switch (args[0]) { case "unpack": @@ -20,12 +23,6 @@ namespace CLI break; } - case "buildassets": - { - AssetsBuilder.Build(args); - break; - } - default: { throw new ArgumentException("Invalid command"); diff --git a/src/CLI/Utils/AgnosticHelpers.cs b/src/CLI/Utils/AgnosticHelpers.cs index 7c8dccc76..33385a398 100644 --- a/src/CLI/Utils/AgnosticHelpers.cs +++ b/src/CLI/Utils/AgnosticHelpers.cs @@ -14,6 +14,11 @@ namespace CLI.Utils public static async Task Initialize() { + if (!Directory.Exists(BINARY_DIR)) + { + Directory.CreateDirectory(BINARY_DIR); + } + InitializeZlib(); await InitializeOodle(); }