mcbe-leveldb 1.15.0-jsonly → 1.16.0-jsonly

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/LevelUtils.js CHANGED
@@ -306,7 +306,7 @@ function writeSubchunkPaletteIds(values, paletteSize) {
306
306
  const blockCount = values.length; // usually 16*16*16 = 4096
307
307
  const bitsPerBlockOriginal = Math.max(1, Math.ceil(Math.log2(paletteSize)));
308
308
  const bitsPerBlockDivisors = [1, 2, 4, 8, 16, 32];
309
- const bitsPerBlock = paletteSize === 0 ? 127 : bitsPerBlockDivisors.find((d) => d >= bitsPerBlockOriginal) ?? 32;
309
+ const bitsPerBlock = paletteSize === 0 ? 127 : (bitsPerBlockDivisors.find((d) => d >= bitsPerBlockOriginal) ?? 32);
310
310
  // console.log(bitsPerBlock);
311
311
  const wordsPerBlock = paletteSize === 0 ? 0 : Math.ceil((blockCount * bitsPerBlock) / 32);
312
312
  const words = new Uint32Array(wordsPerBlock);
@@ -613,11 +613,40 @@ export const entryContentTypeToFormatMap = {
613
613
  /**
614
614
  * The version of a chunk.
615
615
  *
616
- * The current chunk version as of `v1.21.111` is `41` (`0x29`).
617
- *
618
616
  * Deleting think key causes the game to completely regenerate the corresponding chunk.
617
+ *
618
+ * Possible values:
619
+ * - `20`: v1.16.100.52
620
+ * - `21`: v1.16.100.57
621
+ * - `22`: v1.16.210
622
+ * - `23`: v1.16.220.50 (+Caves & Cliffs Experimental Toggle)
623
+ * - `24`: v1.16.220.50 (+Caves & Cliffs Experimental Toggle) (internal/developer builds)
624
+ * - `25`: v1.16.230.50 (+Caves & Cliffs Experimental Toggle)
625
+ * - `26`: v1.16.230.50 (+Caves & Cliffs Experimental Toggle) (internal/developer builds)
626
+ * - `27`: v1.17.30.23 (+Caves & Cliffs Experimental Toggle)
627
+ * - `28`: v1.17.30.23 (+Caves & Cliffs Experimental Toggle) (internal/developer builds)
628
+ * - `29`: v1.17.30.25 (+Caves & Cliffs Experimental Toggle)
629
+ * - `30`: v1.17.30.25 (+Caves & Cliffs Experimental Toggle) (internal/developer builds)
630
+ * - `31`: v1.17.40.20 (+Caves & Cliffs Experimental Toggle)
631
+ * - `32`: v1.17.40.20 (+Caves & Cliffs Experimental Toggle) (internal/developer builds)
632
+ * - `33`: v1.18.0.20
633
+ * - `34`: v1.18.0.20 (internal/developer builds)
634
+ * - `35`: v1.18.0.22
635
+ * - `36`: v1.18.0.22 (internal/developer builds)
636
+ * - `37`: v1.18.0.24
637
+ * - `38`: v1.18.0.24 (internal/developer builds)
638
+ * - `39`: v1.18.0.25
639
+ * - `40`: v1.18.30 after upgrading entities to independent storage
640
+ * - `41`: v1.21.40
641
+ * - `42`: v1.21.120
642
+ *
643
+ * @since v1.16.100
619
644
  */
620
645
  Version: {
646
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/R/chunk_version.R
647
+ // https://github.com/robofinch/Prismarine-Anchor/blob/6ce90fa2a27c5d81e6cc1cc376e91c757a80e321/crates/bedrock/bedrock-entries/src/enum_types/chunk_version.rs#L24
648
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/man/ChunkVersion.Rd
649
+ // Value list: https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L98
621
650
  /**
622
651
  * The format type of the data.
623
652
  */
@@ -1323,6 +1352,10 @@ export const entryContentTypeToFormatMap = {
1323
1352
  *
1324
1353
  * @todo Figure out how to parse this.
1325
1354
  * @todo Add a description for this.
1355
+ *
1356
+ * @see https://github.com/yechentide/core-bedrock/blob/77d815439da14b3d0b7d0335b80deb1860aee42a/Analysis/chunk-0x34-legacy-block-extra-data.md
1357
+ * @see https://github.com/robofinch/Prismarine-Anchor/blob/main/crates/bedrock/leveldb-entries/src/entries/legacy_extra_block_data.rs
1358
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L331
1326
1359
  */
1327
1360
  LegacyBlockExtraData: {
1328
1361
  /**
@@ -1331,26 +1364,197 @@ export const entryContentTypeToFormatMap = {
1331
1364
  type: "unknown",
1332
1365
  },
1333
1366
  /**
1334
- * @todo Figure out how to parse this.
1367
+ * @todo Figure out what this is used for.
1335
1368
  * @todo Add a description for this.
1369
+ *
1370
+ * @see {@link NBTSchemas.nbtSchemas.BiomeState}
1371
+ *
1372
+ * @description
1373
+ * https://github.com/robofinch/Prismarine-Anchor/blob/6ce90fa2a27c5d81e6cc1cc376e91c757a80e321/crates/bedrock/leveldb-entries/src/entries/biome_state.rs#L103C1-L109C41
1374
+ *
1375
+ * The above source says the following:
1376
+ *
1377
+ * > These state values seem to have something to do with snow accumulation level.
1378
+ * Maybe the maximum level that snow can accumulate to naturally.
1379
+ *
1380
+ * > TODO: determine this
1381
+ *
1382
+ * > Also, note that these could be backed by HashMaps,
1383
+ *
1384
+ * > but the order of real game data is inconsistent, and have very, very few values.
1385
+ *
1386
+ * > This makes things easier for testing to be able to round-trip,
1387
+ * and is probably more performant, too.
1336
1388
  */
1337
1389
  BiomeState: {
1390
+ // https://github.com/yechentide/core-bedrock/blob/77d815439da14b3d0b7d0335b80deb1860aee42a/Analysis/chunk-0x35-biome-state.md
1391
+ //
1392
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L344C5-L344C15
1338
1393
  /**
1339
1394
  * The format type of the data.
1340
1395
  */
1341
- type: "unknown",
1396
+ type: "custom",
1397
+ /**
1398
+ * The format type that results from the {@link entryContentTypeToFormatMap.BiomeState.parse | parse} method.
1399
+ */
1400
+ resultType: "JSONNBT",
1401
+ // TODO: Figure out what each of the state values mean.
1402
+ /**
1403
+ * The function to parse the data.
1404
+ *
1405
+ * The {@link data} parameter should be the buffer read directly from the file or LevelDB entry.
1406
+ *
1407
+ * @param data The data to parse, as a buffer.
1408
+ * @returns The parsed data.
1409
+ *
1410
+ * @throws {RangeError} If the buffer is empty.
1411
+ * @throws {RangeError} If the number of BiomeState entries does is less than the number indicated in buffer.
1412
+ * @throws {RangeError} If one of the BiomeState entries does not contain enough bytes.
1413
+ * @throws {TypeError} If the BiomeState format is unknown.
1414
+ */
1415
+ // OPTIMIZE: This parse method can be optimized.
1416
+ parse(data) {
1417
+ if (data.length < 1)
1418
+ throw new RangeError("BiomeState Buffer must be at least 1 byte long");
1419
+ let biomeStateFormat;
1420
+ let count;
1421
+ formatDetection: {
1422
+ count = data[0];
1423
+ if (data.length === 1 + count * 2) {
1424
+ biomeStateFormat = 1;
1425
+ break formatDetection;
1426
+ }
1427
+ if (data.length < 2)
1428
+ throw new TypeError("Unknown BiomeState format");
1429
+ count = data[0] | (data[1] << 8);
1430
+ if (data.length === 2 + count * 3) {
1431
+ biomeStateFormat = 2;
1432
+ break formatDetection;
1433
+ }
1434
+ throw new TypeError("Unknown BiomeState format");
1435
+ }
1436
+ switch (biomeStateFormat) {
1437
+ case 1: {
1438
+ const entries = [];
1439
+ for (let i = 0; i < count; i++) {
1440
+ const entryData = data.subarray(1 + i * 2, 3 + i * 2);
1441
+ if (entryData.length !== 2)
1442
+ throw new RangeError("BiomeState entry data must be 2 bytes long");
1443
+ const [biome_id, state] = entryData;
1444
+ entries.push({ biome_id, state });
1445
+ }
1446
+ return {
1447
+ type: "compound",
1448
+ value: {
1449
+ format: {
1450
+ type: "byte",
1451
+ value: biomeStateFormat,
1452
+ },
1453
+ entries: {
1454
+ type: "list",
1455
+ value: {
1456
+ type: "compound",
1457
+ value: entries.map((entry) => ({
1458
+ biome_id: {
1459
+ type: "byte",
1460
+ value: entry.biome_id,
1461
+ },
1462
+ state: { type: "byte", value: entry.state },
1463
+ })),
1464
+ },
1465
+ },
1466
+ },
1467
+ };
1468
+ }
1469
+ case 2: {
1470
+ const entries = [];
1471
+ for (let i = 0; i < count; i++) {
1472
+ const entryData = data.subarray(2 + i * 3, 5 + i * 3);
1473
+ if (entryData.length !== 3)
1474
+ throw new RangeError("BiomeState entry data must be 3 bytes long");
1475
+ const biome_id = entryData.readUInt16LE(0);
1476
+ const state = entryData[2];
1477
+ entries.push({ biome_id, state });
1478
+ }
1479
+ return {
1480
+ type: "compound",
1481
+ value: {
1482
+ format: {
1483
+ type: "byte",
1484
+ value: biomeStateFormat,
1485
+ },
1486
+ entries: {
1487
+ type: "list",
1488
+ value: {
1489
+ type: "compound",
1490
+ value: entries.map((entry) => ({
1491
+ biome_id: { type: "short", value: entry.biome_id },
1492
+ state: { type: "byte", value: entry.state },
1493
+ })),
1494
+ },
1495
+ },
1496
+ },
1497
+ };
1498
+ }
1499
+ }
1500
+ },
1501
+ /**
1502
+ * The function to serialize the data.
1503
+ *
1504
+ * This result of this can be written directly to the file or LevelDB entry.
1505
+ *
1506
+ * @param data The data to serialize.
1507
+ * @returns The serialized data, as a buffer.
1508
+ *
1509
+ * @throws {TypeError} If one of the BiomeState entries are undefined.
1510
+ * @throws {TypeError} If the BiomeState format is unknown.
1511
+ */
1512
+ serialize(data) {
1513
+ const entries = data.value.entries.value.value;
1514
+ const count = entries.length;
1515
+ switch (data.value.format.value) {
1516
+ case 1: {
1517
+ const serializedData = Buffer.alloc(1 + count * 2);
1518
+ serializedData.writeUInt8(count, 0);
1519
+ for (let i = 0; i < count; i++) {
1520
+ const entry = entries[i];
1521
+ if (!entry)
1522
+ throw new TypeError(`BiomeState entry is undefined at index ${i}`);
1523
+ const offset = 1 + i * 2;
1524
+ serializedData[offset] = entry.biome_id.value;
1525
+ serializedData[offset + 1] = entry.state.value;
1526
+ }
1527
+ return serializedData;
1528
+ }
1529
+ case 2: {
1530
+ const serializedData = Buffer.alloc(2 + count * 3);
1531
+ serializedData.writeUInt16LE(count, 0);
1532
+ for (let i = 0; i < count; i++) {
1533
+ const entry = entries[i];
1534
+ if (!entry)
1535
+ throw new TypeError(`BiomeState entry is undefined at index ${i}`);
1536
+ const offset = 2 + i * 3;
1537
+ serializedData[offset] = entry.biome_id.value & 0xff;
1538
+ serializedData[offset + 1] = entry.biome_id.value >>> 8;
1539
+ serializedData[offset + 2] = entry.state.value;
1540
+ }
1541
+ return serializedData;
1542
+ }
1543
+ default:
1544
+ throw new TypeError(`Unknown BiomeState format: ${data.value.format.value}`);
1545
+ }
1546
+ },
1342
1547
  },
1343
1548
  /**
1344
1549
  * A value that indicates the finalization state of a chunk's data.
1345
1550
  *
1346
1551
  * Possible values:
1347
- * - `0`: Unknown
1348
- * - `1`: Unknown
1349
- * - `2`: Unknown
1350
- *
1351
- * @todo Figure out the meanings of the values.
1552
+ * - `0`: NeedsInstaticking - Chunk needs to be ticked
1553
+ * - `1`: NeedsPopulation - Chunk needs to be populated with mobs
1554
+ * - `2`: Done - Chunk generation is fully complete
1352
1555
  */
1353
1556
  FinalizedState: {
1557
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/R/finalized_state.R#L4
1354
1558
  /**
1355
1559
  * The format type of the data.
1356
1560
  */
@@ -1382,6 +1586,9 @@ export const entryContentTypeToFormatMap = {
1382
1586
  *
1383
1587
  * @todo Figure out how to parse this.
1384
1588
  * @todo Add a description for this.
1589
+ *
1590
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L382
1591
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1445
1385
1592
  */
1386
1593
  ConversionData: {
1387
1594
  /**
@@ -1390,27 +1597,180 @@ export const entryContentTypeToFormatMap = {
1390
1597
  type: "unknown",
1391
1598
  },
1392
1599
  /**
1393
- * @todo Figure out how to parse this.
1394
- * @todo Add a description for this.
1600
+ * The border block data for the chunk.
1601
+ *
1602
+ * @todo Add a better description for this.
1395
1603
  */
1396
1604
  BorderBlocks: {
1605
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext?plain=1#L397
1606
+ // https://github.com/robofinch/Prismarine-Anchor/blob/main/crates/bedrock/leveldb-entries/src/entries/border_blocks.rs
1397
1607
  /**
1398
1608
  * The format type of the data.
1399
1609
  */
1400
- type: "unknown",
1610
+ type: "custom",
1611
+ /**
1612
+ * The format type that results from the {@link entryContentTypeToFormatMap.BorderBlocks.parse | parse} method.
1613
+ */
1614
+ resultType: "JSONNBT",
1615
+ /**
1616
+ * The function to parse the data.
1617
+ *
1618
+ * The {@link data} parameter should be the buffer read directly from the file or LevelDB entry.
1619
+ *
1620
+ * @param data The data to parse, as a buffer.
1621
+ * @returns The parsed data.
1622
+ *
1623
+ * @throws {RangeError} If the buffer is empty.
1624
+ * @throws {RangeError} If the length of the buffer is not equal to the expected length based on the first byte.
1625
+ */
1626
+ parse(data) {
1627
+ if (data.length < 1)
1628
+ throw new RangeError("BorderBlocks buffer must be at least 1 byte long");
1629
+ const count = data[0];
1630
+ if (data.length !== 1 + count)
1631
+ throw new RangeError(`BorderBlocks length mismatch, expected ${1 + count}, got ${data.length}`);
1632
+ const blocks = new Array(count);
1633
+ for (let i = 0; i < count; i++) {
1634
+ const encoded = data[1 + i];
1635
+ const x = encoded >>> 4;
1636
+ const z = encoded & 0x0f;
1637
+ blocks[i] = {
1638
+ x: { type: "byte", value: x },
1639
+ z: { type: "byte", value: z },
1640
+ };
1641
+ }
1642
+ return {
1643
+ type: "compound",
1644
+ value: {
1645
+ BorderBlocks: {
1646
+ type: "list",
1647
+ value: {
1648
+ type: "compound",
1649
+ value: blocks,
1650
+ },
1651
+ },
1652
+ },
1653
+ };
1654
+ },
1655
+ /**
1656
+ * The function to serialize the data.
1657
+ *
1658
+ * This result of this can be written directly to the file or LevelDB entry.
1659
+ *
1660
+ * @param data The data to serialize.
1661
+ * @returns The serialized data, as a buffer.
1662
+ *
1663
+ * @throws {TypeError} If one of the BorderBlocks entries are undefined.
1664
+ */
1665
+ serialize(data) {
1666
+ const blocks = data.value.BorderBlocks.value.value;
1667
+ const count = blocks.length;
1668
+ const serializedData = Buffer.alloc(1 + count);
1669
+ serializedData[0] = count;
1670
+ for (let i = 0; i < count; i++) {
1671
+ const entry = blocks[i];
1672
+ if (!entry)
1673
+ throw new TypeError(`BorderBlocks entry is undefined at index ${i}`);
1674
+ const x = entry.x.value;
1675
+ const z = entry.z.value;
1676
+ serializedData[1 + i] = (x << 4) | (z & 0x0f);
1677
+ }
1678
+ return serializedData;
1679
+ },
1401
1680
  },
1402
1681
  /**
1403
1682
  * Bounding boxes for structure spawns, such as a Nether Fortress or Pillager Outpost.
1404
1683
  *
1405
- * @deprecated Replaced with {@link AABBVolumes} in either 1.21.120 or one of the 1.21.120 previews.
1406
- *
1407
- * @todo Figure out how to parse this.
1684
+ * @deprecated Replaced with {@link entryContentTypeToFormatMap.AABBVolumes | AABBVolumes} in either 1.21.10 or one of the 1.21.10 previews.
1408
1685
  */
1409
1686
  HardcodedSpawners: {
1687
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/man/HardcodedSpawnArea.Rd#L4
1688
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/R/legacy-hsa.R#L44
1689
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L405C5-L405C22
1690
+ //
1691
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1481
1692
+ // One of the sources seem to indicate this was removed in 1.21.10.
1410
1693
  /**
1411
1694
  * The format type of the data.
1412
1695
  */
1413
- type: "unknown",
1696
+ type: "custom",
1697
+ /**
1698
+ * The format type that results from the {@link entryContentTypeToFormatMap.HardcodedSpawners.parse | parse} method.
1699
+ */
1700
+ resultType: "JSONNBT",
1701
+ /**
1702
+ * The function to parse the data.
1703
+ *
1704
+ * The {@link data} parameter should be the buffer read directly from the file or LevelDB entry.
1705
+ *
1706
+ * @param data The data to parse, as a buffer.
1707
+ * @returns The parsed data.
1708
+ *
1709
+ * @throws {RangeError} If the buffer is less than 4 bytes.
1710
+ * @throws {RangeError} If the length of the buffer is not equal to the expected length based on the first four bytes.
1711
+ */
1712
+ parse(data) {
1713
+ if (data.length < 4)
1714
+ throw new RangeError("HardcodedSpawners buffer must be at least 4 bytes long");
1715
+ const count = data.readUInt32LE(0);
1716
+ if (data.length !== 4 + count * 25)
1717
+ throw new RangeError(`HardcodedSpawners length mismatch, expected ${4 + count * 25}, got ${data.length}`);
1718
+ const entries = new Array(count);
1719
+ let offset = 4;
1720
+ for (let i = 0; i < count; i++, offset += 25) {
1721
+ entries[i] = {
1722
+ AABBMinX: { type: "int", value: data.readInt32LE(offset) },
1723
+ AABBMinY: { type: "int", value: data.readInt32LE(offset + 4) },
1724
+ AABBMinZ: { type: "int", value: data.readInt32LE(offset + 8) },
1725
+ AABBMaxX: { type: "int", value: data.readInt32LE(offset + 12) },
1726
+ AABBMaxY: { type: "int", value: data.readInt32LE(offset + 16) },
1727
+ AABBMaxZ: { type: "int", value: data.readInt32LE(offset + 20) },
1728
+ Type: { type: "byte", value: data[offset + 24] },
1729
+ };
1730
+ }
1731
+ return {
1732
+ type: "compound",
1733
+ value: {
1734
+ HardcodedSpawningAreas: {
1735
+ type: "list",
1736
+ value: {
1737
+ type: "compound",
1738
+ value: entries,
1739
+ },
1740
+ },
1741
+ },
1742
+ };
1743
+ },
1744
+ /**
1745
+ * The function to serialize the data.
1746
+ *
1747
+ * This result of this can be written directly to the file or LevelDB entry.
1748
+ *
1749
+ * @param data The data to serialize.
1750
+ * @returns The serialized data, as a buffer.
1751
+ *
1752
+ * @throws {TypeError} If one of the HardcodedSpawners entries are undefined.
1753
+ */
1754
+ serialize(data) {
1755
+ const count = data.value.HardcodedSpawningAreas.value.value.length;
1756
+ const serializedData = Buffer.alloc(4 + count * 25);
1757
+ serializedData.writeUInt32LE(count, 0);
1758
+ const entries = data.value.HardcodedSpawningAreas.value.value;
1759
+ let offset = 4;
1760
+ for (let i = 0; i < count; i++, offset += 25) {
1761
+ const entry = entries[i];
1762
+ if (!entry)
1763
+ throw new TypeError(`HardcodedSpawners entry is undefined at index ${i}`);
1764
+ serializedData.writeInt32LE(entry.AABBMinX.value, offset);
1765
+ serializedData.writeInt32LE(entry.AABBMinY.value, offset + 4);
1766
+ serializedData.writeInt32LE(entry.AABBMinZ.value, offset + 8);
1767
+ serializedData.writeInt32LE(entry.AABBMaxX.value, offset + 12);
1768
+ serializedData.writeInt32LE(entry.AABBMaxY.value, offset + 16);
1769
+ serializedData.writeInt32LE(entry.AABBMaxZ.value, offset + 20);
1770
+ serializedData[offset + 24] = entry.Type.value;
1771
+ }
1772
+ return serializedData;
1773
+ },
1414
1774
  },
1415
1775
  /**
1416
1776
  * @see {@link NBTSchemas.nbtSchemas.RandomTicks}
@@ -1524,20 +1884,53 @@ export const entryContentTypeToFormatMap = {
1524
1884
  type: "unknown",
1525
1885
  },
1526
1886
  /**
1527
- * @deprecated Unused.
1887
+ * UNDOCUMENTED.
1528
1888
  *
1529
- * @todo Figure out how to parse this.
1889
+ * Possible values:
1890
+ * - `0`: False
1891
+ * - `1`: True
1892
+ *
1893
+ * @todo Try to get a world with this to see how it works.
1530
1894
  * @todo Add a description for this.
1895
+ *
1896
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext?plain=1#L481
1897
+ *
1898
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1470
1899
+ * One of the sources seem to indicate this was added in 1.17.30.25. (Verify this, then add the \@since tag.)
1531
1900
  */
1532
1901
  GeneratedPreCavesAndCliffsBlending: {
1533
1902
  /**
1534
1903
  * The format type of the data.
1535
1904
  */
1536
- type: "unknown",
1905
+ type: "int",
1906
+ /**
1907
+ * How many bytes this integer is.
1908
+ */
1909
+ bytes: 1,
1910
+ /**
1911
+ * The endianness of the data.
1912
+ */
1913
+ format: "LE",
1914
+ /**
1915
+ * The signedness of the data.
1916
+ */
1917
+ signed: false,
1918
+ /**
1919
+ * The default value to use when initializing a new entry.
1920
+ *
1921
+ * Bytes:
1922
+ * ```json
1923
+ * [0]
1924
+ * ```
1925
+ */
1926
+ defaultValue: Buffer.from([0]),
1537
1927
  },
1538
1928
  /**
1539
1929
  * @todo Figure out how to parse this.
1540
1930
  * @todo Add a description for this.
1931
+ *
1932
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1471
1933
+ * One of the sources seem to indicate this was added in 1.17.30.25.
1541
1934
  */
1542
1935
  BlendingBiomeHeight: {
1543
1936
  /**
@@ -1550,17 +1943,40 @@ export const entryContentTypeToFormatMap = {
1550
1943
  * for the NBT metadata of this chunk. Seems like it might default to something dependent
1551
1944
  * on the current game or chunk version.
1552
1945
  *
1553
- * @todo Figure out how to parse this.
1946
+ * This is an unsigned 64-bit hex value (16 digits, 8 bytes).
1554
1947
  */
1555
1948
  MetaDataHash: {
1556
1949
  /**
1557
1950
  * The format type of the data.
1558
1951
  */
1559
- type: "unknown",
1952
+ type: "hex",
1953
+ /**
1954
+ * The default value to use when initializing a new entry.
1955
+ *
1956
+ * Bytes:
1957
+ * ```json
1958
+ * [0, 0, 0, 0, 0, 0, 0, 0]
1959
+ * ```
1960
+ */
1961
+ defaultValue: Buffer.from([0, 0, 0, 0, 0, 0, 0, 0]),
1962
+ /**
1963
+ * The minimum length of the data in bytes (if the hex data is a string of hexadecimal characters, two characters is one byte).
1964
+ */
1965
+ minLength: 8,
1966
+ /**
1967
+ * The maximum length of the data in bytes (if the hex data is a string of hexadecimal characters, two characters is one byte).
1968
+ */
1969
+ maxLength: 8,
1560
1970
  },
1561
1971
  /**
1562
1972
  * @todo Figure out how to parse this.
1563
1973
  * @todo Add a description for this.
1974
+ *
1975
+ * @see https://github.com/robofinch/Prismarine-Anchor/blob/main/crates/bedrock/leveldb-entries/src/entries/blending_data.rs#L10
1976
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L526
1977
+ *
1978
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1475
1979
+ * One of the sources seem to indicate this was added in 1.17.30.
1564
1980
  */
1565
1981
  BlendingData: {
1566
1982
  /**
@@ -1569,23 +1985,72 @@ export const entryContentTypeToFormatMap = {
1569
1985
  type: "unknown",
1570
1986
  },
1571
1987
  /**
1572
- * @todo Figure out how to parse this.
1573
- * @todo Add a description for this.
1988
+ * The version of the actor digest data.
1574
1989
  *
1575
- * Seems to always be one byte with a value of `0x00`.
1990
+ * Current known versions:
1991
+ * - `0`: 1.18.30 Format
1576
1992
  */
1577
1993
  ActorDigestVersion: {
1994
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L526
1578
1995
  /**
1579
1996
  * The format type of the data.
1580
1997
  */
1581
- type: "unknown",
1998
+ type: "int",
1999
+ /**
2000
+ * How many bytes this integer is.
2001
+ */
2002
+ bytes: 1,
2003
+ /**
2004
+ * The endianness of the data.
2005
+ */
2006
+ format: "LE",
2007
+ /**
2008
+ * The signedness of the data.
2009
+ */
2010
+ signed: false,
2011
+ /**
2012
+ * The default value to use when initializing a new entry.
2013
+ *
2014
+ * Bytes:
2015
+ * ```json
2016
+ * [0]
2017
+ * ```
2018
+ */
2019
+ defaultValue: Buffer.from([0]),
1582
2020
  },
1583
2021
  /**
1584
- * @deprecated Only used in versions < 1.16.100. Later versions use {@link entryContentTypeToFormatMap.Version}
2022
+ * The version of a chunk for versions < 1.16.100.
1585
2023
  *
1586
- * @todo Add a description for this.
2024
+ * Possible values:
2025
+ * - `0`: v0.9.0
2026
+ * - `1`: v0.9.2
2027
+ * - `2`: v0.9.5
2028
+ * - `3`: v0.17.0.1
2029
+ * - `4`: v1.1.0
2030
+ * - `5`: Converted from console to v1.1.0
2031
+ * - `6`: v1.2.0.2
2032
+ * - `7`: v1.2.0
2033
+ * - `8`: v1.2.13
2034
+ * - `9`: v1.8.0
2035
+ * - `10`: v1.9.0
2036
+ * - `11`: v1.11.0.1
2037
+ * - `12`: v1.11.0.3
2038
+ * - `13`: v1.11.0.4
2039
+ * - `14`: v1.11.1
2040
+ * - `15`: v1.12.0.4
2041
+ * - `16`: v1.14.0
2042
+ * - `17`: v1.15.0
2043
+ * - `18`: v1.16.0.51
2044
+ * - `19`: v1.16.0
2045
+ *
2046
+ * @deprecated Only used in versions < 1.16.100. Later versions use {@link entryContentTypeToFormatMap.Version | Version}
1587
2047
  */
1588
2048
  LegacyVersion: {
2049
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/R/legacy-chunk_version.R
2050
+ // https://github.com/robofinch/Prismarine-Anchor/blob/6ce90fa2a27c5d81e6cc1cc376e91c757a80e321/crates/bedrock/bedrock-entries/src/enum_types/chunk_version.rs
2051
+ // https://github.com/reedacartwright/rbedrock/blob/c9040e803c4172a19507bc8f1278802ad0e6170a/man/LegacyChunkVersion.Rd
2052
+ // Value list: https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L98
2053
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L602
1589
2054
  /**
1590
2055
  * The format type of the data.
1591
2056
  */
@@ -1846,6 +2311,8 @@ export const entryContentTypeToFormatMap = {
1846
2311
  * @deprecated Only used in versions < 1.5.0.
1847
2312
  *
1848
2313
  * @todo Add a description for this.
2314
+ *
2315
+ * @see https://github.com/robofinch/Prismarine-Anchor/blob/main/crates/bedrock/leveldb-entries/src/entries/flat_world_layers.rs
1849
2316
  */
1850
2317
  FlatWorldLayers: {
1851
2318
  /**
@@ -1857,6 +2324,8 @@ export const entryContentTypeToFormatMap = {
1857
2324
  * @deprecated It is unknown when this was removed, it was found in a Windows 10 Edition Beta v0.15.0 world.
1858
2325
  *
1859
2326
  * @todo Add a description for this.
2327
+ *
2328
+ * @see https://github.com/robofinch/Prismarine-Anchor/blob/main/crates/bedrock/leveldb-entries/src/entries/level_spawn_was_fixed.rs
1860
2329
  */
1861
2330
  LevelSpawnWasFixed: {
1862
2331
  /**
@@ -1876,7 +2345,7 @@ export const entryContentTypeToFormatMap = {
1876
2345
  /**
1877
2346
  * Stores the location of a lodestone compass.
1878
2347
  *
1879
- * @todo Add a schema for this.
2348
+ * @see {@link NBTSchemas.nbtSchemas.PositionTrackingDB}
1880
2349
  */
1881
2350
  PositionTrackingDB: {
1882
2351
  /**
@@ -1887,7 +2356,7 @@ export const entryContentTypeToFormatMap = {
1887
2356
  /**
1888
2357
  * The last ID used for a lodestone compass.
1889
2358
  *
1890
- * @todo Add a schema for this.
2359
+ * @see {@link NBTSchemas.nbtSchemas.PositionTrackingLastId}
1891
2360
  */
1892
2361
  PositionTrackingLastId: {
1893
2362
  /**
@@ -2124,7 +2593,6 @@ export const entryContentTypeToFormatMap = {
2124
2593
  *
2125
2594
  * @since 1.26.10 (maybe 1.26.0)
2126
2595
  *
2127
- * @todo Update the linked NBT schema once it is known the structure of the items of the `clocks` list.
2128
2596
  * @todo Figure out that this is used for.
2129
2597
  * @todo Figure out what preview and full release this was actually added in.
2130
2598
  */
@@ -2172,13 +2640,193 @@ export const entryContentTypeToFormatMap = {
2172
2640
  * and volumes where mobs cannot spawn through the normal biome-based means (such as
2173
2641
  * Trial Chambers).
2174
2642
  *
2175
- * @todo Figure out how to parse this.
2643
+ * @see {@link NBTSchemas.nbtSchemas.AABBVolumes}
2644
+ *
2645
+ * @since 1.21.20 (or some 1.21.20 preview)
2176
2646
  */
2177
2647
  AABBVolumes: {
2178
2648
  /**
2179
2649
  * The format type of the data.
2180
2650
  */
2181
- type: "unknown",
2651
+ type: "custom",
2652
+ /**
2653
+ * The format type that results from the {@link entryContentTypeToFormatMap.AABBVolumes.parse | parse} method.
2654
+ */
2655
+ resultType: "JSONNBT",
2656
+ /**
2657
+ * The function to parse the data.
2658
+ *
2659
+ * The {@link data} parameter should be the buffer read directly from the file or LevelDB entry.
2660
+ *
2661
+ * @param data The data to parse, as a buffer.
2662
+ * @returns The parsed data.
2663
+ *
2664
+ * @throws {RangeError} If the buffer is less than 4 bytes.
2665
+ * @throws {unknown} If an error occurs while parsing the data.
2666
+ */
2667
+ parse(data) {
2668
+ if (data.length < 4)
2669
+ throw new RangeError("AABBVolumes buffer must be at least 4 bytes long");
2670
+ const version = data.readUInt32LE(0);
2671
+ if (version !== 1)
2672
+ throw new Error(`Unsupported AABBVolumes version: ${version}`);
2673
+ let offset = 4;
2674
+ const structureTypeCount = data.readUInt32LE(offset);
2675
+ const structureTypes = new Array(structureTypeCount);
2676
+ offset += 4;
2677
+ for (let i = 0; i < structureTypeCount; i++) {
2678
+ const structureTypeLength = data.readUInt16LE(offset + 4);
2679
+ const structureType = data.toString("utf-8", offset + 6, offset + 6 + structureTypeLength);
2680
+ structureTypes[i] = {
2681
+ Id: { type: "int", value: data.readUInt32LE(offset) },
2682
+ Type: { type: "string", value: structureType },
2683
+ };
2684
+ offset += 6 + structureTypeLength;
2685
+ }
2686
+ const chunkBoundingBoxCount = data.readUInt32LE(offset);
2687
+ const chunkBoundingBoxes = new Array(chunkBoundingBoxCount);
2688
+ offset += 4;
2689
+ for (let i = 0; i < chunkBoundingBoxCount; i++, offset += 28) {
2690
+ chunkBoundingBoxes[i] = {
2691
+ Id: { type: "int", value: data.readInt32LE(offset) },
2692
+ AABBMinX: { type: "int", value: data.readInt32LE(offset + 4) },
2693
+ AABBMinY: { type: "int", value: data.readInt32LE(offset + 8) },
2694
+ AABBMinZ: { type: "int", value: data.readInt32LE(offset + 12) },
2695
+ AABBMaxX: { type: "int", value: data.readInt32LE(offset + 16) },
2696
+ AABBMaxY: { type: "int", value: data.readInt32LE(offset + 20) },
2697
+ AABBMaxZ: { type: "int", value: data.readInt32LE(offset + 24) },
2698
+ };
2699
+ }
2700
+ const dynamicSpawnAreaCount = data.readUInt32LE(offset);
2701
+ const dynamicSpawnAreas = new Array(dynamicSpawnAreaCount);
2702
+ offset += 4;
2703
+ for (let i = 0; i < dynamicSpawnAreaCount; i++, offset += 12) {
2704
+ dynamicSpawnAreas[i] = {
2705
+ BoundingBoxId: { type: "int", value: data.readUInt32LE(offset) },
2706
+ StructureId: { type: "int", value: data.readUInt32LE(offset + 4) },
2707
+ FullBoundingBox: { type: "int", value: data.readUInt32LE(offset + 8) },
2708
+ };
2709
+ }
2710
+ const staticSpawnAreaCount = data.readUInt32LE(offset);
2711
+ const staticSpawnAreas = new Array(staticSpawnAreaCount);
2712
+ offset += 4;
2713
+ for (let i = 0; i < staticSpawnAreaCount; i++, offset += 16) {
2714
+ staticSpawnAreas[i] = {
2715
+ BoundingBoxId: { type: "int", value: data.readUInt32LE(offset) },
2716
+ StructureId: { type: "int", value: data.readUInt32LE(offset + 4) },
2717
+ HeightDifference: { type: "int", value: data.readInt32LE(offset + 8) },
2718
+ FullBoundingBox: { type: "int", value: data.readUInt32LE(offset + 12) },
2719
+ };
2720
+ }
2721
+ return {
2722
+ type: "compound",
2723
+ value: {
2724
+ version: { type: "int", value: version },
2725
+ StructureTypes: { type: "list", value: { type: "compound", value: structureTypes } },
2726
+ ChunkBoundingBoxes: {
2727
+ type: "list",
2728
+ value: {
2729
+ type: "compound",
2730
+ value: chunkBoundingBoxes,
2731
+ },
2732
+ },
2733
+ DynamicSpawnAreas: {
2734
+ type: "list",
2735
+ value: {
2736
+ type: "compound",
2737
+ value: dynamicSpawnAreas,
2738
+ },
2739
+ },
2740
+ StaticSpawnAreas: {
2741
+ type: "list",
2742
+ value: {
2743
+ type: "compound",
2744
+ value: staticSpawnAreas,
2745
+ },
2746
+ },
2747
+ },
2748
+ };
2749
+ },
2750
+ /**
2751
+ * The function to serialize the data.
2752
+ *
2753
+ * This result of this can be written directly to the file or LevelDB entry.
2754
+ *
2755
+ * @param data The data to serialize.
2756
+ * @returns The serialized data, as a buffer.
2757
+ *
2758
+ * @throws {TypeError} If one of the StructureTypes entries are undefined.
2759
+ * @throws {TypeError} If one of the ChunkBoundingBoxes entries are undefined.
2760
+ * @throws {TypeError} If one of the DynamicSpawnAreas entries are undefined.
2761
+ * @throws {TypeError} If one of the StaticSpawnAreas entries are undefined.
2762
+ * @throws {unknown} If an error occurs while serializing the data.
2763
+ */
2764
+ serialize(data) {
2765
+ const structureTypeCount = data.value.StructureTypes.value.value.length;
2766
+ const chunkBoundingBoxCount = data.value.ChunkBoundingBoxes.value.value.length;
2767
+ const dynamicSpawnAreaCount = data.value.DynamicSpawnAreas.value.value.length;
2768
+ const staticSpawnAreaCount = data.value.StaticSpawnAreas.value.value.length;
2769
+ const serializedData = Buffer.alloc(20 +
2770
+ structureTypeCount * 6 +
2771
+ data.value.StructureTypes.value.value.reduce((a, b) => a + b.Type.value.length, 0) +
2772
+ chunkBoundingBoxCount * 28 +
2773
+ dynamicSpawnAreaCount * 12 +
2774
+ staticSpawnAreaCount * 16);
2775
+ serializedData.writeUInt32LE(data.value.version.value, 0);
2776
+ const structureTypes = data.value.StructureTypes.value.value;
2777
+ let offset = 4;
2778
+ serializedData.writeUInt32LE(structureTypeCount, offset);
2779
+ offset += 4;
2780
+ for (let i = 0; i < structureTypeCount; i++) {
2781
+ const entry = structureTypes[i];
2782
+ if (entry === undefined)
2783
+ throw new TypeError(`StructureTypes entry is undefined at index ${i}`);
2784
+ const value = entry.Type.value;
2785
+ serializedData.writeUInt32LE(entry.Id.value, offset);
2786
+ const stringByteLength = serializedData.write(value, offset + 6, "utf-8");
2787
+ serializedData.writeUInt16LE(stringByteLength, offset + 4);
2788
+ offset += 6 + stringByteLength;
2789
+ }
2790
+ const chunkBoundingBoxes = data.value.ChunkBoundingBoxes.value.value;
2791
+ serializedData.writeUInt32LE(chunkBoundingBoxCount, offset);
2792
+ offset += 4;
2793
+ for (let i = 0; i < chunkBoundingBoxCount; i++, offset += 28) {
2794
+ const entry = chunkBoundingBoxes[i];
2795
+ if (!entry)
2796
+ throw new TypeError(`ChunkBoundingBoxes entry is undefined at index ${i}`);
2797
+ serializedData.writeUInt32LE(entry.Id.value, offset);
2798
+ serializedData.writeInt32LE(entry.AABBMinX.value, offset + 4);
2799
+ serializedData.writeInt32LE(entry.AABBMinY.value, offset + 8);
2800
+ serializedData.writeInt32LE(entry.AABBMinZ.value, offset + 12);
2801
+ serializedData.writeInt32LE(entry.AABBMaxX.value, offset + 16);
2802
+ serializedData.writeInt32LE(entry.AABBMaxY.value, offset + 20);
2803
+ serializedData.writeInt32LE(entry.AABBMaxZ.value, offset + 24);
2804
+ }
2805
+ const dynamicSpawnAreas = data.value.DynamicSpawnAreas.value.value;
2806
+ serializedData.writeUInt32LE(dynamicSpawnAreaCount, offset);
2807
+ offset += 4;
2808
+ for (let i = 0; i < dynamicSpawnAreaCount; i++, offset += 12) {
2809
+ const entry = dynamicSpawnAreas[i];
2810
+ if (!entry)
2811
+ throw new TypeError(`DynamicSpawnAreas entry is undefined at index ${i}`);
2812
+ serializedData.writeUInt32LE(entry.BoundingBoxId.value, offset);
2813
+ serializedData.writeUInt32LE(entry.StructureId.value, offset + 4);
2814
+ serializedData.writeUInt32LE(entry.FullBoundingBox.value, offset + 8);
2815
+ }
2816
+ const staticSpawnAreas = data.value.StaticSpawnAreas.value.value;
2817
+ serializedData.writeUInt32LE(staticSpawnAreaCount, offset);
2818
+ offset += 4;
2819
+ for (let i = 0; i < staticSpawnAreaCount; i++, offset += 16) {
2820
+ const entry = staticSpawnAreas[i];
2821
+ if (!entry)
2822
+ throw new TypeError(`StaticSpawnAreas entry is undefined at index ${i}`);
2823
+ serializedData.writeUInt32LE(entry.BoundingBoxId.value, offset);
2824
+ serializedData.writeUInt32LE(entry.StructureId.value, offset + 4);
2825
+ serializedData.writeInt32LE(entry.HeightDifference.value, offset + 8);
2826
+ serializedData.writeUInt32LE(entry.FullBoundingBox.value, offset + 12);
2827
+ }
2828
+ return serializedData;
2829
+ },
2182
2830
  },
2183
2831
  /**
2184
2832
  * The content type of the `DynamicProperties` LevelDB key, which stores dynamic properties data for add-ons.
@@ -2212,8 +2860,11 @@ export const entryContentTypeToFormatMap = {
2212
2860
  * ```
2213
2861
  * {BYTEx4}{BYTEx8}{NBTCompound}{BYTEx8}{NBTCompound}{BYTEx8}{NBTCompound}{BYTEx8}{NBTCompound}
2214
2862
  * ```
2863
+ *
2864
+ * @see {@link NBTSchemas.nbtSchemas.LevelChunkMetaDataDictionary}
2215
2865
  */
2216
2866
  LevelChunkMetaDataDictionary: {
2867
+ // https://github.com/MiemieMethod/bedrock-docs/blob/8cd37dacbd064f5fb2a4953548739a258b31dd21/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L501
2217
2868
  /**
2218
2869
  * The format type of the data.
2219
2870
  */
@@ -2281,8 +2932,11 @@ export const entryContentTypeToFormatMap = {
2281
2932
  defaultValue: Buffer.from("true", "utf-8"),
2282
2933
  },
2283
2934
  /**
2284
- * @todo Add a schema for this.
2285
2935
  * @todo Add a description for this.
2936
+ *
2937
+ * @see {@link NBTSchemas.nbtSchemas.ChunkLoadedRequest}
2938
+ *
2939
+ * @see https://github.com/MiemieMethod/bedrock-docs/blob/main/.knowledge/wiki%E6%91%98%E5%BD%95/%E4%B8%AD%E6%96%87Minecraft%20Wiki/%E5%9F%BA%E5%B2%A9%E7%89%88LevelDB%E6%A0%BC%E5%BC%8F.wikitext#L1175
2286
2940
  */
2287
2941
  ChunkLoadedRequest: {
2288
2942
  /**