fix: better parsing and sorting

This commit is contained in:
2026-03-20 17:13:41 -03:00
parent 23367ba6cc
commit 4999c3edca
+102 -41
View File
@@ -4,15 +4,10 @@ using CUE4Parse.FileProvider;
using CUE4Parse.MappingsProvider; using CUE4Parse.MappingsProvider;
using CUE4Parse.UE4.Assets.Exports.Engine; using CUE4Parse.UE4.Assets.Exports.Engine;
using CUE4Parse.UE4.Assets.Exports.Texture; using CUE4Parse.UE4.Assets.Exports.Texture;
using CUE4Parse.UE4.Assets.Objects.Properties;
using CUE4Parse.UE4.Objects.Core.Misc; using CUE4Parse.UE4.Objects.Core.Misc;
using CUE4Parse.UE4.Objects.UObject;
using CUE4Parse.UE4.Versions; 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; using Newtonsoft.Json;
class DumpByDaylight class DumpByDaylight
@@ -55,7 +50,7 @@ class DumpByDaylight
} }
ZlibHelper.Initialize(); ZlibHelper.Initialize();
var oodlePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, OodleHelper.OodleFileName); var oodlePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, OodleHelper.OodleFileName);
OodleHelper.Initialize(oodlePath); OodleHelper.Initialize(oodlePath);
@@ -71,56 +66,122 @@ class DumpByDaylight
Console.WriteLine("\nProvider Initialized. Extracting Databases..."); Console.WriteLine("\nProvider Initialized. Extracting Databases...");
string[] dbNames = { "ItemDB", "OfferingDB", "ItemAddonDB" };
var dataPak = provider.GetArchive("pakchunk4-Windows.utoc"); 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<string>();
var powers = new List<string>();
foreach (var path in searchPaths)
{ {
var searchPaths = dataPak.Files.Keys var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path;
.Where(x => x.Contains($"/{dbName}.uasset", StringComparison.OrdinalIgnoreCase)) if (provider.TryLoadPackageObject<UDataTable>(cleanPath, out var dataTable))
.ToList();
var standard = new List<string>();
var special = new List<string>();
foreach (var path in searchPaths)
{ {
var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path; Console.WriteLine($"getting items / powers from {Path.GetFileName(path)}");
if (provider.TryLoadPackageObject<UDataTable>(cleanPath, out var dataTable)) foreach (var row in dataTable.RowMap)
{ {
Console.WriteLine($"- Processing {dbName} (from {Path.GetFileName(path)})..."); var typeProperty = row.Value.Properties.FirstOrDefault(p => p.Name.Text == "Type");
foreach (var row in dataTable.RowMap) if (typeProperty?.Tag is EnumProperty enumProp)
{ {
bool isInventory = row.Value.GetOrDefault<bool>("Inventory"); string typeName = enumProp.Value.ToString() ?? "null";
bool isBloodweb = row.Value.GetOrDefault<bool>("Bloodweb");
if (isBloodweb) if (typeName == "EInventoryItemType::Power")
{ powers.Add(row.Key.Text);
standard.Add(row.Key.Text); else if (typeName == "EInventoryItemType::Item")
} items.Add(row.Key.Text);
else if (isInventory)
{
special.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<string>();
var powerAddons = new List<string>();
foreach (var path in searchPaths)
{
var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path;
if (provider.TryLoadPackageObject<UDataTable>(cleanPath, out var dataTable))
{ {
var result = new Console.WriteLine($"getting item / power addons from {Path.GetFileName(path)}");
{
Standard = standard.OrderBy(x => x).ToList(),
Special = special.OrderBy(x => x).ToList()
};
string outputPath = $"{dbName}_Names.json"; foreach (var row in dataTable.RowMap)
File.WriteAllText(outputPath, JsonConvert.SerializeObject(result, Formatting.Indented)); {
Console.WriteLine($" -> Saved {standard.Count} standard and {special.Count} special entries to {outputPath}"); 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<string>();
foreach (var path in searchPaths)
{
var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path;
if (provider.TryLoadPackageObject<UDataTable>(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<string>();
foreach (var path in searchPaths)
{
var cleanPath = path.Contains('.') ? path.Substring(0, path.LastIndexOf('.')) : path;
if (provider.TryLoadPackageObject<UDataTable>(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.WriteLine("\nAll dumper operations finished. Press any key to Close.");
Console.ReadKey(); Console.ReadKey();
} }