UNPKG

unreal.js

Version:

A pak reader for games like VALORANT & Fortnite written in Node.JS

320 lines (319 loc) 10.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.FObjectImport = exports.FObjectExport = exports.FObjectResource = exports.FPackageIndex = void 0; const FName_1 = require("./FName"); const PakPackage_1 = require("../../assets/PakPackage"); const FAssetArchive_1 = require("../../assets/reader/FAssetArchive"); const Guid_1 = require("../core/misc/Guid"); const Versions_1 = require("../../versions/Versions"); const IoPackage_1 = require("../../assets/IoPackage"); /** * FPackageIndex */ class FPackageIndex { /** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */ constructor(x, y) { /** * Owner * @type {Package} * @public */ this.owner = null; if (x instanceof FAssetArchive_1.FAssetArchive) { this.index = x.readInt32(); this.owner = x.owner; } else if (typeof x === "number") { this.index = x; this.owner = y; } else { this.index = 0; } } /** * Name * @type {FName} * @public */ get name() { let name; if (this.owner instanceof PakPackage_1.PakPackage) { name = this.owner.getResource(this)?.objectName; } else if (this.owner instanceof IoPackage_1.IoPackage) { const n = this.owner.findObjectMinimal(this); name = n?.name; } return name || FName_1.FName.NAME_None; } get resolvedObject() { return this.owner?.findObjectMinimal(this); } /** * Whether is import * @returns {boolean} Result * @public */ isImport() { return this.index < 0; } /** * Whether is export * @returns {boolean} Result * @public */ isExport() { return this.index > 0; } /** * Whether is null * @returns {boolean} Result * @public */ isNull() { return this.index === 0; } /** * Turns this to import * @returns {number} Import value * @public */ toImport() { if (!this.isImport()) throw new Error("Object is not an import."); return -this.index - 1; } /** * Turns this to export * @returns {number} Export value * @public */ toExport() { if (!this.isExport()) throw new Error("Object is not an export."); return this.index - 1; } /** * Whether equals other object * @param {?any} other Object to check * @returns {boolean} Result * @public */ equals(other) { if (this === other) return true; if (!(other instanceof FPackageIndex)) return false; other; if (this.index !== other.index) return false; return this.owner == other.owner; } /** * Serializes this * @param {FArchiveWriter} Ar UE4 Writer to use * @returns {void} * @public */ serialize(Ar) { Ar.writeInt32(this.index); } /** * Turns this into string * @returns {string} Result * @public */ toString() { if (this.isImport()) { return `Import: ${this.toImport()}`; } else if (this.isExport()) { return `Export: ${this.toExport()}`; } else { return null; } } /** * Loads object (WARNING: MIGHT BE RECURSIVE, TRY TO AVOID THIS) * @returns {UObject} Object * @public */ load() { return this.owner?.loadObject(this); } } exports.FPackageIndex = FPackageIndex; /** * FObjectResource * @abstract */ class FObjectResource { } exports.FObjectResource = FObjectResource; /** * FObjectExport * @extends {FObjectResource} */ class FObjectExport extends FObjectResource { /** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */ constructor(...params) { super(); if (params[0] instanceof FAssetArchive_1.FAssetArchive) { const Ar = params[0]; this.classIndex = new FPackageIndex(Ar); this.superIndex = new FPackageIndex(Ar); this.templateIndex = Ar.ver >= Versions_1.VER_UE4_TemplateIndex_IN_COOKED_EXPORTS ? new FPackageIndex(Ar) : new FPackageIndex(); this.outerIndex = new FPackageIndex(Ar); this.objectName = Ar.readFName(); this.objectFlags = Ar.readUInt32(); if (Ar.ver < Versions_1.VER_UE4_64BIT_EXPORTMAP_SERIALSIZES) { this.serialSize = Ar.readInt32(); this.serialOffset = Ar.readInt32(); } else { this.serialSize = Number(Ar.readInt64()); this.serialOffset = Number(Ar.readInt64()); } this.forcedExport = Ar.readBoolean(); this.notForClient = Ar.readBoolean(); this.notForServer = Ar.readBoolean(); this.packageGuid = new Guid_1.FGuid(Ar); this.packageFlags = Ar.readUInt32(); this.notAlwaysLoadedForEditorGame = Ar.ver >= Versions_1.VER_UE4_LOAD_FOR_EDITOR_GAME ? Ar.readBoolean() : true; this.isAsset = Ar.ver >= Versions_1.VER_UE4_COOKED_ASSETS_IN_EDITOR_SUPPORT ? Ar.readBoolean() : false; if (Ar.ver >= Versions_1.VER_UE4_PRELOAD_DEPENDENCIES_IN_COOKED_EXPORTS) { this.firstExportDependency = Ar.readInt32(); this.serializationBeforeSerializationDependencies = Ar.readInt32(); this.createBeforeSerializationDependencies = Ar.readInt32(); this.serializationBeforeCreateDependencies = Ar.readInt32(); this.createBeforeCreateDependencies = Ar.readInt32(); } else { this.firstExportDependency = -1; this.serializationBeforeSerializationDependencies = 0; this.createBeforeSerializationDependencies = 0; this.serializationBeforeCreateDependencies = 0; this.createBeforeCreateDependencies = 0; } } else { this.classIndex = params[0]; this.superIndex = params[1]; this.templateIndex = params[2]; this.outerIndex = params[3]; this.objectName = params[4]; this.objectFlags = params[5]; this.serialSize = params[6]; this.serialOffset = params[7]; this.forcedExport = params[8]; this.notForClient = params[9]; this.notForServer = params[10]; this.packageGuid = params[11]; this.packageFlags = params[12]; this.notAlwaysLoadedForEditorGame = params[13]; this.isAsset = params[14]; this.firstExportDependency = params[15]; this.serializationBeforeSerializationDependencies = params[16]; this.createBeforeSerializationDependencies = params[17]; this.serializationBeforeCreateDependencies = params[18]; this.createBeforeCreateDependencies = params[19]; } } /** * Turns this into string * @returns {string} Result * @public */ toString() { return this.objectName.text; } /** * Serializes this * @param {FAssetArchiveWriter} Ar UE4 Asset Writer to use * @returns {void} * @public */ serialize(Ar) { this.classIndex.serialize(Ar); this.superIndex.serialize(Ar); if (Ar.ver >= Versions_1.VER_UE4_TemplateIndex_IN_COOKED_EXPORTS) this.templateIndex.serialize(Ar); this.outerIndex.serialize(Ar); Ar.writeFName(this.objectName); Ar.writeUInt32(this.objectFlags); if (Ar.ver < Versions_1.VER_UE4_64BIT_EXPORTMAP_SERIALSIZES) { Ar.writeInt32(this.serialSize); Ar.writeInt32(this.serialOffset); } else { Ar.writeInt64(this.serialSize); Ar.writeInt64(this.serialOffset); } Ar.writeBoolean(this.forcedExport); Ar.writeBoolean(this.notForClient); Ar.writeBoolean(this.notForServer); this.packageGuid.serialize(Ar); Ar.writeUInt32(this.packageFlags); if (Ar.ver >= Versions_1.VER_UE4_LOAD_FOR_EDITOR_GAME) Ar.writeBoolean(this.notAlwaysLoadedForEditorGame); if (Ar.ver >= Versions_1.VER_UE4_COOKED_ASSETS_IN_EDITOR_SUPPORT) Ar.writeBoolean(this.isAsset); if (Ar.ver >= Versions_1.VER_UE4_PRELOAD_DEPENDENCIES_IN_COOKED_EXPORTS) { Ar.writeInt32(this.firstExportDependency); Ar.writeInt32(this.serializationBeforeSerializationDependencies); Ar.writeInt32(this.createBeforeSerializationDependencies); Ar.writeInt32(this.serializationBeforeCreateDependencies); Ar.writeInt32(this.createBeforeCreateDependencies); } } } exports.FObjectExport = FObjectExport; /** * FObjectImport * @extends {FObjectResource} */ class FObjectImport extends FObjectResource { /** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */ constructor(...params) { super(); if (params[0] instanceof FAssetArchive_1.FAssetArchive) { const Ar = params[0]; this.classPackage = Ar.readFName(); this.className = Ar.readFName(); this.outerIndex = new FPackageIndex(Ar); this.objectName = Ar.readFName(); if (Ar.ver >= Versions_1.VER_UE4_NON_OUTER_PACKAGE_IMPORT && !Ar.isFilterEditorOnly) { const packageName = Ar.readFName(); } } else { this.classPackage = params[0]; this.className = params[1]; this.outerIndex = params[2]; this.objectName = params[3]; } } /** * Serializes this * @param {FAssetArchiveWriter} Ar UE4 Asset Writer to use * @returns {void} * @public */ serialize(Ar) { Ar.writeFName(this.classPackage); Ar.writeFName(this.className); this.outerIndex.serialize(Ar); Ar.writeFName(this.objectName); } /** * Turns this into string * @returns {string} Result * @public */ toString() { return this.objectName.text; } } exports.FObjectImport = FObjectImport;