diff --git a/src/dumper/main.cs b/src/dumper/main.cs index 3249d2c..6d3f8bc 100644 --- a/src/dumper/main.cs +++ b/src/dumper/main.cs @@ -4,15 +4,10 @@ using CUE4Parse.FileProvider; using CUE4Parse.MappingsProvider; using CUE4Parse.UE4.Assets.Exports.Engine; using CUE4Parse.UE4.Assets.Exports.Texture; +using CUE4Parse.UE4.Assets.Objects.Properties; using CUE4Parse.UE4.Objects.Core.Misc; +using CUE4Parse.UE4.Objects.UObject; using CUE4Parse.UE4.Versions; -using CUE4Parse.Utils; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; using Newtonsoft.Json; class DumpByDaylight @@ -55,7 +50,7 @@ class DumpByDaylight } ZlibHelper.Initialize(); - + var oodlePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, OodleHelper.OodleFileName); OodleHelper.Initialize(oodlePath); @@ -71,56 +66,122 @@ class DumpByDaylight Console.WriteLine("\nProvider Initialized. Extracting Databases..."); - string[] dbNames = { "ItemDB", "OfferingDB", "ItemAddonDB" }; var dataPak = provider.GetArchive("pakchunk4-Windows.utoc"); - foreach (var dbName in dbNames) + /* + * itemdb dump + */ + var searchPaths = dataPak.Files.Keys.Where(x => x.Contains($"/ItemDB.uasset", StringComparison.OrdinalIgnoreCase)).ToList(); + var items = new List(); + var powers = new List(); + + foreach (var path in searchPaths) { - var searchPaths = dataPak.Files.Keys - .Where(x => x.Contains($"/{dbName}.uasset", StringComparison.OrdinalIgnoreCase)) - .ToList(); - - var standard = new List(); - var special = new List(); - - foreach (var path in searchPaths) + var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; + if (provider.TryLoadPackageObject(cleanPath, out var dataTable)) { - var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; + Console.WriteLine($"getting items / powers from {Path.GetFileName(path)}"); - if (provider.TryLoadPackageObject(cleanPath, out var dataTable)) + foreach (var row in dataTable.RowMap) { - Console.WriteLine($"- Processing {dbName} (from {Path.GetFileName(path)})..."); - foreach (var row in dataTable.RowMap) + var typeProperty = row.Value.Properties.FirstOrDefault(p => p.Name.Text == "Type"); + if (typeProperty?.Tag is EnumProperty enumProp) { - bool isInventory = row.Value.GetOrDefault("Inventory"); - bool isBloodweb = row.Value.GetOrDefault("Bloodweb"); + string typeName = enumProp.Value.ToString() ?? "null"; - if (isBloodweb) - { - standard.Add(row.Key.Text); - } - else if (isInventory) - { - special.Add(row.Key.Text); - } + if (typeName == "EInventoryItemType::Power") + powers.Add(row.Key.Text); + else if (typeName == "EInventoryItemType::Item") + items.Add(row.Key.Text); } } } + } - if (standard.Count > 0 || special.Count > 0) + var itemsSerialized = new + { + Items = items.OrderBy(x => x).ToList(), + Powers = powers.OrderBy(x => x).ToList() + }; + File.WriteAllText("items.json", JsonConvert.SerializeObject(itemsSerialized, Formatting.Indented)); + + /* + * addon dump + */ + searchPaths = dataPak.Files.Keys.Where(x => x.Contains($"/ItemAddonDB.uasset", StringComparison.OrdinalIgnoreCase)).ToList(); + var itemAddons = new List(); + var powerAddons = new List(); + + foreach (var path in searchPaths) + { + var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; + if (provider.TryLoadPackageObject(cleanPath, out var dataTable)) { - var result = new - { - Standard = standard.OrderBy(x => x).ToList(), - Special = special.OrderBy(x => x).ToList() - }; + Console.WriteLine($"getting item / power addons from {Path.GetFileName(path)}"); - string outputPath = $"{dbName}_Names.json"; - File.WriteAllText(outputPath, JsonConvert.SerializeObject(result, Formatting.Indented)); - Console.WriteLine($" -> Saved {standard.Count} standard and {special.Count} special entries to {outputPath}"); + foreach (var row in dataTable.RowMap) + { + var typeProperty = row.Value.Properties.FirstOrDefault(p => p.Name.Text == "Type"); + if (typeProperty?.Tag is EnumProperty enumProp) + { + string typeName = enumProp.Value.ToString() ?? "null"; + + if (typeName == "EInventoryItemType::ItemAddOn") + itemAddons.Add(row.Key.Text); + else if (typeName == "EInventoryItemType::PowerAddOn") + powerAddons.Add(row.Key.Text); + } + } } } + var addonsSerialized = new + { + Items = itemAddons.OrderBy(x => x).ToList(), + Powers = powerAddons.OrderBy(x => x).ToList() + }; + File.WriteAllText("addons.json", JsonConvert.SerializeObject(addonsSerialized, Formatting.Indented)); + + /* + * offerings + */ + searchPaths = dataPak.Files.Keys.Where(x => x.Contains($"/OfferingDB.uasset", StringComparison.OrdinalIgnoreCase)).ToList(); + + var offerings = new List(); + + foreach (var path in searchPaths) + { + var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; + if (provider.TryLoadPackageObject(cleanPath, out var dataTable)) + { + Console.WriteLine($"getting offerings from {Path.GetFileName(path)}"); + + foreach (var row in dataTable.RowMap) + offerings.Add(row.Key.Text); + } + } + File.WriteAllText("offerings.json", JsonConvert.SerializeObject(offerings, Formatting.Indented)); + + /* + * perks + */ + searchPaths = dataPak.Files.Keys.Where(x => x.Contains($"/PerkDB.uasset", StringComparison.OrdinalIgnoreCase)).ToList(); + + var perks = new List(); + + foreach (var path in searchPaths) + { + var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; + if (provider.TryLoadPackageObject(cleanPath, out var dataTable)) + { + Console.WriteLine($"getting perks from {Path.GetFileName(path)}"); + + foreach (var row in dataTable.RowMap) + perks.Add(row.Key.Text); + } + } + File.WriteAllText("perks.json", JsonConvert.SerializeObject(perks, Formatting.Indented)); + Console.WriteLine("\nAll dumper operations finished. Press any key to Close."); Console.ReadKey(); }