mca-json 1.0.4 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -8
- package/dist/bin/mca-find-signs.d.ts +3 -0
- package/dist/bin/mca-find-signs.d.ts.map +1 -0
- package/dist/bin/mca-find-signs.js +148 -0
- package/dist/bin/mca-find-signs.js.map +1 -0
- package/dist/bin/mca-remove-chunks.d.ts +3 -0
- package/dist/bin/mca-remove-chunks.d.ts.map +1 -0
- package/dist/bin/mca-remove-chunks.js +144 -0
- package/dist/bin/mca-remove-chunks.js.map +1 -0
- package/dist/bin/nbt-get-player-location.js +18 -9
- package/dist/bin/nbt-get-player-location.js.map +1 -1
- package/dist/lib/anvil.d.ts.map +1 -1
- package/dist/lib/anvil.js +4 -3
- package/dist/lib/anvil.js.map +1 -1
- package/dist/lib/bit-data.js +2 -2
- package/dist/lib/bit-data.js.map +1 -1
- package/dist/lib/chunk.d.ts.map +1 -1
- package/dist/lib/chunk.js +12 -7
- package/dist/lib/chunk.js.map +1 -1
- package/dist/nbt/snbt-parse.d.ts.map +1 -1
- package/dist/nbt/snbt-parse.js +7 -4
- package/dist/nbt/snbt-parse.js.map +1 -1
- package/dist/nbt/snbt-to-nbt.js +14 -4
- package/dist/nbt/snbt-to-nbt.js.map +1 -1
- package/package.json +2 -2
- package/src/bin/mca-find-signs.ts +214 -0
- package/src/bin/mca-remove-chunks.ts +183 -0
- package/src/bin/nbt-get-player-location.ts +19 -11
- package/src/lib/anvil.ts +5 -3
- package/src/lib/bit-data.ts +2 -2
- package/src/lib/chunk.ts +15 -7
- package/src/nbt/snbt-parse.ts +7 -4
- package/src/nbt/snbt-to-nbt.ts +63 -20
- package/dist/bin/mca-find-chunks-with-signs.d.ts +0 -3
- package/dist/bin/mca-find-chunks-with-signs.d.ts.map +0 -1
- package/dist/bin/mca-find-chunks-with-signs.js +0 -79
- package/dist/bin/mca-find-chunks-with-signs.js.map +0 -1
- package/dist/bin/mca-trim-chunks-without-signs.d.ts +0 -3
- package/dist/bin/mca-trim-chunks-without-signs.d.ts.map +0 -1
- package/dist/bin/mca-trim-chunks-without-signs.js +0 -117
- package/dist/bin/mca-trim-chunks-without-signs.js.map +0 -1
- package/src/bin/mca-find-chunks-with-signs.ts +0 -109
- package/src/bin/mca-trim-chunks-without-signs.ts +0 -146
package/dist/lib/chunk.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.d.ts","sourceRoot":"","sources":["../../src/lib/chunk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAS,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"chunk.d.ts","sourceRoot":"","sources":["../../src/lib/chunk.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAS,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAM1C,qBAAa,KAAK;IACd,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAqC;IAC3D,OAAO,CAAC,OAAO,CAAc;IAE7B;;;;OAIG;gBACS,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;IAW9B;;OAEG;IACH,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,GAAG,SAAS;IASjD;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS;IAc1D;;;;OAIG;IACH,gBAAgB,IAAI,QAAQ,GAAG,SAAS;IA0BxC;;;OAGG;IACH,QAAQ,IAAI,MAAM,GAAG,SAAS;IAU9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,aAAa;IAuCzC;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE;IAoC1C;;;;;;;OAOG;IACH,aAAa,IAAI,MAAM,GAAG,SAAS;IASnC;;OAEG;IACH,QAAQ,IAAI,GAAG;IAIf;;OAEG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC;IAoB/B;;;;;;OAMG;IACH,gBAAgB,IAAI,QAAQ,GAAG,SAAS;IAUxC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAIxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA2BpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,WAAW;IAcnB;;OAEG;IACH,OAAO,CAAC,QAAQ;CAenB"}
|
package/dist/lib/chunk.js
CHANGED
|
@@ -55,19 +55,24 @@ export class Chunk {
|
|
|
55
55
|
*/
|
|
56
56
|
chunkCoordinates() {
|
|
57
57
|
const x =
|
|
58
|
-
// 1.18+
|
|
58
|
+
// 1.18+ region chunks
|
|
59
59
|
this.rootNbt.findChild('xPos') ||
|
|
60
|
-
// up to 1.17
|
|
60
|
+
// up to 1.17 region chunks
|
|
61
61
|
this.rootNbt.findChild('Level/xPos');
|
|
62
62
|
const z =
|
|
63
|
-
// 1.18+
|
|
63
|
+
// 1.18+ region chunks
|
|
64
64
|
this.rootNbt.findChild('zPos') ||
|
|
65
|
-
// up to 1.17
|
|
65
|
+
// up to 1.17 region chunks
|
|
66
66
|
this.rootNbt.findChild('Level/zPos');
|
|
67
|
-
if (typeof x?.data
|
|
68
|
-
return;
|
|
67
|
+
if (typeof x?.data === 'number' && typeof z?.data === 'number') {
|
|
68
|
+
return [x.data, z.data];
|
|
69
|
+
}
|
|
70
|
+
// Check for entity chunks
|
|
71
|
+
const position = this.rootNbt.findChild('Position');
|
|
72
|
+
if (position && position.data.length === 2) {
|
|
73
|
+
return [position.data[0], position.data[1]];
|
|
69
74
|
}
|
|
70
|
-
return
|
|
75
|
+
return;
|
|
71
76
|
}
|
|
72
77
|
/**
|
|
73
78
|
* Returns a unique id for this chunk. It's just the chunk's X and Z
|
package/dist/lib/chunk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/lib/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A Chunk is a 16 x 383 x 16 portion of a Minecraft world. It's stored as NBT\n * data in sections of 16 blocks in the Y axis. The Y axis range is from -64 to\n * 320.\n *\n * This class helps manipulate the chunk data.\n */\n\nimport { Block, BlockInstance } from '../block/block';\nimport { BlockData } from './block-data';\nimport { Coords2d, Coords3d } from '../types/coords';\nimport { NbtBase } from '../nbt/nbt-base';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtString } from '../nbt/nbt-string';\nimport { NbtTagType } from '../nbt/nbt-tag-type';\n\nexport class Chunk {\n private dataVersion: number;\n private parsedSections = new Map<NbtCompound, BlockData>();\n private rootNbt: NbtCompound;\n\n /**\n * Constructs a new chunk object from a given NBT tag.\n *\n * @param root the NBT tag containing the chunk's data\n */\n constructor(root: NbtBase<any>) {\n if (!this.isValidChunkRoot(root)) {\n throw new Error('Invalid chunk root tag');\n }\n\n this.rootNbt = root;\n\n // 1.2.1 does not have this tag.\n this.dataVersion = root.findChild<NbtInt>('DataVersion')?.data ?? 0;\n }\n\n /**\n * Gets the block entity list tag.\n */\n blockEntities(): NbtList<NbtCompound> | undefined {\n return (\n // 1.18+\n this.rootNbt.findChild<NbtList<NbtCompound>>('block_entities') ||\n // up to 1.17\n this.rootNbt.findChild<NbtList<NbtCompound>>('Level/TileEntities')\n );\n }\n\n /**\n * Gets a block's entity data\n */\n blockEntityData(coords: Coords3d): NbtCompound | undefined {\n return this.blockEntities()?.data.find((tag: NbtCompound) => {\n const x = tag.findChild<NbtInt>('x');\n const y = tag.findChild<NbtInt>('y');\n const z = tag.findChild<NbtInt>('z');\n\n return (\n x?.data === coords[0] &&\n y?.data === coords[1] &&\n z?.data === coords[2]\n );\n });\n }\n\n /**\n * Gets the chunk's location in chunk coordinates.\n *\n * Returns a tuple of the chunk's X and Z coordinates.\n */\n chunkCoordinates(): Coords2d | undefined {\n const x =\n // 1.18+\n this.rootNbt.findChild<NbtInt>('xPos') ||\n // up to 1.17\n this.rootNbt.findChild<NbtInt>('Level/xPos');\n const z =\n // 1.18+\n this.rootNbt.findChild<NbtInt>('zPos') ||\n // up to 1.17\n this.rootNbt.findChild<NbtInt>('Level/zPos');\n\n if (typeof x?.data !== 'number' || typeof z?.data !== 'number') {\n return;\n }\n\n return [x.data, z.data];\n }\n\n /**\n * Returns a unique id for this chunk. It's just the chunk's X and Z\n * coordinates in number of chunks from the world's origin.\n */\n chunkKey(): string | undefined {\n const coords = this.chunkCoordinates();\n\n if (!coords) {\n return;\n }\n\n return `${coords[0]},${coords[1]}`;\n }\n\n /**\n * Returns an instance of a block at a given location using world\n * coordinates.\n */\n getBlock(coords: Coords3d): BlockInstance {\n const sectionY = Math.floor(coords[1] / 16);\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n throw new Error('Invalid chunk - no sections found');\n }\n\n const section = sectionsTag.data.find(\n (section) => this.sectionY(section) === sectionY\n );\n\n if (!section) {\n throw new Error('Block not found in any sections');\n }\n\n const blockData = this.parseSection(section);\n const [xWorld, zWorld] = this.worldCoordinates() || [0, 0];\n const xChunk = coords[0] - xWorld;\n const zChunk = coords[2] - zWorld;\n\n if (xChunk < 0 || xChunk > 15) {\n throw new Error('X coordinate out of bounds');\n }\n\n if (zChunk < 0 || zChunk > 15) {\n throw new Error('Z coordinate out of bounds');\n }\n\n const index = blockData.chunkCoordinatesToIndex([\n xChunk,\n coords[1] % 16,\n zChunk,\n ]);\n const name = blockData.getBlockByIndex(index);\n\n return Block.create(name, coords, this.blockEntityData(coords));\n }\n\n /**\n * Finds all blocks by a given name. Provides [X, Y, Z] real-world coordinates.\n */\n findBlocksByName(name: string): Coords3d[] {\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n return [];\n }\n\n return sectionsTag.data.flatMap((section) => {\n const yWorld = this.sectionY(section, true);\n const [xWorld, zWorld] = this.worldCoordinates() || [0, 0];\n const palette = this.sectionPalette(section);\n\n if (palette === undefined) {\n return [];\n }\n\n // // If it's not in the palette, we can skip processing.\n if (!this.paletteNameList(palette).includes(name)) {\n return [];\n }\n\n const blockData = this.parseSection(section);\n\n return blockData.findBlocksByName(name).map((index): Coords3d => {\n const chunkCoordinates =\n blockData.indexToChunkCoordinates(index);\n\n return [\n xWorld + chunkCoordinates[0],\n yWorld + chunkCoordinates[1],\n zWorld + chunkCoordinates[2],\n ];\n });\n });\n }\n\n /**\n * See how long the chunk has been inhabited. This number increases by 1\n * for each game tick, which is 20 times per second when a player is\n * nearby. It can also advance slowly when players are farther away.\n *\n * On newly created chunks, this value does not match what is expected. Use\n * this with caution.\n */\n inhabitedTime(): bigint | undefined {\n return (\n // 1.18+\n this.rootNbt.findChild<NbtLong>('InhabitedTime')?.data ||\n // up to 1.17\n this.rootNbt.findChild<NbtLong>('Level/InhabitedTime')?.data\n );\n }\n\n /**\n * Converts the chunk data to a JSON object.\n */\n toObject(): any {\n return this.rootNbt.toObject();\n }\n\n /**\n * Returns a list of unique block names in the chunk as a Set.\n */\n uniqueBlockNames(): Set<string> {\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n return new Set();\n }\n\n const names = sectionsTag.data.flatMap((section) => {\n const palette = this.sectionPalette(section);\n\n if (!palette) {\n return [];\n }\n\n return this.paletteNameList(palette);\n });\n\n return new Set(names);\n }\n\n /**\n * Gets the chunk's location in real-world coordinates.\n *\n * Returns a tuple of the starting block's world X and Z coordinates. The\n * chunk contains the range from X to X+15 (going East), Y to Y+15 (going\n * up), and Z to Z+15 (going South).\n */\n worldCoordinates(): Coords2d | undefined {\n const result = this.chunkCoordinates();\n\n if (!result) {\n return;\n }\n\n return [result[0] * 16, result[1] * 16];\n }\n\n /**\n * Checks if the given NBT tag is a valid chunk root tag.\n * @param tag the tag to check.\n */\n private isValidChunkRoot(nbt: NbtBase<any>): nbt is NbtCompound {\n return nbt.isCompound('');\n }\n\n /**\n * Checks if the given NBT tag is a valid chunk section tag, containing a list of chunk sections.\n */\n private isValidChunkSection(\n nbt: NbtBase<any>\n ): nbt is NbtList<NbtCompound> {\n if (!nbt.isList(NbtTagType.COMPOUND)) {\n return false;\n }\n\n // Java uses \"sections\", unsure what uses \"Sections\"\n if (nbt.name.toLowerCase() === 'sections') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Returns a list of names within a palette tag.\n */\n private paletteNameList(palette: NbtBase<any>): string[] {\n if (!palette.isList(NbtTagType.COMPOUND)) {\n return [];\n }\n\n return (palette as NbtList<NbtCompound>).data.map((tag) => {\n const name = tag.findChild<NbtString>('Name');\n\n return name?.data ?? '';\n });\n }\n\n /**\n * Parses a section tag into BlockData.\n *\n * Uses a cached version if available;\n */\n private parseSection(section: NbtCompound): BlockData {\n if (this.parsedSections.has(section)) {\n return this.parsedSections.get(section)!;\n }\n\n const palette = this.sectionPalette(section);\n\n if (!palette) {\n throw new Error('Invalid chunk section - no palette found');\n }\n\n const blockStates = this.sectionBlockStates(section);\n\n if (!blockStates) {\n throw new Error('Invalid chunk section - no block states found');\n }\n\n const blockData = BlockData.fromPaletteBlockStates(\n this.dataVersion,\n palette,\n blockStates\n );\n this.parsedSections.set(section, blockData);\n\n return blockData;\n }\n\n /**\n * Finds the BlockStates tag in a section.\n */\n private sectionBlockStates(section: NbtCompound): NbtLongArray | undefined {\n return (\n // 1.18+\n section.findChild<NbtLongArray>('block_states/data') ||\n // up to 1.17\n section.findChild<NbtLongArray>('BlockStates')\n );\n }\n\n /**\n * Finds the block palette in a section.\n */\n private sectionPalette(\n section: NbtCompound\n ): NbtList<NbtCompound> | undefined {\n return (\n // 1.18+\n section.findChild<NbtList<NbtCompound>>('block_states/palette') ||\n // up to 1.17\n section.findChild<NbtList<NbtCompound>>('Palette')\n );\n }\n\n /**\n * Returns all sections\n */\n private sectionsTag(): NbtList<NbtCompound> | undefined {\n const section =\n // 1.18+\n this.rootNbt.findChild<NbtList<NbtCompound>>('sections') ||\n // up to 1.17\n this.rootNbt.findChild<NbtList<NbtCompound>>('Level/Sections');\n\n if (section && this.isValidChunkSection(section)) {\n return section;\n }\n\n return;\n }\n\n /**\n * Returns the Y coordinate of a section, which goes from 0 to 256. If you want the world coordinate, pass true to get -128 to 4031.\n */\n private sectionY(section: NbtCompound, useWorldCoordinate = false): number {\n const ySection = section.findChild<NbtInt>('Y')?.data || 0;\n\n if (!useWorldCoordinate) {\n return ySection;\n }\n\n let yWorld = ySection * 16;\n\n if (yWorld >= 4032) {\n yWorld -= 4096;\n }\n\n return yWorld;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../src/lib/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * A Chunk is a 16 x 383 x 16 portion of a Minecraft world. It's stored as NBT\n * data in sections of 16 blocks in the Y axis. The Y axis range is from -64 to\n * 320.\n *\n * This class helps manipulate the chunk data.\n */\n\nimport { Block, BlockInstance } from '../block/block';\nimport { BlockData } from './block-data';\nimport { Coords2d, Coords3d } from '../types/coords';\nimport { NbtBase } from '../nbt/nbt-base';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtString } from '../nbt/nbt-string';\nimport { NbtTagType } from '../nbt/nbt-tag-type';\n\nexport class Chunk {\n private dataVersion: number;\n private parsedSections = new Map<NbtCompound, BlockData>();\n private rootNbt: NbtCompound;\n\n /**\n * Constructs a new chunk object from a given NBT tag.\n *\n * @param root the NBT tag containing the chunk's data\n */\n constructor(root: NbtBase<any>) {\n if (!this.isValidChunkRoot(root)) {\n throw new Error('Invalid chunk root tag');\n }\n\n this.rootNbt = root;\n\n // 1.2.1 does not have this tag.\n this.dataVersion = root.findChild<NbtInt>('DataVersion')?.data ?? 0;\n }\n\n /**\n * Gets the block entity list tag.\n */\n blockEntities(): NbtList<NbtCompound> | undefined {\n return (\n // 1.18+\n this.rootNbt.findChild<NbtList<NbtCompound>>('block_entities') ||\n // up to 1.17\n this.rootNbt.findChild<NbtList<NbtCompound>>('Level/TileEntities')\n );\n }\n\n /**\n * Gets a block's entity data\n */\n blockEntityData(coords: Coords3d): NbtCompound | undefined {\n return this.blockEntities()?.data.find((tag: NbtCompound) => {\n const x = tag.findChild<NbtInt>('x');\n const y = tag.findChild<NbtInt>('y');\n const z = tag.findChild<NbtInt>('z');\n\n return (\n x?.data === coords[0] &&\n y?.data === coords[1] &&\n z?.data === coords[2]\n );\n });\n }\n\n /**\n * Gets the chunk's location in chunk coordinates.\n *\n * Returns a tuple of the chunk's X and Z coordinates.\n */\n chunkCoordinates(): Coords2d | undefined {\n const x =\n // 1.18+ region chunks\n this.rootNbt.findChild<NbtInt>('xPos') ||\n // up to 1.17 region chunks\n this.rootNbt.findChild<NbtInt>('Level/xPos');\n const z =\n // 1.18+ region chunks\n this.rootNbt.findChild<NbtInt>('zPos') ||\n // up to 1.17 region chunks\n this.rootNbt.findChild<NbtInt>('Level/zPos');\n\n if (typeof x?.data === 'number' && typeof z?.data === 'number') {\n return [x.data, z.data];\n }\n\n // Check for entity chunks\n const position = this.rootNbt.findChild<NbtIntArray>('Position');\n\n if (position && position.data.length === 2) {\n return [position.data[0], position.data[1]];\n }\n\n return;\n }\n\n /**\n * Returns a unique id for this chunk. It's just the chunk's X and Z\n * coordinates in number of chunks from the world's origin.\n */\n chunkKey(): string | undefined {\n const coords = this.chunkCoordinates();\n\n if (!coords) {\n return;\n }\n\n return `${coords[0]},${coords[1]}`;\n }\n\n /**\n * Returns an instance of a block at a given location using world\n * coordinates.\n */\n getBlock(coords: Coords3d): BlockInstance {\n const sectionY = Math.floor(coords[1] / 16);\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n throw new Error('Invalid chunk - no sections found');\n }\n\n const section = sectionsTag.data.find(\n (section) => this.sectionY(section) === sectionY\n );\n\n if (!section) {\n throw new Error('Block not found in any sections');\n }\n\n const blockData = this.parseSection(section);\n const [xWorld, zWorld] = this.worldCoordinates() || [0, 0];\n const xChunk = coords[0] - xWorld;\n const zChunk = coords[2] - zWorld;\n\n if (xChunk < 0 || xChunk > 15) {\n throw new Error('X coordinate out of bounds');\n }\n\n if (zChunk < 0 || zChunk > 15) {\n throw new Error('Z coordinate out of bounds');\n }\n\n const index = blockData.chunkCoordinatesToIndex([\n xChunk,\n coords[1] % 16,\n zChunk,\n ]);\n const name = blockData.getBlockByIndex(index);\n\n return Block.create(name, coords, this.blockEntityData(coords));\n }\n\n /**\n * Finds all blocks by a given name. Provides [X, Y, Z] real-world coordinates.\n */\n findBlocksByName(name: string): Coords3d[] {\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n return [];\n }\n\n return sectionsTag.data.flatMap((section) => {\n const yWorld = this.sectionY(section, true);\n const [xWorld, zWorld] = this.worldCoordinates() || [0, 0];\n const palette = this.sectionPalette(section);\n\n if (palette === undefined) {\n return [];\n }\n\n // // If it's not in the palette, we can skip processing.\n if (!this.paletteNameList(palette).includes(name)) {\n return [];\n }\n\n const blockData = this.parseSection(section);\n\n return blockData.findBlocksByName(name).map((index): Coords3d => {\n const chunkCoordinates =\n blockData.indexToChunkCoordinates(index);\n\n return [\n xWorld + chunkCoordinates[0],\n yWorld + chunkCoordinates[1],\n zWorld + chunkCoordinates[2],\n ];\n });\n });\n }\n\n /**\n * See how long the chunk has been inhabited. This number increases by 1\n * for each game tick, which is 20 times per second when a player is\n * nearby. It can also advance slowly when players are farther away.\n *\n * On newly created chunks, this value does not match what is expected. Use\n * this with caution.\n */\n inhabitedTime(): bigint | undefined {\n return (\n // 1.18+\n this.rootNbt.findChild<NbtLong>('InhabitedTime')?.data ||\n // up to 1.17\n this.rootNbt.findChild<NbtLong>('Level/InhabitedTime')?.data\n );\n }\n\n /**\n * Converts the chunk data to a JSON object.\n */\n toObject(): any {\n return this.rootNbt.toObject();\n }\n\n /**\n * Returns a list of unique block names in the chunk as a Set.\n */\n uniqueBlockNames(): Set<string> {\n const sectionsTag = this.sectionsTag();\n\n if (!sectionsTag) {\n return new Set();\n }\n\n const names = sectionsTag.data.flatMap((section) => {\n const palette = this.sectionPalette(section);\n\n if (!palette) {\n return [];\n }\n\n return this.paletteNameList(palette);\n });\n\n return new Set(names);\n }\n\n /**\n * Gets the chunk's location in real-world coordinates.\n *\n * Returns a tuple of the starting block's world X and Z coordinates. The\n * chunk contains the range from X to X+15 (going East), Y to Y+15 (going\n * up), and Z to Z+15 (going South).\n */\n worldCoordinates(): Coords2d | undefined {\n const result = this.chunkCoordinates();\n\n if (!result) {\n return;\n }\n\n return [result[0] * 16, result[1] * 16];\n }\n\n /**\n * Checks if the given NBT tag is a valid chunk root tag.\n * @param tag the tag to check.\n */\n private isValidChunkRoot(nbt: NbtBase<any>): nbt is NbtCompound {\n return nbt.isCompound('');\n }\n\n /**\n * Checks if the given NBT tag is a valid chunk section tag, containing a list of chunk sections.\n */\n private isValidChunkSection(\n nbt: NbtBase<any>\n ): nbt is NbtList<NbtCompound> {\n if (!nbt.isList(NbtTagType.COMPOUND)) {\n return false;\n }\n\n // Java uses \"sections\", unsure what uses \"Sections\"\n if (nbt.name.toLowerCase() === 'sections') {\n return true;\n }\n\n return false;\n }\n\n /**\n * Returns a list of names within a palette tag.\n */\n private paletteNameList(palette: NbtBase<any>): string[] {\n if (!palette.isList(NbtTagType.COMPOUND)) {\n return [];\n }\n\n return (palette as NbtList<NbtCompound>).data.map((tag) => {\n const name = tag.findChild<NbtString>('Name');\n\n return name?.data ?? '';\n });\n }\n\n /**\n * Parses a section tag into BlockData.\n *\n * Uses a cached version if available;\n */\n private parseSection(section: NbtCompound): BlockData {\n if (this.parsedSections.has(section)) {\n return this.parsedSections.get(section)!;\n }\n\n const palette = this.sectionPalette(section);\n\n if (!palette) {\n throw new Error('Invalid chunk section - no palette found');\n }\n\n const blockStates = this.sectionBlockStates(section);\n\n if (!blockStates) {\n throw new Error('Invalid chunk section - no block states found');\n }\n\n const blockData = BlockData.fromPaletteBlockStates(\n this.dataVersion,\n palette,\n blockStates\n );\n this.parsedSections.set(section, blockData);\n\n return blockData;\n }\n\n /**\n * Finds the BlockStates tag in a section.\n */\n private sectionBlockStates(section: NbtCompound): NbtLongArray | undefined {\n return (\n // 1.18+\n section.findChild<NbtLongArray>('block_states/data') ||\n // up to 1.17\n section.findChild<NbtLongArray>('BlockStates')\n );\n }\n\n /**\n * Finds the block palette in a section.\n */\n private sectionPalette(\n section: NbtCompound\n ): NbtList<NbtCompound> | undefined {\n return (\n // 1.18+\n section.findChild<NbtList<NbtCompound>>('block_states/palette') ||\n // up to 1.17\n section.findChild<NbtList<NbtCompound>>('Palette')\n );\n }\n\n /**\n * Returns all sections\n */\n private sectionsTag(): NbtList<NbtCompound> | undefined {\n const section =\n // 1.18+\n this.rootNbt.findChild<NbtList<NbtCompound>>('sections') ||\n // up to 1.17\n this.rootNbt.findChild<NbtList<NbtCompound>>('Level/Sections');\n\n if (section && this.isValidChunkSection(section)) {\n return section;\n }\n\n return;\n }\n\n /**\n * Returns the Y coordinate of a section, which goes from 0 to 256. If you want the world coordinate, pass true to get -128 to 4031.\n */\n private sectionY(section: NbtCompound, useWorldCoordinate = false): number {\n const ySection = section.findChild<NbtInt>('Y')?.data || 0;\n\n if (!useWorldCoordinate) {\n return ySection;\n }\n\n let yWorld = ySection * 16;\n\n if (yWorld >= 4032) {\n yWorld -= 4096;\n }\n\n return yWorld;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"snbt-parse.d.ts","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAiB,MAAM,aAAa,CAAC;AA4OtD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,YAqBrC"}
|
package/dist/nbt/snbt-parse.js
CHANGED
|
@@ -16,6 +16,7 @@ const tokenParsers = [
|
|
|
16
16
|
type: 'WHITESPACE',
|
|
17
17
|
pattern: /^\s+/,
|
|
18
18
|
callback: (_pos, _type, _snbtData, matches) => {
|
|
19
|
+
// Do not generate a token for whitespace.
|
|
19
20
|
return matches[0].length;
|
|
20
21
|
},
|
|
21
22
|
},
|
|
@@ -96,8 +97,8 @@ const tokenParsers = [
|
|
|
96
97
|
type: 'BYTE',
|
|
97
98
|
pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),
|
|
98
99
|
callback: (pos, type, snbtData, matches) => {
|
|
99
|
-
snbtData.addToken(pos, type, matches[
|
|
100
|
-
return matches[
|
|
100
|
+
snbtData.addToken(pos, type, matches[1].toLowerCase() === 'true' ? '1' : '0');
|
|
101
|
+
return matches[1].length;
|
|
101
102
|
},
|
|
102
103
|
},
|
|
103
104
|
{
|
|
@@ -182,9 +183,10 @@ const tokenParsers = [
|
|
|
182
183
|
},
|
|
183
184
|
];
|
|
184
185
|
// Creates a regular expression that will start at the beginning of the string
|
|
185
|
-
// and conclude with an "end of token" marker at the end.
|
|
186
|
+
// and conclude with an "end of token" marker at the end. The lookahead will
|
|
187
|
+
// not capture the end of the token marker.
|
|
186
188
|
function anchorPattern(pattern) {
|
|
187
|
-
return new RegExp(`^${pattern}\s*(
|
|
189
|
+
return new RegExp(`^${pattern}\s*(?=$|,|}|]|:)`);
|
|
188
190
|
}
|
|
189
191
|
export function snbtParse(snbt) {
|
|
190
192
|
const snbtData = new SnbtData();
|
|
@@ -194,6 +196,7 @@ export function snbtParse(snbt) {
|
|
|
194
196
|
if (!increment) {
|
|
195
197
|
throw new Error(`Unexpected token at position ${pos}`);
|
|
196
198
|
}
|
|
199
|
+
debugLog(`Increment position by ${increment}`);
|
|
197
200
|
pos += increment;
|
|
198
201
|
}
|
|
199
202
|
return snbtData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[0].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[0].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?:$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snbt-parse.js","sourceRoot":"","sources":["../../src/nbt/snbt-parse.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from 'debug';\nimport { SnbtData, SnbtTokenType } from './snbt-data';\n\nconst debugLog = debug('snbt:parse');\n\ninterface TokenParser {\n type: SnbtTokenType;\n pattern: RegExp;\n callback: (\n offset: number,\n type: SnbtTokenType,\n snbtData: SnbtData,\n match: RegExpMatchArray\n ) => number;\n}\n\nfunction testParsers(\n snbtData: SnbtData,\n str: string,\n tokenParsers: TokenParser[],\n pos: number\n) {\n for (const { type, pattern, callback } of tokenParsers) {\n const match = str.match(pattern);\n\n if (match) {\n debugLog(`Matched ${type} at position ${pos}: ${match[0]}`);\n\n return callback(pos, type, snbtData, match);\n }\n }\n\n return false;\n}\n\nconst tokenParsers: TokenParser[] = [\n {\n type: 'WHITESPACE',\n pattern: /^\\s+/,\n callback: (_pos, _type, _snbtData, matches) => {\n // Do not generate a token for whitespace.\n return matches[0].length;\n },\n },\n {\n type: 'COLON',\n pattern: /^:/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ':');\n\n return 1;\n },\n },\n {\n type: 'COMMA',\n pattern: /^,/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ',');\n\n return 1;\n },\n },\n {\n type: 'BYTE_ARRAY_START',\n pattern: /^\\[\\s*[bB]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'INT_ARRAY_START',\n pattern: /^\\[\\s*[iI]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'LONG_ARRAY_START',\n pattern: /^\\[\\s*[lL]\\s*;/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 3;\n },\n },\n {\n type: 'COMPOUND_START',\n pattern: /^\\{/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '{');\n\n return 1;\n },\n },\n {\n type: 'COMPOUND_END',\n pattern: /^\\}/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '}');\n\n return 1;\n },\n },\n {\n type: 'LIST_START',\n pattern: /^\\[/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, '[');\n\n return 1;\n },\n },\n {\n type: 'LIST_END',\n pattern: /^\\]/,\n callback: (pos, type, snbtData) => {\n snbtData.addToken(pos, type, ']');\n\n return 1;\n },\n },\n {\n // Byte - true / false converts to 1 / 0\n type: 'BYTE',\n pattern: anchorPattern('([tT][rR][uU][eE]|[fF][aA][lL][sS][eE])'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(\n pos,\n type,\n matches[1].toLowerCase() === 'true' ? '1' : '0'\n );\n\n return matches[1].length;\n },\n },\n {\n // Byte - number with a suffix\n type: 'BYTE',\n pattern: anchorPattern('[-+]?[0-9]+[bB]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - there's another without the D later\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+[dD]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'FLOAT',\n pattern: anchorPattern('[-+]?[0-9.]+[fF]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'LONG',\n pattern: anchorPattern('[-+]?[0-9]+[lL]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n type: 'SHORT',\n pattern: anchorPattern('[-+]?[0-9]+[sS]'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Double - this must come after other suffixed number types but before\n // Int's matcher\n type: 'DOUBLE',\n pattern: anchorPattern('[-+]?[0-9.]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // Int - this must come after all other number types\n type: 'INT',\n pattern: anchorPattern('[-+]?[0-9]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n {\n // String - single or double quotes\n type: 'STRING',\n pattern: /^([\\\"'])(?:\\\\.|.)*?\\1/,\n callback: (pos, type, snbtData, matches) => {\n const chunk = JSON.parse(`\"${matches[0].slice(1, -1)}\"`);\n snbtData.addToken(pos, type, chunk);\n\n return matches[0].length;\n },\n },\n {\n // String - not quoted and all else failed\n type: 'STRING',\n pattern: anchorPattern('^[-0-9a-zA-Z_.+]+'),\n callback: (pos, type, snbtData, matches) => {\n snbtData.addToken(pos, type, matches[0]);\n\n return matches[0].length;\n },\n },\n];\n\n// Creates a regular expression that will start at the beginning of the string\n// and conclude with an \"end of token\" marker at the end. The lookahead will\n// not capture the end of the token marker.\nfunction anchorPattern(pattern: string) {\n return new RegExp(`^${pattern}\\s*(?=$|,|}|]|:)`);\n}\n\nexport function snbtParse(snbt: string) {\n const snbtData = new SnbtData();\n let pos = 0;\n\n while (pos < snbt.length) {\n const increment = testParsers(\n snbtData,\n snbt.slice(pos),\n tokenParsers,\n pos\n );\n\n if (!increment) {\n throw new Error(`Unexpected token at position ${pos}`);\n }\n\n debugLog(`Increment position by ${increment}`);\n pos += increment;\n }\n\n return snbtData;\n}\n"]}
|
package/dist/nbt/snbt-to-nbt.js
CHANGED
|
@@ -75,6 +75,14 @@ function snbtToNbtCompound(_token, snbtData) {
|
|
|
75
75
|
nbt.name = name;
|
|
76
76
|
data.push(nbt);
|
|
77
77
|
token = snbtData.token();
|
|
78
|
+
if (token && token.type === 'COMMA') {
|
|
79
|
+
try {
|
|
80
|
+
token = snbtData.token();
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new Error(`${err} - Unexpected end of SNBT data while looking for token after comma`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
78
86
|
}
|
|
79
87
|
return new NbtCompound(data);
|
|
80
88
|
}
|
|
@@ -90,7 +98,8 @@ function snbtToNbtInt(token) {
|
|
|
90
98
|
function snbtToNbtIntArray(_token, snbtData) {
|
|
91
99
|
const ints = [];
|
|
92
100
|
let token = snbtData.token();
|
|
93
|
-
|
|
101
|
+
// The fallback double parser can be used for integers too.
|
|
102
|
+
while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {
|
|
94
103
|
ints.push(parseInt(token.content || ''));
|
|
95
104
|
try {
|
|
96
105
|
token = snbtData.token();
|
|
@@ -98,10 +107,11 @@ function snbtToNbtIntArray(_token, snbtData) {
|
|
|
98
107
|
catch (err) {
|
|
99
108
|
throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);
|
|
100
109
|
}
|
|
101
|
-
|
|
102
|
-
|
|
110
|
+
// If we see a comma, we expect another number after it. If not, we
|
|
111
|
+
// expect the end of the array.
|
|
112
|
+
if (token.type === 'COMMA') {
|
|
113
|
+
token = snbtData.token();
|
|
103
114
|
}
|
|
104
|
-
token = snbtData.token();
|
|
105
115
|
}
|
|
106
116
|
return new NbtIntArray(ints);
|
|
107
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"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","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(_token: SnbtToken, snbtData: SnbtData): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing byte array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(`Expecting a string but found ${snbtData.showToken(token)}`);\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for colon`);\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(`Expecting a colon but found ${snbtData.showToken(colon)}`);\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'INT') {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing int array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing list at beginning`);\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while looking for comma or end of list`);\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(`Expecting a comma or list end but found ${snbtData.showToken(token)}`);\n }\n }\n\n if (!list.length) {\n throw new Error('Empty list not allowed in SNBT because the type cannot be inferred');\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(`List contains mixed types: ${firstType} and ${list[i].type}`);\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(_token: SnbtToken, snbtData: SnbtData): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(`${err} - Unexpected end of SNBT data while parsing long array`);\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(`Expecting a comma but found ${snbtData.showToken(token)}`);\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"snbt-to-nbt.js","sourceRoot":"","sources":["../../src/nbt/snbt-to-nbt.ts"],"names":[],"mappings":"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","sourcesContent":["import { NbtBase } from '../nbt/nbt-base';\nimport { NbtByteArray } from '../nbt/nbt-byte-array';\nimport { NbtByte } from '../nbt/nbt-byte';\nimport { NbtCompound } from '../nbt/nbt-compound';\nimport { NbtDouble } from '../nbt/nbt-double';\nimport { NbtFloat } from '../nbt/nbt-float';\nimport { NbtIntArray } from '../nbt/nbt-int-array';\nimport { NbtInt } from '../nbt/nbt-int';\nimport { NbtList } from '../nbt/nbt-list';\nimport { NbtLongArray } from '../nbt/nbt-long-array';\nimport { NbtLong } from '../nbt/nbt-long';\nimport { NbtShort } from '../nbt/nbt-short';\nimport { NbtString } from '../nbt/nbt-string';\nimport { SnbtData, SnbtToken } from './snbt-data';\n\nexport const fromSnbtData: {\n [key: string]: (token: SnbtToken, snbtData: SnbtData) => NbtBase<any>;\n} = {\n BYTE: snbtToNbtByte,\n BYTE_ARRAY_START: snbtToNbtByteArray,\n COMPOUND_START: snbtToNbtCompound,\n DOUBLE: snbtToNbtDouble,\n FLOAT: snbtToNbtFloat,\n INT: snbtToNbtInt,\n INT_ARRAY_START: snbtToNbtIntArray,\n LIST_START: snbtToNbtList,\n LONG: snbtToNbtLong,\n LONG_ARRAY_START: snbtToNbtLongArray,\n SHORT: snbtToNbtShort,\n STRING: snbtToNbtString,\n};\n\nexport function snbtToNbt(snbtData: SnbtData): NbtBase<any> {\n const token = snbtData.token();\n const processor = fromSnbtData[token.type];\n\n if (processor) {\n return processor(token, snbtData);\n }\n\n throw new Error(`Invalid, non-matching token ${snbtData.showToken(token)}`);\n}\n\nfunction snbtToNbtByte(token: SnbtToken): NbtByte {\n return new NbtByte(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtByteArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtByteArray {\n const bytes: number[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'BYTE') {\n bytes.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing byte array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtByteArray(bytes);\n}\n\nfunction snbtToNbtCompound(_token: SnbtToken, snbtData: SnbtData): NbtCompound {\n const data: NbtBase<any>[] = [];\n let token = snbtData.token();\n\n while (token && token.type !== 'COMPOUND_END') {\n if (token.type !== 'STRING') {\n throw new Error(\n `Expecting a string but found ${snbtData.showToken(token)}`\n );\n }\n\n const name = token.content;\n let colon;\n\n try {\n colon = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for colon`\n );\n }\n\n if (colon.type !== 'COLON') {\n throw new Error(\n `Expecting a colon but found ${snbtData.showToken(colon)}`\n );\n }\n\n const nbt = snbtToNbt(snbtData);\n nbt.name = name;\n data.push(nbt);\n token = snbtData.token();\n\n if (token && token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for token after comma`\n );\n }\n }\n }\n\n return new NbtCompound(data);\n}\n\nfunction snbtToNbtDouble(token: SnbtToken): NbtDouble {\n return new NbtDouble(parseFloat(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtFloat(token: SnbtToken): NbtFloat {\n return new NbtFloat(parseFloat(token.content || ''));\n}\n\nfunction snbtToNbtInt(token: SnbtToken): NbtInt {\n return new NbtInt(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtIntArray(_token: SnbtToken, snbtData: SnbtData): NbtIntArray {\n const ints: number[] = [];\n let token = snbtData.token();\n\n // The fallback double parser can be used for integers too.\n while (token && (token.type === 'INT' || token.type === 'DOUBLE')) {\n ints.push(parseInt(token.content || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing int array`\n );\n }\n\n // If we see a comma, we expect another number after it. If not, we\n // expect the end of the array.\n if (token.type === 'COMMA') {\n token = snbtData.token();\n }\n }\n\n return new NbtIntArray(ints);\n}\n\nfunction snbtToNbtList(_token: SnbtToken, snbtData: SnbtData): NbtList<any> {\n const list: NbtBase<any>[] = [];\n let token;\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing list at beginning`\n );\n }\n\n while (token.type !== 'LIST_END') {\n snbtData.step(-1);\n let nbt;\n\n try {\n nbt = snbtToNbt(snbtData);\n } catch (err) {\n throw new Error(`${err} - Error parsing list element`);\n }\n\n list.push(nbt);\n token = snbtData.token();\n\n if (token.type === 'COMMA') {\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while looking for comma or end of list`\n );\n }\n } else if (token.type !== 'LIST_END') {\n throw new Error(\n `Expecting a comma or list end but found ${snbtData.showToken(token)}`\n );\n }\n }\n\n if (!list.length) {\n throw new Error(\n 'Empty list not allowed in SNBT because the type cannot be inferred'\n );\n }\n\n const firstType = list[0].type;\n\n for (let i = 1; i < list.length; i++) {\n if (list[i].type !== firstType) {\n throw new Error(\n `List contains mixed types: ${firstType} and ${list[i].type}`\n );\n }\n }\n\n return new NbtList(list, firstType);\n}\n\nfunction snbtToNbtLong(token: SnbtToken): NbtLong {\n return new NbtLong(BigInt(token.content.slice(0, -1) || ''));\n}\n\nfunction snbtToNbtLongArray(\n _token: SnbtToken,\n snbtData: SnbtData\n): NbtLongArray {\n const longs: bigint[] = [];\n let token = snbtData.token();\n\n while (token && token.type === 'LONG') {\n longs.push(BigInt(token.content.slice(0, -1) || ''));\n\n try {\n token = snbtData.token();\n } catch (err) {\n throw new Error(\n `${err} - Unexpected end of SNBT data while parsing long array`\n );\n }\n\n if (token.type !== 'COMMA') {\n throw new Error(\n `Expecting a comma but found ${snbtData.showToken(token)}`\n );\n }\n\n token = snbtData.token();\n }\n\n return new NbtLongArray(longs);\n}\n\nfunction snbtToNbtShort(token: SnbtToken): NbtShort {\n return new NbtShort(parseInt(token.content || ''));\n}\n\nfunction snbtToNbtString(token: SnbtToken): NbtString {\n return new NbtString(token.content);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mca-json",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Convert Minecraft MCA (Anvil files) and NBT into JSON and back, or modify directly in memory. Works on region files and player data.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"mca-chunks": "dist/bin/mca-chunks.js",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@types/debug": "^4.1.12",
|
|
24
|
-
"@types/node": "^25.
|
|
24
|
+
"@types/node": "^25.3.0",
|
|
25
25
|
"@types/pako": "^2.0.4",
|
|
26
26
|
"typescript": "^5.9.3"
|
|
27
27
|
}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import debug from 'debug';
|
|
4
|
+
import neodoc from 'neodoc';
|
|
5
|
+
import { Anvil } from '../lib/anvil';
|
|
6
|
+
import { Chunk } from '../lib/chunk';
|
|
7
|
+
import { Sign } from '../block/sign';
|
|
8
|
+
import { readFile } from 'node:fs/promises';
|
|
9
|
+
|
|
10
|
+
interface SignInfo {
|
|
11
|
+
chunkX: number;
|
|
12
|
+
chunkZ: number;
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
z: number;
|
|
16
|
+
front: string[];
|
|
17
|
+
back: string[] | null;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface Args {
|
|
21
|
+
'--blank'?: boolean;
|
|
22
|
+
'--generated'?: boolean;
|
|
23
|
+
'--first'?: boolean;
|
|
24
|
+
'--user'?: boolean;
|
|
25
|
+
'--verbose'?: boolean;
|
|
26
|
+
MCA_FILE?: string[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const debugLog = debug('mca-find-signs');
|
|
30
|
+
const args: Args = neodoc.run(
|
|
31
|
+
`Usage: mca-find-signs [OPTIONS] MCA_FILE...
|
|
32
|
+
|
|
33
|
+
Extracts sign coordinates from MCA files. This is designed to find different
|
|
34
|
+
categories of signs.
|
|
35
|
+
|
|
36
|
+
* Blank signs are blank on both sides.
|
|
37
|
+
* Generated signs can be blank or have any non-numeric and non-alphabetic
|
|
38
|
+
characters. This is so igloos with "<----" and "---->" are included.
|
|
39
|
+
* User-created signs must have at least a number or a letter on the front or
|
|
40
|
+
the back. There's no way to tell from the block data that a user placed a
|
|
41
|
+
sign, but this is a good heuristic.
|
|
42
|
+
|
|
43
|
+
The default output is a JSON array that shows the following information:
|
|
44
|
+
|
|
45
|
+
[
|
|
46
|
+
{
|
|
47
|
+
"chunkX": 0,
|
|
48
|
+
"chunkZ": 3,
|
|
49
|
+
"x": 12,
|
|
50
|
+
"y": 34,
|
|
51
|
+
"z": 56,
|
|
52
|
+
"front": ["Line 1", "Line 2", "Line 3", "Line 4"],
|
|
53
|
+
"back": ["Line 1", "Line 2", "Line 3", "Line 4"]
|
|
54
|
+
},
|
|
55
|
+
...
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
Options:
|
|
59
|
+
--blank Only show blank signs. Conflicts with --generated and --user.
|
|
60
|
+
--generated Only show generated signs. Conflicts with --blank and --user.
|
|
61
|
+
--user Only show user-created signs. Conflicts with --blank and --generated.
|
|
62
|
+
--first Stop scanning a chunk after the first sign is found.
|
|
63
|
+
-h, --help Show this message.
|
|
64
|
+
-v, --verbose Show more information during processing.
|
|
65
|
+
`,
|
|
66
|
+
{
|
|
67
|
+
argv: [...process.argv].slice(2),
|
|
68
|
+
laxPlacement: true,
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (!args.MCA_FILE?.length) {
|
|
73
|
+
console.error('No files specified.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (
|
|
78
|
+
(args['--blank'] ? 1 : 0) +
|
|
79
|
+
(args['--generated'] ? 1 : 0) +
|
|
80
|
+
(args['--user'] ? 1 : 0) >
|
|
81
|
+
1
|
|
82
|
+
) {
|
|
83
|
+
console.error(
|
|
84
|
+
'Conflicting options specified. Please choose only one of --blank, --generated, or --user.'
|
|
85
|
+
);
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const signs: SignInfo[] = [];
|
|
90
|
+
|
|
91
|
+
for (const file of args.MCA_FILE) {
|
|
92
|
+
try {
|
|
93
|
+
const moreSigns = await processFile(file);
|
|
94
|
+
signs.push(...moreSigns);
|
|
95
|
+
} catch (e) {
|
|
96
|
+
console.error(`Error processing file ${file}: ${e}`);
|
|
97
|
+
|
|
98
|
+
process.exit(1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
console.log(JSON.stringify(signs, null, 4));
|
|
103
|
+
|
|
104
|
+
async function processFile(filename: string): Promise<SignInfo[]> {
|
|
105
|
+
debugLog(`Reading file: ${filename}`);
|
|
106
|
+
|
|
107
|
+
if (args['--verbose']) {
|
|
108
|
+
console.log(`Reading file: ${filename}`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const contents = await readFile(filename);
|
|
112
|
+
const anvil = Anvil.fromBuffer(contents.buffer);
|
|
113
|
+
const chunks = anvil.getAllChunks();
|
|
114
|
+
const allSignsFound: SignInfo[] = [];
|
|
115
|
+
|
|
116
|
+
for (const chunk of chunks) {
|
|
117
|
+
const chunkKey = chunk.chunkKey() || '';
|
|
118
|
+
const signs = processChunk(chunk);
|
|
119
|
+
|
|
120
|
+
if (signs.length > 0) {
|
|
121
|
+
debugLog(`Found ${signs.length} signs in chunk ${chunkKey}.`);
|
|
122
|
+
|
|
123
|
+
if (args['--verbose']) {
|
|
124
|
+
console.log(
|
|
125
|
+
`Found ${signs.length} signs in chunk ${chunkKey}.`
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
allSignsFound.push(...signs);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return allSignsFound;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function processChunk(chunk: Chunk): SignInfo[] {
|
|
137
|
+
const blockNames = chunk.uniqueBlockNames();
|
|
138
|
+
const foundSigns: SignInfo[] = [];
|
|
139
|
+
|
|
140
|
+
for (const blockName of blockNames) {
|
|
141
|
+
if (blockName.match(/^minecraft:.+_sign$/)) {
|
|
142
|
+
debugLog(`Found sign: ${blockName}`);
|
|
143
|
+
|
|
144
|
+
const listOfBlockCoordinates = chunk.findBlocksByName(blockName);
|
|
145
|
+
|
|
146
|
+
if (listOfBlockCoordinates.length === 0) {
|
|
147
|
+
debugLog(
|
|
148
|
+
`Possible corruption - no blocks found for sign: ${blockName}`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (const coords of listOfBlockCoordinates) {
|
|
153
|
+
debugLog(`Checking block at coordinates: ${coords}`);
|
|
154
|
+
const block = chunk.getBlock(coords);
|
|
155
|
+
|
|
156
|
+
if (!(block instanceof Sign)) {
|
|
157
|
+
throw new Error(
|
|
158
|
+
`Block is supposed to be a sign: ${block.name}`
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const front = block.frontText();
|
|
163
|
+
const back = block.backText();
|
|
164
|
+
const text = [...front, ...(back ?? [])].join('');
|
|
165
|
+
debugLog(`Front: ${JSON.stringify(front)}`);
|
|
166
|
+
debugLog(`Back: ${JSON.stringify(back)}`);
|
|
167
|
+
|
|
168
|
+
if (args['--blank'] && text.length !== 0) {
|
|
169
|
+
debugLog(`Skipping non-blank sign.`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (args['--generated'] && !text.match(/^[^a-z0-9]*$/i)) {
|
|
174
|
+
debugLog(`Skipping user-created sign.`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (args['--user'] && !text.match(/[a-z0-9]/i)) {
|
|
178
|
+
debugLog(`Skipping a possible generated sign.`);
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
debugLog(`Found a matching sign.`);
|
|
183
|
+
|
|
184
|
+
if (args['--verbose']) {
|
|
185
|
+
console.log(
|
|
186
|
+
`Found a matching sign: ${JSON.stringify(front)} and ${JSON.stringify(back)}`
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const chunkCoordinates = chunk.chunkCoordinates();
|
|
191
|
+
|
|
192
|
+
if (!chunkCoordinates) {
|
|
193
|
+
throw new Error('Chunk coordinates not found.');
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
foundSigns.push({
|
|
197
|
+
chunkX: chunkCoordinates[0],
|
|
198
|
+
chunkZ: chunkCoordinates[1],
|
|
199
|
+
x: coords[0],
|
|
200
|
+
y: coords[1],
|
|
201
|
+
z: coords[2],
|
|
202
|
+
front,
|
|
203
|
+
back: back ?? null,
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
if (args['--first']) {
|
|
207
|
+
return foundSigns;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return foundSigns;
|
|
214
|
+
}
|