Difference between revisions of "Pre-release protocol"

From wiki.vg
Jump to: navigation, search
m (Client Status did change)
m (Use hexadecimals instead of decimals for mask)
 
(503 intermediate revisions by 26 users not shown)
Line 1: Line 1:
This page documents the changes from the [[Protocol|last stable Minecraft release]] (currently [[Protocol version numbers|1.11.2, protocol 316]]) to the current pre-release (currently [[Protocol version numbers|1.12, protocol 335]]). Note that this page contains bleeding-edge information that may not be completely or correctly documented.
+
This page documents the changes from the [[Protocol|last stable Minecraft release]] (currently [[Protocol version numbers|1.15.2, protocol 578]]) to the current pre-release (currently [[Protocol version numbers|20w13b, protocol 709]]). Note that this page contains bleeding-edge information that may not be completely or correctly documented.
  
 
One who wishes to commandeer the merging of this into [[Protocol]] when an update is made must be sure to respect any changes that may have occurred to the respective packets there.
 
One who wishes to commandeer the merging of this into [[Protocol]] when an update is made must be sure to respect any changes that may have occurred to the respective packets there.
Line 18: Line 18:
 
  !colspan="2"| Documentation
 
  !colspan="2"| Documentation
 
  |-
 
  |-
!colspan="4"| Handshaking serverbound
+
!colspan="4"| Handshaking serverbound
{{PacketList|0x00|Handshake}}
+
{{PacketList|0x00|Handshake}}
 
  |-
 
  |-
!colspan="4"| Play clientbound
+
!colspan="4"| Play clientbound
{{PacketList|{{Change|0x28|0x25}}|Entity|pre=unchanged}}
+
{{PacketList|{{Change|0x4E|0x43}}|Spawn Position|pre=unchanged}}
{{PacketList|{{Change|0x25|0x26}}|Entity Relative Move|pre=unchanged}}
+
{{PacketList|{{Change|0x43|0x44}}|Display Scoreboard|pre=unchanged}}
{{PacketList|{{Change|0x26|0x27}}|Entity Look And Relative Move|pre=unchanged}}
+
{{PacketList|{{Change|0x44|0x45}}|Entity Metadata|pre=unchanged}}
{{PacketList|{{Change|0x27|0x28}}|Entity Look|pre=unchanged}}
+
{{PacketList|{{Change|0x45|0x46}}|Attach Entity|pre=unchanged}}
{{PacketList|0x30|Unlock Recipes|rel=added}}
+
{{PacketList|{{Change|0x46|0x47}}|Entity Velocity|pre=unchanged}}
{{PacketList|{{Change|0x30|0x31}}|Destroy Entities|pre=unchanged}}
+
{{PacketList|{{Change|0x47|0x48}}|Entity Equipment|pre=unchanged}}
{{PacketList|{{Change|0x31|0x32}}|Remove Entity Effect|pre=unchanged}}
+
{{PacketList|{{Change|0x48|0x49}}|Set Experience|pre=unchanged}}
{{PacketList|{{Change|0x32|0x33}}|Resource Pack Send|pre=unchanged}}
+
{{PacketList|{{Change|0x49|0x4A}}|Update Health|pre=unchanged}}
{{PacketList|{{Change|0x33|0x34}}|Respawn|pre=unchanged}}
+
{{PacketList|{{Change|0x4A|0x4B}}|Scoreboard Objective|pre=unchanged}}
{{PacketList|{{Change|0x34|0x35}}|Entity Head Look|pre=unchanged}}
+
{{PacketList|{{Change|0x4B|0x4C}}|Set Passengers|pre=unchanged}}
{{PacketList|0x36|Advancement Progress|rel=added}}
+
{{PacketList|{{Change|0x4C|0x4D}}|Teams|pre=unchanged}}
{{PacketList|{{Change|0x35|0x37}}|World Border|pre=unchanged}}
+
{{PacketList|{{Change|0x4D|0x4E}}|Update Score|pre=unchanged}}
{{PacketList|{{Change|0x36|0x38}}|Camera|pre=unchanged}}
 
{{PacketList|{{Change|0x37|0x39}}|Held Item Change (clientbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x38|0x3A}}|Display Scoreboard|pre=unchanged}}
 
{{PacketList|{{Change|0x39|0x3B}}|Entity Metadata|pre=unchanged}}
 
{{PacketList|{{Change|0x3A|0x3C}}|Attach Entity|pre=unchanged}}
 
{{PacketList|{{Change|0x3B|0x3D}}|Entity Velocity|pre=unchanged}}
 
{{PacketList|{{Change|0x3C|0x3E}}|Entity Equipment|pre=unchanged}}
 
{{PacketList|{{Change|0x3D|0x3F}}|Set Experience|pre=unchanged}}
 
{{PacketList|{{Change|0x3E|0x40}}|Update Health|pre=unchanged}}
 
{{PacketList|{{Change|0x3F|0x41}}|Scoreboard Objective|pre=unchanged}}
 
{{PacketList|{{Change|0x40|0x42}}|Set Passengers|pre=unchanged}}
 
{{PacketList|{{Change|0x41|0x43}}|Teams|pre=unchanged}}
 
{{PacketList|{{Change|0x42|0x44}}|Update Score|pre=unchanged}}
 
{{PacketList|{{Change|0x43|0x45}}|Spawn Position|pre=unchanged}}
 
{{PacketList|{{Change|0x44|0x46}}|Time Update|pre=unchanged}}
 
{{PacketList|{{Change|0x45|0x47}}|Title|pre=unchanged}}
 
{{PacketList|{{Change|0x46|0x48}}|Sound Effect|pre=unchanged}}
 
{{PacketList|{{Change|0x47|0x49}}|Player List Header And Footer|pre=unchanged}}
 
{{PacketList|{{Change|0x48|0x4A}}|Collect Item|pre=unchanged}}
 
{{PacketList|{{Change|0x49|0x4B}}|Entity Teleport|pre=unchanged}}
 
{{PacketList|0x4C|Advancements|rel=added}}
 
{{PacketList|{{Change|0x4A|0x4D}}|Entity Properties|pre=unchanged}}
 
{{PacketList|{{Change|0x4B|0x4E}}|Entity Effect|pre=unchanged}}
 
 
  |-
 
  |-
!colspan="4"| Play serverbound
+
!colspan="4"| Play serverbound
{{PacketList|0x01|Prepare Crafting Grid|rel=added}}
+
{{PacketList|0x27|Update Jigsaw Block}}
{{PacketList|{{Change|0x01|0x02}}|Tab-Complete (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x02|0x03}}|Chat Message (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x03|0x04}}|Client Status}}
 
{{PacketList|{{Change|0x04|0x05}}|Client Settings}}
 
{{PacketList|{{Change|0x05|0x06}}|Confirm Transaction (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x06|0x07}}|Enchant Item|pre=unchanged}}
 
{{PacketList|{{Change|0x07|0x08}}|Click Window|pre=unchanged}}
 
{{PacketList|{{Change|0x08|0x09}}|Close Window (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x09|0x0A}}|Plugin Message (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x0A|0x0B}}|Use Entity|pre=unchanged}}
 
{{PacketList|{{Change|0x0B|0x0C}}|Keep Alive (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x0F|0x0D}}|Player|pre=unchanged}}
 
{{PacketList|{{Change|0x0C|0x0E}}|Player Position|pre=unchanged}}
 
{{PacketList|{{Change|0x0D|0x0F}}|Player Position And Look (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x0E|0x10}}|Player Look|pre=unchanged}}
 
{{PacketList|{{Change|0x10|0x11}}|Vehicle Move (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x11|0x12}}|Steer Boat|pre=unchanged}}
 
{{PacketList|{{Change|0x12|0x13}}|Player Abilities (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x13|0x14}}|Player Digging|pre=unchanged}}
 
{{PacketList|{{Change|0x14|0x15}}|Entity Action|pre=unchanged}}
 
{{PacketList|{{Change|0x15|0x16}}|Steer Vehicle|pre=unchanged}}
 
{{PacketList|0x17|Crafting Book Data|rel=added}}
 
{{PacketList|{{Change|0x16|0x18}}|Resource Pack Status|pre=unchanged}}
 
{{PacketList|0x19|Advancement Tab|rel=added}}
 
{{PacketList|{{Change|0x17|0x1A}}|Held Item Change (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x18|0x1B}}|Creative Inventory Action|pre=unchanged}}
 
{{PacketList|{{Change|0x19|0x1C}}|Update Sign|pre=unchanged}}
 
{{PacketList|{{Change|0x1A|0x1D}}|Animation (serverbound)|pre=unchanged}}
 
{{PacketList|{{Change|0x1B|0x1E}}|Spectate|pre=unchanged}}
 
{{PacketList|{{Change|0x1C|0x1F}}|Player Block Placement|pre=unchanged}}
 
{{PacketList|{{Change|0x1D|0x20}}|Use Item|pre=unchanged}}
 
 
  |-
 
  |-
|}
+
!colspan="4"| Login clientbound
 +
{{PacketList|0x02|Login Success}}
 +
|}
  
 
== New/modified data types ==
 
== New/modified data types ==
  
=== Entity Metadata ===
+
No changes so far.
 +
 
 +
== Entity Metadata ==
  
Note that entity metadata is a totally distinct concept from block metadata.  It is not required to send all metadata fields, or even any metadata fields, so long as the terminating entry is correctly sent.
+
{{#vardefine:meta_prerelease|1}}
  
Entity Metadata is an array of entries, each of which looks like the following:
+
=== FishingHook ===
  
{| class="wikitable"
+
{{Metadata inherit|FishingHook|inherits=Entity|start_at=7}}
! Name
 
! Type
 
! Meaning
 
|-
 
| Index
 
| Unsigned Byte
 
| Unique index key determining the meaning of the following value, see the table below. If this is <code>0xff</code> then the it is the end of the Entity Metadata array and no more is read.
 
|-
 
| Type
 
| Optional Byte Enum
 
| Only if Index is not <code>0xff</code>; the type of the index, see the table below
 
|-
 
| Value
 
| Optional ''value of Type''
 
| Only if Index is not <code>0xff</code>: the value of the metadata field
 
|}
 
  
 
{| class="wikitable"
 
{| class="wikitable"
! Value of Type field
 
! [[Data types|Type]] of Value field
 
! Notes
 
|-
 
| 0
 
| Byte
 
|
 
|-
 
| 1
 
| VarInt
 
|
 
|-
 
| 2
 
| Float
 
|
 
|-
 
| 3
 
| String
 
|
 
|-
 
| 4
 
| [[Chat]]
 
|
 
|-
 
| 5
 
| [[Slot]]
 
|
 
|-
 
| 6
 
| Boolean
 
|
 
|-
 
| 7
 
| Rotation
 
| 3 floats: rotation on x, rotation on y, rotation on z
 
|-
 
| 8
 
| [[Data Types#Position|Position]]
 
|
 
|-
 
| 9
 
| OptPosition (Boolean + Optional Position)
 
| Position is present if the Boolean is set to true
 
|-
 
| 10
 
| Direction (VarInt)
 
| (Down = 0, Up = 1, North = 2, South = 3, West = 4, East = 5)
 
|-
 
| 11
 
| OptUUID (Boolean + Optional UUID)
 
| UUID is present if the Boolean is set to true
 
|-
 
| 12
 
| OptBlockID (VarInt)
 
| 0 for absent otherwise, <code><nowiki>id &lt;&lt; 4 | data</nowiki></code>
 
|-style="background-color: #d9ead3;"
 
| 13
 
| [[NBT|NBT Tag]]
 
|
 
|}
 
 
Entity classes also recursively inherit fields from classes they extend.
 
 
=== IllusionIllager ===
 
 
Extends [[#EvocationIllager|EvocationIllager]].
 
 
* ''Entity ID: '''37'''.''
 
 
=== Parrot ===
 
 
Extends [[#TameableAnimal|TameableAnimal]].
 
 
{| class="wikitable" style="background-color: #d9ead3;"
 
 
  ! Index
 
  ! Index
 
  ! Type
 
  ! Type
Line 200: Line 60:
 
  ! Default
 
  ! Default
 
  |-
 
  |-
  | 15
+
  | {{Metadata id|}}
 
  | VarInt
 
  | VarInt
  |colspan="2"| Variant (0: red/blue, 1: blue, 2: green, 3: yellow/blue, 4: silver)
+
  |colspan="2"| Hooked entity id + 1, or 0 if there is no hooked entity
 
  | 0
 
  | 0
 +
|- {{Added}}
 +
| {{Metadata id|added}}
 +
| Boolean
 +
|colspan="2"| Is catchable
 +
| False
 
  |}
 
  |}
  
* ''Entity ID: '''105'''.''
+
=== Abstract Arrow ===
  
=== Player ===
+
{{Metadata inherit|Abstract Arrow|inherits=Entity|start_at=7}}
  
Extends [[#Living|Living]].
+
Abstract base class for [[#Tipped Arrow|Tipped Arrow]] (which is used for regular arrows as well as tipped ones) and [[#Spectral Arrow|Spectral Arrow]].
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 218: Line 83:
 
  ! Default
 
  ! Default
 
  |-
 
  |-
  | 11
+
  | rowspan="3" | {{Metadata id|}}
| Float
+
  | rowspan="3" | Byte
  |colspan="2"| Additional Hearts
+
! Bit mask
  | 0.0
+
! Meaning
 +
  | rowspan="3" | 0
 
  |-
 
  |-
  | 12
+
  | 0x01
  | VarInt
+
  | Is critical
|colspan="2"| Score
 
| 0
 
 
  |-
 
  |-
  |rowspan="10"| 13
+
  | 0x02
  |rowspan="10"| Byte
+
| Is noclip (used by loyalty tridents when returning)
  |colspan="2"| The Displayed Skin Parts bit mask that is sent in [[Protocol#Client Settings|Client Settings]]
+
|- {{removed}}
  |rowspan="10"| 0
+
  | {{Metadata id|removed}}
 +
| OptUUID
 +
  |colspan="2"| Unused
 +
  | Empty
 
  |-
 
  |-
! Bit mask !! Meaning
+
  | {{Metadata id|}}
  |-
 
| 0x01 || Cape enabled
 
|-
 
| 0x02 || Jacket enabled
 
|-
 
| 0x04 || Left sleeve enabled
 
|-
 
| 0x08 || Right sleeve enabled
 
|-
 
| 0x10 || Left pants leg enabled
 
|-
 
| 0x20 || Right pants leg enabled
 
|-
 
| 0x40 || Hat enabled
 
|-
 
| 0x80 || ''Unused''
 
|-
 
| 14
 
 
  | Byte
 
  | Byte
  |colspan="2"| Main hand (0 : Left, 1 : Right)
+
  |colspan="2"| Peircing level
| 1
+
  | 0
|- style="background-color: #d9ead3;"
 
| 15
 
| NBT Tag
 
|colspan="2"|Left shoulder entity data
 
|
 
|- style="background-color: #d9ead3;"
 
| 16
 
| NBT Tag
 
|colspan="2"|Right shoulder entity data
 
  |  
 
 
  |}
 
  |}
  
== Block Actions ==
+
=== Tipped Arrow ===
  
== Note Block ==
+
{{Metadata inherit|Tipped Arrow|inherits=Abstract Arrow}}
  
Displays a colored note particle and plays the appropriate note sound effect.
+
Used for both tipped and regular arrows. If not tipped, then color is set to -1 and no tipped arrow particles are used.
 
 
=== Action IDs ===
 
 
 
The action ID is used to determine the instrument to play.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
 +
! Index
 +
! Type
 +
!style="width: 250px;" colspan="2"| Meaning
 +
! Default
 
  |-
 
  |-
! Type ID
+
  | {{Metadata id|}}
! Instrument
+
  | VarInt
! Material/block
+
  |colspan="2"| Color (-1 for no particles)
! Sound
+
  | -1
|-
 
| 0
 
| Harp
 
| Any other material
 
| <code>block.note.harp</code>
 
|-
 
| 1
 
| Bass Drum
 
  | Stone
 
| <code>block.note.harp</code>
 
  |-
 
  | 2
 
| Snare Drum
 
| Sand
 
| <code>block.note.snare</code>
 
|-
 
| 3
 
| Clicks/Sticks
 
| Glass
 
| <code>block.note.hat</code>
 
|-
 
| 4
 
| Bass guitar
 
| Wood
 
| <code>block.note.bass</code>
 
|- style="background-color: #d9ead3;"
 
| 5
 
| Flute
 
| Clay
 
| <code>block.note.flute</code>
 
|- style="background-color: #d9ead3;"
 
| 6
 
| Bell
 
| Gold block
 
| <code>block.note.bell</code>
 
|- style="background-color: #d9ead3;"
 
| 7
 
| Guitar
 
| Wool
 
| <code>block.note.guitar</code>
 
  |- style="background-color: #d9ead3;"
 
| 8
 
| Chime
 
| Packed ice
 
| <code>block.note.chime</code>
 
|- style="background-color: #d9ead3;"
 
| 9
 
| Xylophone
 
| Bone block
 
| <code>block.note.xylophone</code>
 
 
  |}
 
  |}
  
Any unknown ID is treated as if it were <code>0</code>.
+
=== Spectral Arrow ===
 
 
The sound event <code>block.note.pling</code> is unassigned and unused.
 
 
 
=== Action param ===
 
 
 
The pitch of the note (between 0–24 inclusive where 0 is the lowest and 24 is the highest). More information about how the pitch values correspond to notes in real life and how they correspond to pitch scaling on the sound effects can be found in the {{Minecraft Wiki|Note Block}} article on the Minecraft wiki.
 
 
 
== Chat components ==
 
 
 
==== Translation component ====
 
 
 
{{Need Info|Is using this with an invalid key intended or deprecated?  Also, what exactly happens on invalid formats?}}
 
 
 
Translates text into the current language.  If the JSON contains a <code>translate</code> key, then the component is a translation component.
 
 
 
Translation supports <code>%s</code> and <code>%%</code> format tokens.  <code>%%</code> is just an escaped percent symbol.  <code>%s</code> marks text to replace using content from the optional <code>with</code> tag.  <code>with</code> is an array of components.
 
 
 
{{Change||As a special case, if the translation key is <code>chat.type.text</code>, it will be changed to <code>chat.type.text.narrate</code> when passed to narrator (although it will remain as <code>chat.type.text</code> in chat).}}
 
  
==== Keybind component ====
+
{{Metadata inherit|Spectral Arrow|inherits=Abstract Arrow}}
  
{{change||Displays the client's current keybind for the specified key. If the component contains a <code>keybind</code> key, then it is a keybind component.  The value is named after the keys in {{Minecraft Wiki|options.txt}} (for instance, for <code>key_key.forward</code> in options.txt, <code>key.forward</code> would be used in the component and <kbd>W</kbd> would be displayed).  For keys that are not known, the value provided should be displayed instead (for instance <code>key.invalid</code> would remain as <code>key.invalid</code>).}}
+
No additional metadata.
 
 
== Plugin Channels ==
 
  
No changes so far.
+
=== Trident ===
  
== Play ==
+
{{Metadata inherit|Trident|inherits=Abstract Arrow}}
 
 
=== Clientbound ===
 
 
 
==== Update Block Entity ====
 
 
 
Sets tile entity associated with the block at the given location.
 
  
 
{| class="wikitable"
 
{| class="wikitable"
  ! Packet ID
+
  ! Index
  ! State
+
  ! Type
! Bound To
+
  !style="width: 250px;" colspan="2"| Meaning
! Field Name
+
  ! Default
  ! Field Type
 
  ! Notes
 
 
  |-
 
  |-
  |rowspan="3"| 0x09
+
  | {{Metadata id|}}
  |rowspan="3"| Play
+
  | VarInt
  |rowspan="3"| Client
+
  |colspan="2"| Loyalty level (enchantment)
| Location
+
  | 0
| Position
 
  |  
 
 
  |-
 
  |-
  | Action
+
  | {{Metadata id|}}
| Unsigned Byte
+
  | Boolean
  | The type of update to perform, see below
+
  |colspan="2"| Has enchantment glint
  |-
+
  | False
| NBT Data
 
  | [[NBT|NBT Tag]]
 
| Data to set.  May be a TAG_END (0), in which case the block entity at the given location is removed (though this is not required since the client will remove the block entity automatically on chunk unload or block removal)
 
 
  |}
 
  |}
  
''Action'' field:
+
=== Strider ===
  
* '''1''': Set data of a mob spawner (everything except for SpawnPotentials: current delay, min/max delay, mob to be spawned, spawn count, spawn range, etc.)
+
{{Metadata inherit|Strider|inherits=Animal|start_at=16}}
* '''2''': Set command block text (command and last execution status)
 
* '''3''': Set the level, primary, and secondary powers of a beacon
 
* '''4''': Set rotation and skin of mob head
 
* '''5''': Set type of flower in flower pot
 
* '''6''': Set base color and patterns on a banner
 
* '''7''': Set the data for a Structure tile entity
 
* '''8''': Set the destination for a end gateway
 
* '''9''': Set the text on a sign
 
* '''10''': Declare a shulker box (unclear if there is any actual data)
 
* {{Change||'''11''': Set the color of a bed}}
 
  
==== Unlock Recipes ====
+
{| class="wikitable" {{added}}
 
+
  ! Index
{| class="wikitable"
+
  ! Type
  ! Packet ID
+
  !style="width: 250px;" colspan="2"| Meaning
  ! State
+
  ! Default
  ! Bound To
 
! Field Name
 
! Field Type
 
  ! Notes
 
 
  |-
 
  |-
  |rowspan="8"| 0x30
+
  | {{Metadata id|}}
|rowspan="8"| Play
 
|rowspan="8"| Client
 
|-
 
| Action
 
 
  | VarInt
 
  | VarInt
  | 0: init, 1: add, 2: remove
+
|colspan="2"| Total time to "boost" with warped fungi for
 +
  | 0
 
  |-
 
  |-
  | Crafting Book Open
+
  | {{Metadata id|}}
 
  | Boolean
 
  | Boolean
  | If true, then the crafting book will be open when the player opens its inventory.
+
  |colspan="2"| Should display name tag (true unless riding a vehicle or on or in a block tagged with strider_warm_blocks (default: lava))
 +
| false
 
  |-
 
  |-
  | Filtering Craftable
+
  | {{Metadata id|}}
 
  | Boolean
 
  | Boolean
  | If true, then the filtering option is active when the players opens its inventory.
+
  |colspan="2"| Has saddle
|-
+
  | false
| Array size 1
 
| VarInt
 
| Number of elements in the following array
 
|-
 
| Recipe IDs
 
| Array of VarInt
 
|
 
|-
 
| Array size 2
 
| Optional VarInt
 
| Number of elements in the following array, only present if mode is 0 (init)
 
|-
 
| Recipe IDs
 
| Optional Array of VarInt, only present if mode is 0 (init)
 
  |
 
 
  |}
 
  |}
Action:
 
* 0 (init) = All the recipes in the list 2 will added to the recipe book. All the recipes in list 1 will be tagged as displayed, recipes that aren't tagged will be shown in the notification. VERIFY LIST ORDER?
 
* 1 (add) = All the recipes in the list are added and their icon will be shown in the notification.
 
* 2 (remove) = Remove all the recipes in the list. This allows them to re-displayed when they are readded.
 
  
Recipe ID:
+
=== Hoglin ===
These are hardcoded values in the client and server, all the recipe json files will be loaded in a specific order (alphabetical, like sounds) and internal ids will be assigned in that order. There are also inbuilt recipes like fireworks, banners, etc., these are the first recipes to have their id assigned. Due the fact that the recipes are loaded in a specific order will the ids very likely change when recipes get added. [https://twitter.com/dinnerbone/status/856505341479145472 Custom recipes are scheduled for Minecraft 1.13], so most likely will things change a bit in that version.
 
  
==== Advancement Progress ====
+
{{Metadata inherit|Hoglin|inherits=Animal|start_at=16}}
  
{| class="wikitable"
+
No additional metadata.
! Packet ID
 
! State
 
! Bound To
 
! Field Name
 
! Field Type
 
! Notes
 
|-
 
|rowspan="2"| 0x36
 
|rowspan="2"| Play
 
|rowspan="2"| Client
 
| Has id
 
| Boolean
 
| Indicates if the next field is present
 
|-
 
| ID
 
| Optional Identifier
 
|
 
|}
 
  
==== Advancements ====
+
=== Piglin ===
  
{| class="wikitable"
+
{{Metadata inherit|Piglin|inherits=Monster|start_at=15}}
! Packet ID
 
! State
 
! Bound To
 
!colspan="2"| Field Name
 
!colspan="2"| Field Type
 
! Notes
 
|-
 
|rowspan="9"| 0x4C
 
|rowspan="9"| Play
 
|rowspan="9"| Client
 
|colspan="2"| Reset/Clear
 
|colspan="2"| Boolean
 
| Whether to reset/clear the current advancements
 
|-
 
|colspan="2"| Mapping size
 
|colspan="2"| VarInt
 
| Size of the following array
 
|-
 
|rowspan="2"| Advancement mapping
 
| Key
 
|rowspan="2"| Array
 
| Identifier
 
| The identifier of the advancement
 
|-
 
| Value
 
| Advancement
 
| See below
 
|-
 
|colspan="2"| List size
 
|colspan="2"| VarInt
 
| Size of the following array
 
|-
 
|colspan="2"| Identifiers
 
|colspan="2"| Array of Identifier
 
| The identifiers of the advancements that should be removed
 
|-
 
|colspan="2"| Progress size
 
|colspan="2"| VarInt
 
| Size of the following array
 
|-
 
|rowspan="2"| Progress mapping
 
| Key
 
|rowspan="2"| Array
 
| Identifier
 
| The identifier of the advancement
 
|-
 
| Value
 
| Advancement progress
 
| See below
 
|}
 
  
Advancement structure:
+
{| class="wikitable" {{added}}
 
+
! Index
{| class="wikitable"
+
! Type
  !colspan="2"| Field Name
+
  !style="width: 250px;" colspan="2"| Meaning
!colspan="2"| Field Type
+
  ! Default
  ! Notes
 
 
  |-
 
  |-
  |colspan="2"| Has parent
+
  | {{Metadata id|}}
  |colspan="2"| Boolean
+
| Boolean
  | Indicates whether the next field exists.
+
  |colspan="2"| Is baby
 +
  | false
 
  |-
 
  |-
  |colspan="2"| Parent id
+
  | {{Metadata id|}}
|colspan="2"| Optional Identifier
+
  | Boolean
  | The identifier of the parent advancement.
+
  |colspan="2"| Is immune to zombification
|-
+
  | false
|colspan="2"| Has display
 
|colspan="2"| Boolean
 
| Indicates whether the next field exists
 
|-
 
|colspan="2"| Display data
 
|colspan="2"| Optional advancement display
 
| See below.
 
|-
 
|colspan="2"| Number of criteria
 
  |colspan="2"| VarInt
 
| Size of the following array
 
|-
 
|rowspan="2"| Criteria
 
| Key
 
|rowspan="2"| Array
 
| Identifier
 
| The identifier of the criterion
 
|-
 
| Value
 
| '''Void'''
 
| There is ''no'' content written here.  Perhaps this will be expanded in the future?
 
|-
 
|colspan="2"| Array length
 
|colspan="2"| VarInt
 
| Number of arrays in the following array
 
|-
 
|rowspan="2"| Requirements
 
| Array length 2
 
|rowspan="2"| Array
 
| VarInt
 
| Number of elements in the following array
 
|-
 
| Requirement
 
| Array of String
 
| Array of required criteria
 
|}
 
 
 
Advancement display:
 
 
 
{| class="wikitable"
 
! Field Name
 
! Field Type
 
! Notes
 
|-
 
| Title
 
| Chat
 
|
 
|-
 
| Description
 
| Chat
 
|
 
|-
 
| Icon
 
| [[Slot]]
 
|
 
|-
 
| Frame type
 
| VarInt enum
 
| 0 = <code>task</code>, 1 = <code>challenge</code>, 2 = <code>goal</code>
 
|-
 
| Flags
 
| Integer
 
| 0x1: has background texture; 0x2: <code>show_toast</code>; 0x4: <code>hidden</code>
 
|-
 
| Background texture
 
| Optional Identifier
 
| Background texture location.  Only if flags indicates it.
 
|-
 
| X coord
 
| Float
 
  |  
 
 
  |-
 
  |-
  | Y coord
+
  | {{Metadata id|}}
| Float
 
|
 
|}
 
 
 
Advancement progress:
 
 
 
{| class="wikitable"
 
!colspan="2"| Field Name
 
!colspan="2"| Field Type
 
! Notes
 
|-
 
|colspan="2"| Size
 
|colspan="2"| VarInt
 
| Size of the following array
 
|-
 
|rowspan="2"| Criteria
 
| Criterion identifier
 
|rowspan="2"| Array
 
| Identifier
 
| The identifier of the criterion.
 
|-
 
| Criterion progress
 
| Criterion progress
 
|
 
|}
 
 
 
Criterion progress:
 
 
 
{| class="wikitable"
 
! Field Name
 
! Field Type
 
! Notes
 
|-
 
| Achieved
 
 
  | Boolean
 
  | Boolean
  | If true, next field is present
+
  |colspan="2"| Is charging crossbow
|-
+
  | false
| Date of achieving
 
| Optional Long
 
  | As returned by [https://docs.oracle.com/javase/6/docs/api/java/util/Date.html#getTime() <code>Date.getTime</code>]
 
 
  |}
 
  |}
  
 +
=== {{Change|Zombie Pigman|Zombified Piglin}} ===
  
+
{{Metadata inherit|{{Change|Zombie Pigman|Zombified Piglin}}|inherits=Zombie|start_at=18}}
=== Serverbound ===
 
  
==== Prepare Crafting Grid ====
+
No additional metadata.
  
{| class="wikitable"
+
== Block Actions ==
! Packet ID
 
! State
 
! Bound To
 
!colspan="2"| Field Name
 
!colspan="2"| Field Type
 
! Notes
 
|-
 
|rowspan="12"| 0x01
 
|rowspan="12"| Play
 
|rowspan="12"| Server
 
|colspan="2"| Window ID
 
|colspan="2"| Byte
 
| The window id.
 
|-
 
|colspan="2"| Action number
 
|colspan="2"| Short
 
| The transaction number. Will be send to the client in a Confirm Transaction packet.
 
|-
 
|colspan="2"| Array size
 
|colspan="2"| Short
 
| Number of elements in the following array
 
|-
 
|rowspan="3"| Return Entry
 
| Item
 
|rowspan="3"| Array
 
| Slot
 
| The item stack that will be put in the inventory slot
 
|-
 
| Crafting Slot
 
| Byte
 
| The crafting slot index in the active container
 
|-
 
| Player Slot
 
| Byte
 
| The player slot index in the player inventory
 
|-
 
|colspan="2"| Array Size
 
|colspan="2"| Short
 
| Number of elements in the following array
 
|-
 
|rowspan="3"| Prepare Entry
 
| Item
 
|rowspan="3"| Array
 
| Slot
 
| The item stack that will be put in the crafting slot
 
|-
 
| Crafting Slot
 
| Byte
 
| The crafting slot index in the active container
 
|-
 
| Player Slot
 
| Byte
 
| The player slot index in the player inventory
 
|}
 
  
This packet is send when a player clicks a recipe in the crafting book that is craftable (white border).
+
No changes so far.
  
1. Return Entries:
+
== Inventories ==
* All the items on the crafting slot are set to null/empty.
 
* Every entry item stack will be added to the player inventory, to the specific player slot.
 
  
2. Prepare Entries:
+
No changes so far.
* All the items on the player inventory slots their quantity is decreased by 1.
 
* Every entry item stack will be put in the proper crafting grid slot.
 
  
The server will send a Confirm Transaction packet back to the client with the provided transaction id.
+
== Plugin Channels ==
  
==== Client Status ====
+
No changes so far.
  
Sent when the client is ready to complete login and when the client is ready to respawn after death.
+
== Play ==
  
{| class="wikitable"
+
=== Clientbound ===
! Packet ID
 
! State
 
! Bound To
 
! Field Name
 
! Field Type
 
! Notes
 
|-
 
|rowspan="1"| 0x04
 
|rowspan="1"| Play
 
|rowspan="1"| Server
 
| Action ID
 
| VarInt Enum
 
| See below
 
|}
 
  
''Action ID'' values:
+
No changes so far.
  
{| class="wikitable"
+
=== Serverbound ===
|-
 
! Action ID
 
! Action
 
|-
 
| 0
 
| Perform respawn
 
|-
 
| 1
 
| Request stats
 
|-
 
| {{Change|2|}}
 
| {{Change|Open inventory|}}
 
|}
 
  
==== Client Settings ====
+
==== Update Jigsaw Block ====
  
Sent when the player connects, or when settings are changed.
+
Sent when Done is pressed on the {{Minecraft Wiki|Jigsaw Block}} interface.
  
 
{| class="wikitable"
 
{| class="wikitable"
Line 788: Line 247:
 
  ! Notes
 
  ! Notes
 
  |-
 
  |-
  |rowspan="6"| 0x05
+
  |rowspan="7"| 0x27
  |rowspan="6"| Play
+
  |rowspan="7"| Play
  |rowspan="6"| Server
+
  |rowspan="7"| Server
  | Locale
+
  | Location
  | String ({{Change|7|16}})
+
| Position
  | e.g. en_GB.
+
| Block entity location
 +
|- {{Removed}}
 +
| Attachment type
 +
| Identifier
 +
|
 +
|- {{Added}}
 +
| Name
 +
| Identifier
 +
|
 +
|- {{Added}}
 +
| Target
 +
| Identifier
 +
|
 +
|-
 +
  | {{Change|Target pool|Pool}}
 +
  | Identifier
 +
|
 
  |-
 
  |-
  | View Distance
+
  | Final state
  | Byte
+
  | String
  | Client-side render distance, in chunks
+
  | "Turns into" on the GUI, <code>final_state</code> in NBT
  |-
+
  |- {{Added}}
| Chat Mode
+
  | Joint type
| VarInt Enum
+
  | String
| 0: enabled, 1: commands only, 2: hidden.  See [[Chat#Processing chat|processing chat]] for more information.
+
  | <code>rollable</code> if the attached piece can be rotated, else <code>aligned</code>
|-
 
| Chat Colors
 
| Boolean
 
| “Colors” multiplayer setting
 
|-
 
| Displayed Skin Parts
 
| Unsigned Byte
 
| Bit mask, see below
 
|-
 
| Main Hand
 
| VarInt Enum
 
| 0: Left, 1: Right
 
|}
 
 
 
''Displayed Skin Parts'' flags:
 
 
 
* Bit 0 (0x01): Cape enabled
 
* Bit 1 (0x02): Jacket enabled
 
* Bit 2 (0x04): Left Sleeve enabled
 
* Bit 3 (0x08): Right Sleeve enabled
 
* Bit 4 (0x10): Left Pants Leg enabled
 
* Bit 5 (0x20): Right Pants Leg enabled
 
* Bit 6 (0x40): Hat enabled
 
 
 
The most significant bit (bit 7, 0x80) is unused.
 
 
 
==== Crafting Book Data ====
 
 
 
{| class="wikitable"
 
  ! Packet ID
 
! State
 
! Bound To
 
!colspan="2"| Field Name
 
! Field Type
 
! Notes
 
  |-
 
  |rowspan="5"| 0x17
 
|rowspan="5"| Play
 
|rowspan="5"| Server
 
|colspan="2"| Type
 
| VarInt
 
| Determines the format of the rest of the packet
 
|-
 
! Type
 
! Field Name
 
!
 
!
 
|-
 
| 0: Displayed Recipe
 
| Recipe ID
 
| Int
 
| The internal id of the displayed recipe.
 
|-
 
|rowspan="2"| 1: Crafting Book Status
 
| Crafting Book Open
 
| Boolean
 
| Whether the player has the crafting book currently openened/active.
 
|-
 
| Crafting Filter
 
| Boolean
 
| Whether the player has the crafting filter option currently active.
 
|}
 
 
 
The Crafting Book Status type is send when the player closes its inventory.
 
 
 
==== Advancement Tab ====
 
 
 
{| class="wikitable"
 
! Packet ID
 
! State
 
! Bound To
 
! Field Name
 
! Field Type
 
! Notes
 
|-
 
|rowspan="2"| 0x19
 
|rowspan="2"| Play
 
|rowspan="2"| Server
 
| Action
 
| VarInt enum
 
| 0: Opened tab, 1: Closed screen
 
|-
 
| Tab ID
 
| Optional identifier
 
| Only present if action is Opened tab
 
 
  |}
 
  |}
  
Line 893: Line 283:
 
=== Clientbound ===
 
=== Clientbound ===
  
No changes so far.
+
There are no clientbound packets in the Handshaking state, since the protocol immediately switches to a different state after the client sends the first packet.  
  
 
=== Serverbound ===
 
=== Serverbound ===
 
No changes so far.
 
  
 
==== Handshake ====
 
==== Handshake ====
Line 916: Line 304:
 
  | Protocol Version
 
  | Protocol Version
 
  | VarInt
 
  | VarInt
  | See [[protocol version numbers]] (currently {{change|316|335}})
+
  | See [[protocol version numbers]] (currently {{change|578|709}})
 
  |-
 
  |-
 
  | Server Address
 
  | Server Address
 
  | String
 
  | String
  | Hostname or IP, e.g. localhost or 127.0.0.1, that was used to connect. The Notchian server does not use this information.
+
  | Hostname or IP, e.g. localhost or 127.0.0.1, that was used to connect. The Notchian server does not use this information. Note that SRV records are a complete redirect, e.g. if _minecraft._tcp.example.com points to mc.example.org, users connecting to example.com will provide mc.example.org as server address in addition to connecting to it.
 
  |-  
 
  |-  
 
  | Server Port
 
  | Server Port
Line 945: Line 333:
 
=== Clientbound ===
 
=== Clientbound ===
  
No changes so far.
+
==== Login Success ====
 +
 
 +
{| class="wikitable"
 +
! Packet ID
 +
! State
 +
! Bound To
 +
! Field Name
 +
! Field Type
 +
! Notes
 +
|-
 +
|rowspan="2"| 0x02
 +
|rowspan="2"| Login
 +
|rowspan="2"| Client
 +
| UUID
 +
| {{Change|String (36)|Int array (4)}}
 +
| Unlike in other packets, this field contains the UUID as {{change|a string with hyphens|a fixed length int array}}.
 +
{{change||The UUID is encoded and decoded as follows, where the int array for decoding is read in the order the bytes are received:
 +
  public static UUID decodeUuid(int[] is) {
 +
    return new UUID((long)is[0] << 32 <nowiki>|</nowiki> (long)is[1] & 0xFFFF_FFFFL, (long)is[2] << 32 <nowiki>|</nowiki> (long)is[3] & 0xFFFF_FFFFL);
 +
  }
 +
  public static int[] encodeUuid(long mostSignificantBits, long leastSignificantBits) {
 +
    return new int[]{
 +
        (int)(mostSignificantBits >> 32),
 +
        (int)mostSignificantBits,
 +
        (int)(leastSignificantBits >> 32),
 +
        (int)leastSignificantBits
 +
    };
 +
  }
 +
}}
 +
|-
 +
| Username
 +
| String (16)
 +
|
 +
|}
 +
 
 +
This packet switches the connection state to [[#Play|play]].
  
 
=== Serverbound ===
 
=== Serverbound ===
  
 
No changes so far.
 
No changes so far.
 +
  
 
[[Category:Minecraft Modern]]
 
[[Category:Minecraft Modern]]

Latest revision as of 18:26, 26 March 2020

This page documents the changes from the last stable Minecraft release (currently 1.15.2, protocol 578) to the current pre-release (currently 20w13b, protocol 709). Note that this page contains bleeding-edge information that may not be completely or correctly documented.

One who wishes to commandeer the merging of this into Protocol when an update is made must be sure to respect any changes that may have occurred to the respective packets there.

Contents

Data types

No changes so far.

Packets

ID Packet name Documentation
Handshaking serverbound
0x00 Handshake Current Pre
Play clientbound
0x4E 0x43 Spawn Position Current (unchanged)
0x43 0x44 Display Scoreboard Current (unchanged)
0x44 0x45 Entity Metadata Current (unchanged)
0x45 0x46 Attach Entity Current (unchanged)
0x46 0x47 Entity Velocity Current (unchanged)
0x47 0x48 Entity Equipment Current (unchanged)
0x48 0x49 Set Experience Current (unchanged)
0x49 0x4A Update Health Current (unchanged)
0x4A 0x4B Scoreboard Objective Current (unchanged)
0x4B 0x4C Set Passengers Current (unchanged)
0x4C 0x4D Teams Current (unchanged)
0x4D 0x4E Update Score Current (unchanged)
Play serverbound
0x27 Update Jigsaw Block Current Pre
Login clientbound
0x02 Login Success Current Pre

New/modified data types

No changes so far.

Entity Metadata

FishingHook

Extends Entity.

Index Type Meaning Default
7 VarInt Hooked entity id + 1, or 0 if there is no hooked entity 0
8 Boolean Is catchable False

Abstract Arrow

Extends Entity.

Abstract base class for Tipped Arrow (which is used for regular arrows as well as tipped ones) and Spectral Arrow.

Index Type Meaning Default
7 Byte Bit mask Meaning 0
0x01 Is critical
0x02 Is noclip (used by loyalty tridents when returning)
8 OptUUID Unused Empty
9 8 Byte Peircing level 0

Tipped Arrow

Extends Abstract Arrow.

Used for both tipped and regular arrows. If not tipped, then color is set to -1 and no tipped arrow particles are used.

Index Type Meaning Default
10 9 VarInt Color (-1 for no particles) -1

Spectral Arrow

Extends Abstract Arrow.

No additional metadata.

Trident

Extends Abstract Arrow.

Index Type Meaning Default
10 9 VarInt Loyalty level (enchantment) 0
11 10 Boolean Has enchantment glint False

Strider

Extends Animal.

Index Type Meaning Default
16 VarInt Total time to "boost" with warped fungi for 0
17 Boolean Should display name tag (true unless riding a vehicle or on or in a block tagged with strider_warm_blocks (default: lava)) false
18 Boolean Has saddle false

Hoglin

Extends Animal.

No additional metadata.

Piglin

Extends Monster.

Index Type Meaning Default
15 Boolean Is baby false
16 Boolean Is immune to zombification false
17 Boolean Is charging crossbow false

Zombie Pigman Zombified Piglin

Extends Zombie.

No additional metadata.

Block Actions

No changes so far.

Inventories

No changes so far.

Plugin Channels

No changes so far.

Play

Clientbound

No changes so far.

Serverbound

Update Jigsaw Block

Sent when Done is pressed on the Jigsaw Block interface.

Packet ID State Bound To Field Name Field Type Notes
0x27 Play Server Location Position Block entity location
Attachment type Identifier
Name Identifier
Target Identifier
Target pool Pool Identifier
Final state String "Turns into" on the GUI, final_state in NBT
Joint type String rollable if the attached piece can be rotated, else aligned

Handshaking

Clientbound

There are no clientbound packets in the Handshaking state, since the protocol immediately switches to a different state after the client sends the first packet.

Serverbound

Handshake

This causes the server to switch into the target state.

Packet ID State Bound To Field Name Field Type Notes
0x00 Handshaking Server Protocol Version VarInt See protocol version numbers (currently 578 709)
Server Address String Hostname or IP, e.g. localhost or 127.0.0.1, that was used to connect. The Notchian server does not use this information. Note that SRV records are a complete redirect, e.g. if _minecraft._tcp.example.com points to mc.example.org, users connecting to example.com will provide mc.example.org as server address in addition to connecting to it.
Server Port Unsigned Short Default is 25565. The Notchian server does not use this information.
Next State VarInt Enum 1 for status, 2 for login

Status

Clientbound

No changes so far.

Serverbound

No changes so far.

Login

Clientbound

Login Success

Packet ID State Bound To Field Name Field Type Notes
0x02 Login Client UUID String (36) Int array (4) Unlike in other packets, this field contains the UUID as a string with hyphens a fixed length int array.

The UUID is encoded and decoded as follows, where the int array for decoding is read in the order the bytes are received:

 public static UUID decodeUuid(int[] is) {
   return new UUID((long)is[0] << 32 | (long)is[1] & 0xFFFF_FFFFL, (long)is[2] << 32 | (long)is[3] & 0xFFFF_FFFFL);
 }
 public static int[] encodeUuid(long mostSignificantBits, long leastSignificantBits) {
   return new int[]{
       (int)(mostSignificantBits >> 32),
       (int)mostSignificantBits,
       (int)(leastSignificantBits >> 32),
       (int)leastSignificantBits
   };
 }

Username String (16)

This packet switches the connection state to play.

Serverbound

No changes so far.