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

Function writeCopyPack

src/packFileSerializer.ts:1452–1555  ·  view source on GitHub ↗
(
  pathSource: string,
  pathTarget: string,
  packFilesToAdd: PackedFile[],
  sourceMod?: Pack,
)

Source from the content-addressed store, hash-verified

1450 return { createdPackPaths: Array.from(createdPackPaths), hadErrors };
1451};
1452export 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) {

Callers 2

addFakeUpdateFunction · 0.85
createOverwritePackFunction · 0.85

Calls 2

closeMethod · 0.80
readPackFunction · 0.70

Tested by

no test coverage detected