# prismarine-chunk [![NPM version](https://img.shields.io/npm/v/prismarine-chunk.svg)](http://npmjs.com/package/prismarine-chunk) [![Build Status](https://github.com/PrismarineJS/prismarine-chunk/workflows/CI/badge.svg)](https://github.com/PrismarineJS/prismarine-chunk/actions?query=workflow%3A%22CI%22) [![Discord](https://img.shields.io/badge/chat-on%20discord-brightgreen.svg)](https://discord.gg/GsEFRM8) [![Gitter](https://img.shields.io/badge/chat-on%20gitter-brightgreen.svg)](https://gitter.im/PrismarineJS/general) [![Irc](https://img.shields.io/badge/chat-on%20irc-brightgreen.svg)](https://irc.gitter.im/) [![Try it on gitpod](https://img.shields.io/badge/try-on%20gitpod-brightgreen.svg)](https://gitpod.io/#https://github.com/PrismarineJS/prismarine-chunk) A class to hold chunk data for Minecraft: PC 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15 and 1.16 and Bedrock Edition 0.14 and 1.0, 1.16, 1.17, 1.18, 1.19 and 1.20 ## Usage ```js const registry = require('prismarine-registry')('1.8') const ChunkColumn = require('prismarine-chunk')(registry) const { Vec3 } = require("vec3") const chunk = new ChunkColumn() for (let x = 0; x < 16;x++) { for (let z = 0; z < 16; z++) { chunk.setBlockType(new Vec3(x, 50, z), 2) for (let y = 0; y < 256; y++) { chunk.setSkyLight(new Vec3(x, y, z), 15) } } } console.log(JSON.stringify(chunk.getBlock(new Vec3(3,50,3)),null,2)) ``` ## Test data ### pc Test data can be generated with [minecraftChunkDumper](https://github.com/PrismarineJS/minecraft-chunk-dumper). Install it globally with `npm install minecraft-chunk-dumper -g` then run : `minecraftChunkDumper saveChunks 1.20 "1_20" 10` ### bedrock Run tests in [bedrock-provider](https://github.com/PrismarineJS/bedrock-provider/) (which loads chunks through a client as part of its tests) and copy the generated data from `fixtures/$version/pchunk` into `tests/bedrock_$version`. For the version, copy one chunk column of `level_chunk` without caching, `level_chunk` with caching, `level_chunk CacheMissResponse`, `subchunk` without caching, `subchunk cached` and `subchunk CacheMissResponse` into the test/version folder. Note: bedrock-provider tests network decoding and loading chunks from a save database. The tests in prismarine-chunk test other parts of the chunk API, such as setting and getting block light, type, biome, entity and block entity data. # API ## Chunk #### Chunk(initData: { minY?: number, worldHeight?: number }) Build a new chunk. initData is only for 1.18+, and if not given or null the world will default to an old-style 0-256 world. #### Chunk.initialize(iniFunc) Initialize a chunk. * `iniFunc` is a function(x,y,z) returning a prismarine-block. That function is faster than iterating and calling the setBlock* manually. It is useful to generate a whole chunk and load a whole chunk. #### Chunk.version returns the version the chunk loader was called with #### Chunk.section returns ChunkSection class for version #### Chunk.getBlock(pos) Get the [Block](https://github.com/PrismarineJS/prismarine-block) at [pos](https://github.com/andrewrk/node-vec3) `.entity` will have entity NBT data for this block, if it exists #### Chunk.setBlock(pos,block) Set the [Block](https://github.com/PrismarineJS/prismarine-block) at [pos](https://github.com/andrewrk/node-vec3) Set `.entity` property with NBT data for this block to load block entity data for the block #### Chunk.getBlockType(pos) Get the block type at `pos` #### Chunk.getBlockStateId(pos) Get the block state id at `pos` #### Chunk.getBlockData(pos) Get the block data (metadata) at `pos` #### Chunk.getBlockLight(pos) Get the block light at `pos` #### Chunk.getSkyLight(pos) Get the block sky light at `pos` #### Chunk.getBiome(pos) Get the block biome id at `pos` #### Chunk.getBiomeColor(pos) Get the block biome color at `pos`. Does nothing for PC. #### Chunk.setBlockStateId(pos, stateId) Set the block type `stateId` at `pos` #### Chunk.setBlockType(pos, id) Set the block type `id` at `pos` #### Chunk.setBlockData(pos, data) Set the block `data` (metadata) at `pos` #### Chunk.setBlockLight(pos, light) Set the block `light` at `pos` #### Chunk.setSkyLight(pos, light) Set the block sky `light` at `pos` #### Chunk.setBiome(pos, biome) Set the block `biome` id at `pos` #### Chunk.setBiomeColor(pos, biomeColor) Set the block `biomeColor` at `pos`. Does nothing for PC. #### Chunk.getBlockEntity(pos) Returns the block entity data at position if it exists #### Chunk.setBlockEntity(pos, nbt) Sets block entity data at position #### Chunk.loadBlockEntities(nbt) Loads an array of NBT data into the chunk column #### Chunk.toJson() Returns the chunk as json #### Chunk.fromJson(j) Load chunk from json #### Chunk.sections Available for pc chunk implementation. Array of y => section Can be used to identify whether a section is empty or not (will be null if it's the case) For version >= 1.9, contains a .palette property which contains all the stateId of this section, can be used to check quickly whether a given block is in this section. ### pc #### Chunk.getMask() Return the chunk bitmap 0b0000_0000_0000_0000(0x0000) means no chunks are set while 0b1111_1111_1111_1111(0xFFFF) means all chunks are set #### Chunk.dump() Returns the chunk raw data #### Chunk.load(data, bitmap = 0xFFFF, skyLightSent = true, fullChunk = true) Load raw `data` into the chunk #### Chunk.dumpLight() Returns the chunk raw light data (starting from 1.14) #### Chunk.loadLight(data, skyLightMask, blockLightMask, emptySkyLightMask = 0, emptyBlockLightMask = 0) Load lights into the chunk (starting from 1.14) #### Chunk.loadParsedLight (skyLight, blockLight, skyLightMask, blockLightMask, emptySkyLightMask, emptyBlockLightMask) Load lights into the chunk (starting from 1.17) #### Chunk.dumpBiomes() Returns the biomes as an array (starting from 1.15) #### Chunk.loadBiomes(biomes) Load biomes into the chunk (starting from 1.15) ### bedrock See [index.d.ts](https://github.com/PrismarineJS/prismarine-chunk/blob/master/types/index.d.ts#L56) ## ChunkSection ### pc #### static fromJson(j: any): ChunkSection #### static sectionSize(skyLightSent?: boolean): number #### constructor(skyLightSent?: boolean) #### data: Buffer #### toJson(): { type: "Buffer"; data: number[]; } #### initialize(iniFunc: any): void #### getBiomeColor(pos: Vec3): { r: number; g: number; b: number; } #### setBiomeColor(pos: Vec3, r: number, g: number, b: number): void #### getBlockStateId(pos: Vec3): number #### getBlockType(pos: Vec3): number #### getBlockData(pos: Vec3): number #### getBlockLight(pos: Vec3): number #### getSkyLight(pos: Vec3): number #### setBlockStateId(pos: Vec3, stateId: number): void #### setBlockType(pos: Vec3, id: number): void #### setBlockData(pos: Vec3, data: Buffer): void #### setBlockLight(pos: Vec3, light: number): void #### setSkyLight(pos: Vec3, light: number): void #### dump(): Buffer #### load(data: Buffer, skyLightSent?: boolean): void ### bedrock See [index.d.ts](https://github.com/PrismarineJS/prismarine-chunk/blob/master/types/index.d.ts#L56) #### compact() Shrinks the size of the SubChunk if possible after setBlock operations are done #### getPalette() Returns a list of unique block states that make up the chunk section