Files
claude-timemachine 02a249a379 verify pass 2: resolve markers via ViaBackwards/ViaRewind/ViaLegacy
Closed most remaining UNCONFIRMED items + caught corrections: 1.7 data[]=proto5,
1.8 multi-block nibble order (z/x), stance y+1.62, 1.15 wolf idx18=begging,
1.18 below-zero sections NOT stripped (claim was wrong), CONTAINER_SLOT_STATE
1.20.3, + pinned first-appeared versions (report details/server links=1.21,
fluidCount=26.1, block-state id14=1.19.4, itemCount VarInt=1.20.5).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 19:13:19 +02:00

454 lines
32 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Play-State Packet Catalog — Java Edition 1.21.1 (protocol 767)
**Version lock**: all IDs on this page are 1.21.1 (protocol 767). Play-state IDs shift between versions — sometimes heavily. See [`../versions/1.21.md`](../versions/1.21.md) for the delta from 1.20.x, and [`../versions/INDEX.md`](../versions/INDEX.md) for the full version map.
**Sources**:
- `minecraft-data`: `/tmp/mcproto-refs/minecraft-data/data/pc/1.21.1/protocol.json` (packet IDs + field types, authoritative for 1.21.1)
- `ViaVersion CB`: `/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_5to1_21/packet/ClientboundPackets1_21.java` (ordered enum — ordinal = wire ID)
- `ViaVersion SB`: `/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/packet/ServerboundPackets1_20_5.java` (serverbound IDs unchanged from 1.20.5→1.21.1; no new SB enum file in the `v1_20_5to1_21` package)
**Totals** (minecraft-data count): **124 clientbound**, **58 serverbound** = 182 play-state packets.
**Notation**:
- `CB` = Server→Client (clientbound)
- `SB` = Client→Server (serverbound)
- `→ format-*.md` = that packet's binary layout has its own deep-dive doc in this directory
- `<!-- UNCONFIRMED -->` = claim not verified against a second source
---
## 1. Connection / System
Core session-maintenance and state-transition packets.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x00 | `BUNDLE_DELIMITER` | `bundle_delimiter` | Frame boundary: server wraps a group of CB packets between two 0x00 delimiters; client applies them atomically (added 1.19.4) |
| 0x26 | `KEEP_ALIVE` | `keep_alive` | Heartbeat: server sends random `i64` ID; client must echo it within timeout or be kicked |
| 0x35 | `PING` | `ping` | Echoes an `i32` ID back from client's `PONG` (not the status-ping; used for latency measurement mid-session) |
| 0x36 | `PONG_RESPONSE` | `ping_response` | Server response to client's `PING_REQUEST` (0x21 SB); carries `i64` payload |
| 0x1D | `DISCONNECT` | `kick_disconnect` | Kick with chat-component reason (Text component, NBT-encoded in 1.20.3+) |
| 0x2B | `LOGIN` | `login` | **Join Game** — first play-state packet after configuration; see detail below |
| 0x47 | `RESPAWN` | `respawn` | Sent on dimension change or respawn; see detail below |
| 0x53 | `SET_CARRIED_ITEM` | `held_item_slot` | Sets the client's active hotbar slot (08) |
| 0x69 | `START_CONFIGURATION` | `start_configuration` | Transitions back to Configuration state for resource-pack / registry updates (1.20.2+) |
| 0x19 | `CUSTOM_PAYLOAD` | `custom_payload` | Plugin channel message (`Identifier` channel + byte blob) |
| 0x16 | `COOKIE_REQUEST` | `cookie_request` | Server requests a previously stored cookie value from the client (1.20.5+) |
| 0x6B | `STORE_COOKIE` | `store_cookie` | Server pushes a key/value cookie to the client for later retrieval (1.20.5+) |
| 0x73 | `TRANSFER` | `transfer` | Transfers the client to a different server (host + port); 1.20.5+ |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x18 | `KEEP_ALIVE` | `keep_alive` | Echo of server's `i64` keep-alive ID |
| 0x27 | `PONG` | `pong` | Echo of server's `PING` `i32` ID |
| 0x21 | `PING_REQUEST` | `ping_request` | Client-initiated latency probe; carries `i64` payload; server echoes via `PONG_RESPONSE` |
| 0x00 | `ACCEPT_TELEPORTATION` | `teleport_confirm` | Client acks a `PLAYER_POSITION` teleport by echoing its `varint teleportId` |
| 0x0C | `CONFIGURATION_ACKNOWLEDGED` | `configuration_acknowledged` | Client acks `START_CONFIGURATION`, triggering transition back to Configuration state |
| 0x11 | `COOKIE_RESPONSE` | `cookie_response` | Response to `COOKIE_REQUEST`; carries key + optional value |
| 0x12 | `CUSTOM_PAYLOAD` | `custom_payload` | Plugin channel message (SB direction) |
| 0x2B | `RESOURCE_PACK` | `resource_pack_receive` | Client reports resource-pack download status (accepted/declined/downloaded/failed) |
---
### Detail: LOGIN (0x2B CB) — Join Game
First play-state packet sent by the server (after Configuration → Play transition). Sets up the client's world context.
Fields (from `protocol.json` `packet_login`):
| Field | Type | Notes |
|-------|------|-------|
| `entityId` | i32 | Client's entity ID |
| `isHardcore` | bool | |
| `worldNames` | varint-prefixed string[] | All dimension names known to the server |
| `maxPlayers` | varint | (informational, not enforced client-side) |
| `viewDistance` | varint | Server's configured view distance |
| `simulationDistance` | varint | |
| `reducedDebugInfo` | bool | Hides debug overlay |
| `enableRespawnScreen` | bool | |
| `doLimitedCrafting` | bool | |
| `worldState` | SpawnInfo | Composite: dimension type ID, dimension name, hashed seed, gamemode, prev gamemode, debug/flat flags, death location (optional), portal cooldown |
| `enforcesSecureChat` | bool | If true, server requires signed chat messages |
### Detail: RESPAWN (0x47 CB)
Sent on dimension switch, death respawn, or `/respawn`. Resets world context without a full Login.
Fields (`packet_respawn`):
| Field | Type | Notes |
|-------|------|-------|
| `worldState` | SpawnInfo | Same composite type as Login |
| `copyMetadata` | u8 | Bitmask: bit 0 = keep attributes, bit 1 = keep entity data |
---
## 2. Entity
Spawning, movement, metadata, equipment, effects, and removal.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x01 | `ADD_ENTITY` | `spawn_entity` | Spawn any non-XP entity; carries entity ID (varint), UUID, type (varint), position (f64×3), angles, data (varint, type-dependent), velocity |
| 0x02 | `ADD_EXPERIENCE_ORB` | `spawn_entity_experience_orb` | Spawn XP orb; entity ID + position + count (i16) |
| 0x03 | `ANIMATE` | `animation` | Play entity animation (swing arm, take damage, leave bed, etc.); entity ID + animation byte |
| 0x2E | `MOVE_ENTITY_POS` | `rel_entity_move` | Delta position only (fixed-point i16×3); entity moved < 8 blocks |
| 0x2F | `MOVE_ENTITY_POS_ROT` | `entity_move_look` | Delta position + rotation |
| 0x30 | `MOVE_ENTITY_ROT` | `entity_look` | Rotation only |
| 0x48 | `ROTATE_HEAD` | `entity_head_rotation` | Yaw of entity head (separate from body) |
| 0x31 | `MOVE_VEHICLE` | `vehicle_move` | Absolute position + rotation for mounted vehicle |
| 0x70 | `TELEPORT_ENTITY` | `entity_teleport` | Absolute position + rotation for entities beyond delta range (>8 blocks) |
| 0x5A | `SET_ENTITY_MOTION` | `entity_velocity` | Velocity in fixed-point i16 units (1/8000 m/tick) |
| 0x58 | `SET_ENTITY_DATA` | `entity_metadata` | Entity metadata key-value stream; **`format-entity-metadata.md`** |
| 0x5B | `SET_EQUIPMENT` | `entity_equipment` | Equipment slots (main/off hand, 4 armor slots); slot bitmask + Slot data |
| 0x76 | `UPDATE_MOB_EFFECT` | `entity_effect` | Apply/update a potion effect (entity ID, effect ID, amplifier, duration, flags) |
| 0x43 | `REMOVE_MOB_EFFECT` | `remove_entity_effect` | Remove a specific effect from entity |
| 0x59 | `SET_ENTITY_LINK` | `attach_entity` | Attach entity A to entity B (leash); entity ID + vehicle ID (-1 to detach) |
| 0x5F | `SET_PASSENGERS` | `set_passengers` | Set which entities are riding on a vehicle; vehicle entity ID + array of passenger IDs |
| 0x42 | `REMOVE_ENTITIES` | `entity_destroy` | Remove one or more entities by ID (varint array) |
| 0x1F | `ENTITY_EVENT` | `entity_status` | Entity-specific status byte (e.g. death animation, tipped arrow hit, villager anger) |
| 0x1A | `DAMAGE_EVENT` | `damage_event` | Entity took damage: entity ID, damage type, source entity/position (1.19.4+) |
| 0x24 | `HURT_ANIMATION` | `hurt_animation` | Visual-only hurt swing (entity ID + yaw); added 1.19.4 |
| 0x75 | `UPDATE_ATTRIBUTES` | `entity_update_attributes` | Update base attribute values (movement speed, attack damage, etc.) |
| 0x6F | `TAKE_ITEM_ENTITY` | `collect` | Entity picked up an item (item entity ID + collector entity ID + pickup count) |
| 0x3F | `PLAYER_LOOK_AT` | `face_player` | Make entity/player face a position or another entity |
| 0x79 | `PROJECTILE_POWER` | `set_projectile_power` | Projectile acceleration: entity ID (VarInt) + `accelerationPower` (f64 scalar magnitude). In 1.20.5 the server sent three separate doubles (x/y/z); ViaVersion `Protocol1_20_5To1_21.java` converts the magnitude `sqrt(x²+y²+z²)` to the single scalar that 1.21+ uses. Source: `minecraft-data/data/pc/1.21.1/protocol.json` `packet_set_projectile_power` + `ViaVersion/.../protocols/v1_20_5to1_21/Protocol1_20_5To1_21.java` PROJECTILE_POWER handler. |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x1A | `MOVE_PLAYER_POS` | `position` | Player position update (`f64` x/y/z + `bool` onGround) |
| 0x1B | `MOVE_PLAYER_POS_ROT` | `position_look` | Position + yaw/pitch |
| 0x1C | `MOVE_PLAYER_ROT` | `look` | Rotation only |
| 0x1D | `MOVE_PLAYER_STATUS_ONLY` | `flying` | Ground status only (used when no other movement to report) |
| 0x1E | `MOVE_VEHICLE` | `vehicle_move` | Absolute position + rotation while controlling a vehicle |
| 0x16 | `INTERACT` | `use_entity` | Interact with entity: entity ID + action (attack/interact/interact-at) + hand + position (for interact-at) |
| 0x24 | `PLAYER_ACTION` | `block_dig` | Block dig/place actions (start dig, cancel, finish, drop item, swap hands, shoot arrow) + location + face + sequence |
| 0x25 | `PLAYER_COMMAND` | `entity_action` | Player-state commands: sneak start/stop, sprint start/stop, leave bed, start/stop elytra, horse jump |
| 0x36 | `SWING` | `arm_animation` | Arm swing animation (main or off hand) |
| 0x37 | `TELEPORT_TO_ENTITY` | `spectate` | Spectator teleport to entity UUID |
| 0x26 | `PLAYER_INPUT` | `steer_vehicle` | Vehicle steering input (sideways/forward + flags for jump/unmount) |
| 0x1F | `PADDLE_BOAT` | `steer_boat` | Boat paddle state (left + right `bool`) |
| 0x20 | `PICK_ITEM` | `pick_item` | Pick Block (middle-click); carries hotbar slot index |
| 0x15 | `ENTITY_TAG_QUERY` | `query_entity_nbt` | Debug: request entity NBT (debug build) |
---
## 3. World
Chunks, blocks, lighting, world events, and world border.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x27 | `LEVEL_CHUNK_WITH_LIGHT` | `map_chunk` | Full chunk column + light data bundled; **`format-chunk-data.md`** |
| 0x2A | `LIGHT_UPDATE` | `update_light` | Update lighting only (no block data); same sky/block light structure as above; **`format-chunk-data.md`** |
| 0x0C | `CHUNK_BATCH_FINISHED` | `chunk_batch_finished` | Signals end of chunk batch; carries batch size (varint); client responds with `CHUNK_BATCH_RECEIVED` (1.20.2+) |
| 0x0D | `CHUNK_BATCH_START` | `chunk_batch_start` | Signals start of chunk batch (1.20.2+) |
| 0x0E | `CHUNKS_BIOMES` | `chunk_biomes` | Update biome data for existing chunks without re-sending block data (1.20+) |
| 0x21 | `FORGET_LEVEL_CHUNK` | `unload_chunk` | Unload a chunk column; `i32` chunk X + Z |
| 0x54 | `SET_CHUNK_CACHE_CENTER` | `update_view_position` | Shift the client's chunk center (sent on player movement between chunks) |
| 0x55 | `SET_CHUNK_CACHE_RADIUS` | `update_view_distance` | Update render distance |
| 0x09 | `BLOCK_UPDATE` | `block_change` | Single block change: `Position` + block state ID (varint) |
| 0x49 | `SECTION_BLOCKS_UPDATE` | `multi_block_change` | Multiple block changes in one chunk section; section coords + array of `(localPos << 12 | stateId)` i64 |
| 0x07 | `BLOCK_ENTITY_DATA` | `tile_entity_data` | Update a block entity's NBT (chest, furnace, sign, etc.) |
| 0x08 | `BLOCK_EVENT` | `block_action` | Block action event (e.g. chest open/close sound, note block pitch, piston extension); location + action byte + action param + block type |
| 0x06 | `BLOCK_DESTRUCTION` | `block_break_animation` | Show block breaking animation progress (09) for a given entity ID at a position |
| 0x05 | `BLOCK_CHANGED_ACK` | `acknowledge_player_digging` | Server acknowledges a block-dig sequence number; carries sequence ID + position + block state + status + successful bool |
| 0x28 | `LEVEL_EVENT` | `world_event` | World event/sound (door open, explosion sound, portal, block break sound, etc.); event ID + position + data + global flag |
| 0x20 | `EXPLODE` | `explosion` | Explosion: position (f64), radius (f32), array of affected block offsets, player knockback velocity, interaction type, particles, sound |
| 0x22 | `GAME_EVENT` | `game_state_change` | Game state notifications: start/stop rain, change gamemode, win game, demo events, bed/respawn prompts, guardian elder effect, etc. Carries `u8` reason + `f32` value |
| 0x56 | `SET_DEFAULT_SPAWN_POSITION` | `spawn_position` | World spawn point (used for compass direction) |
| 0x25 | `INITIALIZE_BORDER` | `initialize_world_border` | Full world border state (center, size, lerp target, lerp time, warning blocks/time) |
| 0x4D | `SET_BORDER_CENTER` | `world_border_center` | Update border center |
| 0x4E | `SET_BORDER_LERP_SIZE` | `world_border_lerp_size` | Animate border size change |
| 0x4F | `SET_BORDER_SIZE` | `world_border_size` | Set border size instantly |
| 0x50 | `SET_BORDER_WARNING_DELAY` | `world_border_warning_delay` | Warning time (seconds) |
| 0x51 | `SET_BORDER_WARNING_DISTANCE` | `world_border_warning_reach` | Warning distance (blocks) |
| 0x64 | `SET_TIME` | `update_time` | World age (i64, always incrementing) + time of day (i64, 024000; negative = frozen) |
| 0x62 | `SET_SIMULATION_DISTANCE` | `simulation_distance` | Server's entity simulation radius |
| 0x71 | `TICKING_STATE` | `set_ticking_state` | Tick rate + whether frozen (1.20.3+) |
| 0x72 | `TICKING_STEP` | `step_tick` | Advance frozen world by N ticks (1.20.3+) |
| 0x0B | `CHANGE_DIFFICULTY` | `difficulty` | Current difficulty + locked flag |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x08 | `CHUNK_BATCH_RECEIVED` | `chunk_batch_received` | Client reports desired chunks/tick back to server after batch (throttle feedback) |
| 0x01 | `BLOCK_ENTITY_TAG_QUERY` | `query_block_nbt` | Debug: request block entity NBT at position |
| 0x02 | `CHANGE_DIFFICULTY` | `set_difficulty` | Op changes world difficulty (op-only) |
| 0x19 | `LOCK_DIFFICULTY` | `lock_difficulty` | Op locks/unlocks difficulty |
| 0x38 | `USE_ITEM_ON` | `block_place` | Place/use block: hand + block position + face + cursor position + head-inside-block flag + sequence |
| 0x39 | `USE_ITEM` | `use_item` | Use item in hand (right-click in air): hand + sequence |
| 0x17 | `JIGSAW_GENERATE` | `generate_structure` | Generate jigsaw structure (op/debug) |
| 0x30 | `SET_COMMAND_BLOCK` | `update_command_block` | Update command block: position + command + mode + flags |
| 0x31 | `SET_COMMAND_MINECART` | `update_command_block_minecart` | Update command block in minecart |
| 0x33 | `SET_JIGSAW_BLOCK` | `update_jigsaw_block` | Update jigsaw block settings |
| 0x34 | `SET_STRUCTURE_BLOCK` | `update_structure_block` | Update structure block settings |
| 0x35 | `SIGN_UPDATE` | `update_sign` | Submit sign text (front/back): position + is-front-side + 4 lines |
---
## 4. Inventory / Container
Opening, populating, and interacting with containers and the player inventory.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x33 | `OPEN_SCREEN` | `open_window` | Open a container UI; window ID + menu type (varint) + title (NBT text) |
| 0x23 | `HORSE_SCREEN_OPEN` | `open_horse_window` | Open horse inventory UI (separate from generic containers) |
| 0x12 | `CONTAINER_CLOSE` | `close_window` | Server closes a container (window ID) |
| 0x13 | `CONTAINER_SET_CONTENT` | `window_items` | Full slot sync for open container; window ID + `stateId` + Slot array + carried item; **Slot type → `format-slot-and-components.md`** |
| 0x15 | `CONTAINER_SET_SLOT` | `set_slot` | Update single slot; window ID + `stateId` + slot index (i16) + Slot; **`format-slot-and-components.md`** |
| 0x14 | `CONTAINER_SET_DATA` | `craft_progress_bar` | Update a container "property" (furnace progress, enchant seed, etc.); window ID + property ID (i16) + value (i16) |
| 0x32 | `OPEN_BOOK` | `open_book` | Open a book UI (hand: main/off) |
| 0x34 | `OPEN_SIGN_EDITOR` | `open_sign_entity` | Open sign editor UI for a position; bool for front/back side |
| 0x37 | `PLACE_GHOST_RECIPE` | `craft_recipe_response` | Show recipe in crafting grid (response to `PLACE_RECIPE` SB) |
| 0x17 | `COOLDOWN` | `set_cooldown` | Start item use cooldown (item ID + ticks) |
| 0x2D | `MERCHANT_OFFERS` | `trade_list` | Villager trade list (window ID + trades array + villager level/XP + regular villager + can restock) |
| 0x2C | `MAP_ITEM_DATA` | `map` | Map item data (map ID + scale + locked + icons + patch data) |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x0F | `CONTAINER_CLOSE` | `close_window` | Client closed a container (window ID) |
| 0x0E | `CONTAINER_CLICK` | `window_click` | Inventory click; window ID + `stateId` + slot (i16) + button + mode + changed slots array + cursor Slot |
| 0x0D | `CONTAINER_BUTTON_CLICK` | `enchant_item` | Click a container button (enchanting table slot select, trade button, etc.) |
| 0x10 | `CONTAINER_SLOT_STATE_CHANGED` | `set_slot_state` | Toggle a slot state (crafting grid slot on/off — added **1.20.3**, not 1.20.2). Source: `ViaVersion/.../protocols/v1_20_2to1_20_3/packet/ServerboundPackets1_20_3.java` (0x0F there; ID shifted to 0x10 in 1.20.5); absent from `ServerboundPackets1_20_2`. `Protocol1_20_2To1_20_3.java` cancels it toward older clients (`cancelServerbound`). |
| 0x22 | `PLACE_RECIPE` | `craft_recipe_request` | Request to auto-fill a recipe in crafting grid; window ID + recipe ID + make-all flag |
| 0x32 | `SET_CREATIVE_MODE_SLOT` | `set_creative_slot` | Creative-mode direct slot set; slot (i16) + Slot data |
| 0x29 | `RECIPE_BOOK_SEEN_RECIPE` | `displayed_recipe` | Mark a recipe as seen in the recipe book |
| 0x28 | `RECIPE_BOOK_CHANGE_SETTINGS` | `recipe_book` | Toggle recipe book filter/open state |
| 0x2A | `RENAME_ITEM` | `name_item` | Submit anvil rename string |
| 0x2E | `SET_BEACON` | `set_beacon_effect` | Set beacon effect (primary + secondary effect IDs) |
| 0x2D | `SELECT_TRADE` | `select_trade` | Select villager trade by index |
| 0x14 | `EDIT_BOOK` | `edit_book` | Submit book contents (hand + pages array + optional title) |
---
## 5. Player
Position synchronization, health, XP, abilities, and player list.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x40 | `PLAYER_POSITION` | `position` | **Synchronize player position**: server-authoritative teleport; fields: x/y/z (f64), yaw/pitch (f32), flags (PositionUpdateRelatives bitmask — absolute vs relative per axis), `teleportId` (varint); client must confirm with `ACCEPT_TELEPORTATION`; see field detail below |
| 0x38 | `PLAYER_ABILITIES` | `abilities` | Player ability flags (invulnerable, flying, allow-fly, creative-mode) + fly speed + field-of-view modifier |
| 0x5D | `SET_HEALTH` | `update_health` | Health (f32), food (varint), saturation (f32) |
| 0x5C | `SET_EXPERIENCE` | `experience` | XP bar progress (f32 01) + total XP levels (varint) + total XP points (varint) |
| 0x3E | `PLAYER_INFO_UPDATE` | `player_info` | Add/update player list entries; bitmask of actions (add player, initialize chat, update gamemode, update listed, update latency, update display name) + array of UUID + per-action data |
| 0x3D | `PLAYER_INFO_REMOVE` | `player_remove` | Remove player list entries by UUID array |
| 0x3A | `PLAYER_COMBAT_END` | `end_combat_event` | Player exited combat (duration + entity ID) |
| 0x3B | `PLAYER_COMBAT_ENTER` | `enter_combat_event` | Player entered combat |
| 0x3C | `PLAYER_COMBAT_KILL` | `death_combat_event` | Player killed in combat (player entity ID + death message) |
| 0x39 | `PLAYER_CHAT` | `player_chat` | Signed player chat message; see field detail below |
| 0x09 | `CLIENT_COMMAND` (mismap) | — | See SB below |
| 0x52 | `SET_CAMERA` | `camera` | Set which entity the player's camera follows |
| 0x31 | `MOVE_VEHICLE` | `vehicle_move` | Sync vehicle position to client |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x09 | `CLIENT_COMMAND` | `client_command` | Perform client action: 0 = respawn, 1 = open inventory stats |
| 0x0A | `CLIENT_INFORMATION` | `settings` | Client settings: locale, view distance, chat mode, colors, skin parts, main hand, filter text, allow server listings |
| 0x23 | `PLAYER_ABILITIES` | `abilities` | Client reports flying flag (bit 1); other flags ignored by server |
| 0x2F | `SET_CARRIED_ITEM` | `held_item_slot` | Change held hotbar slot (08) |
| 0x0B | `COMMAND_SUGGESTION` | `tab_complete` | Tab-complete request; `transactionId` (varint) + partial command string |
| 0x13 | `DEBUG_SAMPLE_SUBSCRIPTION` | `debug_sample_subscription` | Subscribe to debug performance samples (tick duration, ping, etc.) |
---
### Detail: PLAYER_POSITION (0x40 CB) — Synchronize Player Position
The server asserts the player's canonical position. Client must respond with `ACCEPT_TELEPORTATION` (0x00 SB) carrying the same `teleportId` before sending movement packets will be trusted again.
Fields (from `protocol.json` `packet_position`):
| Field | Type | Notes |
|-------|------|-------|
| `x` | f64 | |
| `y` | f64 | |
| `z` | f64 | |
| `yaw` | f32 | |
| `pitch` | f32 | |
| `flags` | `PositionUpdateRelatives` (u8 bitmask) | Bit 0=X, 1=Y, 2=Z, 3=pitch, 4=yaw: if set, the value is *relative* to current |
| `teleportId` | varint | Client echoes in `ACCEPT_TELEPORTATION` |
---
## 6. UI / HUD
Chat messages (all three kinds), titles, scoreboard, boss bar, tab list.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x6C | `SYSTEM_CHAT` | `system_chat` | System message (NBT text component + `isActionBar` bool); used for `/say`, `/tell`, server announcements |
| 0x39 | `PLAYER_CHAT` | `player_chat` | Signed player chat; carries sender UUID, message, timestamp, signature (256-byte optional), chat type decoration reference, optional unsigned fallback; see detail below |
| 0x1E | `DISGUISED_CHAT` | `profileless_chat` | System-style chat that mimics a player message without a UUID (no signature); added 1.19.3 |
| 0x1C | `DELETE_CHAT` | `hide_message` | Delete a previously sent signed chat message by signature hash |
| 0x65 | `SET_TITLE_TEXT` | `set_title_text` | Show title (NBT text) |
| 0x63 | `SET_SUBTITLE_TEXT` | `set_title_subtitle` | Show subtitle (NBT text) |
| 0x4C | `SET_ACTION_BAR_TEXT` | `action_bar` | Action bar message (NBT text) |
| 0x66 | `SET_TITLES_ANIMATION` | `set_title_time` | Title timing: fade-in, stay, fade-out (all i32 ticks) |
| 0x0F | `CLEAR_TITLES` | `clear_titles` | Clear title/subtitle/action bar; `bool` reset (resets timing) |
| 0x0A | `BOSS_EVENT` | `boss_bar` | Boss bar operation: ADD, REMOVE, UPDATE_HEALTH, UPDATE_TITLE, UPDATE_STYLE, UPDATE_FLAGS; UUID + per-action data |
| 0x6D | `TAB_LIST` | `playerlist_header` | Tab list header + footer (both NBT text) |
| 0x5E | `SET_OBJECTIVE` | `scoreboard_objective` | Create/remove/update scoreboard objective; name + mode (0=create,1=remove,2=update) + display name + type |
| 0x61 | `SET_SCORE` | `scoreboard_score` | Set an entity's score for an objective; entity name + objective name + score (varint) + optional display name + optional number format |
| 0x44 | `RESET_SCORE` | `reset_score` | Remove a score entry; entity name + optional objective name (1.20.3+) |
| 0x57 | `SET_DISPLAY_OBJECTIVE` | `scoreboard_display_objective` | Set which objective appears in a display slot (sidebar, list, below-name) |
| 0x60 | `SET_PLAYER_TEAM` | `teams` | Scoreboard team operations: CREATE, REMOVE, INFO_UPDATE, ADD_PLAYERS, REMOVE_PLAYERS |
| 0x18 | `CUSTOM_CHAT_COMPLETIONS` | `chat_suggestions` | Add/remove/set chat autocomplete suggestions (1.19.1+) |
| 0x0B | `CHANGE_DIFFICULTY` (mismap) | `difficulty` | See World § above |
| 0x1B | `DEBUG_SAMPLE` | `debug_sample` | Performance debug sample push (tick durations, etc.) |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x06 | `CHAT` | `chat_message` | Player chat message; text + timestamp + salt + optional signature + ack bitset |
| 0x04 | `CHAT_COMMAND` | `chat_command` | Run command (unsigned); command string |
| 0x05 | `CHAT_COMMAND_SIGNED` | `chat_command_signed` | Run command with signed arguments (1.19.1+) |
| 0x07 | `CHAT_SESSION_UPDATE` | `chat_session_update` | Update session signing key (public key + expiry + signature) |
| 0x03 | `CHAT_ACK` | `message_acknowledgement` | Acknowledge received signed chat messages (cumulative offset into message history) |
---
### Detail: PLAYER_CHAT (0x39 CB) — Signed Chat
Fields (`protocol.json` `packet_player_chat`):
| Field | Type | Notes |
|-------|------|-------|
| `senderUuid` | UUID | |
| `index` | varint | Position in sender's message sequence |
| `signature` | optional byte[256] | RSA-signed message hash; absent for unsigned messages |
| `plainMessage` | string | Raw text |
| `timestamp` | i64 | Unix ms |
| `salt` | i64 | |
| `previousMessages` | previousMessages | Compact acknowledgment of prior messages (used for signature chaining) |
| `unsignedChatContent` | optional NBT | Decorated/filtered version if different from plain |
| `filterType` | varint | 0=pass-through, 1=fully-filtered, 2=partially-filtered |
| `filterTypeMask` | conditional | Bitmask when `filterType=2` |
| `type` | ChatTypesHolder | Reference into registry for formatting (chat, say-command, etc.) |
| `networkName` | NBT | Sender's display name |
| `networkTargetName` | optional NBT | Target for directed messages (whisper, /tell) |
---
## 7. Commands / Recipes
The command graph, tab-complete, and recipe synchronization.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x11 | `COMMANDS` | `declare_commands` | Full command graph as a node tree; **`format-command-graph.md`** |
| 0x10 | `COMMAND_SUGGESTIONS` | `tab_complete` | Tab-complete response; `transactionId` + match start + length + array of (text, optional tooltip) |
| 0x77 | `UPDATE_RECIPES` | `declare_recipes` | Full recipe list (crafting, smelting, stonecutting, etc.) |
| 0x41 | `RECIPE` | `unlock_recipes` | Recipe book state: action (init/add/remove) + recipe IDs shown + recipe IDs highlighted + display settings |
| 0x37 | `PLACE_GHOST_RECIPE` | `craft_recipe_response` | (Repeat from Inventory §) Display recipe in crafting grid |
| 0x4A | `SELECT_ADVANCEMENTS_TAB` | `select_advancement_tab` | Open advancement tab (optional identifier) |
| 0x74 | `UPDATE_ADVANCEMENTS` | `advancements` | Advancement data: reset flag + added map + removed IDs + progress map |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x0B | `COMMAND_SUGGESTION` | `tab_complete` | Tab-complete request (see Player §5 SB) |
| 0x22 | `PLACE_RECIPE` | `craft_recipe_request` | (Repeat from Inventory §) |
| 0x28 | `RECIPE_BOOK_CHANGE_SETTINGS` | `recipe_book` | Recipe book toggle |
| 0x29 | `RECIPE_BOOK_SEEN_RECIPE` | `displayed_recipe` | Mark recipe seen |
| 0x2C | `SEEN_ADVANCEMENTS` | `advancement_tab` | Open/close an advancement tab |
---
## 8. Sound / Particle
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x68 | `SOUND` | `sound_effect` | Named sound at fixed position (sound ID varint, category, x/y/z as fixed-point i32, volume f32, pitch f32, seed i64) |
| 0x67 | `SOUND_ENTITY` | `entity_sound_effect` | Same but position follows an entity ID |
| 0x6A | `STOP_SOUND` | `stop_sound` | Stop sounds matching a category (optional) and/or sound ID (optional) |
| 0x29 | `LEVEL_PARTICLES` | `world_particles` | Spawn particle effect: particle type + data + position (f64) + offset (f32×3) + max speed + count + long-range flag |
| 0x28 | `LEVEL_EVENT` | `world_event` | (See World §) Also carries many sound/effect IDs |
### Serverbound
_(No SB packets for sound/particle — client never requests specific sounds.)_
---
## 9. Misc
Tags, resource packs, server info, and debug/telemetry.
### Clientbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x78 | `UPDATE_TAGS` | `tags` | Registry tag lists (block, item, fluid, entity type, etc.); map of registry → array of (tag ID + value IDs) |
| 0x46 | `RESOURCE_PACK_PUSH` | `add_resource_pack` | Push a resource pack to client: UUID + URL + hash + forced + optional prompt message (1.20.3: UUID-keyed; 1.20.5: stacks) |
| 0x45 | `RESOURCE_PACK_POP` | `remove_resource_pack` | Remove a previously pushed resource pack by UUID (optional; clear all if absent) |
| 0x4B | `SERVER_DATA` | `server_data` | Server icon (optional PNG bytes) + enforces-secure-chat flag (sent once at login) |
| 0x6E | `TAG_QUERY` | `nbt_query_response` | Response to block/entity NBT query; transaction ID + NBT |
| 0x04 | `AWARD_STATS` | `statistics` | Statistics update (category + statistic + value; varint array) |
| 0x2C | `MAP_ITEM_DATA` | `map` | (See Inventory §) |
| 0x3C | `PLAYER_COMBAT_KILL` | `death_combat_event` | (See Player §) |
| 0x7A | `CUSTOM_REPORT_DETAILS` | `custom_report_details` | Key-value map sent to crash reports (1.21+) |
| 0x7B | `SERVER_LINKS` | `server_links` | List of labeled URLs (bug report, feedback, support, etc.) shown in pause menu (1.21+) |
### Serverbound
| ID | ViaVersion name | mc-data name | Purpose |
|----|-----------------|--------------|---------|
| 0x2B | `RESOURCE_PACK` | `resource_pack_receive` | Client status for a resource pack UUID: accepted/declined/success/failed |
---
## Cross-links
- **Slot type** (used in container packets): [`format-slot-and-components.md`](format-slot-and-components.md) — Slot encoding, item component NBT, 1.20.5 data-driven component format
- **Entity metadata**: [`format-entity-metadata.md`](format-entity-metadata.md) — per-type metadata keys, value encoding
- **Chunk data + lighting**: [`format-chunk-data.md`](format-chunk-data.md) — section encoding, palette, heightmaps, block entity list, sky/block light arrays
- **Command graph**: [`format-command-graph.md`](format-command-graph.md) — node types, flags, parser IDs, redirect mechanism
- **Version deltas**: [`../versions/1.21.md`](../versions/1.21.md) — what changed 1.20.5→1.21; [`../versions/INDEX.md`](../versions/INDEX.md) — full version map
> **Note**: The `format-*.md` cross-link targets do not exist yet in this directory — they are planned deep-dive docs. Links will resolve when those docs are written.
---
## Version caveat
Play-state packet IDs change **frequently** between versions. Examples of large shifts:
| Version range | Notable shift |
|---|---|
| 1.19 → 1.19.1 | Chat signing added; PLAYER_CHAT restructured |
| 1.20.2 | Configuration state added; START_CONFIGURATION 0x69 is new |
| 1.20.3 | NBT chat components replace string; SET_SCORE/RESET_SCORE split |
| 1.20.5 | Item components (data-driven Slot); cookies; resource-pack UUID stacking; PROJECTILE_POWER (0x79) added |
| 1.21 (767) | SERVER_LINKS (0x7B) and CUSTOM_REPORT_DETAILS (0x7A) added in play state; same packets added in Configuration state |
Always cross-check IDs against `minecraft-data/data/pc/<version>/protocol.json` or the ViaVersion `ClientboundPackets<version>` enum for the target version.