unreal.js
Version:
A pak reader for games like VALORANT & Fortnite written in Node.JS
124 lines (123 loc) • 4.16 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FTextKey = exports.FTextLocalizationResourceString = exports.FTextLocalizationResource = void 0;
const Guid_1 = require("../misc/Guid");
const FArchive_1 = require("../../../reader/FArchive");
const Exceptions_1 = require("../../../../exceptions/Exceptions");
const collection_1 = __importDefault(require("@discordjs/collection"));
/**
* FTextLocalizationResource
*/
class FTextLocalizationResource {
/**
* Creates an instance using an UE4 Reader
* @param {FArchive} Ar UE4 Reader to use
* @constructor
* @public
*/
constructor(Ar) {
/**
* locResMagic
* @type {FGuid}
* @public
*/
this.locResMagic = new Guid_1.FGuid(0x7574140E, 0xFC034A67, 0x9D90154A, 0x1B7F37C3);
/**
* indexNone
* @type {number}
* @public
*/
this.indexNone = -1;
const magic = new Guid_1.FGuid(Ar);
if (!magic.equals(this.locResMagic))
throw new Exceptions_1.ParserException("Wrong locres guid", Ar);
this.version = Ar.readUInt8();
this.strArrayOffset = Number(Ar.readInt64());
if (this.strArrayOffset === this.indexNone)
throw new Exceptions_1.ParserException("No offset found", Ar);
// Only works for version 'optimized'
const cOffset = Ar.pos;
Ar.pos = this.strArrayOffset;
const len = Ar.readInt32();
const localizedStrings = new Array(len);
for (let i = 0; i < len; ++i) {
localizedStrings[i] = new FTextLocalizationResourceString(Ar);
}
Ar.pos = cOffset;
Ar.readUInt32(); // entryCount
const nameSpaceCount = Ar.readUInt32();
this.stringData = new collection_1.default();
for (let i = 0; i < nameSpaceCount; ++i) {
const nameSpace = new FTextKey(Ar);
const keyCount = Ar.readUInt32();
const strings = new collection_1.default();
for (let x = 0; x < keyCount; ++x) {
const textKey = new FTextKey(Ar);
Ar.readUInt32(); // source hash
const stringIndex = Ar.readInt32();
if (stringIndex > 0 && stringIndex < localizedStrings.length) {
strings.set(textKey.text, localizedStrings[stringIndex].data);
}
}
this.stringData.set(nameSpace.text, strings);
}
}
}
exports.FTextLocalizationResource = FTextLocalizationResource;
/**
* FTextLocalizationResourceString
*/
class FTextLocalizationResourceString {
/** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */
constructor(x, y) {
if (x instanceof FArchive_1.FArchive) {
this.data = x.readString();
this.refCount = x.readInt32();
}
else {
this.data = x;
this.refCount = y;
}
}
/**
* Serializes this
* @param {FArchiveWriter} Ar UE4 Writer to use
* @returns {void}
* @public
*/
serialize(Ar) {
Ar.writeString(this.data);
Ar.writeInt32(this.refCount);
}
}
exports.FTextLocalizationResourceString = FTextLocalizationResourceString;
/**
* FTextKey
*/
class FTextKey {
/** DO NOT USE THIS CONSTRUCTOR, THIS IS FOR THE LIBRARY */
constructor(x, y) {
if (x instanceof FArchive_1.FArchive) {
this.stringHash = x.readUInt32();
this.text = x.readString();
}
else {
this.stringHash = x;
this.text = y;
}
}
/**
* Serializes this
* @param {FArchiveWriter} Ar UE4 Writer to use
* @returns {void}
* @public
*/
serialize(Ar) {
Ar.writeUInt32(this.stringHash);
Ar.writeString(this.text);
}
}
exports.FTextKey = FTextKey;