fix: better parsing and sorting
This commit is contained in:
+102
-41
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user