Chunk format

Chunks store the terrain and entities within a 16x256x16 area. They also store precomputed lighting, heightmap data for Minecraft's performance, and other meta information.

Chunks were first introduced in Minecraft Infdev. Before the addition of the MCRegion format in Beta 1.3, chunks were stored as individual chunk files ".dat" where the file names contained the chunk's position encoded in Base36 - this is known as the Alpha level format. MCRegion changed this by storing groups of 32x32 chunks in individual ".mcr" files with the coordinates in Base10, with the goal being to reduce disk usage by cutting down on the number of file handles Minecraft had open at once. MCRegion's successor is the current format, Anvil, which only made changes to the chunk format. The region file technique is still used, but the region file extensions are ".mca" instead.

The major change from MCRegion to Anvil was the division of Chunks into Sections; each chunk has up to 16 individual 16x16x16 block Sections so that completely empty sections will not be saved at all. Preparation has also been made to support blocks with IDs in the range 0 to 4095, as compared to the previous 0 to 255 limitation. However, Minecraft is not fully prepared for such blocks to exist as items; many item IDs are already taken in the range 256 to 4095.

The Blocks, Data, BlockLight, and SkyLight arrays are now housed in individual chunk Sections. The Data, SkyLight, and BlockLight are arrays of 4-bit values, and the BlockLight and SkyLight arrays no longer house part of the block ID. The Blocks array is 8 bits per block, and the 4096-blocks support exists in the form of an optional Add byte array of 4-bits per block for additional block ID information. With the Anvil format, the NBT Format was changed from Notch's original specification to include an integer array tag similar to the existing byte array tag. It is currently only used for HeightMap information in chunks.

NBT Structure
Chunks are stored in NBT format, with this structure:
 * The root tag.
 * : Chunk data.
 * : X position of the chunk.
 * : Z position of the chunk.
 * : Tick when the chunk was last saved.
 * : 1 or not present (true/false) indicate whether the terrain in this chunk was populated with special things. (Ores, special blocks, trees, dungeons, flowers, waterfalls, etc.) If set to zero then Minecraft will regenerate these features in the blocks that already exist.
 * : May not exist. 256 bytes of biome data, one byte for each vertical column in the chunk. See Data Values for biome IDs. If this tag does not exist it will be created and filled by Minecraft when the chunk is loaded and saved. If any values in this array are -1, Minecraft will also set them to the correct biome.
 * : 1024 bytes(256 TAG_Int) of heightmap data. 16 x 16. Each byte records the lowest level in each column where the light from the sky is at full strength. Speeds computing of the SkyLight. Note: This array's indexes are ordered ZX whereas the other array indexes are ordered XZ or YZX.
 * : List of Compound tags, each tag is a sub-chunk of sorts.
 * : The Y index (not coordinate) of this section. Range 0 to 15 (bottom to top), with no duplicates but some sections may be missing if empty.
 * : 4096 bytes of block IDs defining the terrain. 8 bits per block, plus the bits from the below Add tag. 3D order YZX.
 * : May not exist. 2048 bytes of additional block ID data. The value to add to (combine with) the above block ID to form the true block ID in the range 0 to 4095. 4 bits per block. 3D order YZX. Combining is done by shifting this value to the left 8 bits and then adding it to the block ID from above.
 * : 2048 bytes of block data additionally defining parts of the terrain. 4 bits per block. 3D order YZX.
 * : 2048 bytes recording the amount of block-emitted light in each block. Makes load times faster compared to recomputing at load time. 4 bits per block. 3D order YZX.
 * : 2048 bytes recording the amount of sunlight or moonlight hitting each block. 4 bits per block. 3D order YZX.
 * : Each TAG_Compound in this list defines an entity in the chunk. See Entity Format below. If this list is empty it will be a list of Byte tags.
 * : Each TAG_Compound in this list defines a tile entity in the chunk. See Tile Entity Format below. If this list is empty it will be a list of Byte tags.
 * : May not exist. Each TAG_Compound in this list is an "active" block in this chunk waiting to be updated. These are used to save the state of redstone machines, falling sand or water, and other activity. See Tile Tick Format below. This tag may not exist.

Block Format
In the Anvil format, block positions are ordered YZX for compression purposes.

The coordinate system is as follows:
 * X increases East, decreases West
 * Y increases upwards, decreases downwards
 * Z increases South, decreases North

Each section in a chunk is a 16x16x16-block area, with up to 16 sections in a chunk. Section 0 is the bottom section of the chunk, and section 15 is the top section of the chunk. To save space, completely empty sections are not saved. Within each section is a byte tag "Y" for the Y index of the section, 0 to 15, and then byte arrays for the blocks. The "Block" byte array has 4096 partial block IDs at 8 bits per block. Another byte array "Add" is used for block with IDs over 255, and is 2048 bytes of the other part of the 4096 block IDs at 4 bits per block. When both the "Block" and "Add" byte arrays exist, the partial ID from the "Add" array is shifted left 8 bits and added to the partial ID from the "Blocks" array to form the true Block ID. The "Data" byte array is also 2048 bytes for 4096 block data values at 4 bits per block. The "BlockLight" and "SkyLight" byte arrays are the same as the "Data" byte array but they are used for block light levels and sky light levels respectively. The "SkyLight" values represent how much sunlight or moonlight can potentially reach the block, independent of the current light level of the sky.

The pseudo-code below shows how to access individual block information from a single section. Hover over text to see additional information or comments.

 byte Nibble4( byte [] arr, int index) { return index%2 == 0 ? arr[index/2]&0x0F : (arr[index/2]>>4)&0x0F ; } int BlockPos  = y *16 *16 + z*16 + x; byte BlockID_a = Blocks [BlockPos]; byte BlockID_b = Nibble4(Add, BlockPos); short BlockID = BlockID_a + (BlockID_b << 8) ; byte BlockData = Nibble4(<abbr title="The Data byte array, 4 bits per block">Data, BlockPos); byte <abbr title="The block light for the block">Blocklight = Nibble4(<abbr title="The BlockLight byte array, 4 bits per block">BlockLight, BlockPos); byte <abbr title="The sky light for the block">Skylight = Nibble4(<abbr title="The SkyLight byte array, 4 bits per block">SkyLight, BlockPos);

Entity Format
Every entity is an unnamed TAG_Compound contained in the Entities list of a chunk file. The sole exception is the Player entity, stored in level.dat, or in .dat files on servers. All entities share this base:
 * Entity data
 * : Entity ID. This tag does not exist for the Player entity.
 * : 3 TAG_Doubles describing the current X,Y,Z position of the entity.
 * : 3 TAG_Doubles describing the current dX,dY,dZ velocity of the entity in meters per tick.
 * : Two TAG_Floats representing rotation in degrees.
 * The entity's rotation clockwise around the Y axis (called yaw). Due west is 0. Can have large values because it accumulates all of the entity's lateral rotation throughout the game.
 * The entity's declination from the horizon (called pitch). Horizontal is 0. Positive values look downward. Does not exceed positive or negative 90 degrees.
 * : Distance the entity has fallen. Larger values cause more damage when the entity lands.
 * : Number of ticks until the fire is put out. Negative values reflect how long the entity can stand in fire before burning.
 * : How much air the entity has, in ticks. Fills to a maximum of 200 in air, giving 10 seconds submerged before the entity starts to drown, and a total of up to 20 seconds before the entity dies. Decreases while underwater. If 0 while underwater, the entity loses 1 health per second.
 * : 1 or 0 (true/false) - true if the entity is touching the ground.
 * : Unknown usage; entities are only saved in the region files for the dimension they are in. -1 for The Nether, 0 for The Overworld, and 1 for The End.
 * : 1 or 0 (true/false) - true if the entity should not take damage. This applies to living and nonliving entities alike: mobs will not take damage from any source (including potion effects) and objects such as vehicles and item frames cannot be destroyed unless their supports are removed. Note that these entities also cannot be moved by fishing rods, attacks, explosions, or projectiles.
 * : The number of ticks before which the entity may be teleported back through a portal of any kind. Initially starts at 900 ticks (45 seconds) and counts down.
 * : The least significant bits of this entity's Universally Unique IDentifier. This is joined with UUIDMost to form this entity's unique ID, which is currently unused.
 * : The most significant bits of this entity's Universally Unique IDentifier.
 * : The data of the entity being ridden.
 * See this format (recursive).

Mobs
Mobs are a subclass of Entity with additional tags to store their health, attacking/damaged state, potion effects, and more depending on the mob. Players are a subclass of Mob.

{| class="wikitable" style="float: right" ! colspan="2" | Mob Entities ! Entity ID ! Name
 * Bat
 * Bat
 * Blaze
 * Blaze
 * CaveSpider
 * Cave Spider
 * Chicken
 * Chicken
 * Cow
 * Cow
 * Creeper
 * Creeper
 * EnderDragon
 * Ender Dragon
 * Enderman
 * Enderman
 * Ghast
 * Ghast
 * Giant
 * Giant
 * LavaSlime
 * Magma Cube
 * MushroomCow
 * Mooshroom
 * Ozelot
 * Ocelot
 * Pig
 * Pig
 * PigZombie
 * Zombie Pigman
 * Sheep
 * Sheep
 * Silverfish
 * Silverfish
 * Skeleton
 * Skeleton Wither Skeleton
 * Slime
 * Slime
 * SnowMan
 * Snow Golem
 * Spider
 * Spider
 * Squid
 * Squid
 * Villager
 * Villager
 * VillagerGolem
 * Iron Golem
 * Witch
 * Witch
 * WitherBoss
 * Wither
 * Wolf
 * Wolf
 * Zombie
 * Zombie Zombie Villager
 * colspan="2" |.
 * : Only visible if ChestedHorse isn't 0. Probably the mule's inventory.
 * : The horse's attributes.
 * : an attribute. Some attributes have set values. Bred attributes will be near those of the parents.
 * : The attribute value.
 * : the attribute name.
 * : Modifier data
 * Squid
 * Squid
 * Villager
 * Villager
 * VillagerGolem
 * Iron Golem
 * Witch
 * Witch
 * WitherBoss
 * Wither
 * Wolf
 * Wolf
 * Zombie
 * Zombie Zombie Villager
 * colspan="2" |.
 * : Only visible if ChestedHorse isn't 0. Probably the mule's inventory.
 * : The horse's attributes.
 * : an attribute. Some attributes have set values. Bred attributes will be near those of the parents.
 * : The attribute value.
 * : the attribute name.
 * : Modifier data
 * colspan="2" |.
 * : Only visible if ChestedHorse isn't 0. Probably the mule's inventory.
 * : The horse's attributes.
 * : an attribute. Some attributes have set values. Bred attributes will be near those of the parents.
 * : The attribute value.
 * : the attribute name.
 * : Modifier data
 * : Modifier data
 * : Modifier data

Projectiles
Projectiles are a subclass of Entity and have very obscure tags such as X,Y,Z coordinate tags despite Entity Pos tag, inTile despite inGround, and shake despite most projectiles not being arrows.
 * Projectiles have these additional fields:
 * : X coordinate of the item's position in the chunk.
 * : Y coordinate of the item's position in the chunk.
 * : Z coordinate of the item's position in the chunk.
 * : ID of tile projectile is in.
 * : The "shake" when arrows hit a block.
 * : 1 or 0 (true/false) - If the Projectile is in the ground or hit the ground already (For arrow pickup; you cannot pickup arrows in the air)


 * Arrow has these additional fields:
 * : Metadata of tile arrow is in.
 * : 0 = cannot be picked up by players. 1 = can be picked up by players in survival or creative. 2 = can only be picked up by players in creative.
 * : 1 or 0 (true/false) - If pickup is not used, and this is true, the arrow can be picked up by players.
 * : Unknown how this affects actual damage inflicted by the arrow. May not be a whole number. 2.0 for normal arrows, and increased 0.5 per level of Power enchantment on the firing bow. If the Power enchantment is present, an additional 0.5 is added on (so Power I gives a bonus of 1.0, while Power II gives 1.5).


 * Fireball, SmallFireball, and WitherSkull have these additional fields:
 * : List of 3 doubles. Should be identical to Motion.


 * Fireball has these additional fields:
 * : The power and size of the explosion created by the fireball upon impact.


 * ThrownEnderpearl has these additional fields:
 * : The name of the player this ender pearl will teleport upon impact.


 * ThrownPotion has these additional fields:
 * : The item that was thrown, without the slot tag.
 * See Item format and Potion Effects tag tag.
 * : If the Potion tag does not exist, this value is used as the damagevalue of the thrown potion.

Items
Items are a subclass of Entity.
 * Items have these additional fields:
 * : The health of the item, which starts at 5. Items take damage from fire, lava, and explosions. The item is destroyed when its health reaches 0.
 * : The number of ticks the item has been "untouched". After 6000 ticks (5 minutes ) the item is destroyed.


 * Item has these additional fields:
 * : The inventory item, without the Slot tag.
 * See Item Format.


 * XPOrb has these additional fields:
 * : The amount of experience the orb gives when picked up.

Vehicles
Vehicles are subclasses of Entity.
 * Minecart  (deprecated since 13w02a)  has these additional fields:
 * : The type of the cart: 0 - empty, 1 - with a chest, 2 - with a furnace.


 * Storage Minecarts  (deprecated since 13w02a)  and MinecartChest have these additional fields:
 * : List of items.
 * An item, including the Slot tag. Slots are numbered 0 to 26.
 * See Item Format


 * Furnace Minecarts  (deprecated since 13w02a)  and MinecartFurnace have these additional fields:
 * : Force along X axis, used for smooth acceleration/deceleration.
 * : Force along Z axis, used for smooth acceleration/deceleration.
 * : The number of ticks until the minecart runs out of fuel.


 * MinecartSpawner has these additional fields:
 * All fields from the MobSpawner Tile Entity, not including the base Tile Entity fields.


 * All types of Minecarts may have these additional optional fields:
 * : The ID of the custom block in the minecart.
 * : The Data value of the custom block in the minecart.
 * : 1 or 0 (true/false) - whether to display the custom tile in this minecart.
 * : The offset of the block displayed in the Minecart. Positive values move the block upwards, while negative values move it downwards. A value of 16 will move the block up by exactly one multiple of its height.
 * : The custom name of this minecart. May not exist. Not saved, but loaded and affects the name of the dropped item.

Dynamic Tiles
Dynamic tiles are a subclass of Entity and are used to simulate realistically moving blocks.
 * PrimedTnt has these additional fields:
 * : Ticks until explosion.


 * FallingSand has these additional fields:
 *  (deprecated) : The Block ID. Not limited to only sand, gravel, dragon eggs, or anvils.
 * : The Block ID, as above, but now supporting the 1-4095 range.
 * : Optional. The tags of the tile entity for this block.
 * : The data value for the block.
 * : The number of ticks the block has been moving. If zero, the block will despawn after one or two ticks, similar to a mob spawned with zero health.
 * : 1 or 0 (true/false) - true if the block should drop an item that can be picked up when it breaks.
 * : 1 or 0 (true/false) - true if the block should hurt entities it falls on.
 * : The maximum number of hitpoints of damage to inflict on entities that intersect this FallingSand. Anvils default to 20 (10 hearts).
 * : Multiplied by the FallDistance to calculate the amount of damage to inflict.

Other
Other entity types that are a subclass of Entity but do not fit into any of the above categories.
 * FireworksRocketEntity has these additional fields:
 * : The number of ticks this fireworks rocket has been flying for.
 * : The number of ticks before this fireworks rocket explodes. A flight duration of 1 is 24 ticks.
 * : The crafted Firework Rocket item.
 * See Item format and Fireworks tag tag.


 * Paintings and Item Frames share these additional fields:
 * : The X coordinate within the chunk.
 * : The Y coordinate within the chunk.
 * : The Z coordinate within the chunk.
 * : Direction the painting faces: 0 is east, 1 is north, 2 is west, and 3 is south.
 * : Same as Direction, except the meaning of values 2 and 0 are swapped. Ignored if Direction is present.


 * ItemFrame has these additional fields:
 * : The item, without the slot tag. If the item frame is empty, this tag does not exist.
 * See Item Structure.
 * : The chance the item will drop when the item frame breaks. 1.0 by default.
 * : The number of times the item has been rotated 90 degrees clockwise.


 * Painting has these additional fields:
 * : The name of this Painting's art.

Tile Entity Format
Tile Entities (not related to Entities) are used by Minecraft to store information about blocks that can't be stored in the 4-bits of block data the block has. All tile entities share this base:
 * Tile entity data
 * : Tile entity ID
 * : X coordinate of the Tile Entity.
 * : Y coordinate of the Tile Entity.
 * : Z coordinate of the Tile Entity.


 * Various containers may have these additional fields:
 * : Optional. The name of this container, which will display in its GUI where the default name ordinarily is. For Command Blocks, the name will replace the usual '@' when using commands such as "say" and "tell".


 * Beacon has these additional fields:
 * : The number of levels available from the pyramid.
 * : The primary power selected, see Potion effects for IDs. 0 means none.
 * : The secondary power selected, see Potion effects for IDs. 0 means none.


 * Cauldron has these additional fields:
 * : List of items in the brewing stand.
 * : An item, including the slot tag. Slots are numbered 0 to 3.
 * See Item Format.
 * : The number of ticks the potions have been brewing for.


 * Chest has these additional fields:
 * : List of items in the chest.
 * : An item, including the slot tag. Chest slots are numbered 0-26 with 0 in the top left corner.
 * See Item Format.


 * Comparator has these additional fields:
 * : Represents the strength of the analog signal output by this redstone comparator. Likely used because the block itself uses its four bits of metadata to determine its rotation, powered state, and subtraction mode state, and comparators can hold a specific amount of power even in circuits without redstone wire.


 * Control has these additional fields:
 * : The command to issue to the server.
 * : Represents the strength of the analog signal output by redstone comparators attached to this command block. Only updated when the command block is activated with a redstone signal.


 * Furnace has these additional fields:
 * : Number of ticks left before the current fuel runs out.
 * : Number of ticks the item has been smelting for. The item finishes smelting when this value reaches 200 (10 seconds). Is reset to 0 if BurnTime reaches 0.
 * : List of items in the furnace slots.
 * : An item in the furnace, including the slot tag: Slot 0: The item(s) being smelted. Slot 1: The item(s) to use as the next fuel source. Slot 2: The item(s) in the result slot.
 * See Item Format.


 * Hopper has these additional fields:
 * : List of items in the hopper slots.
 * : An item in the hopper, including the slot tag.
 * See Item Format.


 * MobSpawner has these additional fields:
 * : Optional. List of possible entities to spawn. If this tag does not exist, but SpawnData exists, Minecraft will generate it the next time the spawner tries to spawn an entity. The generated list will contain a single entry derived from the EntityId and SpawnData tags.
 * : A potential future spawn. After the spawner makes an attempt at spawning, it will choose one of these entries at random and use it to prepare for the next spawn.
 * : Overwrites EntityId when preparing the next spawn.
 * : The chance that this spawn will be picked as compared to other spawn weights. Must be positive.
 * : Overwrites the contents of SpawnData when preparing the next spawn. Not optional; an empty one will be created if it does not exist.
 * : The Entity ID of the next entity(s) to spawn. Both Mob Entity IDs and other Entity IDs will work. Warning: If SpawnPotentials exists, this tag will get overwritten after the next spawning attempt: see above for more details.
 * : Contains tags to copy to the next spawned entity(s) after spawning. Any of the Entity or Mob tags may be used. Note that if a spawner specifies any of these tags, certain variable data such as mob equipment will no longer be automatically generated, and must also be manually specified (note that this does not apply to position data, which will be randomized as normal unless Pos is specified). This, together with EntityId, also determines the appearance of the miniature entity spinning in the spawner cage. Note: this tag is optional: if it does not exist, the next spawned entity will use the default vanilla spawning properties for this mob, including potentially randomized armor (this is true even if SpawnPotentials does exist). Warning: If SpawnPotentials exists, this tag will get overwritten after the next spawning attempt: see above for more details.
 * : How many mobs to attempt to spawn each time.
 * : The radius around which the spawner attempts to place mobs randomly. The spawn area is square, includes the block the spawner is in, and is centered around the spawner's x,z coordinates - not the spawner itself.
 * : Ticks until next spawn.
 * : The minimum random delay for the next spawn delay.
 * : The maximum random delay for the next spawn delay. Warning: Setting this value to 0 crashes Minecraft. Set to at least 1.
 * : Overrides the maximum number of nearby (within a box of spawnrange*2+1 x spawnrange*2+1 x spawnrange+1 centred around the spawner block) entities whose IDs match this spawner's entity ID.
 * : Overrides the block radius of the sphere of activation by players for this spawner.
 * : Unknown.
 * : Unknown.
 * : Unknown.
 * : Unknown.
 * : Unknown.


 * Music has these additional fields:
 * : Pitch (number of right-clicks).


 * Piston has these additional fields:
 * : Block_IDs of the block being moved.
 * : Data value of the block being moved.
 * : Direction in which the block will be pushed.
 * : How far the block has been moved.
 * : 1 or 0 (true/false) - true if the block is being pushed.


 * RecordPlayer has these additional fields:
 * : Record currently playing. 0 is no record. Otherwise, it is the item ID of the record (e.g. 2261 for the "mall" record). Other IDs can be used to make other items or blocks pop out with a data value of 0. This is always overridden by the ID in RecordItem.
 * : The item, without the Slot tag.
 * See Item Format.


 * Sign has these additional fields:
 * : First row of text.
 * : Second row of text.
 * : Third row of text.
 * : Fourth row of text. Only the first 16 characters of each line are read, the rest are discarded.


 * Skull has these additional fields:
 * : The type of the skull, similar to the Item IDs. (See Data values)
 * : Name of the player this is a skull of.
 * : The orientation, similar to signs. (See Data values)


 * Trap and Dropper have these additional fields:
 * : List of items in the dispenser/dropper
 * : An item, including the slot tag. Slots are numbered 0-8.
 * See Item Format.

Tile Tick Format
Tile Ticks represent block updates that need to happen because they could not happen before the chunk was saved. Examples reasons for tile ticks include redstone circuits needing to continue updating, water and lava that should continue flowing, recently placed sand or gravel that should fall, etc. Tile ticks are not used for purposes such as leaf decay, where the decay information is stored in the leaf block data values and handled by Minecraft when the chunk loads. For map makers, tile ticks can be used to update blocks after a period of time has passed with the chunk loaded into memory.


 * A Tile Tick
 * : The ID of the block; used to activate the correct block update procedure.
 * : The number of ticks until processing should occur. May be negative when processing is overdue.
 * : X position
 * : Y position
 * : Z position