( outFile: BinaryFile, originalHeader: PackHeader, packedFiles: PackedFile[], dependencyPacks: string[], )
| 3530 | } |
| 3531 | }; |
| 3532 | const 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 | }; |
| 3587 | export 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"); |
no outgoing calls
no test coverage detected