From 4f9dd1d3c9f67c35ef8f9687de37d1ac2261c319 Mon Sep 17 00:00:00 2001 From: ZacAttack Date: Fri, 4 Oct 2024 19:12:21 -0700 Subject: [PATCH] XML Version support in PCK reading apparently --- .gitignore | 1 + .npmignore | 3 ++- package.json | 2 +- src/index.ts | 5 +++-- src/pck/readPck.ts | 24 +++++++++++++++++++++--- testing/runTests.ts | 26 ++++++++++++++++++++++++-- 6 files changed, 52 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 9db2dd3..78e8cea 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,4 @@ dist /testing/reading/msscmp /testing/results /staging +/testing/reading diff --git a/.npmignore b/.npmignore index 2bf27e3..2fe9559 100644 --- a/.npmignore +++ b/.npmignore @@ -6,4 +6,5 @@ tsconfig.build.json .vscode /testing_internal /.idea -/staging \ No newline at end of file +/staging +.github \ No newline at end of file diff --git a/package.json b/package.json index a6cd1b1..385eeb3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "liblce", - "version": "1.2.11", + "version": "1.2.12", "description": "A TS library for Minecraft Legacy Console Edition files + more", "type": "module", "main": "./dist/index.js", diff --git a/src/index.ts b/src/index.ts index dbc28ae..d6d431b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,12 +25,12 @@ export * from "./loc/readLoc.js"; // arc export * from "./arc/readArc.js"; export * from "./arc/writeArc.js"; -// consoles -export * from "./console/consoles.js"; // msscmp export * from "./msscmp/readMsscmp.js"; // pck export * from "./pck/readPck.js"; +// consoles +export * from "./console/consoles.js"; export interface MsscmpFile { fileName: string, @@ -81,6 +81,7 @@ export interface PckFileData { export interface PckFile { version: number; + xmlVersion?: number; lookupTable: LookupTable[] fileTable: PckFileData[]; }; diff --git a/src/pck/readPck.ts b/src/pck/readPck.ts index 1892ca0..b01f7ec 100644 --- a/src/pck/readPck.ts +++ b/src/pck/readPck.ts @@ -5,7 +5,6 @@ * * File Contributors (based off of GitHub commits): * - DexrnZacAttack - * - Offroaders123 * * Other credits: * - NessieHax @@ -17,9 +16,14 @@ import { bReader } from "binaryio.js"; import { LookupTable, PckFileData, PckFile, PckFileEntry, PckKV, PckFileTypes } from "../index.js"; -export async function readPCK(file: File, isLittle = false): Promise { +export async function readPCK(file: File, isLittle?: boolean): Promise { const reader = new bReader(await file.arrayBuffer(), isLittle); + let readXMLVersion = false; + if (typeof isLittle === 'undefined' && reader.readUInt() > 4) + reader.setEndianness(true); + + reader.setPos(0); const version = reader.readUInt(); const lookupTable: LookupTable[] = []; @@ -29,9 +33,22 @@ export async function readPCK(file: File, isLittle = false): Promise { const lookupTableCount = reader.readUInt(); for (var i = 0; i < lookupTableCount; i++) { - lookupTable.push({ offset: reader.readUInt(), name: reader.readString16(reader.readUInt() * 2) }); + const offset = reader.readUInt(); + const name = reader.readString16(reader.readUInt() * 2); + + if (name == "XMLVERSION") + readXMLVersion = true; + + lookupTable.push({ offset, name}); reader.readUInt(); } + + let xmlVersion; + + if (readXMLVersion) + xmlVersion = reader.readUInt(); + + readXMLVersion = false; const fileTableCount = reader.readUInt(); @@ -56,6 +73,7 @@ export async function readPCK(file: File, isLittle = false): Promise { return { version, + xmlVersion, lookupTable: lookupTable, fileTable: PckFiles } diff --git a/testing/runTests.ts b/testing/runTests.ts index 89eec77..8958641 100644 --- a/testing/runTests.ts +++ b/testing/runTests.ts @@ -2,7 +2,7 @@ import { readdir, readFile, stat, writeFile } from "fs/promises"; import path, { join, resolve, relative } from "path"; -import { CompressionTypes, compressSave, writeSave, readARC, readSave, writeArc, readMSSCMP } from "../src/index.js"; +import { CompressionTypes, compressSave, writeSave, readARC, readSave, writeArc, readMSSCMP, readPCK } from "../src/index.js"; import { existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, statSync } from "fs"; async function runArcTest(): Promise { @@ -55,6 +55,22 @@ async function runMSSCMPTest() { } } +async function runPCKTest() { + try { + const files = readdirSync("reading\\PCK"); + + for (const file of files) { + const filePath = path.join("reading\\PCK", file); + if (statSync(filePath).isFile()) { + console.log(`Reading PCK ${filePath}`) + await readPCK(new File([readFileSync(filePath)], "pcktest")); + } + } + } catch (error) { + console.error('Error reading PCK:', error); + } +} + async function runTests() { if (!existsSync("results")) { @@ -90,7 +106,13 @@ async function runTests() { // To run this test, place .MSSCMP files "./reading/MSSCMP". if (existsSync("reading/MSSCMP") && lstatSync("reading/MSSCMP").isDirectory()) { console.log("Reading MSSCMPs"); - runMSSCMPTest(); + await runMSSCMPTest(); + } + + // To run this test, place .PCK files "./reading/PCK". + if (existsSync("reading/PCK") && lstatSync("reading/PCK").isDirectory()) { + console.log("Reading PCKs"); + await runPCKTest(); } }