Difference between revisions of "Chunk Format"
(→Implementations: added outdated notice) |
(→Implementations: add links to 1.9 implementations) |
||
Line 53: | Line 53: | ||
== Implementations == | == Implementations == | ||
− | The following implement the | + | * [https://github.com/Steveice10/MCProtocolLib/blob/4ed72deb75f2acb0a81d641717b7b8074730f701/src/main/java/org/spacehq/mc/protocol/data/game/chunk/BlockStorage.java#L42 Java, 1.9] |
+ | * [https://github.com/Gjum/SpockBot/blob/9597fe9/spockbot/plugins/tools/smpmap.py#L143-L175 Python, 1.9] | ||
+ | * [https://github.com/JavaProphet/MinecraftClone/blob/fdd61b9/MinecraftClone/src/ingame.c#L512-L632 C, 1.9] | ||
+ | |||
+ | The following implement the [http://wiki.vg/index.php?title=SMP_Map_Format&oldid=7164 previous] (before 1.9) format: | ||
* [https://github.com/GlowstoneMC/Glowstone/blob/d3ed79ea7d284df1d2cd1945bf53d5652962a34f/src/main/java/net/glowstone/GlowChunk.java#L640 Java, 1.8] | * [https://github.com/GlowstoneMC/Glowstone/blob/d3ed79ea7d284df1d2cd1945bf53d5652962a34f/src/main/java/net/glowstone/GlowChunk.java#L640 Java, 1.8] | ||
* [https://github.com/barneygale/smpmap Python, 1.4] | * [https://github.com/barneygale/smpmap Python, 1.4] | ||
* [https://github.com/PrismarineJS/prismarine-chunk Node.js, 1.8] | * [https://github.com/PrismarineJS/prismarine-chunk Node.js, 1.8] |
Revision as of 17:44, 16 March 2016
This article describes the Chunk Section format used in the Chunk Data packet (Play, 0x20, clientbound).
Concepts
- Chunk Section: a 16×16×16 area, sometimes also called chunk.
- Chunk Column: 16 chunks aligned vertically (totalling 16×256×16).
Format
A Chunk Section is defined in terms of other data types. A Chunk Section consists of the following fields:
Field Name | Field Type | Notes |
---|---|---|
Bits Per Block | Unsigned Byte | How many bits per block in Data Array. If 0, the Palette Length and Palette fields are omitted and the global palette (with 13 bits per block) is used. |
Palette Length | Optional VarInt | Length of the following array |
Palette | Optional Array of VarInt | Mapping of block state IDs in the global palette to indices of this array |
Data Array Length | VarInt | Number of bytes in the following array, divided by 8 (given as such because Notchian implements Data Array as an Array of Long) |
Data Array | Byte Array | List of 4096 indices pointing to state IDs in the Palette, followed by padding to round the length up to the next multiple of 8 bytes |
Block Light | Byte Array | Half byte per block |
Sky Light | Optional Byte Array | Only if in the Overworld; half byte per block |
Data Array, Block Light, and Sky Light are given for each block with increasing x coordinates, within rows of increasing z coordinates, within layers of increasing y coordinates.
The global palette encodes a block as 13 bits. It uses the block ID for the first 9 bits, and the block damage value for the last 4 bits. For example, diorite (block ID 1
for minecraft:stone
with damage 3
) would be encoded as 000000001 0011
.
In half-byte arrays, two values are packed into each byte. Even-indexed items are packed into the high bits, odd-indexed into the low bits.
Implementations
The following implement the previous (before 1.9) format: