unreal.js
Version:
A pak reader for games like VALORANT & Fortnite written in Node.JS
171 lines (170 loc) • 7.33 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FPackageFileSummary = exports.FGenerationInfo = void 0;
const FArchive_1 = require("../../reader/FArchive");
const Guid_1 = require("../core/misc/Guid");
const EngineVersion_1 = require("../core/misc/EngineVersion");
const FCompressedChunk_1 = require("../../assets/objects/FCompressedChunk");
const CustomVersion_1 = require("../core/serialization/CustomVersion");
const EPackageFlags_1 = require("./EPackageFlags");
const Versions_1 = require("../../versions/Versions");
const Game_1 = require("../../versions/Game");
/**
* FGenerationInfo
*/
class FGenerationInfo {
/** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */
constructor(x, y) {
if (x instanceof FArchive_1.FArchive) {
this.exportCount = x.readInt32();
this.nameCount = x.readInt32();
}
else {
this.exportCount = x;
this.nameCount = y;
}
}
/**
* Serializes this
* @param {FArchiveWriter} Ar UE4 Writer to use
* @returns {void}
* @public
*/
serialize(Ar) {
Ar.writeInt32(this.exportCount);
Ar.writeInt32(this.nameCount);
}
}
exports.FGenerationInfo = FGenerationInfo;
/**
* A "table of contents" for an Unreal package file. Stored at the top of the file.
*/
class FPackageFileSummary {
/**
* Creates an instance using an UE4 Reader
* @param {FArchive} Ar UE4 Reader to use
* @constructor
* @public
*/
constructor(Ar) {
this.tag = Ar.readUInt32();
this.legacyFileVersion = Ar.readInt32();
this.legacyUE3Version = Ar.readInt32();
this.fileVersionUE4 = Ar.readInt32();
this.fileVersionLicenseUE4 = Ar.readInt32();
const cvConLen = Ar.readInt32();
this.customVersionContainer = new Array(cvConLen);
for (let i = 0; i < cvConLen; ++i) {
this.customVersionContainer[i] = new CustomVersion_1.FCustomVersion(Ar);
}
this.totalHeaderSize = Ar.readInt32();
this.folderName = Ar.readString();
this.packageFlags = Ar.readUInt32();
if ((this.packageFlags & EPackageFlags_1.EPackageFlags.PKG_FilterEditorOnly) !== 0) {
Ar.isFilterEditorOnly = true;
}
this.nameCount = Ar.readInt32();
this.nameOffset = Ar.readInt32();
if (!Ar.isFilterEditorOnly) {
if (this.fileVersionUE4 >= Versions_1.VER_UE4_ADDED_PACKAGE_SUMMARY_LOCALIZATION_ID) {
const localizationId = Ar.readString();
}
}
this.gatherableTextDataCount = Ar.readInt32();
this.gatherableTextDataOffset = Ar.readInt32();
this.exportCount = Ar.readInt32();
this.exportOffset = Ar.readInt32();
this.importCount = Ar.readInt32();
this.importOffset = Ar.readInt32();
this.dependsOffset = Ar.readInt32();
this.softPackageReferencesCount = Ar.readInt32();
this.softPackageReferencesOffset = Ar.readInt32();
this.searchableNamesOffset = Ar.readInt32();
this.thumbnailTableOffset = Ar.readInt32();
if (Ar.game === Game_1.Ue4Version.GAME_VALORANT.game)
Ar.pos += 8;
this.guid = new Guid_1.FGuid(Ar);
if (!Ar.isFilterEditorOnly) {
if (this.fileVersionUE4 >= Versions_1.VER_UE4_ADDED_PACKAGE_OWNER) {
const persistentGuid = new Guid_1.FGuid(Ar);
}
if (this.fileVersionUE4 >= Versions_1.VER_UE4_ADDED_PACKAGE_OWNER && Versions_1.VER_UE4_ADDED_PACKAGE_OWNER < Versions_1.VER_UE4_NON_OUTER_PACKAGE_IMPORT) {
const ownerPersistentGuid = new Guid_1.FGuid(Ar);
}
}
const genLen = Ar.readInt32();
this.generations = new Array(genLen);
for (let i = 0; i < genLen; ++i) {
this.generations[i] = new FGenerationInfo(Ar);
}
this.savedByEngineVersion = new EngineVersion_1.FEngineVersion(Ar);
this.compatibleWithEngineVersion = new EngineVersion_1.FEngineVersion(Ar);
this.compressionFlags = Ar.readUInt32();
const comFlagsLen = Ar.readInt32();
this.compressedChunks = new Array(comFlagsLen);
for (let i = 0; i < comFlagsLen; ++i) {
this.compressedChunks[i] = new FCompressedChunk_1.FCompressedChunk(Ar);
}
this.packageSource = Ar.readUInt32();
const addPkgLen = Ar.readInt32();
this.additionalPackagesToCook = new Array(addPkgLen);
for (let i = 0; i < comFlagsLen; ++i) {
this.additionalPackagesToCook[i] = Ar.readString();
}
this.assetRegistryDataOffset = Ar.readInt32();
this.bulkDataStartOffset = Ar.readInt32();
this.worldTileInfoDataOffset = Ar.readInt32();
const chunkIdsLen = Ar.readInt32();
this.chunkIds = new Array(chunkIdsLen);
for (let i = 0; i < chunkIdsLen; ++i) {
this.chunkIds[i] = Ar.readInt32();
}
this.preloadDependencyCount = Ar.readInt32();
this.preloadDependencyOffset = Ar.readInt32();
}
/**
* Serializes this
* @param {FArchiveWriter} Ar UE4 Writer to use
* @returns {void}
* @public
*/
serialize(Ar) {
Ar.writeUInt32(this.tag);
Ar.writeInt32(this.legacyFileVersion);
Ar.writeInt32(this.legacyUE3Version);
Ar.writeInt32(this.fileVersionUE4);
Ar.writeInt32(this.fileVersionLicenseUE4);
Ar.writeTArray(this.customVersionContainer, (it) => it.serialize(Ar));
Ar.writeInt32(this.totalHeaderSize);
Ar.writeString(this.folderName);
Ar.writeUInt32(this.packageFlags);
Ar.writeInt32(this.nameCount);
Ar.writeInt32(this.nameOffset);
Ar.writeInt32(this.gatherableTextDataCount);
Ar.writeInt32(this.gatherableTextDataOffset);
Ar.writeInt32(this.exportCount);
Ar.writeInt32(this.exportOffset);
Ar.writeInt32(this.importCount);
Ar.writeInt32(this.importOffset);
Ar.writeInt32(this.dependsOffset);
Ar.writeInt32(this.softPackageReferencesCount);
Ar.writeInt32(this.softPackageReferencesOffset);
Ar.writeInt32(this.searchableNamesOffset);
Ar.writeInt32(this.thumbnailTableOffset);
this.guid.serialize(Ar);
Ar.writeTArray(this.generations, (it) => it.serialize(Ar));
this.savedByEngineVersion.serialize(Ar);
this.compatibleWithEngineVersion.serialize(Ar);
Ar.writeUInt32(this.compressionFlags);
Ar.writeTArray(this.compressedChunks, (it) => it.serialize(Ar));
Ar.writeUInt32(this.packageSource);
Ar.writeTArray(this.additionalPackagesToCook, (it) => Ar.writeString(it));
Ar.writeInt32(this.assetRegistryDataOffset);
Ar.writeInt32(this.bulkDataStartOffset);
Ar.writeInt32(this.worldTileInfoDataOffset);
Ar.writeTArray(this.chunkIds, (it) => Ar.writeInt32(it));
Ar.writeInt32(this.preloadDependencyCount);
Ar.writeInt32(this.preloadDependencyOffset);
}
}
exports.FPackageFileSummary = FPackageFileSummary;