Difference between revisions of "Chunk Format"
(→Format: Color-coded example (may want to change scheme for readability later)) |
(→Format: Attempt to increase readability further and also fix an unhighlighted section) |
||
Line 62: | Line 62: | ||
<code>1001880C0060020</code> = | <code>1001880C0060020</code> = | ||
− | <code><span style="background-color: hsl(160, 90%, 60%)">00000001</span><span style="background-color: hsl(160, 90%, 70%)">0000</span><span style="background-color: hsl(120, 90%, 60%)">000000011</span><span style="background-color: hsl(120, 90%, 70%)">0001</span><span style="background-color: hsl(80, 90%, 60%)">000000011</span><span style="background-color: hsl(80, 90%, 70%)">0000</span><span style="background-color: hsl(40, 90%, 60%)">000000011</span><span style="background-color: hsl(50, 90%, 70%)">0000</span><span style="background-color: hsl(0, 90%, | + | <code><span style="background-color: hsl(160, 90%, 60%)">00000001</span><span style="background-color: hsl(160, 90%, 70%)">0000</span><span style="background-color: hsl(120, 90%, 60%)">000000011</span><span style="background-color: hsl(120, 90%, 70%)">0001</span><span style="background-color: hsl(80, 90%, 60%)">000000011</span><span style="background-color: hsl(80, 90%, 70%)">0000</span><span style="background-color: hsl(40, 90%, 60%)">000000011</span><span style="background-color: hsl(50, 90%, 70%)">0000</span><span style="background-color: hsl(0, 90%, 65%)">000000010</span><span style="background-color: hsl(0, 90%, 75%)">0000</span></code><br> |
− | <code>200D0068004C020</code> = <code>00000010000<span style="background-color: hsl(320, 90%, 60%)">000001101</span><span style="background-color: hsl(320, 90%, 70%)">0000</span><span style="background-color: hsl(280, 90%, 60%)">000001101</span><span style="background-color: hsl(280, 90%, | + | <code>200D0068004C020</code> = <code>00000010000<span style="background-color: hsl(320, 90%, 60%)">000001101</span><span style="background-color: hsl(320, 90%, 70%)">0000</span><span style="background-color: hsl(280, 90%, 60%)">000001101</span><span style="background-color: hsl(280, 90%, 75%)">0000</span><span style="background-color: hsl(240, 90%, 65%)">000000001</span><span style="background-color: hsl(240, 90%, 75%)">0011</span><span style="background-color: hsl(200, 90%, 65%)">000000001</span><span style="background-color: hsl(200, 90%, 70%)">0000</span><span style="background-color: hsl(160, 90%, 60%)">0</span></code> |
9 blocks, with the start of a 10th (that would be finished in the next long). | 9 blocks, with the start of a 10th (that would be finished in the next long). | ||
− | #Grass, <span style="background-color: hsl(0, 90%, | + | #Grass, <span style="background-color: hsl(0, 90%, 65%)">2</span>:<span style="background-color: hsl(0, 90%, 75%)">0</span> |
#Dirt, <span style="background-color: hsl(40, 90%, 60%)">3</span>:<span style="background-color: hsl(40, 90%, 70%)">0</span> | #Dirt, <span style="background-color: hsl(40, 90%, 60%)">3</span>:<span style="background-color: hsl(40, 90%, 70%)">0</span> | ||
#Dirt, <span style="background-color: hsl(80, 90%, 60%)">3</span>:<span style="background-color: hsl(80, 90%, 70%)">0</span> | #Dirt, <span style="background-color: hsl(80, 90%, 60%)">3</span>:<span style="background-color: hsl(80, 90%, 70%)">0</span> | ||
Line 73: | Line 73: | ||
#Stone, <span style="background-color: hsl(160, 90%, 60%)">1</span>:<span style="background-color: hsl(160, 90%, 70%)">0</span> | #Stone, <span style="background-color: hsl(160, 90%, 60%)">1</span>:<span style="background-color: hsl(160, 90%, 70%)">0</span> | ||
#Stone, <span style="background-color: hsl(200, 90%, 60%)">1</span>:<span style="background-color: hsl(200, 90%, 70%)">0</span> | #Stone, <span style="background-color: hsl(200, 90%, 60%)">1</span>:<span style="background-color: hsl(200, 90%, 70%)">0</span> | ||
− | #Diorite, <span style="background-color: hsl(240, 90%, | + | #Diorite, <span style="background-color: hsl(240, 90%, 65%)">1</span>:<span style="background-color: hsl(240, 90%, 75%)">3</span> |
− | #Gravel, <span style="background-color: hsl(280, 90%, | + | #Gravel, <span style="background-color: hsl(280, 90%, 65%)">13</span>:<span style="background-color: hsl(280, 90%, 75%)">0</span> |
#Gravel, <span style="background-color: hsl(320, 90%, 60%)">13</span>:<span style="background-color: hsl(320, 90%, 70%)">0</span> | #Gravel, <span style="background-color: hsl(320, 90%, 60%)">13</span>:<span style="background-color: hsl(320, 90%, 70%)">0</span> | ||
#Stone, 1:0 (or potentially emerald ore, 129:0) | #Stone, 1:0 (or potentially emerald ore, 129:0) |
Revision as of 17:34, 12 April 2016
This information, particularly about the palette and when it can be omitted, is incorrect. The article will be corrected as this format is researched and reverse-engineered. Sorry for any inconvenience.
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 | Determines how many bits are used to encode a block. Note that not all numbers are valid here. This also changes whether the palette is present. |
Palette Length | VarInt | Length of the following array. May be 0. |
Palette | 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 |
Data Array | Long Array | List of 4096 indices pointing to state IDs in the Palette |
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.
There are several values that can be used for the bits per block value. In most cases, invalid values will be treated as if it is a different value when parsed by the Notchian client, meaning that chunk data will be parsed incorrectly if you use an invalid bits per block. Servers must make sure that the bits per block value is correct.
- 4: Blocks are encoded as 4 bits. The palette array is used and sent.
- 5 to 8: Blocks are encoded with the given number of bits. The palette array is used and sent.
- 9 and above: Blocks are encoded by their whole ID in the global palette, with bits per block being set as the base 2 logarithm of the number of block states, rounded up. For the current vanilla release, this is 13 bits per block.
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
. If a block is not found in the global palette (either due to not having a valid damage value or due to not being a valid ID), it will be treated as air.
The data array stores several entries within a single long, and sometimes overlaps one entry between multiple longs. For a bits per block value of 13, the data is stored such that bits 1 through 13 are the first entry, 14 through 26 are the second, and so on. Note that bit 1 is the least significant bit in this case, not the most significant bit. The same behavior applies when a value stretches between two longs: for instance, block 5 would be bits 53 through 64 of the first long and then bit 65 of the second long.
For instance, with 13 bits per block, the following 2 longs would represent...
1001880C0060020
=
0000000100000000000110001000000011000000000001100000000000100000
200D0068004C020
= 0000001000000000110100000000011010000000000001001100000000100000
9 blocks, with the start of a 10th (that would be finished in the next long).
- Grass, 2:0
- Dirt, 3:0
- Dirt, 3:0
- Coarse dirt, 3:1
- Stone, 1:0
- Stone, 1:0
- Diorite, 1:3
- Gravel, 13:0
- Gravel, 13:0
- Stone, 1:0 (or potentially emerald ore, 129:0)
In half-byte arrays, two values are packed into each byte. Even-indexed items are packed into the low bits, odd-indexed into the high bits.
Implementations
The following implement the previous (before 1.9) format: