diff --git a/src/CLI/Functions/Unpacker.cs b/src/CLI/Functions/Unpacker.cs index 9abfa28f5..9f7bd605b 100644 --- a/src/CLI/Functions/Unpacker.cs +++ b/src/CLI/Functions/Unpacker.cs @@ -6,8 +6,8 @@ namespace CLI.Functions { class Unpacker { - public static string ZlibPath = "../../temp/zlib.dll"; - public static string VFSWriteDir = "../../temp/vfs/"; + private const string contentGroup = "p14y73c7_p5e_b10gg3RS_big_play"; + private const string vfs = "../../temp/vfs/"; // this may be different from the one provided in args so check this and not args[1] // we don't wanna delete my local installation of the game when debugging haha! @@ -22,7 +22,26 @@ namespace CLI.Functions AgnosticZlibHelper.Initialize(); - string workingDirectory = args[1]; + UnpackDepot(args[1]); + UnpackDLC(); + } + + private static void UnpackDLC() + { + string defaultDlcPath = Path.Combine(vfs, "Blitz/Config/DefaultDlc.ini"); + IniParser iniParser = new(defaultDlcPath); + string? contentBuildId = iniParser.GetString("DefaultContentBuildId"); + + if (string.IsNullOrEmpty(contentBuildId)) + { + throw new Exception("Failed to read content build id from DefaultDlc.ini"); + } + + Console.WriteLine($"Exploring DLC {contentBuildId} within group {contentGroup}"); + } + + private static void UnpackDepot(string workingDirectory) + { string paksDirectory = Path.Combine(workingDirectory, "Blitz/Content/Paks"); string[] containers = Directory.GetFiles(paksDirectory, "*.pak"); @@ -38,7 +57,7 @@ namespace CLI.Functions } } - public static void Exergy(string container) + private static void Exergy(string container) { Console.WriteLine($"Filtering {container}"); @@ -56,7 +75,7 @@ namespace CLI.Functions continue; } - string writePath = Path.Combine(VFSWriteDir, gameFile.Path); + string writePath = Path.Combine(vfs, gameFile.Path); if (File.Exists(writePath)) { @@ -77,9 +96,9 @@ namespace CLI.Functions } } - public static string[] ExergizableFiles = ["Blitz/Config/DefaultDlc.ini"]; + private static string[] ExergizableFiles = ["Blitz/Config/DefaultDlc.ini"]; - public static bool ShouldExergize(string path) + private static bool ShouldExergize(string path) { return ExergizableFiles.Contains(path); } diff --git a/src/CLI/Models/Constants.cs b/src/CLI/Models/Constants.cs deleted file mode 100644 index d46061010..000000000 --- a/src/CLI/Models/Constants.cs +++ /dev/null @@ -1,11 +0,0 @@ -using CUE4Parse.UE4.Versions; - -namespace CLI.Constants -{ - public static class ContainerConstants - { - public const string ContentGroup = "p14y73c7_p5e_b10gg3RS_big_play"; - } - - public static class BlitzConstants { } -} diff --git a/src/CLI/Utils/BlitzVfs.cs b/src/CLI/Utils/BlitzVfs.cs deleted file mode 100644 index a8f3a73fb..000000000 --- a/src/CLI/Utils/BlitzVfs.cs +++ /dev/null @@ -1,75 +0,0 @@ -// using CUE4Parse.Compression; -// using CUE4Parse.FileProvider.Vfs; -// using CUE4Parse.UE4.Versions; - -// namespace CLI.Utils -// { -// public class BlitzVfs : AbstractVfsFileProvider -// { -// public const EGame EngineVersion = EGame.GAME_UE5_3; -// public const string InstallationDirectory = -// "C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest"; -// public const string AppDataDirectory = "C:/Users/coola/AppData/Local/Blitz"; - -// private static string[] IndexDirectories() -// { -// return -// [ -// Path.Combine(InstallationDirectory, "Blitz/Content/Paks"), -// Path.Combine(AppDataDirectory, "Saved/PersistentDownloadDir/Dlc/PakCache"), -// ]; -// } - -// private static List IndexContainers() -// { -// string[] directories = IndexDirectories(); -// List files = []; - -// foreach (string directory in directories) -// { -// if (!Directory.Exists(directory)) -// { -// throw new Exception($"Directory \"{directory}\" does not exist"); -// } - -// string[] directoryFiles = Directory.GetFiles(directory, "*.pak"); -// files.AddRange(directoryFiles); -// } - -// return files; -// } - -// public override void Initialize() -// { -// ZlibHelper.DownloadDll("temp/zlib.dll"); -// ZlibHelper.Initialize("temp/zlib.dll"); - -// List containers = IndexContainers(); - -// foreach (string container in containers) -// { -// PakFileReader reader = new(container); - -// reader.Mount(); - -// foreach (var gameFile in reader.Files) -// { -// Console.WriteLine($"Reading \"{gameFile.Key}\""); - -// byte[] bytes = gameFile.Value.Read(); -// string path = $"temp/container/{gameFile.Key}"; -// string? directory = Path.GetDirectoryName(path); - -// if (directory != null && !Directory.Exists(directory)) -// { -// Directory.CreateDirectory(directory); -// } - -// File.WriteAllBytes(path, bytes); -// } - -// break; -// } -// } -// } -// } diff --git a/src/CLI/Utils/IniParser.cs b/src/CLI/Utils/IniParser.cs new file mode 100644 index 000000000..d700505fe --- /dev/null +++ b/src/CLI/Utils/IniParser.cs @@ -0,0 +1,51 @@ +namespace CLI.Utils +{ + public class IniParser + { + private readonly Dictionary strings = []; + private readonly Dictionary> arrays = []; + + public IniParser(string file) + { + string content = File.ReadAllText(file); + + foreach (string line in content.Split('\n')) + { + if (string.IsNullOrWhiteSpace(line)) + continue; + + string[] parts = line.Split('='); + if (parts.Length < 2) + continue; + + string key = parts[0].Trim(); + string value = string.Join("=", parts, 1, parts.Length - 1).Trim(); + + if (key.StartsWith('+')) + { + string keySuffix = key[1..]; + + if (arrays.TryGetValue(keySuffix, out List? listValue)) + { + listValue.Add(value); + } + else + { + arrays[keySuffix] = [value]; + } + } + else + { + // Overwrite existing key instead of throwing an exception + strings[key] = value; + } + } + } + + public string? GetString(string key) => + strings.TryGetValue(key, out string? value) ? value : null; + + public List? GetArray(string key) => + arrays.TryGetValue(key, out List? value) ? value : null; + } +}