Difference between revisions of "Protocol"

From wiki.vg
Jump to navigation Jump to search
(Fixed Particle Effect descriptions and added a previously unknown description)
Line 28: Line 28:
 
All packets begin with a single "Packet ID" byte.  Listed packet size includes this byte.  Packets are either "server to client", "client to server", or "Two-Way" (both). Packets are not prefixed with their length. For variable length packets, you must parse it completely to determine its length.
 
All packets begin with a single "Packet ID" byte.  Listed packet size includes this byte.  Packets are either "server to client", "client to server", or "Two-Way" (both). Packets are not prefixed with their length. For variable length packets, you must parse it completely to determine its length.
 
=== Protocol Version ===
 
=== Protocol Version ===
1.6.4 - 78
+
1.7.2 - 4
  
{{anchor|0x00}}
+
== Packet format ==
 
 
=== Keep Alive (0x00) ===
 
''Two-Way''
 
 
 
The server will frequently send out a keep-alive, each containing a random ID. The client must respond with the same packet.
 
The Beta server will disconnect a client if it doesn't receive at least one packet before 1200 in-game ticks, and the Beta client will time out the connection under the same conditions. The client may send packets with Keep-alive ID=0.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| Length || VarInt || Includes the type's length
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| 0x00
+
| Type || VarInt ||
| Keep-alive ID
 
| int
 
| <code>957759560</code>
 
| Server-generated random id
 
 
|-
 
|-
| Total Size:
+
| Data || ||
| colspan="4" | 5 bytes
 
 
|}
 
|}
  
{{anchor|0x01}}
+
== Handshaking ==
=== Login Request (0x01) ===
 
''Server to Client'' ''(and Client to Server in some mods, see below)''
 
  
See [[Protocol Encryption]] for information on logging in.
+
=== Serverbound ===
  
 +
==== Handshake ====
 +
This causes the server to switch into the target state.
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=4 | 0x00
| Field Name
+
| Protocol Version || VarInt ||
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="7" | 0x01
+
| Server Address (hostname or IP) || String || localhost
| Entity ID
+
|-  
| int
+
| Server Port || Unsigned Short|| 25565
| <code>1298</code>
 
| The Player's Entity ID
 
|-
 
| Level type
 
| string
 
| default
 
| <code>default</code>, <code>flat</code>, or <code>largeBiomes</code>. level-type in server.properties
 
|-
 
| Game mode
 
| byte
 
| <code>0</code>
 
| <code>0</code>: survival, <code>1</code>: creative, <code>2</code>: adventure. Bit 3 (<code>0x8</code>) is the hardcore flag
 
|-
 
| Dimension
 
| byte
 
| <code>0</code>
 
| <code>-1</code>: nether, <code>0</code>: overworld, <code>1</code>: end
 
|-
 
| Difficulty
 
| byte
 
| <code>1</code>
 
| <code>0</code> thru <code>3</code> for Peaceful, Easy, Normal, Hard
 
|-
 
| Not used
 
| byte
 
| <code>0</code>
 
| Only 0 observed from vanilla server, was previously world height
 
|-
 
| Max players
 
| byte
 
| <code>8</code>
 
| Used by the client to draw the player list
 
 
|-
 
|-
| Total Size:
+
| Current state || VarInt || 1 for status, 2 for login
| colspan="4" | 12 bytes + length of strings
 
 
|}
 
|}
  
* MinecraftForge sends packet with type 0x01 and 25 bytes(may depend on mods installed with it) following it after completing handshake and enabling encryption. In our tests it sent the following payload:
+
== Play ==
0x53 0xC8 0xE6 0x1B 0x00 0x07 0x00 0x64 0x00 0x65 0x00 0x66 0x00 0x61 0x00 0x75 0x00 0x6C 0x00 0x74 0xFF 0x02 0x00 0x00 0x00
 
  
It is probably safe for server to ignore them unless you know what to do. More insights are needed on MinecraftForge protocol specifics.
+
=== Clientbound ===
  
{{anchor|0x02}}
+
==== Keep Alive ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=1 | 0x00
 +
| Keep Alive ID || Int ||
 +
|}
  
=== Handshake (0x02) ===
 
''Client to server''
 
 
See [[Protocol Encryption]] for information on logging in.
 
  
 +
==== Join Game ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=6 | 0x01
| Field Name
+
| Entity ID || Int || The player's Entity ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0x02
+
| Gamemode || Unsigned Byte || 0: survival, 1: creative, 2: adventure. Bit 3 (0x8) is the hardcore flag
| Protocol Version
 
| byte
 
| <code>51</code>
 
| As of 1.6.2 the protocol version is 74. See [[Protocol version numbers]] for list.
 
 
|-
 
|-
| Username
+
| Dimension || Byte || -1: nether, 0: overworld, 1: end
| string
 
| <code>Notch</code>
 
| The username of the player attempting to connect
 
 
|-
 
|-
| Server Host
+
| Difficulty || Unsigned Byte || 0 thru 3 for Peaceful, Easy, Normal, Hard
| string
 
| <code>localhost</code>
 
|
 
 
|-
 
|-
| Server Port
+
| Max Players || Unsigned Byte || Used by the client to draw the player list
| int
 
| <code>25565</code>
 
|
 
 
|-
 
|-
| Total Size:
+
| Level Type || String || default, flat, largeBiomes, amplified, default_1_1
| colspan="4" | 10 bytes + length of strings
 
 
|}
 
|}
{{anchor|0x03}}
+
{{Warning|If the Dimension isn't valid then the client will crash}}
 
 
=== Chat Message (0x03) ===
 
 
 
''Client to Server''
 
 
 
The default server will check the message to see if it begins with a '/'. If it doesn't, the username of the sender is prepended and sent to all other clients (including the original sender). If it does, the server assumes it to be a command and attempts to process it. A message longer than 100 characters will cause the server to kick the client. (As of 1.3.2, the vanilla client appears to limit the text a user can enter to 100 charaters.) This limits the chat message packet length to 203 bytes (as characters are encoded on 2 bytes). Note that this limit does not apply to chat messages sent by the server, which are limited to 32767 characters since 1.2.5. This change was initially done by allowing the client to not slice the message up to 119 (the previous limit), without changes to the server. For this reason, the vanilla server kept the code to cut messages at 119, but this isn't a protocol limitation and can be ignored.
 
 
 
For more information, see [[Chat]].
 
 
 
''Server to Client''
 
  
 +
==== Chat Message ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! Packet ID
+
| rowspan=1 | 0x02
! Field Name
+
| JSON Data || String || https://gist.github.com/thinkofdeath/e882ce057ed83bac0a1c
! Field Type
 
! Example
 
! Notes
 
|-
 
| rowspan="1" | 0x03
 
| JSON string
 
| String
 
| See below
 
|
 
|-
 
| Total Size:
 
| colspan="4" | 3 bytes + string length
 
 
|}
 
|}
 +
{{Warning|Malformed JSON will disconnect the client}}
  
The chat string must now be a valid JSON object:
+
==== Time Update ====
 
 
    {"translate":"chat.type.announcement","using":["Server","hi"]}
 
    {"color":"gray","italic":true,"translate":"chat.type.admin","using":["Server",{"translate":"commands.save.success"}]}
 
    {"text":"§aOld style chat"}
 
[https://gist.github.com/Dinnerbone/5631634 Original Gist from Dinnerbone]
 
 
 
Where translate is one of the following:
 
 
 
    chat.type.admin: [%s: %s]
 
    chat.type.announcement: [%s] %s
 
    chat.type.emote: * %s %s
 
    chat.type.text: <%s> %s
 
 
 
 
 
{{anchor|0x04}}
 
 
 
=== Time Update (0x04) ===
 
''Server to Client''
 
 
 
Time is based on ticks, where 20 ticks happen every second. There are 24000 ticks in a day, making Minecraft days exactly 20 minutes long.
 
 
 
The time of day is based on the timestamp modulo 24000. 0 is sunrise, 6000 is noon, 12000 is sunset, and 18000 is midnight.
 
 
 
The default SMP server increments the time by <code>20</code> every second.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! | Packet ID
+
| rowspan=2 | 0x03
! | Field Name
+
| Age of the world || Long || In ticks; not changed by server commands
! | Field Type
 
! | Example
 
! | Notes
 
 
|-
 
|-
| rowspan="2" | 0x04
+
| Time of day || Long || The world (or region) time, in ticks. If negative the sun will stop moving at the Math.abs of the time
| Age of the world
 
| long
 
| 45464654
 
| In ticks; not changed by server commands
 
|-
 
| Time of Day
 
| long
 
| 21321
 
| The world (or region) time, in ticks. '''If negative the sun will stop moving at the Math.abs of the time.'''
 
|-
 
! | Total Size:
 
| colspan="4" | 17 Bytes
 
 
|}
 
|}
  
{{anchor|0x05}}
+
==== Entity Equipment ====
=== Entity Equipment (0x05) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x04
| Field Name
+
| EntityID || Int || Entity's ID
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0x05
 
| Entity ID
 
| int
 
| 0x00010643
 
| Named Entity ID
 
 
|-
 
|-
| Slot
+
| Slot || Short || Equipment slot: 0=held, 1-4=armor slot (1 - boots, 2 - leggings, 3 - chestplate, 4 - helmet)
| short
 
| 4
 
| Equipment slot: 0=held, 1-4=armor slot (1 - boots, 2 - leggings, 3 - chestplate, 4 - helmet)
 
 
|-
 
|-
| Item
+
| Item || [[Slot_Data|Slot]] || Item in slot format
| [[Slot_Data|slot]]
 
|
 
| Item in slot format
 
|-
 
| Total Size:
 
| colspan="4" | 7 bytes + slot data
 
 
|}
 
|}
  
{{anchor|0x06}}
+
==== Spawn Position ====
=== Spawn Position (0x06) ===
 
''Server to Client''
 
 
 
Sent by the server after login to specify the coordinates of the spawn point (the point at which players spawn at, and which the compass points to). It can be sent at any time to update the point compasses point at.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x05
| Field Name
+
| X || Int || Spawn X in block coordinates
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x06
+
| Y || Int || Spawn Y in block coordinates
| X
 
| int
 
| <code>117</code>
 
| Spawn X in block coordinates
 
 
|-
 
|-
| Y
+
| Z || Int || Spawn | in block coordinates
| int
 
| <code>70</code>
 
| Spawn Y in block coordinates
 
|-
 
| Z
 
| int
 
| <code>-46</code>
 
| Spawn Z in block coordinates
 
|-
 
| Total Size:
 
| colspan="4" | 13 bytes
 
 
|}
 
|}
  
{{anchor|0x07}}
+
==== Update Health ====
=== Use Entity (0x07) ===
 
''Client to Server''
 
 
 
This packet is sent from the client to the server when the client attacks or right-clicks another entity (a player, minecart, etc).
 
 
 
A Notchian server only accepts this packet if the entity being attacked/used is visible without obstruction and within a 4-unit radius of the player's position.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x06
| Field Name
+
| Health || Float || 0 or less = dead, 20 = full HP
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x07
+
| Food || Short || 0 - 20
| User
+
|-  
| int
+
| Food Saturation || Float || Seems to vary from 0.0 to 5.0 in integer increments
| <code>1298</code>
 
| The entity of the player (ignored by the server)
 
|-
 
| Target
 
| int
 
| <code>1805</code>
 
| The entity the player is interacting with
 
|-
 
| Mouse button
 
| boolean
 
| <code>true</code>
 
| <code>true</code> when the player is left-clicking and <code>false</code> when right-clicking.
 
|-
 
| Total Size:
 
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
 
+
==== Respawn ====
{{anchor|0x08}}
 
=== Update Health (0x08) ===
 
''Server to Client''
 
 
 
Sent by the server to update/set the health of the player it is sent to. Added in protocol version 5.
 
 
 
Food saturation acts as a food "overcharge". Food values will not decrease while the saturation is over zero. Players logging in automatically get a saturation of 5.0. Eating food increases the saturation as well as the food bar.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=4 | 0x07
| Field Name
+
| Dimension || Int || -1: The Nether, 0: The Overworld, 1: The End
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x08
+
| Difficulty || Unsigned Byte || 0 thru 3 for Peaceful, Easy, Normal, Hard.
| Health
 
| '''float'''
 
| '''20.0'''
 
| 0 or less = dead, 20 = full HP
 
 
|-
 
|-
| Food
+
| Gamemode || Unsigned Byte || 0: survival, 1: creative, 2: adventure. The hardcore flag is not included
| short
 
| 20
 
| 0 - 20
 
 
|-
 
|-
| Food Saturation
+
| Level Type || String || Same as Join Game
| float
 
| 5.0
 
| Seems to vary from 0.0 to 5.0 in integer increments
 
|-
 
| Total Size:
 
| colspan="4" | 11 bytes
 
 
|}
 
|}
 +
{{Warning|If the Dimension isn't valid then the client will crash}}
  
{{anchor|0x09}}
+
==== Player Position And Look ====  
=== Respawn (0x09) ===
 
''Server to Client''
 
 
 
To change the player's dimension (overworld/nether/end), send them a respawn packet with the appropriate dimension, followed by prechunks/chunks for the new dimension, and finally a position and look packet.  You do not need to unload chunks, the client will do it automatically.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=6| 0x08
| Field Name
+
| X || Double || Absolute position
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x09
+
| Y || Double || Absolute position
| Dimension
 
| int
 
| <code>1</code>
 
| <code>-1</code>: The Nether, <code>0</code>: The Overworld, <code>1</code>: The End
 
 
|-
 
|-
| Difficulty
+
| Z || Double || Absolute position
| byte
 
| <code>1</code>
 
| <code>0</code> thru <code>3</code> for Peaceful, Easy, Normal, Hard. <code>1</code> is always sent c->s
 
 
|-
 
|-
| Game mode
+
| Yaw || Float || Absolute rotation on the X Axis, in degrees
| byte
 
| <code>1</code>
 
| <code>0</code>: survival, <code>1</code>: creative, <code>2</code>: adventure. The hardcore flag is not included
 
 
|-
 
|-
| World height
+
| Pitch || Float || Absolute rotation on the Y Axis, in degrees
| short
 
| <code>256</code>
 
| Defaults to <code>256</code>
 
 
|-
 
|-
| Level type
+
| On Ground || Bool || True if the client is on the ground, False otherwise
| string
 
| default
 
| See [[#0x01|0x01 login]]
 
|-
 
| Total Size:
 
| colspan="4" | 11 bytes + length of string
 
 
|}
 
|}
* Please avoid changing player's dimension to same dimension as he was in (i.e. from Nether to Nether, from Overworld to Overworld). While at first glance everything seems to work, weird bugs can occur, i.e. such player will be unable to attack other players in new world (minecraft client just won't send "Use Entity (0x07)" packet on hitting, only "Animation (0x12)" packet), even though he can see them and they can attack him (fixes after his death and respawn though).
 
If you actually have multiple worlds of same dimension on server and need to teleport player between them, use intermediate world (with different dimension) between them.
 
 
{{anchor|0x0A}}
 
=== Player (0x0A) ===
 
''Client to Server''
 
 
This packet is used to indicate whether the player is on ground (walking/swimming), or airborne (jumping/falling).
 
 
When dropping from sufficient height, fall damage is applied when this state goes from False to True. The amount of damage applied is based on the point where it last changed from True to False. Note that there are several movement related packets containing this state.
 
 
This packet was previously referred to as Flying
 
  
 +
==== Held Item Change ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x09
| Field Name
+
| Slot || Byte || The slot which the player has selected (0-8)
| Field Type
 
| Example
 
| Notes
 
|-
 
| 0x0A
 
| On Ground
 
| boolean
 
| <code>1</code>
 
| <code>True</code> if the client is on the ground, <code>False</code> otherwise
 
|-
 
| Total Size:
 
| colspan="4" | 2 bytes
 
 
|}
 
|}
  
{{anchor|0x0B}}
+
==== Use Bed ====  
=== Player Position (0x0B) ===
 
''Client to Server''
 
 
 
Updates the players XYZ position on the server.
 
If <code>Stance - Y</code> is less than <code>0.1</code> or greater than <code>1.65</code>, the stance is illegal and the client will be kicked with the message “Illegal Stance”.
 
If the distance between the last known position of the player on the server and the new position set by this packet is greater than 100 units will result in the client being kicked for "You moved too quickly :( (Hacking?)"
 
Also if the fixed-point number of X or Z is set greater than <code>3.2E7D</code> the client will be kicked for "Illegal position"
 
 
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x0A
| Field Name
+
| Entity ID || Int || Player ID
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="5" | 0x0B
 
| X
 
| double
 
| <code>102.809</code>
 
| Absolute position
 
|-
 
| Y
 
| double
 
| <code>70.00</code>
 
| Absolute position
 
|-
 
| Stance
 
| double
 
| <code>71.62</code>
 
| Used to modify the players bounding box when going up stairs, crouching, etc…
 
 
|-
 
|-
| Z
+
| X || Int || Bed headboard X as block coordinate
| double
 
| <code>68.30</code>
 
| Absolute position
 
 
|-
 
|-
| On Ground
+
| Y || Unsigned Byte || Bed headboard Y as block coordinate
| boolean
 
| <code>1</code>
 
|
 
Derived from packet [[#0x0A|0x0A]]
 
 
|-
 
|-
| Total Size:
+
| Z || Int || Bed headboard Z as block coordinate
| colspan="4" | 34 bytes
 
 
|}
 
|}
  
 
+
==== Animation ====
{{anchor|0x0C}}
 
=== Player Look (0x0C) ===
 
''Client to Server''
 
 
 
[[File:Minecraft-trig-yaw.png|thumb|The unit circle for yaw]]
 
 
 
Updates the direction the player is looking in.
 
 
 
Yaw is measured in degrees, and does not follow classical trigonometry rules. The unit circle of yaw on the xz-plane starts at (0, 1) and turns backwards towards (-1, 0), or in other words, it turns clockwise instead of counterclockwise. Additionally, yaw is not clamped to between 0 and 360 degrees; any number is valid, including negative numbers and numbers greater than 360.
 
 
 
Pitch is measured in degrees, where 0 is looking straight ahead, -90 is looking straight up, and 90 is looking straight down.
 
 
 
You can get a unit vector from a given yaw/pitch via:
 
  x = -cos(pitch) * sin(yaw)
 
  y = -sin(pitch)
 
  z =  cos(pitch) * cos(yaw)
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=2 | 0x0B
| Field Name
+
| Entity ID || VarInt || Player ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x0C
+
| Animation || Unsigned Byte || Animation ID
| Yaw
 
| float
 
| <code>0.00</code>
 
| Absolute rotation on the X Axis, in degrees
 
|-
 
| Pitch
 
| float
 
| <code>0.00</code>
 
| Absolute rotation on the Y Axis, in degrees
 
|-
 
| On Ground
 
| boolean
 
| <code>1</code>
 
|
 
Derived from packet [[#0x0A|0x0A]]
 
|-
 
| Total Size:
 
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
{{anchor|0x0D}}
+
Animation can be one of the following values:
=== Player Position and Look (0x0D) ===
 
''Two-Way''
 
 
 
A combination of [[#0x0C|Player Look]] and [[#0x0B|Player position]].
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! ID !! Animation
 
|-
 
|-
| Packet ID
+
| 0 || Swing arm
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="7" | 0x0D
+
| 1 || Damage animation
| X
 
| double
 
| <code>6.5</code>
 
| Absolute position
 
 
|-
 
|-
| Y/Stance
+
| 2 || Leave bed
| double
 
| <code>65.620000004768372</code>
 
| Y: Absolute Position (Client to Server); Stance: Used to modify the players bounding box when going up stairs, crouching, etc… (Server to Client)
 
 
|-
 
|-
| Stance/Y
+
| 3 || Eat food
| double
 
| <code>67.240000009536743</code>
 
| Stance (Client to Server); Y (Server to Client)
 
 
|-
 
|-
| Z
+
| 4 || Critical effect
| double
 
| <code>7.5</code>
 
| Absolute position
 
 
|-
 
|-
| Yaw
+
| 5 || Magic critical effect
| float
 
| <code>0.0</code>
 
| Absolute rotation on the X Axis
 
 
|-
 
|-
| Pitch
+
| 102 || (unknown)
| float
 
| <code>0.0</code>
 
| Absolute rotation on the Y Axis
 
 
|-
 
|-
| On Ground
+
| 104 || Crouch
| boolean
 
| <code>0</code>
 
|
 
Derived from packet [[#0x0A|0x0A]]
 
 
|-
 
|-
| Total Size:
+
| 105 || Uncrouch
| colspan="4" | 42 bytes
 
 
|}
 
|}
  
{{anchor|0x0E}}
+
==== Spawn Player ====
 
 
=== Player Digging (0x0E) ===
 
''Client to Server''
 
 
 
Sent when the player mines a block.  A Notchian server only accepts digging packets with coordinates within a 6-unit radius of the player's position.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=10 | 0x0C
| Field Name
+
| Entity ID || VarInt || Player's Entity ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x0E
+
| Player UUID || String || Player's UUID
| Status
 
| byte
 
| <code>1</code>
 
| The action the player is taking against the block (see below)
 
 
|-
 
|-
| X
+
| Player Name || String || Player's Name
| int
 
| <code>32</code>
 
| Block position
 
 
|-
 
|-
| Y
+
| X || Int || Player X as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| byte
 
| <code>64</code>
 
| Block position
 
 
|-
 
|-
| Z
+
| Y || Int || Player X as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| int
 
| <code>32</code>
 
| Block position
 
 
|-
 
|-
| Face
+
| Z || Int || Player X as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| byte
 
| <code>3</code>
 
| The face being hit (see below)
 
 
|-
 
|-
| Total Size:
+
| Yaw || Byte || Player rotation as a packed byte
| colspan="4" | 12 bytes
+
|-
 +
| Pitch || Byte || Player rotation as a packet byte
 +
|-
 +
| Current Item || Short || The item the player is currently holding. Note that this should be 0 for "no item", unlike -1 used in other packets. A negative value crashes clients.
 +
|-
 +
| Metadata || [[Entities#Entity_Metadata_Format|Metadata]] || The client will crash if no metadata is sent
 
|}
 
|}
 +
{{Warning|The client will crash if no metadata is sent}}
  
Status can (currently) be one of six values:
+
==== Collect Item ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=2 | 0x0D
 +
| Collected Entity ID || Int ||
 +
|-
 +
| Collector Entity ID || Int ||
 +
|}
  
 +
==== Spawn Object ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Meaning
+
| rowspan=8| 0x0E
| Value
+
| Entity ID || VarInt || Entity ID of the object
 
|-
 
|-
| Started digging
+
| Type || Byte || The of object (See [[Entities#Objects|Objects]]
| <code>0</code>
 
 
|-
 
|-
| Cancelled digging
+
| X || Int || X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| <code>1</code>
 
 
|-
 
|-
| Finished digging
+
| Y || Int || Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| <code>2</code>
 
 
|-
 
|-
| Drop item stack
+
| Z || Int || Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| <code>3</code>
 
 
|-
 
|-
| Drop item
+
| Pitch || Byte || The pitch in steps of 2p/256
| <code>4</code>
 
 
|-
 
|-
| Shoot arrow / finish eating
+
| Yaw || Byte || The yaw in steps of 2p/256
| <code>5</code>
+
|-
 +
| Data || [[Object_Data|Object Data]] ||
 
|}
 
|}
  
Notchian clients send a 0 (started digging) when they start digging and a 2 (finished digging) once they think they are finished. If digging is aborted, the client simply send a 1 (Cancel digging).
+
==== Spawn Mob ====
 
 
Status code 4 (drop item) is a special case.  In-game, when you use the Drop Item command (keypress 'q'), a dig packet with a status of 4, and all other values set to 0, is sent from client to server. Status code 3 is similar, but drops the entire stack.
 
 
 
Status code 5 (shoot arrow / finish eating) is also a special case. The x, y and z fields are all set to 0 like above, with the exception of the face field, which is set to 255.
 
 
 
The face can be one of six values, representing the face being hit:
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Value
+
| rowspan=12 | 0x0F
| 0
+
| Entity ID || VarInt || Entity's ID
| 1
 
| 2
 
| 3
 
| 4
 
| 5
 
 
|-
 
|-
| Offset
+
| Type || Unsigned Byte || The type of mob. See [[Entities#Mobs|Mobs]]
| -Y
 
| +Y
 
| -Z
 
| +Z
 
| -X
 
| +X
 
|}
 
 
 
In 1.7.3, when a player opens a door with left click the server receives Packet 0xE+start digging and opens the door.
 
 
 
{{anchor|0x0F}}
 
=== Player Block Placement (0x0F) ===
 
''Client to Server''
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| X || Int || X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="8" | 0x0F
+
| Y || Int || Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| X
 
| int
 
| <code>32</code>
 
| Block position
 
 
|-
 
|-
| Y
+
| Z || Int || Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| unsigned byte
 
| <code>64</code>
 
| Block position
 
 
|-
 
|-
| Z
+
| Pitch || Byte || The pitch in steps of 2p/256
| int
 
| <code>32</code>
 
| Block position
 
 
|-
 
|-
| Direction
+
| Head Pitch || Byte || The pitch in steps of 2p/256
| byte
 
| <code>3</code>
 
| The offset to use for block/item placement (see below)
 
 
|-
 
|-
| Held item
+
| Yaw || Byte || The yaw in steps of 2p/256
| [[Slot_Data|slot]]
 
|
 
|
 
 
|-
 
|-
| Cursor position X
+
| Velocity X || Short ||
| byte
 
| 0 - 16
 
| The position of the crosshair on the block
 
 
|-
 
|-
| Cursor position Y
+
| Velocity Y || Short ||
| byte
 
| 0 - 16
 
|
 
 
|-
 
|-
| Cursor position Z
+
| Velocity Z || Short ||
| byte
 
| 0 - 16
 
|
 
 
|-
 
|-
| Total Size:
+
| Metadata || [[Entities#Entity_Metadata_Format|Metadata]] ||
| colspan="4" | 14 bytes + slot data
 
 
|}
 
|}
In normal operation (ie placing a block), this packet is sent once, with the values set normally.
 
 
This packet has a special case where X, Y, Z, and Direction are all -1. (Note that Y is unsigned so set to 255.) This special packet indicates that the currently held item for the player should have its state updated such as eating food, shooting bows, using buckets, etc.
 
 
In a Notchian Beta client, the block or item ID corresponds to whatever the client is currently holding, and the client sends one of these packets any time a right-click is issued on a surface, so no assumptions can be made about the safety of the ID.  However, with the implementation of server-side inventory, a Notchian server seems to ignore the item ID, instead operating on server-side inventory information and holding selection. The client has been observed (1.2.5 and 1.3.2) to send both real item IDs and -1 in a single session.
 
 
Special note on using buckets:  When using buckets, the Notchian client might send two packets:  first a normal and then a special case.  The first normal packet is sent when you're looking at a block (e.g. the water you want to scoop up).  This normal packet does not appear to do anything with a Notchian server.  The second, special case packet appears to perform the action - based on current position/orientation and with a distance check - it appears that buckets can only be used within a radius of 6 units.
 
 
{{anchor|0x10}}
 
=== Held Item Change (0x10) ===
 
''Two-Way''
 
 
Sent when the player changes the slot selection
 
  
 +
==== Spawn Painting ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=6 | 0x10
 +
| Entity ID || VarInt || Entity's ID
 +
|-
 +
| Title || String || Name of the painting. Max length 13
 
|-
 
|-
| Packet ID
+
| X || Int || Center X coordinate
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| 0x10
+
| Y || Int || Center Y coordinate
| Slot ID
 
| short
 
| <code>1</code>
 
| The slot which the player has selected (0-8)
 
 
|-
 
|-
| Total Size:
+
| Z || Int || Center Z coordinate
| colspan="4" | 3 bytes
+
|-
 +
| Direction || Int || Direction the painting faces (0 -z, 1 -x, 2 +z, 3 +x)
 
|}
 
|}
  
{{anchor|0x11}}
+
==== Spawn Experience Orb ====
=== Use Bed (0x11) ===
 
''Server to Client''
 
 
 
This packet tells that a player goes to bed.
 
 
 
The client with the matching  Entity ID will go into bed mode.
 
 
 
This Packet is sent to all nearby players including the one sent to bed.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x11
| Field Name
+
| Entity ID || VarInt || Entity's ID
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="5" | 0x11
 
| Entity ID
 
| int
 
| 89
 
| Player ID
 
|-
 
| Unknown
 
| byte
 
| 0
 
| Only 0 has been observed
 
 
|-
 
|-
| Bed X
+
| X || Int || X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| int
 
| -247
 
| Bed headboard X as block coordinate
 
 
|-
 
|-
| Bed Y
+
| Y || Int || Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| byte
 
| 78
 
| Bed headboard Y as block coordinate
 
 
|-
 
|-
| Bed Z
+
| Z || Int || Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| int
 
| 128
 
| Bed headboard Z as block coordinate
 
 
|-
 
|-
| Total Size:
+
| Count || Short || The amount of experience this orb will reward once collected
| colspan="4" | 15 bytes
 
 
|}
 
|}
  
{{anchor|0x12}}
+
==== Entity Velocity ====
 
 
=== Animation (0x12) ===
 
''Two-Way''
 
 
 
Sent whenever an entity should change animation.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=4 | 0x12
| Field Name
+
| Entity ID || Int || Entity's ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x12
+
| Velocity X || Short || Velocity on the X axis
| Entity ID
 
| int
 
| <code>55534</code>
 
| Player ID
 
 
|-
 
|-
| Animation
+
| Velocity Y || Short || Velocity on the Y axis
| byte
 
| <code>1</code>
 
| Animation ID
 
 
|-
 
|-
| Total Size:
+
| Velocity Z || Short || Velocity on the Z axis
| colspan="4" | 6 bytes
 
 
|}
 
|}
  
Animation can be one of the following values:
+
==== Destroy Entities====
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! ID
+
| rowspan=2 | 0x13
! Animation
+
| Count || Byte || Length of following array
 
|-
 
|-
| 0
+
| Entity IDs || Array of Int || The list of entities of destroy
| No animation
+
|}
 +
 
 +
==== Entity ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| 1
+
| rowspan=1 | 0x14
| Swing arm
+
| Entity ID || Int || Entity's ID
 +
|}
 +
 
 +
==== Entity Relative Move ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| 2
+
| rowspan=4| 0x15
| Damage animation
+
| Entity ID || Int || Entity's ID
 
|-
 
|-
| 3
+
| DX || Byte || Change in X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Leave bed
 
 
|-
 
|-
| 5
+
| DY || Byte || Change in Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Eat food
 
 
|-
 
|-
| 6
+
| DZ || Byte || Change in Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Critical effect
 
|-
 
| 7
 
| Magic critical effect
 
|-
 
| 102
 
| (unknown)
 
|-
 
| 104
 
| Crouch
 
|-
 
| 105
 
| Uncrouch
 
 
|}
 
|}
  
Only <code>1</code> (swing arm) is sent by notchian clients. Crouching is sent via 0x13. Damage is server-side, and so is not sent by notchian clients. See also [[#0x26|Entity Status]]. As of client 1.5.2, crouching / uncrouching is sent through [[#0x28|Entity Metadata]].
+
==== Entity Look ====
 
 
{{anchor|0x13}}
 
 
 
=== Entity Action (0x13) ===
 
''Client to Server''
 
 
 
Sent at least when crouching, leaving a bed, or sprinting.
 
To send action animation to client use 0x28.
 
The client will send this with Action ID = 3 when "Leave Bed" is clicked.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x16
| Field Name
+
| Entity ID || Int || Entity's ID
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0x13
 
| Entity ID
 
| int
 
| <code>55534</code>
 
| Player ID
 
|-
 
| Action ID
 
| byte
 
| <code>1</code>
 
| The ID of the action, see below.
 
 
|-
 
|-
| '''jumpBoost'''
+
| Yaw || Byte || The X Axis rotation as a fraction of 360
| int
 
| <code>0</code>
 
| Horse jump boost. Ranged from 0 -> 100.
 
 
|-
 
|-
| Total Size:
+
| Pitch || Byte || The Y Axis rotation as a fraction of 360
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
Action ID can be one of the following values:
+
==== Entity Look and Relative Move ====
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! ID
+
| rowspan=6 | 0x17
! Action
+
| Entity ID || Int || Entity's ID
 
|-
 
|-
| 1
+
| DX || Byte || Change in X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Crouch
 
 
|-
 
|-
| 2
+
| DY || Byte || Change in Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Uncrouch
 
 
|-
 
|-
| 3
+
| DZ || Byte || Change in Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Leave bed
 
 
|-
 
|-
| 4
+
| Yaw || Byte || The X Axis rotation as a fraction of 360
| Start sprinting
 
 
|-
 
|-
| 5
+
| Pitch || Byte || The Y Axis rotation as a fraction of 360
| Stop sprinting
 
 
|}
 
|}
  
 
+
==== Entity Teleport ====
{{anchor|0x14}}
 
 
 
=== Spawn Named Entity (0x14) ===
 
''Server to Client''
 
 
 
The only named entities (at the moment) are players (either real or NPC/Bot). This packet is sent by the server when a player comes into visible range, '''not''' when a player joins.
 
 
 
Servers can, however, safely spawn player entities for players not in visible range. The client appears to handle it correctly.
 
 
 
At one point, the Notchian client was not okay with receiving player entity packets, including 0x14, that refer to its own username or Entity ID; and would teleport to the absolute origin of the map and fall through the Void any time it received them. However, in more recent versions, it appears to handle them correctly, by spawning a new entity as directed (though future packets referring to the entity ID may be handled incorrectly).
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=6 | 0x18
| Field Name
+
| Entity ID || Int || Entity's ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="9" | 0x14
+
| X || Int || X position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| Entity ID
 
| int
 
| <code>94453</code>
 
| Player ID
 
 
|-
 
|-
| Player Name
+
| Y || Int || Y position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| string
 
| <code>Twdtwd</code>
 
| Max length of 16
 
 
|-
 
|-
| X
+
| Z || Int || Z position as a [[Data_Types#Fixed-point_numbers|Fixed-Point number]]
| int
 
| <code>784</code>
 
| Player X as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Y
+
| Yaw || Byte || The X Axis rotation as a fraction of 360
| int
 
| <code>2131</code>
 
| Player Y as [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Z
+
| Pitch || Byte || The Y Axis rotation as a fraction of 360
| int
+
|}
| <code>-752</code>
+
 
| Player Z as [[Data_Types#Fixed-point_numbers|fixed-point number]]
+
==== Entity Head Look ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Yaw
+
| rowspan=2 | 0x19
| byte
+
| Entity ID || Int || Entity's ID
| <code>0</code>
 
| Player rotation as a packed byte
 
 
|-
 
|-
| Pitch
+
| Head Yaw || Byte || Head yaw in steps of 2p/256
| byte
+
|}
| <code>0</code>
+
 
| Player rotation as a packed byte
+
==== Entity Status ====
|-
+
{| class="wikitable"
| Current Item
+
! Packet ID !! Field Name !! Field Type !! Notes
| short
 
| <code>0</code>
 
| The item the player is currently holding. Note that this should be 0 for "no item", unlike -1 used in other packets. A negative value crashes clients.
 
 
|-
 
|-
| Metadata
+
| rowspan=2 | 0x1A
| [[Entities#Entity_Metadata_Format|Metadata]]
+
| Entity ID || Int || Entity's ID
| <code></code>
 
| The 1.3 client crashes on packets with no metadata, but the server can send any metadata key of 0, 1 or 8 and the client is fine.
 
 
|-
 
|-
| Total Size:
+
| Entity Status || Byte || See below
| colspan="4" | 22 bytes + length of strings + metadata (at least 1)
 
 
|}
 
|}
 
{{anchor|0x15}}
 
=== Collect Item (0x16) ===
 
''Server to Client''
 
 
Sent by the server when someone picks up an item lying on the ground - its sole purpose appears to be the animation of the item flying towards you. It doesn't destroy the entity in the client memory ([[#0x1D|0x1D]] does that), and it doesn't add it to your inventory ([[#0x67|0x67]] does that). The server only checks for items to be picked up after each [[#0x0B|Player Position]] and [[#0x0D|Player Position & Look]] packet sent by the client.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Entity Status !! Meaning
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x16
+
| 2 || Entity hurt
| Collected Entity ID
 
| int
 
| <code>38</code>
 
|
 
 
|-
 
|-
| Collector Entity ID
+
| 3 || Entity dead
| int
 
| <code>20</code>
 
|
 
 
|-
 
|-
| Total Size:
+
| 6 || Wolf taming
| colspan="4" | 9 bytes
+
|-
|}
+
| 7 || Wolf tamed
 
 
{{anchor|0x17}}
 
=== Spawn Object/Vehicle (0x17) ===
 
''Server to Client''
 
 
 
Sent by the server when an Object/Vehicle is created. The throwers entity id is now used for fishing floats too.
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| 8 || Wolf shaking water off itself
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="8" | 0x17
+
| 9 || (of self) Eating accepted by server
| Entity ID
 
| int
 
| <code>62</code>
 
| Entity ID of the Object
 
 
|-
 
|-
| Type
+
| 10 || Sheep eating grass
| byte
 
| <code>11</code>
 
| The type of object (see [[Entities#Objects]])
 
 
|-
 
|-
| X
+
| 11 || Iron Golem handing over a rose
| int
 
| <code>16080</code>
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] X Position of the object
 
 
|-
 
|-
| Y
+
| 12 || Spawn "heart" particles near a villager
| int
 
| <code>2299</code>
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Y Position of the object
 
 
|-
 
|-
| Z
+
| 13 || Spawn particles indicating that a villager is angry and seeking revenge
| int
 
| <code>592</code>
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Z Position of the object
 
 
|-
 
|-
| Pitch
+
| 14 || Spawn happy particles near a villager
| byte
 
| <code>67</code>
 
| The pitch in steps of 2p/256
 
 
|-
 
|-
| Yaw
+
| 15 || Spawn a "magic" particle near the Witch
| byte
 
| <code>0</code>
 
| The yaw in steps of 2p/256
 
 
|-
 
|-
| [[Object Data]]
+
| 16 || Zombie converting into a villager by shaking violently (unused in recent update)
| [[Object Data]]
 
|
 
|  
 
 
|-
 
|-
| Total Size:
+
| 17 || A firework exploding
| colspan="4" | 23 or 29 bytes
 
 
|}
 
|}
  
{{anchor|0x18}}
+
==== Attach Entity ====
=== Spawn Mob (0x18) ===
 
''Server to Client''
 
 
 
Sent by the server when a Mob Entity is Spawned
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x1B
| Field Name
+
| Entity ID || Int || Entity's ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="12" | 0x18
+
| Vehicle ID || Int || Vechicle's Entity ID
| Entity ID
 
| int
 
| <code>446</code>
 
| Spawned Entity ID
 
 
|-
 
|-
| Type
+
| Leash || Bool || If true leashes the entity to the vehicle
| byte
+
|}
| <code>91</code>
+
 
| The type of mob. See [[Entities#Mobs]]
+
==== Entity Metadata ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| X
+
| rowspan=2 | 0x1C
| int
+
| Entity ID || Int || Entity's ID
| <code>13366</code>
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] X Position of the object
 
 
|-
 
|-
| Y
+
| Metadata || [[Entities#Entity_Metadata_Format|Metadata]] ||
| int
+
|}
| <code>2176</code>
+
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Y Position of the object
+
==== Entity Effect ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Z
+
| rowspan=4 | 0x1D
| int
+
| Entity ID || Int || Entity's ID
| <code>1680</code>
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Z Position of the object
 
 
|-
 
|-
| Pitch
+
| Effect ID || Byte || See [[http://www.minecraftwiki.net/wiki/Potion_effect#Parameters]]
| byte
 
| <code>0</code>
 
| The pitch in steps of 2p/256
 
 
|-
 
|-
| Head Pitch
+
| Amplifier || Byte ||  
| byte
 
| <code>10</code>
 
| The head pitch in steps of 2p/256
 
 
|-
 
|-
| Yaw
+
| Duration || Short ||
| byte
+
|}
| <code>-27</code>
+
 
| Yaw in steps of 2p/256
+
==== Remove Entity Effect ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Velocity X
+
| rowspan=2 | 0x1E
| short
+
| Entity ID || Int || Entity's ID
| <code>0</code>
 
|
 
 
|-
 
|-
| Velocity Y
+
| Effect ID || Byte ||
| short
+
|}
| <code>0</code>
+
 
|
+
==== Set Experience ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Velocity Z
+
| rowspan=3 | 0x1F
| short
+
| Experience bar || Float || Between 0 and 1
| <code>0</code>
 
|
 
 
|-
 
|-
| Metadata
+
| Level || Short ||
| [[Entities#Entity_Metadata_Format|Metadata]]
 
| <code>0 0 127</code>
 
| Varies by mob, see [[Entities]]
 
 
|-
 
|-
| Total Size:
+
| Total Experience || Short ||
| colspan="4" | 27 bytes + Metadata (at least 3 as you must send at least 1 item of metadata)
 
 
|}
 
|}
  
{{anchor|0x19}}
+
==== Entity Properties ====
=== Spawn Painting (0x19) ===
 
''Server to Client''
 
 
 
This packet shows location, name, and type of painting.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=3 | 0x20
| Field Name
+
| Entity ID || Int | Entity's ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x19
+
| Count || Int || Length of following array
| Entity ID
 
| int
 
| <code>0x00000326</code>
 
| Unique entity ID
 
 
|-
 
|-
| Title
+
| Properties || Array of Property Data ||
| string
+
|}
| <code>Creepers</code>
+
 
| Name of the painting; max length 13 (length of "SkullAndRoses")
+
'''Property Data''' structure:
 +
{| class="wikitable"
 
|-
 
|-
| X
+
! Field Name !! Field Type !! Notes
| int
 
| <code>50</code>
 
| Center X coordinate
 
 
|-
 
|-
| Y
+
| Key || String ||  
| int
 
| <code>66</code>
 
| Center Y coordinate
 
 
|-
 
|-
| Z
+
| Value || Double ||  
| int
 
| <code>-50</code>
 
| Center Z coordinate
 
 
|-
 
|-
| Direction
+
| List Length || Short || Number of list elements that follow.
| int
 
| <code>0</code>
 
| Direction the painting faces (0 -z, 1 -x, 2 +z, 3 +x)
 
 
|-
 
|-
| Total Size:
+
| Modifiers || Array of Modifier Data || http://www.minecraftwiki.net/wiki/Attribute#Modifiers
| colspan="4" | 23 bytes + length of string
 
 
|}
 
|}
  
Calculating the center of an image: given a (width x height) grid of cells, with (0, 0) being the top left corner, the center is (max(0, width / 2 - 1), height / 2). E.g.
+
Known key values:
 
 
2x1 (1, 0)
 
4x4 (1, 2)
 
 
 
{{anchor|0x1A}}
 
=== Spawn Experience Orb (0x1A) ===
 
''Server to Client''
 
 
 
Spawns one or more experience orbs. Coordinates are stored as fixed-point numbers.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Key !! Default !! Min !! Max !! Label
| Field Name
+
|-
| Field Type
+
| generic.maxHealth || 20.0 || 0.0 || Double.MaxValue || Max Health
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x1A
+
| generic.followRange || 32.0 || 0.0 || 2048.0 || Follow Range
| Entity ID
 
| int
 
| 105668
 
| The unique entity ID of the orb to spawn.
 
 
|-
 
|-
| x
+
| generic.knockbackResistance || 0.0 || 0.0 || 1.0 || Knockback Resistance
| int
 
| -1143
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] X position of the entity.
 
 
|-
 
|-
| y
+
| generic.movementSpeed || 0.699999988079071 || 0.0 || Double.MaxValue || Movement Speed
| int
 
| 1952
 
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Y position of the entity.
 
 
|-
 
|-
| z
+
| generic.attackDamage || 2.0 || 0.0 || Double.MaxValue ||
| int
+
|-
| 1166
+
| horse.jumpStrength || 0.7 || 0.0 || 2.0 || Jump Strength
| The [[Data_Types#Fixed-point_numbers|fixed-point]] Z position of the entity.
 
|-  
 
| count
 
| short
 
| 7
 
| The amount of experience this orb will reward once collected.
 
 
|-
 
|-
| Total Size:
+
| zombie.spawnReinforcements || 0.0 || 0.0 || 1.0 || Spawn Reinforcements Chance
| colspan="4" | 19 bytes
 
 
|}
 
|}
  
{{anchor|0x1B}}
+
'''Modifier Data''' structure:
=== Steer Vehicle (0x1B) ===
 
''Client to Server''
 
 
 
Sent by client to steer the horse, minecart and boats.
 
Horses listen to all directions, boats and minecarts only listen to the positive forward value in combination with the direction the player is looking in.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Field Name !! Field Type !! Notes
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0x1B
+
| UUID || 128-bit integer ||
| Sideways
 
| float
 
| 0.98
 
| Positive to the left of the player
 
 
|-
 
|-
| Forward
+
| Amount || Double ||
| float
 
| -0.98
 
| Positive forward
 
 
|-
 
|-
| Jump
+
| Operation || Byte ||
| bool
 
| true
 
|  
 
|-
 
| Unmount
 
| bool
 
| false
 
| True when leaving the vehicle
 
|-
 
| Total Size:
 
| colspan="4" | 11 bytes
 
 
|}
 
|}
  
{{anchor|0x1C}}
+
==== Chunk Data ====
=== Entity Velocity (0x1C) ===
 
''Server to Client''
 
 
 
This packet is new to version 4 of the protocol, and is believed to be Entity Velocity/Motion.
 
 
 
Velocity is believed to be in units of 1/8000 of a block per server tick (50ms);
 
for example, -1343 would move (-1343 / 8000) = −0.167875 blocks per tick (or −3,3575 blocks per second).
 
 
 
(This packet data values are not fully verified)
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=7 | 0x21
| Field Name
+
| Chunk X || Int || Chunk X coordinate
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0x1C
+
| Chunk Z || Int || Chunk Z coordinate
| Entity ID
 
| int
 
| <code>1805</code>
 
| The entity ID
 
 
|-
 
|-
| Velocity X
+
| Ground-Up continuous || Boolean || This is True if the packet represents all sections in this vertical column, where the primary bit map specifies exactly which sections are included, and which are air
| short
 
| <code>-1343</code>
 
| Velocity on the X axis
 
 
|-
 
|-
| Velocity Y
+
| Primary bit map || Unsigned Short || Bitmask with 1 for every 16x16x16 section which data follows in the compressed data.
| short
 
| <code>0</code>
 
| Velocity on the Y axis
 
 
|-
 
|-
| Velocity Z
+
| Add bit map || Unsigned Short || Same as above, but this is used exclusively for the 'add' portion of the payload
| short
+
|-
| <code>0</code>
+
| Compressed size || Int || Size of compressed chunk data
| Velocity on the Z axis
 
 
|-
 
|-
| Total Size:
+
| Compressed data || Byte array || The chunk data is compressed using Zlib Deflate
| colspan="4" | 11 bytes
 
 
|}
 
|}
  
{{anchor|0x1D}}
+
==== Multi Block Change ====
 
 
=== Destroy Entity (0x1D) ===
 
''Server to Client''
 
 
 
Sent by the server when an list of Entities is to be destroyed on the client.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x22
| Field Name
+
| Chunk X || Int || Chunk X coordinate
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x1D
+
| Chunk Z || Int || Chunk Z Coordinate
| Entity Count
 
| byte
 
| <code>3</code>
 
| The amount of entities which should be destroyed
 
|-
 
| Entity IDs
 
| array of int
 
| <code>452, 546, 123</code>
 
| The list of entity ids which should be destroyed
 
|-
 
| Total Size:
 
| colspan="4" | 2 + (entity count * 4) bytes
 
|}
 
 
 
{{anchor|0x1E}}
 
=== Entity (0x1E) ===
 
''Server to Client''
 
 
 
Most entity-related packets are subclasses of this packet. When sent from the server to the client, it may initialize the entry.
 
 
 
For player entities, either this packet or any move/look packet is sent every game tick.
 
So the meaning of this packet is basically that the entity did not move/look since the last such packet.
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| Record count || Short || The number of blocks affected
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| 0x1E
+
| Data size || Int || The total size of the data, in bytes. Should always be 4*record count
| Entity ID
 
| int
 
| <code>446</code>
 
|
 
 
|-
 
|-
| Total Size:
+
| Records || Array of Records ||  
| colspan="4" | 5 bytes
 
 
|}
 
|}
  
{{anchor|0x1F}}
+
'''Record'''
=== Entity Relative Move (0x1F) ===
 
''Server to Client''
 
 
 
This packet is sent by the server when an entity moves less then 4 blocks; if an entity moves more than 4 blocks [[#0x22|Entity Teleport]] should be sent instead.
 
 
 
This packet allows at most four blocks movement in any direction, because byte range is from -128 to 127. Movement is an offset of fixed-point numbers; to convert relative move to block coordinate offset, divide by 32.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Bit mask !! Width !! Meaning
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0x1F
+
| 00 00 00 0F || 4 bits || Block metadata
| Entity ID
 
| int
 
| <code>459</code>
 
|
 
 
|-
 
|-
| dX
+
| 00 00 FF F0 || 12 bits || Block ID
| byte
 
| <code>1</code>
 
| X axis Relative movement as a [[Data_Types#Fixed-point_numbers|fixed-point number]], where 6 of the least-significant bits represents the fractional part.
 
 
|-
 
|-
| dY
+
| 00 FF 00 00 || 8 bits || Y co-ordinate
| byte
 
| <code>-7</code>
 
| Y axis Relative movement as a [[Data_Types#Fixed-point_numbers|fixed-point number]].
 
 
|-
 
|-
| dZ
+
| 0F 00 00 00 || 4 bits || Z co-ordinate, relative to chunk
| byte
 
| <code>5</code>
 
| Z axis Relative movement as a [[Data_Types#Fixed-point_numbers|fixed-point number]].
 
 
|-
 
|-
| Total Size:
+
| F0 00 00 00 || 4 bits || X co-ordinate, relative to chunk
| colspan="4" | 8 bytes
 
 
|}
 
|}
  
{{anchor|0x20}}
+
==== Block Change ====
=== Entity Look (0x20) ===
 
''Server to Client''
 
 
 
This packet is sent by the server when an entity rotates.  Example: "Yaw" field 64 means a 90 degree turn.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x23
| Field Name
+
| X || Int || Block X Coordinate
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x20
+
| Y || Unsigned Byte || Block Y Coordinate
| Entity ID
 
| int
 
| <code>459</code>
 
|
 
 
|-
 
|-
| Yaw
+
| Z || Int || Block Z Coordinate
| byte
 
| <code>126</code>
 
| The X Axis rotation as a fraction of 360
 
 
|-
 
|-
| Pitch
+
| Block Type || VarInt || The new block type for the block
| byte
 
| <code>0</code>
 
| The Y Axis rotation as a fraction of 360
 
 
|-
 
|-
| Total Size:
+
| Block Data || Unsigned Byte || The new data for the block
| colspan="4" | 7 bytes
 
 
|}
 
|}
  
{{anchor|0x21}}
+
==== Block Action ====
=== Entity Look and Relative Move (0x21) ===
 
''Server to Client''
 
 
 
This packet is sent by the server when an entity rotates and moves.
 
Since a byte range is limited from -128 to 127, and movement is offset of fixed-point numbers,
 
this packet allows at most four blocks movement in any direction. (-128/32 == -4)
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=6 | 0x24
| Field Name
+
| X || Int || Block X Coordinate
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="6" | 0x21
 
| Entity ID
 
| int
 
| <code>459</code>
 
|
 
|-
 
| dX
 
| byte
 
| <code>1</code>
 
| X axis Relative movement a [[Data_Types#Fixed-point_numbers|fixed-point number]], where 6 of the least-significant bits represents the fractional part.
 
 
|-
 
|-
| dY
+
| Y || Short || Block Y Coordinate
| byte
 
| <code>-7</code>
 
| Y axis Relative movement as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| dZ
+
| Z || Int || Block Z Coordinate
| byte
 
| <code>5</code>
 
| Z axis Relative movement as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Yaw
+
| Byte 1 || Unsigned Byte || Varies depending on block - see [[Block_Actions]]
| byte
 
| <code>126</code>
 
| The X Axis rotation as a fraction of 360
 
 
|-
 
|-
| Pitch
+
| Byte 2 || Unsigned Byte || Varies depending on block - see [[Block_Actions]]
| byte
 
| <code>0</code>
 
| The Y Axis rotation as a fraction of 360
 
 
|-
 
|-
| Total Size:
+
| Block Type || VarInt || The block type for the block
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
{{anchor|0x22}}
+
==== Block Break Animation ====
=== Entity Teleport (0x22) ===
 
''Server to Client''
 
 
 
This packet is sent by the server when an entity moves more than 4 blocks.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x25
| Field Name
+
| Entity ID || VarInt || Entity's ID
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x22
+
| X || Int || rowspan=3 | Block Position
| Entity ID
 
| int
 
| <code>459</code>
 
|
 
 
|-
 
|-
| X
+
| Y || Int
| int
 
| <code>14162</code>
 
| X axis position as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Y
+
| Z || Int
| int
 
| <code>2176</code>
 
| Y axis position as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Z
+
| Destroy Stage || Byte || 0 - 9
| int
 
| <code>1111</code>
 
| Z axis position as a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
|-
 
| Yaw
 
| byte
 
| <code>126</code>
 
| The X Axis rotation as a fraction of 360
 
|-
 
| Pitch
 
| byte
 
| <code>0</code>
 
| The Y Axis rotation as a fraction of 360
 
|-
 
| Total Size:
 
| colspan="4" | 19 bytes
 
 
|}
 
|}
  
{{anchor|0x23}}
+
==== Map Chunk Bulk ====
=== Entity Head Look (0x23) ===
 
''Server to Client''
 
 
 
Changes the direction an entity's head is facing.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=5 | 0x26
 +
| Chunk column count || Short || The number of chunk in this packet
 
|-
 
|-
| Packet ID
+
| Data length || Int || The size of the data field
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x23
+
| Sky light sent || Bool || Whether or not the chunk data contains a light nibble array. This is true in the main world, false in the end + nether
| Entity ID
 
| int
 
|
 
|
 
 
|-
 
|-
| Head Yaw
+
| Data || Byte Array || Compressed chunk data
| byte
 
|
 
| Head yaw in steps of 2p/256
 
 
|-
 
|-
| Total Size:
+
| Meta information || Meta || See below
| colspan="4" | 6 bytes
 
 
|}
 
|}
  
{{anchor|0x26}}
+
'''Meta'''
=== Entity Status (0x26) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
|Chunk X || Int || The X Coordinate of the chunk
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x26
+
|Chunk Z || Int || The Z Coordinate of the chunk
| Entity ID
 
| int
 
| 34353
 
|
 
 
|-
 
|-
| Entity Status
+
|Primary bitmap || Unsigned Short || A bitmap which specifies which sections are not empty in this chunk
| byte
 
| 0x03
 
| See below
 
 
|-
 
|-
| Total Size:
+
|Add bitmap || Unsigned Short || A bitmap which specifies which sections need add information because of very high block ids. not yet used
| colspan="4" | 6 bytes
 
 
|}
 
|}
  
 +
==== Explosion ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! Entity Status
+
| rowspan="9" | 0x27
! Meaning
+
| X || Float ||
 
|-
 
|-
| 2
+
| Y || Float ||
| Entity hurt
 
 
|-
 
|-
| 3
+
| Z || Float ||
| Entity dead
 
 
|-
 
|-
| 6
+
| Radius || Float || Currently unused in the client
| Wolf taming
 
 
|-
 
|-
| 7
+
| Record count || Int || This is the count, not the size. The size is 3 times this value.
| Wolf tamed
 
 
|-
 
|-
| 8
+
| Records || (Byte, Byte, Byte) × count || Each record is 3 signed bytes long, each bytes are the XYZ (respectively) offsets of affected blocks.
| Wolf shaking water off itself
 
 
|-
 
|-
| 9
+
| Player Motion X || Float || X velocity of the player being pushed by the explosion
| (of self) Eating accepted by server
 
 
|-
 
|-
| 10
+
| Player Motion Y || Float || Y velocity of the player being pushed by the explosion
| Sheep eating grass
 
 
|-
 
|-
| 11
+
| Player Motion Z || Float || Z velocity of the player being pushed by the explosion
| Iron Golem handing over a rose
+
|}
 +
 
 +
==== Effect ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| 12
+
| rowspan="6" | 0x28
| Spawn "heart" particles near a villager
+
| Effect ID || Int || The ID of the effect, see below.
 
|-
 
|-
| 13
+
| X || Int || The X location of the effect multiplied by 8
| Spawn particles indicating that a villager is angry and seeking revenge
 
 
|-
 
|-
| 14
+
| Y || Byte || The Y location of the effect multiplied by 8
| Spawn happy particles near a villager
 
 
|-
 
|-
| 15
+
| Z || Int || The Z location of the effect multiplied by 8
| Spawn a "magic" particle near the Witch
 
 
|-
 
|-
| 16
+
| Data || Int || Extra data for certain effects, see below.
| Zombie converting into a villager by shaking violently (unused in recent update)
 
|-
 
| 17
 
| A firework exploding
 
 
|-
 
|-
 +
| Disable relative volume || Bool || See above
 
|}
 
|}
  
{{anchor|0x27}}
+
'''Sound''':
 +
 
 +
*1000: <code>random.click</code>
 +
*1001: <code>random.click</code>
 +
*1002: <code>random.bow</code>
 +
*1003: <code>random.door_open</code> or <code>random.door_close</code> (50/50 chance)
 +
*1004: <code>random.fizz</code>
 +
*1005: Play a music disc. '''Data''': [http://www.minecraftwiki.net/wiki/Music_Discs Record ID]
 +
*''(1006 not assigned)''
 +
*1007: <code>mob.ghast.charge</code>
 +
*1008: <code>mob.ghast.fireball</code>
 +
*1009: <code>mob.ghast.fireball</code>, but with a lower volume.
 +
*1010: <code>mob.zombie.wood</code>
 +
*1011: <code>mob.zombie.metal</code>
 +
*1012: <code>mob.zombie.woodbreak</code>
 +
*1013: <code>mob.wither.spawn</code>
 +
*1014: <code>mob.wither.shoot</code>
 +
*1015: <code>mob.bat.takeoff</code>
 +
*1016: <code>mob.zombie.infect</code>
 +
*1017: <code>mob.zombie.unfect</code>
 +
*1018: <code>mob.enderdragon.end</code>
 +
*1020: <code>random.anvil_break</code>
 +
*1021: <code>random.anvil_use</code>
 +
*1022: <code>random.anvil_land</code>
 +
 
 +
'''Particle''':
  
=== Attach Entity (0x27) ===
+
*2000: Spawns 10 smoke particles, e.g. from a fire. '''Data''': direction, see below
''Server to Client''
+
*2001: Block break. '''Data''': [http://www.minecraftwiki.net/wiki/Data_values Block ID]
 +
*2002: Splash potion. Particle effect + glass break sound. '''Data''': [http://www.lb-stuff.com/Minecraft/PotionDataValues1.9pre3.txt Potion ID]
 +
*2003: Eye of ender entity break animation - particles and sound
 +
*2004: Mob spawn particle effect: smoke + flames
 +
*2005: Spawn "happy villager" effect (hearts).
  
This packet is sent when a player has been attached to an entity (e.g. Minecart)
+
Smoke directions:
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! ID !! Direction
 +
|-
 +
| 0 || South - East
 +
|-
 +
| 1 || South
 +
|-
 +
| 2 || South - West
 +
|-
 +
| 3 || East
 
|-
 
|-
| Packet ID
+
| 4 || (Up or middle ?)
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x27
+
| 5 || West
| Entity ID
 
| int
 
| <code>1298</code>
 
| The player entity ID being attached
 
 
|-
 
|-
| Vehicle ID
+
| 6 || North - East
| int
 
| <code>1805</code>
 
| The vehicle entity ID attached to (-1 for unattaching)
 
 
|-
 
|-
| '''Leash'''
+
| 7 || North
| unsigned byte
 
| <code>0</code>
 
| If set to 1, leashes the entity to the vehicle
 
 
|-
 
|-
| Total Size:
+
| 8 || North - West
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
{{anchor|0x28}}
+
==== Sound Effect ====
 
 
=== Entity Metadata (0x28) ===
 
''Server to Client''
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="7" | 0x29
| Field Name
+
| Sound name || String ||  
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x28
+
| Effect position X || Int || Effect X multiplied by 8
| Entity ID
 
| int
 
| <code>0x00000326</code>
 
| Unique entity ID to update.
 
 
|-
 
|-
| Entity Metadata
+
| Effect position Y || Int || Effect Y multiplied by 8
| [[Entities#Entity_Metadata_Format|Metadata]]
 
| <code>0x00 0x01 0x7F</code>
 
| Metadata varies by entity. See [[Entities]]
 
 
|-
 
|-
| Total Size:
+
| Effect position Z || Int || Effect Z multiplied by 8
| colspan="4" | 5 bytes + Metadata
+
|-
 +
| Volume || Float || 1 is 100%, can be more
 +
|-
 +
| Pitch || Unsigned Byte || 63 is 100%, can be more
 
|}
 
|}
  
 
+
==== Particle ====
{{anchor|0x29}}
 
=== Entity Effect (0x29) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan="9" | 0x2A
 +
| Particle name || String || The name of the particle to create. A list can be found [https://gist.github.com/thinkofdeath/5110835 here]
 +
|-
 +
| X || Float || X position of the particle
 
|-
 
|-
| Packet ID
+
| Y || Float || Y position of the particle
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0x29
+
| Z || Float || Z position of the particle
| Entity ID
 
| int
 
| <code>14</code>
 
| Entity ID of a player
 
 
|-
 
|-
| Effect ID
+
| Offset X || Float || This is added to the X position after being multiplied by random.nextGaussian()
| byte
 
| <code>17</code>
 
| See [http://www.minecraftwiki.net/wiki/Potion_effect#Parameters here]
 
 
|-
 
|-
| Amplifier
+
| Offset Y || Float || This is added to the Y position after being multiplied by random.nextGaussian()
| byte
 
| <code>0</code>
 
|
 
 
|-
 
|-
| Duration
+
| Offset Z || Float || This is added to the Z position after being multiplied by random.nextGaussian()
| short
 
| <code>64</code>
 
|
 
 
|-
 
|-
| Total Size:
+
| Particle speed || Float || The speed of each particle
| colspan="4" | 9 bytes
+
|-
 +
| Number of particles || Int || The number of particles to create
 
|}
 
|}
  
{{anchor|0x2A}}
+
==== Change Game State ====
=== Remove Entity Effect (0x2A) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="2" | 0x2B
| Field Name
+
| Reason || Unsigned Byte ||
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x2a
+
| Value || Float || Depends on reason
| Entity ID
 
| int
 
|
 
| Entity ID of a player
 
|-
 
| Effect ID
 
| byte
 
| <code>17</code>
 
| See [http://www.minecraftwiki.net/wiki/Potion_effect#Parameters here]
 
|-
 
| Total Size:
 
| colspan="4" | 6 bytes
 
 
|}
 
|}
  
 
+
'''Reason codes'''
{{anchor|0x2B}}
 
=== Set Experience (0x2B) ===
 
''Server to Client''
 
 
 
Sent by the server when the client should change experience levels.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Code !! Effect !! Notes
 
|-
 
|-
| Packet ID
+
| 0 || Invalid Bed || "tile.bed.notValid"
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x2B
+
| 1 || Begin raining ||  
| Experience bar
 
| float
 
| <code>0.5960060358047485</code>
 
| Used for drawing the experience bar - value is between 0 and 1.
 
 
|-
 
|-
| Level
+
| 2 || End raining ||  
| short
 
| <code>8</code>
 
|
 
 
|-
 
|-
| Total experience
+
| 3 || Change game mode || "gameMode.changed" 0 - Survival, 1 - Creative, 2 - Adventure
| short
 
| <code>130</code>
 
|
 
 
|-
 
|-
| Total Size:
+
| 4 || Enter credits ||
| colspan="4" | 9 bytes
+
|-
 +
| 5 || Demo messages || 0 - Show welcome to demo screen, 101 - Tell movement controls, 102 - Tell jump control, 103 - Tell inventory control
 +
|-
 +
| 6 | Bow hit sound ||
 +
|-
 +
| 7 || Fade value || The current darkness value. 1 = Dark, 0 = Bright, Setting the value higher causes the game to change color and freeze
 +
|-
 +
| 8 || Fade time || Time in ticks for the sky to fade
 
|}
 
|}
  
{{anchor|0x2C}}
+
==== Spawn Global Entity ====
=== Entity Properties (0x2C) ===
 
''Server to Client''
 
 
 
'''Note''': The server sends this packet to inform the user of its movement speed. Users move far too fast when this packet is not sent.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="5" | 0x2C
| Field Name
+
| Entity ID || VarInt || The entity ID of the thunderbolt
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x2C
+
| Type || Byte || The global entity type, currently always 1 for thunderbolt.
| Entity ID
 
| int
 
| 195
 
| ?
 
 
|-
 
|-
| Properties Count
+
| X || Int || Thunderbolt X a [[Data_Types#Fixed-point_numbers|fixed-point number]]
| int
 
| 3
 
| Number of string/data (including these lists) pairs that follow. The remaining fields here are repeated this number of times.
 
 
|-
 
|-
| Properties
+
| Y || Int || Thunderbolt Y a [[Data_Types#Fixed-point_numbers|fixed-point number]]
| array of Property Data
 
|  
 
|  
 
 
|-
 
|-
| Total Size:
+
| Z || Int || Thunderbolt Z a [[Data_Types#Fixed-point_numbers|fixed-point number]]
| colspan="4" | ? bytes
 
 
|}
 
|}
  
 
+
==== Open Window ====
'''Property Data''' structure:
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! Field Name
+
| rowspan="6" | 0x2D
! Field Type
+
| Window id || Unsigned Byte || A unique id number for the window to be displayed.  Notchian server implementation is a counter, starting at 1.
! Example
 
! Notes
 
 
|-
 
|-
| Key
+
| Inventory Type || Unsigned Byte || The window type to use for display. Check below
| string
 
| "generic.Maxhealth"
 
|
 
 
|-
 
|-
| Value
+
| Window title || String || The title of the window.
| double
 
| 20.0
 
|
 
 
|-
 
|-
| List Length
+
| Number of Slots || Unsigned Byte || Number of slots in the window (excluding the number of slots in the player inventory).
| short
 
| 1
 
| Number of list elements that follow.
 
 
|-
 
|-
| Modifiers
+
| Use provided window title || Bool || If false, the client will look up a string like "window.minecart". If true, the client uses what the server provides.
| array of Modifier Data
+
|-
|  
+
| Entity ID || Int || EntityHorse's entityId. Only sent when window type is equal to 11 (AnimalChest).
| http://www.minecraftwiki.net/wiki/Attribute#Modifiers
 
 
|}
 
|}
  
Known key values:
+
See [[Inventory#Windows|inventory windows]] for further information.
 +
 
 +
==== Close Window ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! Key
+
| 0x2E
! Default
+
| Window ID || Unsigned Byte || This is the id of the window that was closed. 0 for inventory.
! Min
+
|}
! Max
+
 
! Label
+
==== Set Slot ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| generic.maxHealth
+
| rowspan="3" | 0x2F
| 20.0
+
| Window ID || Unsigned Byte
| 0.0
+
| The window which is being updated. 0 for player inventory. Note that all known window types include the player inventory. This packet will only be sent for the currently opened window while the player is performing actions, even if it affects the player inventory. After the window is closed, a number of these packets are sent to update the player's inventory window (0).
| Double.MaxValue
 
| Max Health
 
 
|-
 
|-
| generic.followRange
+
| Slot || Short || The slot that should be updated
| 32.0
 
| 0.0
 
| 2048.0
 
| Follow Range
 
 
|-
 
|-
| generic.knockbackResistance
+
| Slot data || [[Slot_Data|Slot]] ||
| 0.0
+
|}
| 0.0
+
 
| 1.0
+
==== Window Items ====
| Knockback Resistance
+
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| generic.movementSpeed
+
| rowspan="3" | 0x30
| 0.699999988079071
+
| Window ID || Unsigned Byte || The id of window which items are being sent for. 0 for player inventory.
| 0.0
 
| Double.MaxValue
 
| Movement Speed
 
 
|-
 
|-
| generic.attackDamage
+
| Count || Short || The number of slots (see below)
| 2.0
 
| 0.0
 
| Double.MaxValue
 
|  
 
 
|-
 
|-
| horse.jumpStrength
+
| Slot data || Array of [[Slot_Data|Slot]]s ||
| 0.7
 
| 0.0
 
| 2.0
 
| Jump Strength
 
|-
 
| zombie.spawnReinforcements
 
| 0.0
 
| 0.0
 
| 1.0
 
| Spawn Reinforcements Chance
 
 
|}
 
|}
  
'''Modifier Data''' structure:
+
See [[Inventory#Windows|inventory windows]] for further information about how slots are indexed.
 +
 
 +
==== Window Property ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
! Field Name
+
| rowspan="3" | 0x31
! Field Type
+
| Window ID || Unsigned Byte || The id of the window.
! Example
 
! Notes
 
 
|-
 
|-
| UUID
+
| Property || Short || Which property should be updated.
| 128-bit integer
 
|
 
|
 
 
|-
 
|-
| Amount
+
| Value || Short || The new value for the property.
| double
 
|
 
|
 
|-
 
| Operation
 
| byte
 
|
 
|
 
 
|}
 
|}
  
 +
'''Furnace'''
 +
 +
Properties:
 +
 +
* 0: Progress arrow
 +
* 1: Fire icon (fuel)
 +
 +
Values:
 +
 +
* 0-200 for progress arrow
 +
* 0-200 for fuel indicator
  
{{anchor|0x33}}
+
Ranges are presumably in in-game ticks
  
=== Chunk Data (0x33) ===
+
'''Enchantment Table'''
''Server to Client''
 
  
Chunks are not unloaded by the client automatically. To unload chunks, send this packet with ground-up continuous=true and no 16^3 chunks (eg. primary bit mask=0). The server does not send skylight information for nether-chunks, it's up to the client to know if the player is currently in the nether. You can also infer this information from the primary bitmask and the amount of uncompressed bytes sent.
+
Properties: 0, 1 or 2 depending on the "enchantment slot" being given.
  
See also: [[SMP Map Format]]
+
Values: The enchantment's level.
  
 +
==== Confirm Transaction  ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x32
| Field Name
+
| Window ID || Unsigned Byte || The id of the window that the action occurred in.
| Field Type
+
|-
| Example
+
| Action number || Short || Every action that is to be accepted has a unique number. This field corresponds to that number.
| Notes
+
|-
 +
| Accepted || Bool || Whether the action was accepted.
 +
|}
 +
 
 +
==== Update Sign ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
 
| rowspan="7" | 0x33
 
| rowspan="7" | 0x33
| Chunk X
+
| X || Int || Block X Coordinate
| int
 
|
 
| Chunk X Coordinate (*16 to get true X)
 
|-
 
| Chunk Z
 
| int
 
|
 
| Chunk Z Coordinate (*16 to get true Z)
 
 
|-
 
|-
| Ground-up continuous
+
| Y || Short || Block Y Coordinate
| boolean
 
|
 
| This is True if the packet represents all sections in this vertical column, where the primary bit map specifies exactly which sections are included, and which are air.
 
 
|-
 
|-
| Primary bit map
+
| Z || Int || Block Z Coordinate
| unsigned short
 
| 15
 
| Bitmask with 1 for every 16x16x16 section which data follows in the compressed data.
 
 
|-
 
|-
| Add bit map
+
| Line 1 || String || First line of text in the sign
| unsigned short
 
| 0
 
| Same as above, but this is used exclusively for the 'add' portion of the payload
 
 
|-
 
|-
| Compressed size
+
| Line 2 || String || Second line of text in the sign
| int
 
|
 
| Size of compressed chunk data.
 
 
|-
 
|-
| Compressed data
+
| Line 3 || String || Third line of text in the sign
| unsigned byte array
 
| <code>…</code>
 
| The chunk data is compressed using ZLib Deflate function.
 
 
|-
 
|-
| Total Size:
+
| Line 4 || String || Fourth line of text in the sign
| colspan="4" | 18 bytes + Compressed chunk size
 
 
|}
 
|}
  
{{anchor|0x34}}
+
==== Maps ====
 
 
=== Multi Block Change (0x34) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="4" | 0x34
| Field Name
+
| Item Damage || VarInt || The damage value of the map being modified
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="5" | 0x34
 
| Chunk X
 
| int
 
| <code>-9</code>
 
| Chunk X Coordinate
 
 
|-
 
|-
| Chunk Z
+
| Length || Short || Length of following byte array
| int
 
| <code>12</code>
 
| Chunk Z Coordinate
 
 
|-
 
|-
| Record count
+
| Data || Byte Array || Array data
| short
 
|
 
| The number of blocks affected
 
|-
 
| Data size
 
| int
 
|
 
| The total size of the data, in bytes. Should always be 4*record count - please confirm.
 
|-
 
| Data
 
| Special
 
| <code>…</code>
 
| Coordinates, type, and metadata of blocks to change (see below table).
 
|-
 
| Total Size:
 
| colspan="4" | 15 bytes + Arrays
 
 
|}
 
|}
  
Each record is four bytes.
+
If the first byte of the array is 0, the next two bytes are X start and Y start and the rest of the bytes are the colors in that column.
  
 +
If the first byte of the array is 1, the rest of the bytes are in groups of three: (data, x, y). The lower half of the data is the type (always 0 under vanilla) and the upper half is the direction.
 +
 +
If the first byte of the array is 2, the second byte is the map scale.
 +
 +
==== Update Block Entity ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Bit mask
+
| rowspan="6" | 0x35
| Width
+
| X || Int ||
| Meaning
 
 
|-
 
|-
| 00 00 00 0F
+
| Y || Short ||
| 4 bits
 
| Block metadata
 
 
|-
 
|-
| 00 00 FF F0
+
| Z || Int ||
| 12 bits
 
| Block ID
 
 
|-
 
|-
| 00 FF 00 00
+
| Action || Unsigned Byte || The type of update to perform
| 8 bits
 
| Y co-ordinate
 
 
|-
 
|-
| 0F 00 00 00
+
| Data length || Short || Varies
| 4 bits
 
| Z co-ordinate, relative to chunk
 
 
|-
 
|-
| F0 00 00 00
+
| NBT Data || Byte Array || Present if data length > 0. Compressed with [[wikipedia:Gzip|gzip]]. Varies
| 4 bits
 
| X co-ordinate, relative to chunk
 
 
|}
 
|}
  
{{anchor|0x35}}
+
'''Actions'''
  
=== Block Change (0x35) ===
+
* '''1''': Set mob displayed inside a mob spawner. Custom 1 contains the [[Entities#Mobs|mob type]]
''Server to Client''
 
  
 +
==== Sign Editor Open ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x36
| Field Name
+
| X || Int || X in block coordinates
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x35
+
| Y || Int || Y in block coordinates
| X
 
| int
 
| <code>502</code>
 
| Block X Coordinate
 
 
|-
 
|-
| Y
+
| Z || Int || Z in block coordinates
| byte
+
|}
| <code>71</code>
+
 
| Block Y Coordinate
+
==== Statistics ====
 +
{| class="wikitable"
 +
! Packet ID
 +
! colspan="2" | Field Name
 +
! Field Type !! Notes
 
|-
 
|-
| Z
+
| rowspan="3" | 0x37
| int
+
| colspan="2" | Count || VarInt || Number of entrys
| <code>18</code>
 
| Block Z Coordinate
 
 
|-
 
|-
| Block Type
+
| rowspan=2 | Entry
| short
+
| Statistic's name || String ||  
| <code>78</code>
 
| The new block type for the block
 
 
|-
 
|-
| Block Metadata
+
| Amount || VarInt || The amount to increase by
| byte
 
| <code>0</code>
 
| The new Metadata for the block
 
|-
 
| Total Size:
 
| colspan="4" | 13 bytes
 
 
|}
 
|}
  
{{anchor|0x36}}
+
==== Player List Item ====
=== Block Action (0x36) ===
 
''Server to Client''
 
 
 
This packet is used for a number of things:
 
* <div class="li">Chests opening and closing
 
* Pistons pushing and pulling
 
* Note blocks playing
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x38
| Field Name
+
| Player name || String || Supports chat colouring, limited to 16 characters.
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x36
+
| Online || Bool || The client will remove the user from the list if false.
| X
 
| int
 
| <code>502</code>
 
| Block X Coordinate
 
 
|-
 
|-
| Y
+
| Ping || Short || Ping, presumably in ms.
| short
+
|}
| <code>71</code>
+
 
| Block Y Coordinate
+
==== Player Abilities ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Z
+
| rowspan="3" | 0x39
| int
+
| Flags || Byte ||
| <code>18</code>
 
| Block Z Coordinate
 
 
|-
 
|-
| Byte 1
+
| Flying speed || Float|| previous integer value divided by 250
| byte
 
| <code>3</code>
 
| Varies depending on block - see below
 
 
|-
 
|-
| Byte 2
+
| Walking speed || Float || previous integer value divided by 250
| byte
+
|}
| <code>17</code>
+
 
| Varies depending on block - see below
+
==== Tab-Complete ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Block ID
+
| rowspan=2| 0x3A
| short
+
| Count || VarInt || Number of following strings
| <code>29</code>
 
| The block id this action is set for
 
 
|-
 
|-
| Total Size:
+
| Match || String || Possible Tab-Complete
| colspan="4" | 15 bytes
 
 
|}
 
|}
See Also: [[Block Actions]]
 
 
{{anchor|0x37}}
 
=== Block Break Animation (0x37) ===
 
''Server to Client''
 
  
 +
==== Scoreboard Objective ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x3B
| Field Name
+
| Objective name || String || An unique name for the objective
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x37
+
| Objective value || String || The text to be displayed for the score.
| Entity ID?
 
| int
 
| 0
 
| Entity breaking the block?
 
 
|-
 
|-
| X
+
| Create/Remove || Byte || 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text.
| int
+
|}
|
+
 
| rowspan="3" | Block position
+
==== Update Score ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Y
+
| rowspan="4" | 0x3C
| int
+
| Item Name || String || An unique name to be displayed in the list.
|
 
 
|-
 
|-
| Z
+
| Update/Remove || Byte || 0 to create/update an item. 1 to remove an item.
| int
 
|
 
 
|-
 
|-
| Destroy Stage
+
| Score Name || String || The unique name for the scoreboard to be updated. Only sent when Update/Remove does not equal 1.
| byte
 
| 1
 
| How far destroyed this block is. (see below)
 
 
|-
 
|-
| Total Size:
+
| Value || Int || The score to be displayed next to the entry. Only sent when Update/Remove does not equal 1.
| colspan="4" | 18 bytes
 
 
|}
 
|}
0-9 are the displayable destroy stages and each other number means that there is no animation on this coordinate.
 
  
You can also set an animation to air! The animation will still be visible.
+
==== Display Scoreboard ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan="2" | 0x3D
 +
| Position || Byte || The position of the scoreboard. 0 = list, 1 = sidebar, 2 = belowName.
 +
|-
 +
| Score Name || String || The unique name for the scoreboard to be displayed.
 +
|}
  
 +
==== Teams ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan="8" | 0x3E
 +
| Team Name || String || A unique name for the team. (Shared with scoreboard).
 +
|-
 +
| Mode || Byte || If 0 then the team is created.
 +
If 1 then the team is removed.
  
{{anchor|0x38}}
+
If 2 the team team information is updated.
  
=== Map Chunk Bulk (0x38) ===
+
If 3 then new players are added to the team.
''Server to Client''
 
  
See also: [[SMP Map Format]]
+
If 4 then players are removed from the team.
 
 
To reduce the number of bytes this packet is used to send chunks together for better compression results.
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| Team Display Name || String || Only if Mode = 0 or 2.
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x38
+
| Team Prefix || String || Only if Mode = 0 or 2. Displayed before the players' name that are part of this team.
| Chunk column count
 
| short
 
|
 
| The number of chunks in this packet
 
 
|-
 
|-
| Data length
+
| Team Suffix || String || Only if Mode = 0 or 2. Displayed after the players' name that are part of this team.
| int
 
|
 
| the size of the data field
 
 
|-
 
|-
| Sky light sent
+
| Friendly fire || Byte || Only if Mode = 0 or 2; 0 for off, 1 for on, 3 for seeing friendly invisibles
| boolean
 
|
 
| Whether or not the chunk data contains a light nibble array. This is true in the main world, false in the end + nether
 
 
|-
 
|-
| Data
+
| Player count || Short || Only if Mode = 0 or 3 or 4. Number of players in the array
| byte array
 
|
 
| Compressed chunk data
 
 
|-
 
|-
| Meta information
+
| Players || Array of strings || Only if Mode = 0 or 3 or 4. Players to be added/remove from the team.
| Special
 
|
 
| see below
 
|-
 
| Total Size:
 
| colspan="4" | 8 + (Chunk data size) + 12 * (Chunk Count) bytes
 
 
|}
 
|}
  
====Meta Information Structure====
+
==== Plugin Message ====
 
 
This structure is repeated for each chunk column sent
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Field Name
+
| rowspan="3" | 0x3F
| Field Type
+
| Channel || String || Name of the "channel" used to send the data.
| Example
 
| Notes
 
 
|-
 
|-
| Chunk X
+
| Length || Short || Length of the following byte array
| int
 
| 10
 
| The X coordinate of the specific chunk
 
 
|-
 
|-
| Chunk Z
+
| Data || Byte Array || Any data.
| int
 
| 10
 
| The Z coordinate of the specific chunk
 
|-
 
| Primary bitmap
 
| unsigned short
 
| 15
 
| A bitmap which specifies which sections are not empty in this chunk
 
|-
 
| Add bitmap
 
| unsigned short
 
| 0
 
| A bitmap which specifies which sections need add information because of very high block ids. not yet used. needs verification
 
|-
 
| Total Size:
 
| colspan="3" | 12 bytes
 
 
|}
 
|}
  
 +
More documentation on this: http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/
  
* If you send this packet to update area surrounding player in the middle of the game, entities within the updated area may become unattackable (vanilla client just won't send "Use Entity (0x07)" packet when you try to hit them, only swing animation, also it will dig blocks through them), even though they will be visible and work correctly in other ways. This is a bug in vanilla client (still there in 1.5.2), but you can workaround it by destroying relevant entities prior to sending 0x38 (via 0x1D) and spawning them again after it.
+
==== Disconnect ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| 0x40
 +
| Reason || String || Displayed to the client when the connection terminates
 +
|}
  
{{anchor|0x3C}}
+
=== Serverbound ===
  
=== Explosion (0x3C) ===
+
==== Keep Alive ====
''Server to Client''
+
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=1 | 0x00
 +
| Keep Alive ID || Int ||
 +
|}
  
Sent when an explosion occurs (creepers, TNT, and ghast fireballs).
+
==== Chat Message ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 +
|-
 +
| rowspan=1 | 0x01
 +
| Message || String ||
 +
|}
  
 +
==== Use Entity ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=2 | 0x02
| Field Name
+
| Target || Int ||
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="9" | 0x3C
+
| Mouse || Byte ||
| X
+
|}
| double
+
 
|
+
==== Player ====
|
+
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Y
+
| rowspan=1 | 0x03
| double
+
| On Ground || Bool || True if the client is on the ground, False otherwise
|
+
|}
|
+
 
 +
==== Player Position ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Z
+
| rowspan=5| 0x04
| double
+
| X || Double || Absolute position
|
 
|
 
 
|-
 
|-
| Radius
+
| Y || Double || Absolute position
| float
 
| 3.0
 
| Currently unused in the client
 
 
|-
 
|-
| Record count
+
| Stance || Double || Used to modify the players bounding box when going up stairs, crouching, etc…
| int
 
|
 
| This is the count, not the size. The size is 3 times this value.
 
 
|-
 
|-
| Records
+
| Z || Double || Absolute position
| (byte, byte, byte) × count
 
|
 
| Each record is 3 signed bytes long, each bytes are the XYZ (respectively) offsets of affected blocks.
 
 
|-
 
|-
| Player Motion X
+
| On Ground || Bool || True if the client is on the ground, False otherwise
| float
+
|}
|
+
 
| X velocity of the player being pushed by the explosion
+
==== Player Look ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Player Motion Y
+
| rowspan=3| 0x05
| float
+
| Yaw || Float || Absolute rotation on the X Axis, in degrees
|
 
| Y velocity of the player being pushed by the explosion
 
 
|-
 
|-
| Player Motion Z
+
| Pitch || Float || Absolute rotation on the Y Axis, in degrees
| float
 
|
 
| Z velocity of the player being pushed by the explosion
 
 
|-
 
|-
| Total Size:
+
| On Ground || Bool || True if the client is on the ground, False otherwise
| colspan="4" | 45 bytes + 3*(Record count) bytes
 
 
|}
 
|}
  
Each block in Records is set to air. Coordinates for each axis in record is int(X) + record.x
+
==== Player Position And Look ====  
 
 
{{anchor|0x3D}}
 
=== Sound Or Particle Effect (0x3D) ===
 
''Server to Client''
 
 
 
Sent when a client is to play a sound or particle effect.
 
 
 
By default, the minecraft client adjusts the volume of sound effects based on distance. The final boolean field is used to disable this, and instead the effect is played from 2 blocks away in the correct direction. Currently this is only used for effect 1013 (mob.wither.spawn), and is ignored for any other value by the client.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=7| 0x06
| Field Name
+
| X || Double || Absolute position
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x3D
+
| Y || Double || Absolute position
| Effect ID
 
| int
 
| 1003
 
| The ID of the effect, see below.
 
 
|-
 
|-
| X
+
| Stance || Double || Used to modify the players bounding box when going up stairs, crouching, etc…
| int
 
|
 
| The X location of the effect multiplied by 8
 
 
|-
 
|-
| Y
+
| Z || Double || Absolute position
| byte
 
|
 
| The Y location of the effect multiplied by 8
 
 
|-
 
|-
| Z
+
| Yaw || Float || Absolute rotation on the X Axis, in degrees
| int
 
|
 
| The Z location of the effect multiplied by 8
 
 
|-
 
|-
| Data
+
| Pitch || Float || Absolute rotation on the Y Axis, in degrees
| int
 
| 0
 
| Extra data for certain effects, see below.
 
 
|-
 
|-
| Disable relative volume
+
| On Ground || Bool || True if the client is on the ground, False otherwise
| boolean
 
| false
 
| See above
 
|-
 
| Total Size:
 
| colspan="4" | 19 bytes
 
 
|}
 
|}
  
====Effects====
+
==== Player Digging ====
 
 
'''Sound''':
 
 
 
*1000: <code>random.click</code>
 
*1001: <code>random.click</code>
 
*1002: <code>random.bow</code>
 
*1003: <code>random.door_open</code> or <code>random.door_close</code> (50/50 chance)
 
*1004: <code>random.fizz</code>
 
*1005: Play a music disc. '''Data''': [http://www.minecraftwiki.net/wiki/Music_Discs Record ID]
 
*''(1006 not assigned)''
 
*1007: <code>mob.ghast.charge</code>
 
*1008: <code>mob.ghast.fireball</code>
 
*1009: <code>mob.ghast.fireball</code>, but with a lower volume.
 
*1010: <code>mob.zombie.wood</code>
 
*1011: <code>mob.zombie.metal</code>
 
*1012: <code>mob.zombie.woodbreak</code>
 
*1013: <code>mob.wither.spawn</code>
 
*1014: <code>mob.wither.shoot</code>
 
*1015: <code>mob.bat.takeoff</code>
 
*1016: <code>mob.zombie.infect</code>
 
*1017: <code>mob.zombie.unfect</code>
 
*1018: <code>mob.enderdragon.end</code>
 
*1020: <code>random.anvil_break</code>
 
*1021: <code>random.anvil_use</code>
 
*1022: <code>random.anvil_land</code>
 
 
 
'''Particle''':
 
 
 
*2000: Spawns 10 smoke particles, e.g. from a fire. '''Data''': direction, see below
 
*2001: Block break. '''Data''': [http://www.minecraftwiki.net/wiki/Data_values Block ID]
 
*2002: Splash potion. Particle effect + glass break sound. '''Data''': [http://www.lb-stuff.com/Minecraft/PotionDataValues1.9pre3.txt Potion ID]
 
*2003: Eye of ender entity break animation - particles and sound
 
*2004: Mob spawn particle effect: smoke + flames
 
*2005: Spawn "happy villager" effect (hearts).
 
 
 
Smoke directions:
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| ID
+
| rowspan="5" | 0x07
| Direction
+
| Status || Byte || The action the player is taking against the block (see below)
 
|-
 
|-
| 0
+
| X || Int || Block position
| South - East
 
 
|-
 
|-
| 1
+
| Y || Byte || Block position
| South
 
 
|-
 
|-
| 2
+
| Z || Int || Block position
| South - West
+
|-
 +
| Face || Byte || The face being hit (see below)
 +
|}
 +
 
 +
Status can (currently) be one of six values:
 +
 
 +
{| class="wikitable"
 +
! Meaning !! Value
 
|-
 
|-
| 3
+
| Started digging || <code>0</code>
| East
 
 
|-
 
|-
| 4
+
| Cancelled digging || <code>1</code>
| (Up or middle ?)
 
 
|-
 
|-
| 5
+
| Finished digging || <code>2</code>
| West
 
 
|-
 
|-
| 6
+
| Drop item stack || <code>3</code>
| North - East
 
 
|-
 
|-
| 7
+
| Drop item || <code>4</code>
| North
 
 
|-
 
|-
| 8
+
| Shoot arrow / finish eating || <code>5</code>
| North - West
 
 
|}
 
|}
  
{{anchor|0x3E}}
+
Notchian clients send a 0 (started digging) when they start digging and a 2 (finished digging) once they think they are finished. If digging is aborted, the client simply send a 1 (Cancel digging).
  
=== Named Sound Effect (0x3E) ===
+
Status code 4 (drop item) is a special case.  In-game, when you use the Drop Item command (keypress 'q'), a dig packet with a status of 4, and all other values set to 0, is sent from client to server. Status code 3 is similar, but drops the entire stack.
''Server to client''
 
  
Used to play a sound effect on the client.
+
Status code 5 (shoot arrow / finish eating) is also a special case. The x, y and z fields are all set to 0 like above, with the exception of the face field, which is set to 255.
  
All known sound effect names can be seen [https://github.com/SirCmpwn/Craft.Net/blob/master/source/Craft.Net.Common/SoundEffect.cs here].
+
The face can be one of six values, representing the face being hit:
  
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
| Value || 0 || 1 || 2 || 3 || 4 || 5
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="6" | 0x3E
 
| Sound name
 
| string
 
| step.grass
 
| 250
 
|-
 
| Effect position X
 
| int
 
| 250
 
| effect X multiplied by 8
 
 
|-
 
|-
| Effect position Y
+
| Offset || -Y || +Y || -Z || +Z || -X || +X
| int
 
| 250
 
| effect Y multiplied by 8
 
|-
 
| Effect position Z
 
| int
 
| 250
 
| effect Z multiplied by 8
 
|-
 
| Volume
 
| float
 
| 9
 
| 1 is 100%, can be more
 
|-
 
| Pitch
 
| byte
 
| 1
 
| 63 is 100%, can be more
 
|-
 
| Total Size:
 
| colspan="4" | 20 bytes + length of string
 
 
|}
 
|}
  
{{anchor|0x3F}}
+
In 1.7.3, when a player opens a door with left click the server receives Packet 0xE+start digging and opens the door.
 
 
=== Particle (0x3F) ===
 
''Server to Client''
 
 
 
This displays the named particle
 
  
 +
==== Player Block Placement ====
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Packet ID !! Field Name !! Field Type !! Notes
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="9" | 0x3F
+
| rowspan="8" | 0x08
| Particle name
+
| X || Int || Block position
| string
 
| <code>hugeexplosion</code>
 
| The name of the particle to create. A list can be found [https://gist.github.com/thinkofdeath/5110835 here]
 
 
|-
 
|-
| X
+
| Y || Unsigned Byte || Block position
| float
 
| 0
 
| X position of the particle
 
 
|-
 
|-
| Y
+
| Z || Int || Block position
| float
 
| 0
 
| Y position of the particle
 
 
|-
 
|-
| Z
+
| Direction || Byte || The offset to use for block/item placement (see below)
| float
 
| 0
 
| Z position of the particle
 
 
|-
 
|-
| Offset X
+
| Held item || [[Slot_Data|Slot]] ||
| float
 
| 0
 
| This is added to the X position after being multiplied by random.nextGaussian()
 
 
|-
 
|-
| Offset Y
+
| Cursor position X || Byte || The position of the crosshair on the block
| float
 
| 0
 
| This is added to the Y position after being multiplied by random.nextGaussian()
 
 
|-
 
|-
| Offset Z
+
| Cursor position Y || Byte ||
| float
 
| 0
 
| This is added to the Z position after being multiplied by random.nextGaussian()
 
 
|-
 
|-
| Particle speed
+
| Cursor position Z || Byte ||
| float
 
| 0
 
| The speed of each particle
 
|-
 
| Number of particles
 
| int
 
| 0
 
| The number of particles to create
 
|-
 
| Total Size:
 
| colspan="4" | 34 bytes + length of string
 
 
|}
 
|}
 +
In normal operation (ie placing a block), this packet is sent once, with the values set normally.
  
{{anchor|0x46}}
+
This packet has a special case where X, Y, Z, and Direction are all -1. (Note that Y is unsigned so set to 255.) This special packet indicates that the currently held item for the player should have its state updated such as eating food, shooting bows, using buckets, etc.
=== Change Game State (0x46) ===
 
''Server to Client''
 
  
This packet appeared with protocol version 10. Currently, it appears when a bed can't be used as a spawn point and when the rain state changes. it could have additional uses in the future.
+
In a Notchian Beta client, the block or item ID corresponds to whatever the client is currently holding, and the client sends one of these packets any time a right-click is issued on a surface, so no assumptions can be made about the safety of the ID.  However, with the implementation of server-side inventory, a Notchian server seems to ignore the item ID, instead operating on server-side inventory information and holding selection. The client has been observed (1.2.5 and 1.3.2) to send both real item IDs and -1 in a single session.
  
The class has an array of strings linked to reason codes 0, 1, 2, and 3 but only the codes for 1 and 2 are null.
+
Special note on using buckets:  When using buckets, the Notchian client might send two packets:  first a normal and then a special case.  The first normal packet is sent when you're looking at a block (e.g. the water you want to scoop up).  This normal packet does not appear to do anything with a Notchian server.  The second, special case packet appears to perform the action - based on current position/orientation and with a distance check - it appears that buckets can only be used within a radius of 6 units.
  
 +
==== Held Item Change ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x09
| Field Name
+
| Slot || Short || The slot which the player has selected (0-8)
| Field Type
+
|}
| Example
+
 
| Notes
+
==== Animation ====
|-
+
{| class="wikitable"
| rowspan="2" | 0x46
+
! Packet ID !! Field Name !! Field Type !! Notes
| Reason
 
| byte
 
| 0
 
|
 
 
|-
 
|-
| Game mode
+
| rowspan=2 | 0x0A
| byte
+
| Entity ID || Int || Player ID
| 0
 
| Used only when reason = 3. 0 is survival, 1 is creative.
 
 
|-
 
|-
| Total Size:
+
| Animation || Byte || Animation ID
| colspan="4" | 3 bytes
 
 
|}
 
|}
  
'''Reason codes'''
+
 
 +
Animation can be one of the following values:
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! ID !! Animation
 
|-
 
|-
! Code
+
| 0 || No animation
! Effect
 
! Text
 
 
|-
 
|-
| 0
+
| 1 || Swing arm
| Invalid Bed
 
| "tile.bed.notValid"
 
 
|-
 
|-
| 1
+
| 2 || Damage animation
| Begin raining
 
| null
 
 
|-
 
|-
| 2
+
| 3 || Leave bed
| End raining
 
| null
 
 
|-
 
|-
| 3
+
| 5 || Eat food
| Change game mode
 
| gameMode.changed
 
 
|-
 
|-
| 4
+
| 6 || Critical effect
| Enter credits
 
|
 
|}
 
 
 
{{anchor|0x47}}
 
=== Spawn Global Entity (0x47) ===
 
''Server to Client''
 
 
 
With this packet, the server notifies the client of thunderbolts striking within a 512 block radius around the player. The coordinates specify where exactly the thunderbolt strikes.
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| 7 || Magic critical effect
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="5" | 0x47
+
| 102 || (unknown)
| Entity ID
 
| int
 
| 4
 
| The entity ID of the thunderbolt
 
 
|-
 
|-
| Type
+
| 104 || Crouch
| byte
 
| 1
 
| The global entity type, currently always 1 for thunderbolt.
 
 
|-
 
|-
| X
+
| 105 || Uncrouch
| int
+
|}
| 133
+
 
| Thunderbolt X a [[Data_Types#Fixed-point_numbers|fixed-point number]]
+
==== Entity Action ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Y
+
| rowspan="3" | 0x0B
| int
+
| Entity ID || Int || Player ID
| 913
 
| Thunderbolt Y a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Z
+
| Action ID || Byte || The ID of the action, see below.
| int
 
| 63552
 
| Thunderbolt Z a [[Data_Types#Fixed-point_numbers|fixed-point number]]
 
 
|-
 
|-
| Total Size:
+
| Jump Boost || Int || Horse jump boost. Ranged from 0 -> 100.
| colspan="4" | 18 bytes
 
 
|}
 
|}
  
{{anchor|0x64}}
+
Action ID can be one of the following values:
 
 
=== Open Window (0x64) ===
 
''Server to Client''
 
 
 
This is sent to the client when it should open an inventory, such as a chest, workbench, or furnace. This message is not sent anywhere for clients opening their own inventory.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! ID !! Action
 
|-
 
|-
| Packet ID
+
| 1 || Crouch
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x64
+
| 2 || Uncrouch
| Window id
 
| byte
 
| 123
 
| A unique id number for the window to be displayed.  Notchian server implementation is a counter, starting at 1.
 
 
|-
 
|-
| Inventory Type
+
| 3 || Leave bed
| byte
 
| 2
 
| The window type to use for display.  Check below
 
 
|-
 
|-
| Window title
+
| 4 || Start sprinting
| string
 
| <code>Chest</code>
 
| The title of the window.
 
 
|-
 
|-
| Number of Slots
+
| 5 || Stop sprinting
| byte
+
|}
| 3
+
 
| Number of slots in the window (excluding the number of slots in the player inventory).
+
==== Steer Vehicle ====
 +
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Use provided window title
+
| rowspan="4" | 0x0C
| boolean
+
| Sideways || Float || Positive to the left of the player
| 1
 
| If false, the client will look up a string like "window.minecart". If true, the client uses what the server provides.
 
 
|-
 
|-
| entityId
+
| Forward || Float || Positive forward
| int
 
| 0
 
| EntityHorse's entityId. Only sent when window type is equal to 11 (AnimalChest).
 
 
|-
 
|-
| Total Size:
+
| Jump || Bool ||
| colspan="4" | 8 bytes + length of string
+
|-
 +
| Unmount || Bool || True when leaving the vehicle
 
|}
 
|}
  
See [[Inventory#Windows|inventory windows]] for further information.
+
==== Close Window ====
 
 
{{anchor|0x65}}
 
 
 
=== Close Window (0x65) ===
 
''Two-Way''
 
 
 
This packet is sent by the client when closing a window. This packet is sent from the server to the client when a window is forcibly closed, such as when a chest is destroyed while it's open.
 
 
 
Note, notchian clients send a close window message with window id 0 to close their inventory even though there is never an Open Window message for inventory.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| 0x0D
| Field Name
+
| Window id || byte || This is the id of the window that was closed. 0 for inventory.
| Field Type
 
| Example
 
| Notes
 
|-
 
| 0x65
 
| Window id
 
| byte
 
| 0
 
| This is the id of the window that was closed. 0 for inventory.
 
|-
 
| Total Size:
 
| colspan="4" | 2 bytes
 
 
|}
 
|}
  
{{anchor|0x66}}
 
=== Click Window (0x66) ===
 
''Client to Server''
 
 
This packet is sent by the player when it clicks on a slot in a window.
 
  
 +
==== Click Window ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="6" | 0x0E
| Field Name
+
| Window ID || Byte || The id of the window which was clicked. 0 for player inventory.
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="6" | 0x66
 
| Window id
 
| byte
 
| <code>0</code>
 
| The id of the window which was clicked. 0 for player inventory.
 
|-
 
| Slot
 
| short
 
| <code>36</code>
 
| The clicked slot. See below.
 
 
|-
 
|-
| Button
+
| Slot || Short || The clicked slot. See below.
| byte
 
| <code>1</code>
 
| The button used in the click. See below.
 
 
|-
 
|-
| Action number
+
| Button || Byte || The button used in the click. See below.
| short
 
| <code>12</code>
 
| A unique number for the action, used for transaction handling (See the Transaction packet).
 
 
|-
 
|-
| Mode
+
| Action number || Short || A unique number for the action, used for transaction handling (See the Transaction packet).
| byte
 
| <code>1</code>
 
| Inventory operation mode. See below.
 
 
|-
 
|-
| Clicked item
+
| Mode || Byte || Inventory operation mode. See below.
| [[Slot_Data|slot]]
 
|
 
|
 
 
|-
 
|-
| Total Size:
+
| Clicked item || [[Slot_Data|Slot]] ||
| colspan="4" | 8 bytes + slot data
 
 
|}
 
|}
  
Line 2,923: Line 1,541:
 
The distinct type of click performed by the client is determined by the combination of the "Mode" and "Button" fields.
 
The distinct type of click performed by the client is determined by the combination of the "Mode" and "Button" fields.
 
{| class="wikitable"
 
{| class="wikitable"
|-
+
! Mode !! Button !! Slot !! Trigger
! Mode
 
! Button
 
! Slot
 
! Trigger
 
 
|-
 
|-
 
! rowspan="2" | 0
 
! rowspan="2" | 0
| 0
+
| 0 || Normal || Left mouse click
| Normal
 
| Left mouse click
 
 
|-
 
|-
| 1
+
| 1 || Normal || Right mouse click
| Normal
 
| Right mouse click
 
 
|-
 
|-
 
! rowspan="2" | 1
 
! rowspan="2" | 1
| 0
+
| 0 || Normal || Shift + left mouse click
| Normal
 
| Shift + left mouse click
 
 
|-
 
|-
| 1
+
| 1 || Normal || Shift + right mouse click ''(Identical behavior)''
| Normal
 
| Shift + right mouse click ''(Identical behavior)''
 
 
|-
 
|-
 
! rowspan="5" | 2
 
! rowspan="5" | 2
| 0
+
| 0 || Normal || Number key 1
| Normal
 
| Number key 1
 
 
|-
 
|-
| 1
+
| 1 || Normal || Number key 2
| Normal
 
| Number key 2
 
 
|-
 
|-
| 2
+
| 2 || Normal || Number key 3
| Normal
 
| Number key 3
 
 
|-
 
|-
 
| ...
 
| ...
Line 2,964: Line 1,564:
 
| ...
 
| ...
 
|-
 
|-
| 8
+
| 8 || Normal || Number key 9
| Normal
 
| Number key 9
 
 
|-
 
|-
 
! rowspan="1" | 3
 
! rowspan="1" | 3
| 2
+
| 2 || Normal || Middle click
| Normal
 
| Middle click
 
 
|-
 
|-
 
! rowspan="4" | 4
 
! rowspan="4" | 4
| 0
+
| 0 || Normal || Drop key (Q)
| Normal
 
| Drop key (Q)
 
 
|-
 
|-
| 1
+
| 1 || Normal || Ctrl + Drop key (Ctrl-Q)
| Normal
 
| Ctrl + Drop key (Ctrl-Q)
 
 
|-
 
|-
| 0
+
| 0 || -999 || Left click outside inventory holding nothing ''(No-op)''
| -999
 
| Left click outside inventory holding nothing ''(No-op)''
 
 
|-
 
|-
| 1
+
| 1 || -999 || Right click outside inventory holding nothing ''(No-op)''
| -999
 
| Right click outside inventory holding nothing ''(No-op)''
 
 
|-
 
|-
 
! rowspan="6" | 5
 
! rowspan="6" | 5
| 0
+
| 0 || -999 || Starting left mouse drag ''(Or middle mouse)''
| -999
 
| Starting left mouse drag ''(Or middle mouse)''
 
 
|-
 
|-
| 4
+
| 4 || -999 || Starting right mouse drag
| -999
 
| Starting right mouse drag
 
 
|-
 
|-
| 1
+
| 1 || Normal || Add slot for left-mouse drag
| Normal
 
| Add slot for left-mouse drag
 
 
|-
 
|-
| 5
+
| 5 || Normal || Add slot for right-mouse drag
| Normal
 
| Add slot for right-mouse drag
 
 
|-
 
|-
| 2
+
| 2 || -999 || Ending left mouse drag
| -999
 
| Ending left mouse drag
 
 
|-
 
|-
| 6
+
| 6 || -999 || Ending right mouse drag
| -999
 
| Ending right mouse drag
 
 
|-
 
|-
! 6
+
! 6  
| 0
+
| 0 || Normal || Double click
| Normal
 
| Double click
 
 
|}
 
|}
  
Line 3,029: Line 1,603:
 
If any of the painting packets other than the "progress" ones are sent out of order (for example, a start, some slots, then another start; or a left-click in the middle) the painting status will be reset.
 
If any of the painting packets other than the "progress" ones are sent out of order (for example, a start, some slots, then another start; or a left-click in the middle) the painting status will be reset.
  
{{anchor|0x67}}
+
==== Confirm Transaction  ====
 
 
=== Set Slot (0x67) ===
 
''Server to Client''
 
 
 
Sent by the server when an item in a slot (in a window) is added/removed.
 
 
 
{| class="wikitable"
 
|-
 
| Packet ID
 
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0x67
 
| Window id
 
| byte
 
| <code>0</code>
 
| The window which is being updated. 0 for player inventory. Note that all known window types include the player inventory. This packet will only be sent for the currently opened window while the player is performing actions, even if it affects the player inventory. After the window is closed, a number of these packets are sent to update the player's inventory window (0).
 
|-
 
| Slot
 
| short
 
| <code>36</code>
 
| The slot that should be updated
 
|-
 
| Slot data
 
| [[Slot_Data|slot]]
 
|
 
|
 
|-
 
| Total Size:
 
| colspan="4" | 4 bytes + slot data
 
|}
 
 
 
Note that if window ID and slot are both -1, it means the item currently attached to the cursor.
 
 
 
See [[Inventory#Windows|inventory windows]] for further information about how slots are indexed.
 
 
 
Slots: [http://gyazo.com/9d52e1fd4dc14790ec66eab4a9aee00e.png]
 
 
 
{{anchor|0x68}}
 
=== Set Window Items (0x68) ===
 
''Server to Client''
 
 
 
[[File:Inventory-slots.png|thumb|The inventory slots]]
 
 
 
Sent by the server when an item in a slot (in a window) is added/removed. This includes the main inventory, equipped armour and crafting slots.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x0F
| Field Name
+
| Window ID || Byte || The id of the window that the action occurred in.
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0x68
 
| Window ID
 
| byte
 
| <code>1</code>
 
| The id of window which items are being sent for. 0 for player inventory.
 
|-
 
| Count
 
| short
 
| <code>4</code>
 
| The number of slots (see below)
 
 
|-
 
|-
| Slot data
+
| Action number || Short || Every action that is to be accepted has a unique number. This field corresponds to that number.
| array of [[Slot_Data|slot]]s
 
|
 
|
 
 
|-
 
|-
| Total Size:
+
| Accepted || Bool || Whether the action was accepted.
| colspan="4" | 4 bytes + size of slot data array
 
 
|}
 
|}
  
See [[Inventory#Windows|inventory windows]] for further information about how slots are indexed.
+
==== Creative Inventory Action ====
 
 
{{anchor|0x69}}
 
 
 
=== Update Window Property (0x69) ===
 
''Server to Client''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="2" | 0x10
| Field Name
+
| Slot || Short || Inventory slot
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x69
+
| Clicked item || [[Slot_Data|Slot]] ||
| Window id
 
| byte
 
| 2
 
| The id of the window.
 
|-
 
| Property
 
| short
 
| 1
 
| Which property should be updated.
 
|-
 
| Value
 
| short
 
| 650
 
| The new value for the property.
 
|-
 
| Total Size:
 
| colspan="4" | 6 bytes
 
 
|}
 
|}
  
'''Furnace'''
+
==== Enchant Item ====
 
 
Properties:
 
 
 
* 0: Progress arrow
 
* 1: Fire icon (fuel)
 
 
 
Values:
 
 
 
* 0-200 for progress arrow
 
* 0-200 for fuel indicator
 
 
 
Ranges are presumably in in-game ticks
 
 
 
'''Enchantment Table'''
 
 
 
Properties: 0, 1 or 2 depending on the "enchantment slot" being given.
 
 
 
Values: The enchantment's level.
 
 
 
{{anchor|0x6A}}
 
=== Confirm Transaction (0x6A) ===
 
''Two-Way''
 
 
 
A packet from the server indicating whether a request from the client was accepted, or whether there was a conflict (due to lag). This packet is also sent from the client to the server in response to a server transaction rejection packet.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="2" | 0x11
| Field Name
+
| Window ID || Byte || The ID sent by [[#0x64|Open Window]]
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0x6A
+
| Enchantment || Byte || The position of the enchantment on the enchantment table window, starting with 0 as the topmost one.
| Window ID
 
| byte
 
| 0
 
| The id of the window that the action occurred in.
 
|-
 
| Action number
 
| short
 
| 12
 
| Every action that is to be accepted has a unique number. This field corresponds to that number.
 
|-
 
| Accepted?
 
| boolean
 
| true
 
| Whether the action was accepted.
 
|-
 
| Total Size:
 
| colspan="4" | 5 bytes
 
 
|}
 
|}
  
{{anchor|0x6B}}
+
==== Update Sign ====
 
 
=== Creative Inventory Action (0x6B) ===
 
''Two-Way''
 
 
 
While the user is in the standard inventory (i.e., not a crafting bench) on a creative-mode server then the server will send this packet:
 
 
 
* <div class="li"> If an item is dropped into the quick bar</div>
 
* If an item is picked up from the quick bar (item id is -1)
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="7" | 0x12
| Field Name
+
| X || Int || Block X Coordinate
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x6B
+
| Y || Short || Block Y Coordinate
| Slot
 
| short
 
| 36
 
| Inventory slot
 
 
|-
 
|-
| Clicked item
+
| Z || Int || Block Z Coordinate
| [[Slot_Data|slot]]
 
|
 
|
 
 
|-
 
|-
| Total Size:
+
| Line 1 || String || First line of text in the sign
| colspan="4" | 3 bytes + slot data
 
|}
 
 
 
{{anchor|0x6C}}
 
=== Enchant Item (0x6C) ===
 
''Client to Server''
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| Line 2 || String || Second line of text in the sign
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="2" | 0x6C
+
| Line 3 || String || Third line of text in the sign
| Window ID
 
| byte
 
| 1
 
| The ID sent by [[#0x64|Open Window]]
 
 
|-
 
|-
| Enchantment
+
| Line 4 || String || Fourth line of text in the sign
| byte
 
| 0
 
| The position of the enchantment on the enchantment table window, starting with 0 as the topmost one.
 
|-
 
| Total Size:
 
| colspan="4" | 3 bytes
 
 
|}
 
|}
  
{{anchor|0x82}}
+
==== Player Abilities ====
=== Update Sign (0x82) ===
 
''Two-Way''
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x13
| Field Name
+
| Flags || Byte ||
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="7" | 0x82
 
| X
 
| int
 
| 128
 
| Block X Coordinate
 
|-
 
| Y
 
| short
 
| 0
 
| Block Y Coordinate
 
|-
 
| Z
 
| int
 
| -128
 
| Block Z Coordinate
 
|-
 
| Line 1
 
| string
 
| <code>First line</code>
 
| First line of text in the sign
 
|-
 
| Line 2
 
| string
 
| <code>Second line</code>
 
| Second line of text in the sign
 
|-
 
| Line 3
 
| string
 
| <code>Third line</code>
 
| Third line of text in the sign
 
 
|-
 
|-
| Line 4
+
| Flying speed || Float|| previous integer value divided by 250
| string
 
| <code>Fourth line</code>
 
| Fourth line of text in the sign
 
 
|-
 
|-
| Total Size:
+
| Walking speed || Float || previous integer value divided by 250
| colspan="4" | 11 bytes + 4 strings
 
 
|}
 
|}
  
This message is sent from the server to the client whenever a sign is discovered or created. This message is sent from the client to the server when the "Done" button is pushed after placing a sign. This message is NOT sent when a sign is destroyed or unloaded.
+
==== Tab-Complete ====
 
 
{{anchor|0x83}}
 
 
 
=== Item Data (0x83) ===
 
''Server to Client''
 
 
 
Sent to specify complex data on an item; currently used only for maps.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| 0x14
| Field Name
+
| Text || String ||
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="4" | 0x83
 
| Item Type
 
| short
 
| <code>358</code>
 
| Type of item being modified
 
|-
 
| Item ID
 
| short
 
| <code>0</code>
 
| The ID (damage value) of the item being modified
 
|-
 
| Text length
 
| short
 
| <code>35</code>
 
| Length of following byte array
 
|-
 
| byte[]
 
| byte array
 
| {0,0,0,20,20,20,20,20}
 
| Array data
 
|-
 
| Total Size:
 
| colspan="4" | 7 bytes + Text length
 
 
|}
 
|}
  
'''Maps'''
 
If the first byte of the text is 0, the next two bytes are X start and Y start and the rest of the bytes are the colors in that column.
 
 
If the first byte of the text is 1, the rest of the bytes are in groups of three: (data, x, y). The lower half of the data is the type (always 0 under vanilla) and the upper half is the direction.
 
 
If the first byte of the text is 2, the second byte is the map scale.
 
 
{{anchor|0x84}}
 
 
=== Update Tile Entity (0x84) ===
 
''Server to Client''
 
 
Essentially a block update on a tile entity.
 
  
 +
==== Client Settings ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="6" | 0x15
| Field Name
+
| Locale || String || en_GB
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="6" | 0x84
+
| View distance || Byte || 0-3 for 'far', 'normal', 'short', 'tiny'.
| X
 
| int
 
|
 
|
 
 
|-
 
|-
| Y
+
| Chat flags || Byte || Chat settings. See notes below.
| short
 
|
 
|
 
 
|-
 
|-
| Z
+
| Unused || Bool || Only observed as true
| int
 
|
 
|
 
 
|-
 
|-
| Action
+
| Difficulty || Byte || Client-side difficulty from options.txt
| byte
 
|
 
| The type of update to perform
 
 
|-
 
|-
| Data length
+
| Show Cape || Bool || Client-side "show cape" option
| Short
 
|
 
| Varies
 
|-
 
| NBT Data
 
| Byte Array
 
|
 
| Present if data length > 0. Compressed with [[wikipedia:Gzip|gzip]]. Varies
 
|-
 
| Total Size:
 
| colspan="4" | 12 + itemstack bytes
 
 
|}
 
|}
  
'''Actions'''
+
Chat flags has several values packed into one byte.
  
* '''1''': Set mob displayed inside a mob spawner. Custom 1 contains the [[Entities#Mobs|mob type]]
+
'''Chat Enabled:''' Bits 0-1. 00: Enabled.  01: Commands only.  10: Hidden.
  
{{anchor|0x85}}
+
'''Colors Enabled:''' Bit 3. 0: Disabled.  1: Enabled.
 
 
=== Tile Editor Open? (0x85) ===
 
''Server to Client''
 
 
 
Sent on placement of sign.
 
 
 
{| class="wikitable"
 
|-
 
| Packet ID
 
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="4" | 0x85
 
| Tile Entity Id
 
| byte
 
| <code>0</code>
 
| Always seems to be 0 (TileEntitySign)
 
|-
 
| X
 
| int
 
| <code>70</code>
 
| X in block coordinates
 
|-
 
| Y
 
| int
 
| <code>70</code>
 
| Y in block coordinates
 
|-
 
| Z
 
| int
 
| <code>-46</code>
 
| Z in block coordinates
 
|-
 
| Total Size:
 
| colspan="4" | 14 bytes
 
|}
 
 
 
{{anchor|0xC8}}
 
 
 
=== Increment Statistic (0xC8) ===
 
''Server to Client''
 
  
 +
==== Client Status ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x16
| Field Name
+
| Action ID || Byte || See below
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="2" | 0xC8
 
| Statistic ID
 
| int
 
| 1003
 
| The ID of the statistic. See [http://www.minecraftwiki.net/wiki/Statistics List of statistics].
 
|-
 
| Amount
 
| '''int'''
 
| 1
 
| The amount to increment the statistic.
 
|-
 
| Total Size:
 
| colspan="4" | 9 bytes
 
 
|}
 
|}
  
{{anchor|0xC9}}
+
Action ID values:
 
 
=== Player List Item (0xC9) ===
 
''Server to Client''
 
 
 
Sent by the notchian server to update the user list (<tab> in the client). The server sends one packet per user per tick, amounting to 20 packets/s for 1 online user, 40 for 2, and so forth.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
|-
 
|-
| Packet ID
+
! Action ID !! Name
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0xC9
 
| Player name
 
| string
 
| barneygale
 
| Supports chat colouring, limited to 16 characters.
 
 
|-
 
|-
| Online
+
| 0 || Perform respawn
| boolean
 
| true
 
| If false, the client will remove the user from the list.
 
 
|-
 
|-
| Ping
+
| 1 || Request stats
| short
 
| 193
 
| Ping, presumably in ms.
 
 
|-
 
|-
| Total Size:
+
| 2 || Open inventory achievement
| colspan="4" | 6 bytes + length of string
 
 
|}
 
|}
  
{{anchor|0xCA}}
+
==== Plugin Message ====
=== Player Abilities (0xCA) ===
 
''Two-Way''
 
 
 
The latter 2 bytes are used to indicate the walking and flying speeds respectively, while the first byte is used to determine the value of 4 booleans.
 
 
The flags are whether damage is disabled (god mode, 8, bit 3), whether the player can fly (4, bit 2), whether the player is flying (2, bit 1), and whether the player is in creative mode (1, bit 0).
 
 
To get the values of these booleans, simply AND (&) the byte with 1,2,4 and 8 respectively, to get the 0 or 1 bitwise value. To set them OR (|) them with their repspective masks.
 
The vanilla client sends this packet when the player starts/stops flying with the second parameter changed accordingly. All other parameters are ignored by the vanilla server.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan="3" | 0x17
| Field Name
+
| Channel || String || Name of the "channel" used to send the data.
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0xCA
 
| Flags
 
| byte
 
| 5
 
|
 
 
|-
 
|-
| Flying speed*
+
| Length || Short || Length of the following byte array
| '''float'''
 
| '''0.05'''
 
| previous integer value divided by 250
 
 
|-
 
|-
| Walking speed*
+
| Data || Byte Array || Any data.
| '''float'''
 
| '''0.1'''
 
| previous integer value divided by 250
 
|-
 
| Total Size:
 
| colspan="4" | 10 bytes
 
 
|}
 
|}
  
The client ignores the walking speed and flying speed fields. Send an 0x2C packet as well.
+
More documentation on this: http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/
 
 
{{anchor|0xCB}}
 
=== Tab-complete (0xCB) ===
 
''Two-way''
 
 
 
Sent C->S when the user presses [tab] while writing text. The payload contains all text behind the cursor.
 
 
 
The server responds with an auto-completion of the last word sent to it. In the case of regular chat, this is a player username. Command names and parameters are also supported.
 
 
 
In the event of more than one possible completion, the server responds with the options packed into the single string field, separated by a null character. Note that as strings are UTF-16, this is two bytes wide.
 
 
 
{| class="wikitable"
 
|-
 
| Packet ID
 
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| 0xCB
 
| Text
 
| string
 
|
 
|
 
|-
 
| Total Size:
 
| colspan="4" | 3 bytes + length of string
 
|}
 
  
{{anchor|0xCC}}
+
== Status ==
=== Client Settings (0xCC) ===
+
The status ping works as follows.
''Client to server''
+
    C->S : Handshake State=1
 +
    C->S : Request
 +
    S->C : Response
 +
    C->S : Ping
 +
    S->C : Ping
  
Sent when the player connects, or when settings are changed.
+
=== Clientbound ===
  
 +
==== Response ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x00
| Field Name
+
| JSON Response || String || https://gist.github.com/thinkofdeath/6927216
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="5" | 0xCC
 
| Locale
 
| string
 
| en_GB
 
|
 
|-
 
| View distance
 
| byte
 
| 0
 
| 0-3 for 'far', 'normal', 'short', 'tiny'.
 
|-
 
| Chat flags
 
| byte
 
| 8
 
| Chat settings. See notes below.
 
|-
 
| Difficulty
 
| byte
 
| 0
 
| Client-side difficulty from options.txt
 
|-
 
| Show Cape
 
| boolean
 
| true
 
| Client-side "show cape" option
 
|-
 
| Total Size:
 
| colspan="4" | 7 bytes + length of string
 
 
|}
 
|}
  
Chat flags has several values packed into one byte.
 
 
'''Chat Enabled:''' Bits 0-1. 00: Enabled.  01: Commands only.  10: Hidden.
 
 
'''Colors Enabled:''' Bit 3.  0: Disabled.  1: Enabled.
 
 
{{anchor|0xCD}}
 
=== Client Statuses (0xCD) ===
 
''Client to server''
 
 
Sent when the client is ready to complete login and when the client is ready to respawn after death.
 
  
 +
==== Ping ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x01
| Field Name
+
| Time || Long || Should be the same as sent by the client
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="1" | 0xCD
 
| Payload
 
| byte
 
| 0
 
| Bit field. 0: Initial spawn, 1: Respawn after death
 
|-
 
| Total Size:
 
| colspan="5" | 2 bytes
 
 
|}
 
|}
  
{{anchor|0xCE}}
+
=== Serverbound ===
=== Scoreboard Objective (0xCE) ===
 
''Server to Client''
 
 
 
This is sent to the client when it should create a new scoreboard or remove one.
 
  
 +
==== Request ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x00 || || ||
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="3" | 0xCE
 
| Objective name
 
| string
 
| <code>deaths</code>
 
| An unique name for the objective
 
|-
 
| Objective value
 
| string
 
| <code>Deaths</code>
 
| The text to be displayed for the score.
 
|-
 
| Create/Remove
 
| byte
 
| 0
 
| 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text. TODO: Check these values
 
|-
 
| Total Size:
 
| colspan="4" | 6 bytes + length of string
 
 
|}
 
|}
  
{{anchor|0xCF}}
 
=== Update Score (0xCF) ===
 
''Server to Client''
 
 
This is sent to the client when it should update a scoreboard item.
 
  
 +
==== Ping ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x01
| Field Name
+
| Time || Long ||
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="4" | 0xCF
 
| Item Name
 
| string
 
| <code>Bob</code>
 
| An unique name to be displayed in the list.
 
|-
 
| Update/Remove
 
| byte
 
| 0
 
| 0 to create/update an item. 1 to remove an item.
 
|-
 
| Score Name
 
| string
 
| <code>deaths</code>
 
| The unique name for the scoreboard to be updated. Only sent when Update/Remove does not equal 1.
 
|-
 
| Value
 
| int
 
| 5
 
| The score to be displayed next to the entry. Only sent when Update/Remove does not equal 1.
 
|-
 
| Total Size:
 
| colspan="4" | 9 bytes + length of strings
 
 
|}
 
|}
  
{{anchor|0xD0}}
+
== Login ==
  
=== Display Scoreboard (0xD0) ===
+
The login process is as follows:
''Server to Client''
+
    C->S : Handshake State=2
 +
    C->S : Login Start
 +
    S->C : Encryption Key Request
 +
    (Client Auth)
 +
    C->S : Encryption Key Response
 +
    (Server Auth, Both enable encryption)
 +
    S->C : Login Success
  
This is sent to the client when it should display a scoreboard.
+
For unauthenticated and* localhost connections there is no encryption.
 
+
In that case Login Start is directly followed by Login Success.
{| class="wikitable"
 
|-
 
| Packet ID
 
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="2" | 0xD0
 
| Position
 
| byte
 
| 1
 
| The position of the scoreboard. 0 = list, 1 = sidebar, 2 = belowName.
 
|-
 
| Score Name
 
| string
 
| <code>deaths</code>
 
| The unique name for the scoreboard to be displayed.
 
|-
 
| Total Size:
 
| colspan="4" | 4 bytes + length of string
 
|}
 
  
{{anchor|0xD1}}
+
<nowiki>*</nowiki> It could be that only one of the two conditions is enough for an unencrypted connection.
=== Teams (0xD1) ===
 
''Server to Client''
 
  
Creates and updates teams.
+
=== Clientbound ===
  
 +
==== Disconnect ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x00
| Field Name
+
| JSON Data || String ||
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="8" | 0xD1
 
| Team Name
 
| string
 
| mcdevs
 
| A unique name for the team. (Shared with scoreboard).
 
|-
 
| Mode
 
| byte
 
| 0
 
| If 0 then the team is created.
 
If 1 then the team is removed.
 
 
 
If 2 the team team information is updated.
 
 
 
If 3 then new players are added to the team.
 
 
 
If 4 then players are removed from the team.
 
|-
 
| Team Display Name
 
| string
 
| McDevs
 
| Only if Mode = 0 or 2.
 
|-
 
| Team Prefix
 
| string
 
|
 
| Only if Mode = 0 or 2. Displayed before the players' name that are part of this team.
 
|-
 
| Team Suffix
 
| string
 
|
 
| Only if Mode = 0 or 2. Displayed after the players' name that are part of this team.
 
|-
 
| Friendly fire
 
| byte
 
| 0
 
| Only if Mode = 0 or 2; 0 for off, 1 for on, 3 for seeing friendly invisibles
 
|-
 
| Player count
 
| short
 
| 0
 
| Only if Mode = 0 or 3 or 4. Number of players in the array
 
|-
 
| Players
 
| Array of strings
 
|
 
| Only if Mode = 0 or 3 or 4. Players to be added/remove from the team.
 
|-
 
| Total Size:
 
| colspan="4" | Variable
 
 
|}
 
|}
  
{{anchor|0xFA}}
+
==== Encryption Request ====
=== Plugin Message (0xFA) ===
 
''Two-Way''
 
 
 
Mods and plugins can use this to send their data. As of 1.3, Minecraft itself uses a number of [[plugin channel]]s. These internal channels are prefixed with <code>MC|</code>.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=5 | 0x01
| Field Name
+
| Server ID || String ||
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="3" | 0xFA
+
| Length || Short || length of public key
| Channel
 
| string
 
| MyMod:testchannel
 
| Name of the "channel" used to send the data.
 
 
|-
 
|-
| length
+
| Public Key || Byte array ||  
| short
 
|
 
| Length of the following byte array
 
 
|-
 
|-
| data
+
| Length || Short || length of verify token
| byte array
 
|
 
| Any data.
 
 
|-
 
|-
| Total Size:
+
| Verify Token || Byte array ||
| colspan="4" | 5 bytes + length of string + length of byte array
+
|-
 
|}
 
|}
  
More documentation on this: http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/
+
==== Login Success ====
 
 
{{anchor|0xFC}}
 
=== Encryption Key Response (0xFC) ===
 
''Two-Way''
 
 
 
See [[Protocol Encryption]] for information on this packet. Bypassing the encryption is possible, authentication for the player name is still needed if the server is in online mode, but instead of sending this packet, you send [[#0xCD|Client Statuses]] instead.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=2 | 0x02
| Field Name
+
| UUID || String ||
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| rowspan="4" | 0xFC
+
| Username || String ||
| Shared secret length
 
| short
 
|
 
|
 
|-
 
| Shared secret
 
| byte array
 
|
 
|
 
|-
 
| Verify token length
 
| short
 
|
 
|
 
|-
 
| Verify token response
 
| byte array
 
|
 
|
 
|-
 
| Total Size:
 
| colspan="4" | 5 bytes + length of shared secret + length of token
 
 
|}
 
|}
  
{{anchor|0xFD}}
+
=== Serverbound ===
=== Encryption Key Request (0xFD) ===
 
''Server to client''
 
 
 
See [[Protocol Encryption]] for information on this packet.
 
  
 +
==== Login Start  ====
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=1 | 0x00
| Field Name
+
| Name || String ||  
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="5" | 0xFD
 
| Server id
 
| string
 
|
 
|
 
|-
 
| Public key length
 
| short
 
|
 
|
 
|-
 
| Public key
 
| byte array
 
|
 
|
 
|-
 
| Verify token length
 
| short
 
|
 
|
 
|-
 
| Verify token
 
| byte array
 
|
 
|
 
|-
 
| Total Size:
 
| colspan="4" | 7 bytes + length of string + length of key + length of token
 
 
|}
 
|}
  
{{anchor|0xFE}}
+
==== Encryption Response ====
 
 
=== Server List Ping (0xFE) ===
 
''Client to Server''
 
 
 
''Main article: [[Server List Ping]]''
 
 
 
This packet is used by the multiplayer menu to retrieve MOTD, version, and player counts.
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Packet ID !! Field Name !! Field Type !! Notes
 
|-
 
|-
| Packet ID
+
| rowspan=4 | 0x01
| Field Name
+
| Length || Short || length of public key
| Field Type
 
| Example
 
| Notes
 
|-
 
| rowspan="1" | 0xFE
 
| Magic
 
| byte
 
| <code>1</code>
 
| always <code>1</code>
 
|-
 
| Total Size:
 
| colspan="4" | 2 bytes
 
|}
 
 
 
{{anchor|0xFF}}
 
 
 
=== Disconnect/Kick (0xFF) ===
 
''Two-Way''
 
 
 
Sent by the server before it disconnects a client, or by the client before it disconnects from the server. The receiver of this packet assumes that the sender has already closed the connection by the time the packet arrives.
 
 
 
Due to race conditions in the client, a local server may need to pause for a short period after sending this packet before closing the connection. An alternative is simply not to close the connection, and wait for the client to do so on receipt of this packet.
 
 
 
When vanilla client quits, reason is "Quitting", but any reason is ok.
 
 
 
{| class="wikitable"
 
 
|-
 
|-
| Packet ID
+
| Public Key || Byte array ||  
| Field Name
 
| Field Type
 
| Example
 
| Notes
 
 
|-
 
|-
| 0xFF
+
| Length || Short || length of verify token
| Reason
 
| string
 
| <code>The server is full!</code>
 
| Displayed to the client when the connection terminates
 
 
|-
 
|-
| Total Size:
+
| Verify Token || Byte array ||
| colspan="4" | 3 bytes + length of strings
+
|-
 
|}
 
|}
  
 
== See Also ==
 
== See Also ==
 +
* [[Data Types]]
 
* [[Protocol History]]
 
* [[Protocol History]]
* [[Data Types]]
 
 
* [[Units of Measurement]]
 
* [[Units of Measurement]]
  
 
[[Category:Protocol Details]]
 
[[Category:Protocol Details]]
 
[[Category:Minecraft Modern]]
 
[[Category:Minecraft Modern]]

Revision as of 13:22, 25 October 2013

This page presents a dissection of the current stable Minecraft protocol. The current pre-release protocol is documented elsewhere. The protocol for Pocket Minecraft is substantially different, and is documented at Pocket Minecraft Protocol.

If you're having trouble, check out the FAQ or ask for help in the IRC channel (#mcdevs on irc.freenode.net).

Note: While you may use the contents of this page without restriction to create servers, clients, bots, etc… you still need to provide attribution to #mcdevs if you copy any of the contents of this page for publication elsewhere.

Term Definition
Player When used in the singular, Player always refers to the client connected to the server
Entity Entity refers to any item, player, mob, minecart or boat in the world. This definition is subject to change as Notch extends the protocol
EID An EID - or Entity ID - is a unique 4-byte integer used to identify a specific entity
XYZ In this document, the axis names are the same as those used by Notch. Y points upwards, X points South, and Z points West.
See also: Data types, Units of Measurement

Contents

Packets

All packets begin with a single "Packet ID" byte. Listed packet size includes this byte. Packets are either "server to client", "client to server", or "Two-Way" (both). Packets are not prefixed with their length. For variable length packets, you must parse it completely to determine its length.

Protocol Version

1.7.2 - 4

Packet format

Field Name Field Type Notes
Length VarInt Includes the type's length
Type VarInt
Data

Handshaking

Serverbound

Handshake

This causes the server to switch into the target state.

Packet ID Field Name Field Type Notes
0x00 Protocol Version VarInt
Server Address (hostname or IP) String localhost
Server Port Unsigned Short 25565
Current state VarInt 1 for status, 2 for login

Play

Clientbound

Keep Alive

Packet ID Field Name Field Type Notes
0x00 Keep Alive ID Int


Join Game

Packet ID Field Name Field Type Notes
0x01 Entity ID Int The player's Entity ID
Gamemode Unsigned Byte 0: survival, 1: creative, 2: adventure. Bit 3 (0x8) is the hardcore flag
Dimension Byte -1: nether, 0: overworld, 1: end
Difficulty Unsigned Byte 0 thru 3 for Peaceful, Easy, Normal, Hard
Max Players Unsigned Byte Used by the client to draw the player list
Level Type String default, flat, largeBiomes, amplified, default_1_1

Warning.png If the Dimension isn't valid then the client will crash

Chat Message

Packet ID Field Name Field Type Notes
0x02 JSON Data String https://gist.github.com/thinkofdeath/e882ce057ed83bac0a1c

Warning.png Malformed JSON will disconnect the client

Time Update

Packet ID Field Name Field Type Notes
0x03 Age of the world Long In ticks; not changed by server commands
Time of day Long The world (or region) time, in ticks. If negative the sun will stop moving at the Math.abs of the time

Entity Equipment

Packet ID Field Name Field Type Notes
0x04 EntityID Int Entity's ID
Slot Short Equipment slot: 0=held, 1-4=armor slot (1 - boots, 2 - leggings, 3 - chestplate, 4 - helmet)
Item Slot Item in slot format

Spawn Position

Packet ID Field Name Field Type Notes
0x05 X Int Spawn X in block coordinates
Y Int Spawn Y in block coordinates
Z Int in block coordinates

Update Health

Packet ID Field Name Field Type Notes
0x06 Health Float 0 or less = dead, 20 = full HP
Food Short 0 - 20
Food Saturation Float Seems to vary from 0.0 to 5.0 in integer increments

Respawn

Packet ID Field Name Field Type Notes
0x07 Dimension Int -1: The Nether, 0: The Overworld, 1: The End
Difficulty Unsigned Byte 0 thru 3 for Peaceful, Easy, Normal, Hard.
Gamemode Unsigned Byte 0: survival, 1: creative, 2: adventure. The hardcore flag is not included
Level Type String Same as Join Game

Warning.png If the Dimension isn't valid then the client will crash

Player Position And Look

Packet ID Field Name Field Type Notes
0x08 X Double Absolute position
Y Double Absolute position
Z Double Absolute position
Yaw Float Absolute rotation on the X Axis, in degrees
Pitch Float Absolute rotation on the Y Axis, in degrees
On Ground Bool True if the client is on the ground, False otherwise

Held Item Change

Packet ID Field Name Field Type Notes
0x09 Slot Byte The slot which the player has selected (0-8)

Use Bed

Packet ID Field Name Field Type Notes
0x0A Entity ID Int Player ID
X Int Bed headboard X as block coordinate
Y Unsigned Byte Bed headboard Y as block coordinate
Z Int Bed headboard Z as block coordinate

Animation

Packet ID Field Name Field Type Notes
0x0B Entity ID VarInt Player ID
Animation Unsigned Byte Animation ID

Animation can be one of the following values:

ID Animation
0 Swing arm
1 Damage animation
2 Leave bed
3 Eat food
4 Critical effect
5 Magic critical effect
102 (unknown)
104 Crouch
105 Uncrouch

Spawn Player

Packet ID Field Name Field Type Notes
0x0C Entity ID VarInt Player's Entity ID
Player UUID String Player's UUID
Player Name String Player's Name
X Int Player X as a Fixed-Point number
Y Int Player X as a Fixed-Point number
Z Int Player X as a Fixed-Point number
Yaw Byte Player rotation as a packed byte
Pitch Byte Player rotation as a packet byte
Current Item Short The item the player is currently holding. Note that this should be 0 for "no item", unlike -1 used in other packets. A negative value crashes clients.
Metadata Metadata The client will crash if no metadata is sent

Warning.png The client will crash if no metadata is sent

Collect Item

Packet ID Field Name Field Type Notes
0x0D Collected Entity ID Int
Collector Entity ID Int

Spawn Object

Packet ID Field Name Field Type Notes
0x0E Entity ID VarInt Entity ID of the object
Type Byte The of object (See Objects
X Int X position as a Fixed-Point number
Y Int Y position as a Fixed-Point number
Z Int Z position as a Fixed-Point number
Pitch Byte The pitch in steps of 2p/256
Yaw Byte The yaw in steps of 2p/256
Data Object Data

Spawn Mob

Packet ID Field Name Field Type Notes
0x0F Entity ID VarInt Entity's ID
Type Unsigned Byte The type of mob. See Mobs
X Int X position as a Fixed-Point number
Y Int Y position as a Fixed-Point number
Z Int Z position as a Fixed-Point number
Pitch Byte The pitch in steps of 2p/256
Head Pitch Byte The pitch in steps of 2p/256
Yaw Byte The yaw in steps of 2p/256
Velocity X Short
Velocity Y Short
Velocity Z Short
Metadata Metadata

Spawn Painting

Packet ID Field Name Field Type Notes
0x10 Entity ID VarInt Entity's ID
Title String Name of the painting. Max length 13
X Int Center X coordinate
Y Int Center Y coordinate
Z Int Center Z coordinate
Direction Int Direction the painting faces (0 -z, 1 -x, 2 +z, 3 +x)

Spawn Experience Orb

Packet ID Field Name Field Type Notes
0x11 Entity ID VarInt Entity's ID
X Int X position as a Fixed-Point number
Y Int Y position as a Fixed-Point number
Z Int Z position as a Fixed-Point number
Count Short The amount of experience this orb will reward once collected

Entity Velocity

Packet ID Field Name Field Type Notes
0x12 Entity ID Int Entity's ID
Velocity X Short Velocity on the X axis
Velocity Y Short Velocity on the Y axis
Velocity Z Short Velocity on the Z axis

Destroy Entities

Packet ID Field Name Field Type Notes
0x13 Count Byte Length of following array
Entity IDs Array of Int The list of entities of destroy

Entity

Packet ID Field Name Field Type Notes
0x14 Entity ID Int Entity's ID

Entity Relative Move

Packet ID Field Name Field Type Notes
0x15 Entity ID Int Entity's ID
DX Byte Change in X position as a Fixed-Point number
DY Byte Change in Y position as a Fixed-Point number
DZ Byte Change in Z position as a Fixed-Point number

Entity Look

Packet ID Field Name Field Type Notes
0x16 Entity ID Int Entity's ID
Yaw Byte The X Axis rotation as a fraction of 360
Pitch Byte The Y Axis rotation as a fraction of 360

Entity Look and Relative Move

Packet ID Field Name Field Type Notes
0x17 Entity ID Int Entity's ID
DX Byte Change in X position as a Fixed-Point number
DY Byte Change in Y position as a Fixed-Point number
DZ Byte Change in Z position as a Fixed-Point number
Yaw Byte The X Axis rotation as a fraction of 360
Pitch Byte The Y Axis rotation as a fraction of 360

Entity Teleport

Packet ID Field Name Field Type Notes
0x18 Entity ID Int Entity's ID
X Int X position as a Fixed-Point number
Y Int Y position as a Fixed-Point number
Z Int Z position as a Fixed-Point number
Yaw Byte The X Axis rotation as a fraction of 360
Pitch Byte The Y Axis rotation as a fraction of 360

Entity Head Look

Packet ID Field Name Field Type Notes
0x19 Entity ID Int Entity's ID
Head Yaw Byte Head yaw in steps of 2p/256

Entity Status

Packet ID Field Name Field Type Notes
0x1A Entity ID Int Entity's ID
Entity Status Byte See below
Entity Status Meaning
2 Entity hurt
3 Entity dead
6 Wolf taming
7 Wolf tamed
8 Wolf shaking water off itself
9 (of self) Eating accepted by server
10 Sheep eating grass
11 Iron Golem handing over a rose
12 Spawn "heart" particles near a villager
13 Spawn particles indicating that a villager is angry and seeking revenge
14 Spawn happy particles near a villager
15 Spawn a "magic" particle near the Witch
16 Zombie converting into a villager by shaking violently (unused in recent update)
17 A firework exploding

Attach Entity

Packet ID Field Name Field Type Notes
0x1B Entity ID Int Entity's ID
Vehicle ID Int Vechicle's Entity ID
Leash Bool If true leashes the entity to the vehicle

Entity Metadata

Packet ID Field Name Field Type Notes
0x1C Entity ID Int Entity's ID
Metadata Metadata

Entity Effect

Packet ID Field Name Field Type Notes
0x1D Entity ID Int Entity's ID
Effect ID Byte See [[1]]
Amplifier Byte
Duration Short

Remove Entity Effect

Packet ID Field Name Field Type Notes
0x1E Entity ID Int Entity's ID
Effect ID Byte

Set Experience

Packet ID Field Name Field Type Notes
0x1F Experience bar Float Between 0 and 1
Level Short
Total Experience Short

Entity Properties

Packet ID Field Name Field Type Notes
0x20 Entity ID Entity's ID
Count Int Length of following array
Properties Array of Property Data

Property Data structure:

Field Name Field Type Notes
Key String
Value Double
List Length Short Number of list elements that follow.
Modifiers Array of Modifier Data http://www.minecraftwiki.net/wiki/Attribute#Modifiers

Known key values:

Key Default Min Max Label
generic.maxHealth 20.0 0.0 Double.MaxValue Max Health
generic.followRange 32.0 0.0 2048.0 Follow Range
generic.knockbackResistance 0.0 0.0 1.0 Knockback Resistance
generic.movementSpeed 0.699999988079071 0.0 Double.MaxValue Movement Speed
generic.attackDamage 2.0 0.0 Double.MaxValue
horse.jumpStrength 0.7 0.0 2.0 Jump Strength
zombie.spawnReinforcements 0.0 0.0 1.0 Spawn Reinforcements Chance

Modifier Data structure:

Field Name Field Type Notes
UUID 128-bit integer
Amount Double
Operation Byte

Chunk Data

Packet ID Field Name Field Type Notes
0x21 Chunk X Int Chunk X coordinate
Chunk Z Int Chunk Z coordinate
Ground-Up continuous Boolean This is True if the packet represents all sections in this vertical column, where the primary bit map specifies exactly which sections are included, and which are air
Primary bit map Unsigned Short Bitmask with 1 for every 16x16x16 section which data follows in the compressed data.
Add bit map Unsigned Short Same as above, but this is used exclusively for the 'add' portion of the payload
Compressed size Int Size of compressed chunk data
Compressed data Byte array The chunk data is compressed using Zlib Deflate

Multi Block Change

Packet ID Field Name Field Type Notes
0x22 Chunk X Int Chunk X coordinate
Chunk Z Int Chunk Z Coordinate
Record count Short The number of blocks affected
Data size Int The total size of the data, in bytes. Should always be 4*record count
Records Array of Records

Record

Bit mask Width Meaning
00 00 00 0F 4 bits Block metadata
00 00 FF F0 12 bits Block ID
00 FF 00 00 8 bits Y co-ordinate
0F 00 00 00 4 bits Z co-ordinate, relative to chunk
F0 00 00 00 4 bits X co-ordinate, relative to chunk

Block Change

Packet ID Field Name Field Type Notes
0x23 X Int Block X Coordinate
Y Unsigned Byte Block Y Coordinate
Z Int Block Z Coordinate
Block Type VarInt The new block type for the block
Block Data Unsigned Byte The new data for the block

Block Action

Packet ID Field Name Field Type Notes
0x24 X Int Block X Coordinate
Y Short Block Y Coordinate
Z Int Block Z Coordinate
Byte 1 Unsigned Byte Varies depending on block - see Block_Actions
Byte 2 Unsigned Byte Varies depending on block - see Block_Actions
Block Type VarInt The block type for the block

Block Break Animation

Packet ID Field Name Field Type Notes
0x25 Entity ID VarInt Entity's ID
X Int Block Position
Y Int
Z Int
Destroy Stage Byte 0 - 9

Map Chunk Bulk

Packet ID Field Name Field Type Notes
0x26 Chunk column count Short The number of chunk in this packet
Data length Int The size of the data field
Sky light sent Bool Whether or not the chunk data contains a light nibble array. This is true in the main world, false in the end + nether
Data Byte Array Compressed chunk data
Meta information Meta See below

Meta

Field Name Field Type Notes
Chunk X Int The X Coordinate of the chunk
Chunk Z Int The Z Coordinate of the chunk
Primary bitmap Unsigned Short A bitmap which specifies which sections are not empty in this chunk
Add bitmap Unsigned Short A bitmap which specifies which sections need add information because of very high block ids. not yet used

Explosion

Packet ID Field Name Field Type Notes
0x27 X Float
Y Float
Z Float
Radius Float Currently unused in the client
Record count Int This is the count, not the size. The size is 3 times this value.
Records (Byte, Byte, Byte) × count Each record is 3 signed bytes long, each bytes are the XYZ (respectively) offsets of affected blocks.
Player Motion X Float X velocity of the player being pushed by the explosion
Player Motion Y Float Y velocity of the player being pushed by the explosion
Player Motion Z Float Z velocity of the player being pushed by the explosion

Effect

Packet ID Field Name Field Type Notes
0x28 Effect ID Int The ID of the effect, see below.
X Int The X location of the effect multiplied by 8
Y Byte The Y location of the effect multiplied by 8
Z Int The Z location of the effect multiplied by 8
Data Int Extra data for certain effects, see below.
Disable relative volume Bool See above

Sound:

  • 1000: random.click
  • 1001: random.click
  • 1002: random.bow
  • 1003: random.door_open or random.door_close (50/50 chance)
  • 1004: random.fizz
  • 1005: Play a music disc. Data: Record ID
  • (1006 not assigned)
  • 1007: mob.ghast.charge
  • 1008: mob.ghast.fireball
  • 1009: mob.ghast.fireball, but with a lower volume.
  • 1010: mob.zombie.wood
  • 1011: mob.zombie.metal
  • 1012: mob.zombie.woodbreak
  • 1013: mob.wither.spawn
  • 1014: mob.wither.shoot
  • 1015: mob.bat.takeoff
  • 1016: mob.zombie.infect
  • 1017: mob.zombie.unfect
  • 1018: mob.enderdragon.end
  • 1020: random.anvil_break
  • 1021: random.anvil_use
  • 1022: random.anvil_land

Particle:

  • 2000: Spawns 10 smoke particles, e.g. from a fire. Data: direction, see below
  • 2001: Block break. Data: Block ID
  • 2002: Splash potion. Particle effect + glass break sound. Data: Potion ID
  • 2003: Eye of ender entity break animation - particles and sound
  • 2004: Mob spawn particle effect: smoke + flames
  • 2005: Spawn "happy villager" effect (hearts).

Smoke directions:

ID Direction
0 South - East
1 South
2 South - West
3 East
4 (Up or middle ?)
5 West
6 North - East
7 North
8 North - West

Sound Effect

Packet ID Field Name Field Type Notes
0x29 Sound name String
Effect position X Int Effect X multiplied by 8
Effect position Y Int Effect Y multiplied by 8
Effect position Z Int Effect Z multiplied by 8
Volume Float 1 is 100%, can be more
Pitch Unsigned Byte 63 is 100%, can be more

Particle

Packet ID Field Name Field Type Notes
0x2A Particle name String The name of the particle to create. A list can be found here
X Float X position of the particle
Y Float Y position of the particle
Z Float Z position of the particle
Offset X Float This is added to the X position after being multiplied by random.nextGaussian()
Offset Y Float This is added to the Y position after being multiplied by random.nextGaussian()
Offset Z Float This is added to the Z position after being multiplied by random.nextGaussian()
Particle speed Float The speed of each particle
Number of particles Int The number of particles to create

Change Game State

Packet ID Field Name Field Type Notes
0x2B Reason Unsigned Byte
Value Float Depends on reason

Reason codes

Code Effect Notes
0 Invalid Bed "tile.bed.notValid"
1 Begin raining
2 End raining
3 Change game mode "gameMode.changed" 0 - Survival, 1 - Creative, 2 - Adventure
4 Enter credits
5 Demo messages 0 - Show welcome to demo screen, 101 - Tell movement controls, 102 - Tell jump control, 103 - Tell inventory control
Bow hit sound
7 Fade value The current darkness value. 1 = Dark, 0 = Bright, Setting the value higher causes the game to change color and freeze
8 Fade time Time in ticks for the sky to fade

Spawn Global Entity

Packet ID Field Name Field Type Notes
0x2C Entity ID VarInt The entity ID of the thunderbolt
Type Byte The global entity type, currently always 1 for thunderbolt.
X Int Thunderbolt X a fixed-point number
Y Int Thunderbolt Y a fixed-point number
Z Int Thunderbolt Z a fixed-point number

Open Window

Packet ID Field Name Field Type Notes
0x2D Window id Unsigned Byte A unique id number for the window to be displayed. Notchian server implementation is a counter, starting at 1.
Inventory Type Unsigned Byte The window type to use for display. Check below
Window title String The title of the window.
Number of Slots Unsigned Byte Number of slots in the window (excluding the number of slots in the player inventory).
Use provided window title Bool If false, the client will look up a string like "window.minecart". If true, the client uses what the server provides.
Entity ID Int EntityHorse's entityId. Only sent when window type is equal to 11 (AnimalChest).

See inventory windows for further information.

Close Window

Packet ID Field Name Field Type Notes
0x2E Window ID Unsigned Byte This is the id of the window that was closed. 0 for inventory.

Set Slot

Packet ID Field Name Field Type Notes
0x2F Window ID Unsigned Byte The window which is being updated. 0 for player inventory. Note that all known window types include the player inventory. This packet will only be sent for the currently opened window while the player is performing actions, even if it affects the player inventory. After the window is closed, a number of these packets are sent to update the player's inventory window (0).
Slot Short The slot that should be updated
Slot data Slot

Window Items

Packet ID Field Name Field Type Notes
0x30 Window ID Unsigned Byte The id of window which items are being sent for. 0 for player inventory.
Count Short The number of slots (see below)
Slot data Array of Slots

See inventory windows for further information about how slots are indexed.

Window Property

Packet ID Field Name Field Type Notes
0x31 Window ID Unsigned Byte The id of the window.
Property Short Which property should be updated.
Value Short The new value for the property.

Furnace

Properties:

  • 0: Progress arrow
  • 1: Fire icon (fuel)

Values:

  • 0-200 for progress arrow
  • 0-200 for fuel indicator

Ranges are presumably in in-game ticks

Enchantment Table

Properties: 0, 1 or 2 depending on the "enchantment slot" being given.

Values: The enchantment's level.

Confirm Transaction

Packet ID Field Name Field Type Notes
0x32 Window ID Unsigned Byte The id of the window that the action occurred in.
Action number Short Every action that is to be accepted has a unique number. This field corresponds to that number.
Accepted Bool Whether the action was accepted.

Update Sign

Packet ID Field Name Field Type Notes
0x33 X Int Block X Coordinate
Y Short Block Y Coordinate
Z Int Block Z Coordinate
Line 1 String First line of text in the sign
Line 2 String Second line of text in the sign
Line 3 String Third line of text in the sign
Line 4 String Fourth line of text in the sign

Maps

Packet ID Field Name Field Type Notes
0x34 Item Damage VarInt The damage value of the map being modified
Length Short Length of following byte array
Data Byte Array Array data

If the first byte of the array is 0, the next two bytes are X start and Y start and the rest of the bytes are the colors in that column.

If the first byte of the array is 1, the rest of the bytes are in groups of three: (data, x, y). The lower half of the data is the type (always 0 under vanilla) and the upper half is the direction.

If the first byte of the array is 2, the second byte is the map scale.

Update Block Entity

Packet ID Field Name Field Type Notes
0x35 X Int
Y Short
Z Int
Action Unsigned Byte The type of update to perform
Data length Short Varies
NBT Data Byte Array Present if data length > 0. Compressed with gzip. Varies

Actions

  • 1: Set mob displayed inside a mob spawner. Custom 1 contains the mob type

Sign Editor Open

Packet ID Field Name Field Type Notes
0x36 X Int X in block coordinates
Y Int Y in block coordinates
Z Int Z in block coordinates

Statistics

Packet ID Field Name Field Type Notes
0x37 Count VarInt Number of entrys
Entry Statistic's name String
Amount VarInt The amount to increase by

Player List Item

Packet ID Field Name Field Type Notes
0x38 Player name String Supports chat colouring, limited to 16 characters.
Online Bool The client will remove the user from the list if false.
Ping Short Ping, presumably in ms.

Player Abilities

Packet ID Field Name Field Type Notes
0x39 Flags Byte
Flying speed Float previous integer value divided by 250
Walking speed Float previous integer value divided by 250

Tab-Complete

Packet ID Field Name Field Type Notes
0x3A Count VarInt Number of following strings
Match String Possible Tab-Complete

Scoreboard Objective

Packet ID Field Name Field Type Notes
0x3B Objective name String An unique name for the objective
Objective value String The text to be displayed for the score.
Create/Remove Byte 0 to create the scoreboard. 1 to remove the scoreboard. 2 to update the display text.

Update Score

Packet ID Field Name Field Type Notes
0x3C Item Name String An unique name to be displayed in the list.
Update/Remove Byte 0 to create/update an item. 1 to remove an item.
Score Name String The unique name for the scoreboard to be updated. Only sent when Update/Remove does not equal 1.
Value Int The score to be displayed next to the entry. Only sent when Update/Remove does not equal 1.

Display Scoreboard

Packet ID Field Name Field Type Notes
0x3D Position Byte The position of the scoreboard. 0 = list, 1 = sidebar, 2 = belowName.
Score Name String The unique name for the scoreboard to be displayed.

Teams

Packet ID Field Name Field Type Notes
0x3E Team Name String A unique name for the team. (Shared with scoreboard).
Mode Byte If 0 then the team is created.

If 1 then the team is removed.

If 2 the team team information is updated.

If 3 then new players are added to the team.

If 4 then players are removed from the team.

Team Display Name String Only if Mode = 0 or 2.
Team Prefix String Only if Mode = 0 or 2. Displayed before the players' name that are part of this team.
Team Suffix String Only if Mode = 0 or 2. Displayed after the players' name that are part of this team.
Friendly fire Byte Only if Mode = 0 or 2; 0 for off, 1 for on, 3 for seeing friendly invisibles
Player count Short Only if Mode = 0 or 3 or 4. Number of players in the array
Players Array of strings Only if Mode = 0 or 3 or 4. Players to be added/remove from the team.

Plugin Message

Packet ID Field Name Field Type Notes
0x3F Channel String Name of the "channel" used to send the data.
Length Short Length of the following byte array
Data Byte Array Any data.

More documentation on this: http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/

Disconnect

Packet ID Field Name Field Type Notes
0x40 Reason String Displayed to the client when the connection terminates

Serverbound

Keep Alive

Packet ID Field Name Field Type Notes
0x00 Keep Alive ID Int

Chat Message

Packet ID Field Name Field Type Notes
0x01 Message String

Use Entity

Packet ID Field Name Field Type Notes
0x02 Target Int
Mouse Byte

Player

Packet ID Field Name Field Type Notes
0x03 On Ground Bool True if the client is on the ground, False otherwise

Player Position

Packet ID Field Name Field Type Notes
0x04 X Double Absolute position
Y Double Absolute position
Stance Double Used to modify the players bounding box when going up stairs, crouching, etc…
Z Double Absolute position
On Ground Bool True if the client is on the ground, False otherwise

Player Look

Packet ID Field Name Field Type Notes
0x05 Yaw Float Absolute rotation on the X Axis, in degrees
Pitch Float Absolute rotation on the Y Axis, in degrees
On Ground Bool True if the client is on the ground, False otherwise

Player Position And Look

Packet ID Field Name Field Type Notes
0x06 X Double Absolute position
Y Double Absolute position
Stance Double Used to modify the players bounding box when going up stairs, crouching, etc…
Z Double Absolute position
Yaw Float Absolute rotation on the X Axis, in degrees
Pitch Float Absolute rotation on the Y Axis, in degrees
On Ground Bool True if the client is on the ground, False otherwise

Player Digging

Packet ID Field Name Field Type Notes
0x07 Status Byte The action the player is taking against the block (see below)
X Int Block position
Y Byte Block position
Z Int Block position
Face Byte The face being hit (see below)

Status can (currently) be one of six values:

Meaning Value
Started digging 0
Cancelled digging 1
Finished digging 2
Drop item stack 3
Drop item 4
Shoot arrow / finish eating 5

Notchian clients send a 0 (started digging) when they start digging and a 2 (finished digging) once they think they are finished. If digging is aborted, the client simply send a 1 (Cancel digging).

Status code 4 (drop item) is a special case. In-game, when you use the Drop Item command (keypress 'q'), a dig packet with a status of 4, and all other values set to 0, is sent from client to server. Status code 3 is similar, but drops the entire stack.

Status code 5 (shoot arrow / finish eating) is also a special case. The x, y and z fields are all set to 0 like above, with the exception of the face field, which is set to 255.

The face can be one of six values, representing the face being hit:

Value 0 1 2 3 4 5
Offset -Y +Y -Z +Z -X +X

In 1.7.3, when a player opens a door with left click the server receives Packet 0xE+start digging and opens the door.

Player Block Placement

Packet ID Field Name Field Type Notes
0x08 X Int Block position
Y Unsigned Byte Block position
Z Int Block position
Direction Byte The offset to use for block/item placement (see below)
Held item Slot
Cursor position X Byte The position of the crosshair on the block
Cursor position Y Byte
Cursor position Z Byte

In normal operation (ie placing a block), this packet is sent once, with the values set normally.

This packet has a special case where X, Y, Z, and Direction are all -1. (Note that Y is unsigned so set to 255.) This special packet indicates that the currently held item for the player should have its state updated such as eating food, shooting bows, using buckets, etc.

In a Notchian Beta client, the block or item ID corresponds to whatever the client is currently holding, and the client sends one of these packets any time a right-click is issued on a surface, so no assumptions can be made about the safety of the ID. However, with the implementation of server-side inventory, a Notchian server seems to ignore the item ID, instead operating on server-side inventory information and holding selection. The client has been observed (1.2.5 and 1.3.2) to send both real item IDs and -1 in a single session.

Special note on using buckets: When using buckets, the Notchian client might send two packets: first a normal and then a special case. The first normal packet is sent when you're looking at a block (e.g. the water you want to scoop up). This normal packet does not appear to do anything with a Notchian server. The second, special case packet appears to perform the action - based on current position/orientation and with a distance check - it appears that buckets can only be used within a radius of 6 units.

Held Item Change

Packet ID Field Name Field Type Notes
0x09 Slot Short The slot which the player has selected (0-8)

Animation

Packet ID Field Name Field Type Notes
0x0A Entity ID Int Player ID
Animation Byte Animation ID


Animation can be one of the following values:

ID Animation
0 No animation
1 Swing arm
2 Damage animation
3 Leave bed
5 Eat food
6 Critical effect
7 Magic critical effect
102 (unknown)
104 Crouch
105 Uncrouch

Entity Action

Packet ID Field Name Field Type Notes
0x0B Entity ID Int Player ID
Action ID Byte The ID of the action, see below.
Jump Boost Int Horse jump boost. Ranged from 0 -> 100.

Action ID can be one of the following values:

ID Action
1 Crouch
2 Uncrouch
3 Leave bed
4 Start sprinting
5 Stop sprinting

Steer Vehicle

Packet ID Field Name Field Type Notes
0x0C Sideways Float Positive to the left of the player
Forward Float Positive forward
Jump Bool
Unmount Bool True when leaving the vehicle

Close Window

Packet ID Field Name Field Type Notes
0x0D Window id byte This is the id of the window that was closed. 0 for inventory.


Click Window

Packet ID Field Name Field Type Notes
0x0E Window ID Byte The id of the window which was clicked. 0 for player inventory.
Slot Short The clicked slot. See below.
Button Byte The button used in the click. See below.
Action number Short A unique number for the action, used for transaction handling (See the Transaction packet).
Mode Byte Inventory operation mode. See below.
Clicked item Slot

See inventory windows for further information about how slots are indexed.

When right-clicking on a stack of items, half the stack will be picked up and half left in the slot. If the stack is an odd number, the half left in the slot will be smaller of the amounts.

The Action number is actually a counter, starting at 1. This number is used by the server as a transaction ID to send back a Transaction packet.

The distinct type of click performed by the client is determined by the combination of the "Mode" and "Button" fields.

Mode Button Slot Trigger
0 0 Normal Left mouse click
1 Normal Right mouse click
1 0 Normal Shift + left mouse click
1 Normal Shift + right mouse click (Identical behavior)
2 0 Normal Number key 1
1 Normal Number key 2
2 Normal Number key 3
... ... ...
8 Normal Number key 9
3 2 Normal Middle click
4 0 Normal Drop key (Q)
1 Normal Ctrl + Drop key (Ctrl-Q)
0 -999 Left click outside inventory holding nothing (No-op)
1 -999 Right click outside inventory holding nothing (No-op)
5 0 -999 Starting left mouse drag (Or middle mouse)
4 -999 Starting right mouse drag
1 Normal Add slot for left-mouse drag
5 Normal Add slot for right-mouse drag
2 -999 Ending left mouse drag
6 -999 Ending right mouse drag
6 0 Normal Double click

Starting from version 1.5, "painting mode" is available for use in inventory windows. It is done by picking up stack of something (more than 1 items), then holding mouse button (left, right or middle) and dragging holded stack over empty (or same type in case of right button ) slots. In that case client sends the following to server after mouse button release (omitting first pickup packet which is sent as usual):

  1. packet with mode 5, slot -999 , button (0 for left | 4 for right);
  2. packet for every slot painted on, mode is still 5, button (1 | 5);
  3. packet with mode 5, slot -999, button (2 | 6);

If any of the painting packets other than the "progress" ones are sent out of order (for example, a start, some slots, then another start; or a left-click in the middle) the painting status will be reset.

Confirm Transaction

Packet ID Field Name Field Type Notes
0x0F Window ID Byte The id of the window that the action occurred in.
Action number Short Every action that is to be accepted has a unique number. This field corresponds to that number.
Accepted Bool Whether the action was accepted.

Creative Inventory Action

Packet ID Field Name Field Type Notes
0x10 Slot Short Inventory slot
Clicked item Slot

Enchant Item

Packet ID Field Name Field Type Notes
0x11 Window ID Byte The ID sent by Open Window
Enchantment Byte The position of the enchantment on the enchantment table window, starting with 0 as the topmost one.

Update Sign

Packet ID Field Name Field Type Notes
0x12 X Int Block X Coordinate
Y Short Block Y Coordinate
Z Int Block Z Coordinate
Line 1 String First line of text in the sign
Line 2 String Second line of text in the sign
Line 3 String Third line of text in the sign
Line 4 String Fourth line of text in the sign

Player Abilities

Packet ID Field Name Field Type Notes
0x13 Flags Byte
Flying speed Float previous integer value divided by 250
Walking speed Float previous integer value divided by 250

Tab-Complete

Packet ID Field Name Field Type Notes
0x14 Text String


Client Settings

Packet ID Field Name Field Type Notes
0x15 Locale String en_GB
View distance Byte 0-3 for 'far', 'normal', 'short', 'tiny'.
Chat flags Byte Chat settings. See notes below.
Unused Bool Only observed as true
Difficulty Byte Client-side difficulty from options.txt
Show Cape Bool Client-side "show cape" option

Chat flags has several values packed into one byte.

Chat Enabled: Bits 0-1. 00: Enabled. 01: Commands only. 10: Hidden.

Colors Enabled: Bit 3. 0: Disabled. 1: Enabled.

Client Status

Packet ID Field Name Field Type Notes
0x16 Action ID Byte See below

Action ID values:

Action ID Name
0 Perform respawn
1 Request stats
2 Open inventory achievement

Plugin Message

Packet ID Field Name Field Type Notes
0x17 Channel String Name of the "channel" used to send the data.
Length Short Length of the following byte array
Data Byte Array Any data.

More documentation on this: http://dinnerbone.com/blog/2012/01/13/minecraft-plugin-channels-messaging/

Status

The status ping works as follows.

   C->S : Handshake State=1
   C->S : Request
   S->C : Response
   C->S : Ping
   S->C : Ping

Clientbound

Response

Packet ID Field Name Field Type Notes
0x00 JSON Response String https://gist.github.com/thinkofdeath/6927216


Ping

Packet ID Field Name Field Type Notes
0x01 Time Long Should be the same as sent by the client

Serverbound

Request

Packet ID Field Name Field Type Notes
0x00


Ping

Packet ID Field Name Field Type Notes
0x01 Time Long

Login

The login process is as follows:

   C->S : Handshake State=2
   C->S : Login Start
   S->C : Encryption Key Request
   (Client Auth)
   C->S : Encryption Key Response
   (Server Auth, Both enable encryption)
   S->C : Login Success

For unauthenticated and* localhost connections there is no encryption. In that case Login Start is directly followed by Login Success.

* It could be that only one of the two conditions is enough for an unencrypted connection.

Clientbound

Disconnect

Packet ID Field Name Field Type Notes
0x00 JSON Data String

Encryption Request

Packet ID Field Name Field Type Notes
0x01 Server ID String
Length Short length of public key
Public Key Byte array
Length Short length of verify token
Verify Token Byte array

Login Success

Packet ID Field Name Field Type Notes
0x02 UUID String
Username String

Serverbound

Login Start

Packet ID Field Name Field Type Notes
0x00 Name String

Encryption Response

Packet ID Field Name Field Type Notes
0x01 Length Short length of public key
Public Key Byte array
Length Short length of verify token
Verify Token Byte array

See Also