From 70983953233059aecbd503e83cbc34c1cd3708a8 Mon Sep 17 00:00:00 2001 From: tresabhi <43380238+tresabhi@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:17:41 -0600 Subject: [PATCH] feat: some unpacker stuff --- .vscode/settings.json | 4 ++ package.json | 2 +- src/CLI/Functions/Unpacker.cs | 81 ++++++++++++++++++++++++++++------- 3 files changed, 70 insertions(+), 17 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 23aed0af2..11364d580 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -71,6 +71,10 @@ "dxgi", "echarts", "Everytime", + "Exergizable", + "Exergize", + "Exergizing", + "Exergy", "FASTNAME", "flexdirection", "FOURCC", diff --git a/package.json b/package.json index 2c2fed076..afe16a2e7 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "build:reviews": "cd packages/scripts && bun build:reviews", "build:ids": "cd packages/scripts && bun build:ids", "prunestrings": "cd packages/scripts && bun prunestrings", - "test:cli": "cd src/CLI && dotnet run" + "dev:cli:unpack": "cd src/CLI && dotnet run unpack \"C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest\"" }, "license": "MIT", "dependencies": { diff --git a/src/CLI/Functions/Unpacker.cs b/src/CLI/Functions/Unpacker.cs index aa4c4753d..4092d943d 100644 --- a/src/CLI/Functions/Unpacker.cs +++ b/src/CLI/Functions/Unpacker.cs @@ -1,38 +1,87 @@ +using CUE4Parse.Compression; +using CUE4Parse.FileProvider.Objects; +using CUE4Parse.UE4.Pak; + namespace CLI.Functions { class Unpacker { + public static string ZlibPath = "../../temp/zlib.dll"; + public static string VFSWriteDirectory = "../../temp/vfs/"; + public static void Unpack(string[] args) { if (args.Length < 2) { - throw new ArgumentException("Missing required working directory argument"); + throw new ArgumentException("Missing required initial paks directory"); } + if (File.Exists(ZlibPath)) + { + Console.WriteLine($"Zlib found at {ZlibPath}; using that..."); + } + else + { + Console.WriteLine($"Zlib not found; downloading to {ZlibPath}..."); + ZlibHelper.DownloadDll(ZlibPath); + } + + ZlibHelper.Initialize(ZlibPath); + string workingDirectory = args[1]; string paksDirectory = Path.Combine(workingDirectory, "Blitz/Content/Paks"); - string[] files = Directory.GetFiles(paksDirectory, "*.pak"); + string[] containers = Directory.GetFiles(paksDirectory, "*.pak"); - foreach (string file in files) + foreach (string container in containers) { - Console.WriteLine($"Reading \"{file}\""); + Exergy(container); } + } - // BlitzVfs vfs = new(); + public static void Exergy(string container) + { + Console.WriteLine($"Filtering {container}"); - // vfs.Initialize(); + PakFileReader reader = new(container); - // DefaultFileProvider provider = new( - // directory: new( - // "C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest" - // ), - // extraDirectories: [new DirectoryInfo("C:/Users/coola/AppData/Local/Blitz")], - // searchOption: SearchOption.AllDirectories, - // isCaseInsensitive: false, - // versions: new(game: EGame.GAME_UE5_3, platform: ETexturePlatform.DesktopMobile, ver: new()) - // ); + reader.Mount(); - // provider.Initialize(); + foreach (var file in reader.Files) + { + GameFile gameFile = file.Value; + bool exergizable = ShouldExergize(gameFile.Path); + + if (!exergizable) + { + continue; + } + + string writePath = Path.Combine(VFSWriteDirectory, gameFile.Path); + + if (File.Exists(writePath)) + { + Console.WriteLine($"{gameFile.Path} already exists; skipping..."); + continue; + } + + Console.WriteLine($"{gameFile.Path} writing from vfs..."); + + string? directory = Path.GetDirectoryName(writePath); + + if (directory != null && !Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + File.WriteAllBytes(writePath, gameFile.Read()); + } + } + + public static string[] ExergizableFiles = ["Blitz/Config/DefaultDlc.ini"]; + + public static bool ShouldExergize(string path) + { + return ExergizableFiles.Contains(path); } } }