( pathSource: string, pathTarget: string, packFilesToAdd: PackedFile[], sourceMod?: Pack, )
| 1450 | return { createdPackPaths: Array.from(createdPackPaths), hadErrors }; |
| 1451 | }; |
| 1452 | export const writeCopyPack = async ( |
| 1453 | pathSource: string, |
| 1454 | pathTarget: string, |
| 1455 | packFilesToAdd: PackedFile[], |
| 1456 | sourceMod?: Pack, |
| 1457 | ) => { |
| 1458 | let outFile: BinaryFile | undefined; |
| 1459 | let sourceFile: BinaryFile | undefined; |
| 1460 | // eslint-disable-next-line @typescript-eslint/no-inferrable-types |
| 1461 | let sourceFileId: number = -1; |
| 1462 | try { |
| 1463 | // console.log(pathSource); |
| 1464 | sourceMod = sourceMod || (await readPack(pathSource, { skipParsingTables: true })); |
| 1465 | // console.log(sourceMod); |
| 1466 | const packFiles = sourceMod.packedFiles; |
| 1467 | const packFilesWithAdded = sourceMod.packedFiles.concat( |
| 1468 | packFilesToAdd.filter((packFiletoAdd) => |
| 1469 | sourceMod?.packedFiles.every((existingPackFile) => existingPackFile.name != packFiletoAdd.name), |
| 1470 | ), |
| 1471 | ); |
| 1472 | const packFilesToAddWithoutReplaced = packFilesToAdd.filter((packFiletoAdd) => |
| 1473 | sourceMod?.packedFiles.every((existingPackFile) => existingPackFile.name != packFiletoAdd.name), |
| 1474 | ); |
| 1475 | if (packFiles.length < 1) return; |
| 1476 | outFile = new BinaryFile(pathTarget, "w", true); |
| 1477 | sourceFile = new BinaryFile(pathSource, "r", true); |
| 1478 | await sourceFile.open(); |
| 1479 | sourceFileId = fs.openSync(pathSource, "r"); |
| 1480 | await outFile.open(); |
| 1481 | await outFile.write(sourceMod.packHeader.header); |
| 1482 | await outFile.writeInt32(sourceMod.packHeader.byteMask); |
| 1483 | await outFile.writeInt32(sourceMod.packHeader.refFileCount); |
| 1484 | await outFile.writeInt32(sourceMod.packHeader.pack_file_index_size); |
| 1485 | await outFile.writeInt32(packFilesWithAdded.length); |
| 1486 | const index_size = packFilesWithAdded.reduce((acc, pack) => acc + new Blob([pack.name]).size + 1 + 5, 0); |
| 1487 | await outFile.writeInt32(index_size); |
| 1488 | await outFile.writeInt32(0x7fffffff); // header_buffer |
| 1489 | console.log("DEP PACKS:", sourceMod.dependencyPacks); |
| 1490 | if (sourceMod.dependencyPacks) { |
| 1491 | for (const dependencyPack of sourceMod.dependencyPacks) { |
| 1492 | await outFile.writeString(dependencyPack); |
| 1493 | await outFile.writeUInt8(0); |
| 1494 | } |
| 1495 | } |
| 1496 | for (const packFile of packFilesWithAdded) { |
| 1497 | const { name, file_size } = packFile; |
| 1498 | // console.log("file size is " + file_size); |
| 1499 | const replacementPackFile = packFilesToAdd.find((toAdd) => toAdd.name == name); |
| 1500 | await outFile.writeInt32(replacementPackFile ? replacementPackFile.file_size : file_size); |
| 1501 | // await outFile.writeInt8(is_compressed); |
| 1502 | await outFile.writeInt8(replacementPackFile ? 0 : packFile.is_compressed ? 1 : 0); |
| 1503 | await outFile.writeString(name + "\0"); |
| 1504 | } |
| 1505 | for (const packFile of packFiles) { |
| 1506 | let data: Buffer | undefined; |
| 1507 | const fileToReplaceWith = packFilesToAdd.find((packFileToAdd) => packFileToAdd.name == packFile.name); |
| 1508 | if (fileToReplaceWith && fileToReplaceWith.schemaFields) { |
| 1509 | if (fileToReplaceWith.guid) { |
no test coverage detected