unpak.js
Version:
Modern TypeScript library for reading Unreal Engine pak files and assets, inspired by CUE4Parse
87 lines • 4.24 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.AssetRegistry = void 0;
const FArchive_1 = require("../reader/FArchive");
const FByteArchive_1 = require("../reader/FByteArchive");
const FAssetRegistryVersion_1 = require("./objects/FAssetRegistryVersion");
const AssetRegistryArchive_1 = require("./reader/AssetRegistryArchive");
const Exceptions_1 = require("../../exceptions/Exceptions");
const NameTableArchive_1 = require("./reader/NameTableArchive");
const FAssetData_1 = require("./objects/FAssetData");
const FDependsNode_1 = require("./objects/FDependsNode");
const FAssetPackageData_1 = require("./objects/FAssetPackageData");
class AssetRegistry {
preallocatedAssetDataBuffer;
preallocatedDependsNodeDataBuffer;
preallocatedPackageDataBuffer;
originalAr;
fileName;
constructor(x, y) {
this.fileName = y;
this.originalAr = x instanceof FArchive_1.FArchive ? x : new FByteArchive_1.FByteArchive(x);
// init
const version = new FAssetRegistryVersion_1.FAssetRegistryVersion(this.originalAr);
let Ar = null;
if (version.version < FAssetRegistryVersion_1.Type.RemovedMD5Hash) {
throw new Exceptions_1.ParserException("Cannot read states before this version");
}
else if (version.version < FAssetRegistryVersion_1.Type.FixedTags) {
Ar = new NameTableArchive_1.FNameTableArchiveReader(this.originalAr);
}
else {
Ar = new AssetRegistryArchive_1.FAssetRegistryReader(this.originalAr);
}
const _len1 = Ar.readInt32();
this.preallocatedAssetDataBuffer = new Array(_len1);
for (let i = 0; i < _len1; ++i) {
this.preallocatedAssetDataBuffer[i] = new FAssetData_1.FAssetData(Ar);
}
if (version.version <= FAssetRegistryVersion_1.Type.AddedDependencyFlags) {
const localNumDependsNodes = Ar.readInt32();
this.preallocatedDependsNodeDataBuffer = new Array(localNumDependsNodes);
for (let i = 0; i < localNumDependsNodes; ++i) {
this.preallocatedDependsNodeDataBuffer[i] = new FDependsNode_1.FDependsNode();
}
if (localNumDependsNodes > 0)
this.loadDependenciesBeforeFlags(Ar, version);
}
else {
const dependencySectionSize = Number(Ar.readInt64());
const dependencySectionEnd = Ar.pos + dependencySectionSize;
const localNumDependsNodes = Ar.readInt32();
this.preallocatedDependsNodeDataBuffer = new Array(localNumDependsNodes);
for (let i = 0; i < localNumDependsNodes; ++i) {
this.preallocatedDependsNodeDataBuffer[i] = new FDependsNode_1.FDependsNode();
}
if (localNumDependsNodes > 0)
this.loadDependencies(Ar);
Ar.pos = dependencySectionEnd;
}
const serializeHash = version.version < FAssetRegistryVersion_1.Type.AddedCookedMD5Hash;
const chunkHashes = version.version < FAssetRegistryVersion_1.Type.AddedChunkHashes;
const _len2 = Ar.readInt32();
this.preallocatedPackageDataBuffer = new Array(_len2);
for (let i = 0; i < _len2; ++i) {
this.preallocatedPackageDataBuffer[i] = new FAssetPackageData_1.FAssetPackageData(Ar, serializeHash, chunkHashes);
}
}
loadDependencies(Ar) {
const self = this;
function getNodeFromSerializeIndex(index) {
if (index < 0 || self.preallocatedDependsNodeDataBuffer.length < index) {
return null;
}
return self.preallocatedDependsNodeDataBuffer[index];
}
for (const dependsNode of this.preallocatedDependsNodeDataBuffer) {
dependsNode.serializeLoad(Ar, getNodeFromSerializeIndex);
}
}
loadDependenciesBeforeFlags(Ar, version) {
for (const dependsNode of this.preallocatedDependsNodeDataBuffer) {
dependsNode.serializeLoadBeforeFlags(Ar, version, this.preallocatedDependsNodeDataBuffer, this.preallocatedDependsNodeDataBuffer.length);
}
}
}
exports.AssetRegistry = AssetRegistry;
//# sourceMappingURL=AssetRegistry.js.map
;