MCPcopy Create free account
hub / github.com/Shazbot/WH3-Mod-Manager / writePackHeader

Function writePackHeader

src/packFileSerializer.ts:3532–3586  ·  view source on GitHub ↗
(
  outFile: BinaryFile,
  originalHeader: PackHeader,
  packedFiles: PackedFile[],
  dependencyPacks: string[],
)

Source from the content-addressed store, hash-verified

3530 }
3531};
3532const writePackHeader = async (
3533 outFile: BinaryFile,
3534 originalHeader: PackHeader,
3535 packedFiles: PackedFile[],
3536 dependencyPacks: string[],
3537): Promise<void> => {
3538 // Write base header
3539 await outFile.write(originalHeader.header);
3540 await outFile.writeInt32(originalHeader.byteMask);
3541 await outFile.writeInt32(originalHeader.refFileCount);
3542 // Calculate pack index size
3543 const pack_file_index_size = dependencyPacks.reduce(
3544 (acc, dep) => acc + Buffer.byteLength(dep, "utf8") + 1,
3545 0,
3546 );
3547 await outFile.writeInt32(pack_file_index_size);
3548 await outFile.writeInt32(packedFiles.length);
3549 // Calculate packed file index size
3550 const packed_file_index_size = packedFiles.reduce(
3551 (acc, file) => acc + 4 + 1 + Buffer.byteLength(file.name, "utf8") + 1,
3552 0,
3553 );
3554 await outFile.writeInt32(packed_file_index_size);
3555 await outFile.writeInt32(0x7fffffff); // header_buffer
3556 // Write dependency packs
3557 for (const dep of dependencyPacks) {
3558 await outFile.writeString(dep);
3559 await outFile.writeUInt8(0);
3560 }
3561 // Write file index
3562 // Pre-calculate total size for file index to write in one batch
3563 let totalIndexSize = 0;
3564 for (const file of packedFiles) {
3565 totalIndexSize += 4; // file_size (int32)
3566 totalIndexSize += 1; // is_compressed (int8)
3567 totalIndexSize += Buffer.byteLength(file.name + "\0", "utf8"); // filename + null terminator
3568 }
3569 // Create buffer for entire file index and write all at once
3570 const indexBuffer = Buffer.allocUnsafe(totalIndexSize);
3571 let offset = 0;
3572 for (const file of packedFiles) {
3573 // Write file_size
3574 indexBuffer.writeInt32LE(file.file_size, offset);
3575 offset += 4;
3576 // Write is_compressed flag
3577 indexBuffer.writeInt8(file.is_compressed ? 1 : 0, offset);
3578 offset += 1;
3579 // Write filename with null terminator
3580 const filenameBytes = Buffer.from(file.name + "\0", "utf8");
3581 filenameBytes.copy(indexBuffer, offset);
3582 offset += filenameBytes.length;
3583 }
3584 // Single write operation for entire file index
3585 await outFile.write(indexBuffer);
3586};
3587export const readDataFromPacks = async (mods: Mod[]) => {
3588 // console.log("READ PACKS STARTED");
3589 // mods = mods.filter((mod) => mod.name === "!!pj_test1.pack" || mod.name === "!!pj_test1_dupe.pack");

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected