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>
This commit is contained in:
@@ -92,7 +92,7 @@ ViaVersion cross-check: `ClientboundLoginPackets.java` ordinals 0–5 match; `Se
|
||||
|
||||
The Configuration state runs between Login Acknowledged and Finish Configuration. Its purpose: push registry data, feature flags, resource packs, and tags before the client enters Play. The state can be re-entered from Play (server sends `Start Configuration`).
|
||||
|
||||
The packet set expanded again in **1.20.5 (protocol 766)**: Cookie, Transfer, Store Cookie, resource-pack split (push/pop vs. unified), Select Known Packs, Custom Report Details, Server Links were added, shifting most IDs.
|
||||
The packet set expanded again in **1.20.5 (protocol 766)**: Cookie, Transfer, Store Cookie, resource-pack split (push/pop vs. unified), and Select Known Packs were added, shifting most IDs. **1.21** added Custom Report Details and Server Links (CB 0x0F/0x10, SB 0x08/0x09).
|
||||
|
||||
### Serverbound
|
||||
|
||||
@@ -110,9 +110,7 @@ The packet set expanded again in **1.20.5 (protocol 766)**: Cookie, Transfer, St
|
||||
| `0x09` | Server Links Response | C→S | 1.21 | `links` (Array; echoes known-type or custom-text link list)² |
|
||||
|
||||
¹ In 1.20.2–1.20.4 the resource pack response had no UUID field; UUID was added when resource-pack-push/pop split was introduced in 1.20.5.
|
||||
² IDs `0x08` and `0x09` are present in 1.21.1 per `protocol.json` (`custom_report_details`, `server_links`) but absent from earlier ViaVersion 1.20.5 enum — confirm exact introduction version.
|
||||
|
||||
<!-- UNCONFIRMED: Exact first version for SB Custom Report Details (0x08) and Server Links Response (0x09) — protocol.json shows them in 1.21.1; ViaVersion 1_20_5 SB enum only lists 8 entries (0x00–0x07). Likely 1.21.0 or 1.21.1. -->
|
||||
² IDs `0x08` and `0x09` confirmed added in **1.21**: absent from `ServerboundConfigurationPackets1_20_5` (ends at 0x07) and present in 1.21.1 `protocol.json`. ViaVersion passes them through in the SB direction without a new enum file — `ServerboundConfigurationPackets1_20_5` covers 1.20.5 through 1.21.x (no SB enum file in `v1_20_5to1_21` package). Source: `ViaVersion/.../protocols/v1_20_5to1_21/packet/ClientboundConfigurationPackets1_21.java` (CB side confirmed) + `minecraft-data/data/pc/1.21.1/protocol.json` configuration.toServer.
|
||||
|
||||
**ID shift note (1.20.2 → 1.20.5 serverbound):**
|
||||
|
||||
@@ -153,9 +151,7 @@ Source: `minecraft-data/data/pc/1.21.1/protocol.json` → `configuration.toServe
|
||||
| `0x0F` | Custom Report Details | S→C | 1.21 | `details` (Array of {key:String, value:String}); appears in crash reports¹ |
|
||||
| `0x10` | Server Links | S→C | 1.21 | `links` (Array of {hasKnownType:bool, knownType:ServerLinkType (if known), unknownType:NbtComponent (if custom), url:String})¹ |
|
||||
|
||||
¹ `0x0F` and `0x10` present in 1.21.1 `protocol.json`; not in ViaVersion 1.20.5 CB enum (15 entries, 0x00–0x0E). Likely introduced 1.21.0 or 1.21.1.
|
||||
|
||||
<!-- UNCONFIRMED: Exact first version for CB Custom Report Details (0x0F) and Server Links (0x10) — same tracking note as SB counterparts above. -->
|
||||
¹ `0x0F` and `0x10` confirmed added in **1.21**: `ClientboundConfigurationPackets1_20_5` ends at `SELECT_KNOWN_PACKS` (0x0E); `ClientboundConfigurationPackets1_21` (in `v1_20_5to1_21` package) adds `CUSTOM_REPORT_DETAILS` (0x0F) and `SERVER_LINKS` (0x10). Source: `ViaVersion/.../protocols/v1_20_5to1_21/packet/ClientboundConfigurationPackets1_21.java`.
|
||||
|
||||
**ID shift note (1.20.2 → 1.20.5 clientbound):**
|
||||
|
||||
|
||||
@@ -118,7 +118,7 @@ Spawning, movement, metadata, equipment, effects, and removal.
|
||||
| 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 vector <!-- UNCONFIRMED exact semantics --> |
|
||||
| 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
|
||||
|
||||
@@ -226,7 +226,7 @@ Opening, populating, and interacting with containers and the player inventory.
|
||||
| 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 (e.g. toggle a crafting grid slot on/off — added 1.20.2) <!-- UNCONFIRMED exact usage --> |
|
||||
| 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 |
|
||||
@@ -415,8 +415,8 @@ Tags, resource packs, server info, and debug/telemetry.
|
||||
| 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.20.5+) |
|
||||
| 0x7B | `SERVER_LINKS` | `server_links` | List of labeled URLs (bug report, feedback, support, etc.) shown in pause menu (1.20.5+) |
|
||||
| 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
|
||||
|
||||
@@ -447,7 +447,7 @@ Play-state packet IDs change **frequently** between versions. Examples of large
|
||||
| 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; SERVER_LINKS; CUSTOM_REPORT_DETAILS |
|
||||
| 1.21 (767) | No major new play packets vs 1.20.5; PROJECTILE_POWER (0x79) added |
|
||||
| 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.
|
||||
|
||||
@@ -87,7 +87,7 @@ Source: `ChunkSectionType1_18.java:49-63` — reads `Short` non-air count, then
|
||||
- **`blockStates`** — paletted container over **4096** entries (one per block in the 16³ section). Entry = a **block-state** global-registry ID, not a block ID. Cell index ordering is **YZX**: `index = (y<<8) | (z<<4) | x` (`ChunkSection.java:39`).
|
||||
- **`biomes`** — paletted container over **64** entries (4×4×4 sub-grid; one biome per 4³ cell). Entry = a biome registry ID. *This container did not exist before 1.18* — biomes lived in a flat chunk-level array (§3).
|
||||
|
||||
<!-- UNCONFIRMED: the latest wiki (1.21.9-era) shows a second `Short fluidCount` field after `blockCount` in the Chunk Section — ViaVersion exposes ChunkSection.getFluidCount() "Available with versions 26.1+" (ChunkSection.java:67-73). For 1.18–1.21.x there is exactly ONE Short (blockCount) before the block-states container. -->
|
||||
**26.1+**: A second `Short fluidCount` field is added after `blockCount` in each Chunk Section. Confirmed: `ViaVersion/.../api/type/types/chunk/ChunkSectionType26_1.java` reads `buffer.readShort()` for `nonAirBlocksCount` then `buffer.readShort()` for `fluidCount` (line 43–44). This type is registered in `Protocol1_21_11To26_1` — i.e. protocol 26.1 is the version following MC 1.21.11. For 1.18–1.21.11 there is exactly ONE Short (`blockCount`/`nonAirBlocksCount`) before the block-states container.
|
||||
|
||||
### 1.3 Block Entity (the array after `data`)
|
||||
|
||||
@@ -290,7 +290,7 @@ Source: minecraft-data `1.17` vs `1.18` `packet_map_chunk`; ViaVersion `ChunkTyp
|
||||
|
||||
- **1.21.x**: `trustEdges` removed from the chunk packet (minecraft-data `1.21.1/packet_map_chunk` has no `trustEdges`); packet ID shifted to `0x27`. heightmaps switched to **anonymous** (network/unnamed) NBT (`anonymousNbt`).
|
||||
- **1.16**: the data-array packing changed from "entries-can-span-longs" to the **padded "no entry spans two longs"** form (§2.4) — a silent but decoder-breaking change with no field-list delta.
|
||||
- **26.1+**: a second `Short fluidCount` is added to each Chunk Section (ViaVersion `ChunkSection.getFluidCount` "Available with versions 26.1+", `ChunkSection.java:67-73`). <!-- UNCONFIRMED for exact protocol/version number; flagged in §1.2 -->
|
||||
- **26.1+**: a second `Short fluidCount` is added to each Chunk Section. Confirmed via `ChunkSectionType26_1.java` (reads two `readShort()` calls) and `Protocol1_21_11To26_1.java` (uses `ChunkType26_1`). Source: `ViaVersion/.../api/type/types/chunk/ChunkSectionType26_1.java`; see §1.2 for detailed layout.
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -207,7 +207,7 @@ Registry after insertion (24 entries):
|
||||
Source: `EntityDataTypes1_19_4.java`.
|
||||
|
||||
Added:
|
||||
- ID 14: Block State (non-optional, explicit; previously only Optional Block State existed — no bare Block State type ID was present in 1.14–1.19.3) <!-- UNCONFIRMED: minecraft-data 1.19 shows blockStateType=id 13 in ViaVersion but only Optional exists; ViaVersion 1.19.4 file explicitly separates them at 14 and 15. -->
|
||||
- ID 14: Block State (non-optional, explicit; confirmed new in 1.19.4). ViaVersion `EntityDataTypes1_9` through `EntityDataTypes1_19_3` have only `optionalBlockStateType` (never a separate `blockStateType`); `EntityDataTypes1_19_4.java:45` is the first to add `blockStateType = add(14, Types.VAR_INT)` alongside `optionalBlockStateType = add(15, Types.VAR_INT)`. Source: grep across `EntityDataTypes1_9.java`, `EntityDataTypes1_14.java`, `EntityDataTypes1_19.java`, `EntityDataTypes1_19_3.java`, `EntityDataTypes1_19_4.java`.
|
||||
- ID 25: Sniffer State (VarInt enum, new in 1.20 — but the type ID slot is first defined in ViaVersion's 1.19.4 class)
|
||||
- ID 26: Vector3F (`f32`×3)
|
||||
- ID 27: Quaternion (`f32`×4)
|
||||
@@ -338,6 +338,6 @@ Historically (≤ 1.8) the full metadata list was also embedded in `Spawn Mob` (
|
||||
|
||||
## 9. Open Items
|
||||
|
||||
- `<!-- UNCONFIRMED -->` — Whether `Block State` (ID 14, non-optional) already existed in 1.14–1.19.2 or was truly new in 1.19.4: ViaVersion's 1.14 class omits it (only `optionalBlockState` at 13) but 1.19.4 explicitly has both 14 and 15. This implies the split was at 1.19.4, but no direct minecraft-data diff or wiki changelog entry in the available sources explicitly names this change.
|
||||
- The `optional_global_pos` value in 1.21.1 (`minecraft-data` encodes it as `['option', 'string']`) — the string appears to be the dimension name key only, not a full ResourceLocation + Position pair as ViaVersion's `OPTIONAL_GLOBAL_POSITION` type implies. <!-- UNCONFIRMED: need to cross-check against the Minecraft wiki Optional Global Position definition. -->
|
||||
- **Block State (ID 14, non-optional) first appeared in 1.19.4**: confirmed — ViaVersion's 1.14, 1.19, and 1.19.3 classes have only `optionalBlockStateType`; 1.19.4 adds both `blockStateType` (14) and `optionalBlockStateType` (15). See §4.6.
|
||||
- **`optional_global_pos` wire encoding**: confirmed — `GlobalBlockPositionType.java` reads `String dimension` (the dimension ResourceLocation, e.g. `minecraft:overworld`) + `BLOCK_POSITION1_14` (packed i64 position). The `minecraft-data` `['option', 'string']` representation is a schema approximation; the actual wire format is `bool` + (if present) String + packed Position. Source: `ViaVersion/.../api/type/types/math/GlobalBlockPositionType.java:41-43`.
|
||||
- Pose enum values beyond the 1.14 original (e.g. `Croaking`, `UsingTongue`, `Roaring`, `Sniffing`, `Emerging`, `Digging` added for 1.17–1.20 mobs) — not enumerated here; the authoritative list is at `minecraft.wiki/w/Entity_format#Pose`.
|
||||
|
||||
@@ -154,10 +154,7 @@ Slot {
|
||||
### `itemCount` type discrepancy
|
||||
|
||||
`minecraft-data` 1.20.5 records `itemCount` as `i8`. ViaVersion's `ItemType1_20_5.java:51`
|
||||
reads it as `VAR_INT`. ViaVersion is tested against live servers; the minecraft-data
|
||||
entry is believed to be an artifact of the dataset's snapshot timing.
|
||||
From 1.21.2 onwards minecraft-data also records `varint`, confirming the ViaVersion
|
||||
reading. <!-- UNCONFIRMED: exact snapshot commit when Mojang changed the wire type -->
|
||||
reads it as `VAR_INT` — confirmed: `Types.VAR_INT.readPrimitive(buffer)` is the first read in the non-empty branch. ViaVersion is tested against live servers and is authoritative; the minecraft-data `i8` entry is a snapshot artifact from before the 1.20.5 release finalised the wire format. `minecraft-data` 1.21.1 independently records `varint`, confirming that VarInt is correct from **1.20.5** onward. Source: `ViaVersion/.../api/type/types/item/ItemType1_20_5.java:51` + `minecraft-data/data/pc/1.21.1/protocol.json` `types.Slot`.
|
||||
|
||||
---
|
||||
|
||||
@@ -279,19 +276,6 @@ that components replace with per-component `showTooltip` booleans.
|
||||
|
||||
## Open items
|
||||
|
||||
- **`itemCount` i8 vs VarInt in 1.20.5**: minecraft-data records `i8`; ViaVersion
|
||||
`ItemType1_20_5.java` reads `VAR_INT`. The ViaVersion implementation is tested
|
||||
against live traffic and is treated as authoritative here, but the exact protocol
|
||||
snapshot where Mojang switched is unconfirmed. <!-- UNCONFIRMED -->
|
||||
- **1.20.2 NBT format**: ViaVersion `ItemType1_20_2.java` uses `Types.COMPOUND_TAG`
|
||||
(anonymous, no name prefix) while earlier versions used `Types.NAMED_COMPOUND_TAG`.
|
||||
The exact protocol version of that sub-change within the 1.13.2–1.20.4 era is
|
||||
confirmed as 1.20.2 by the class name but not independently verified against
|
||||
protocol.json (1.20.2 and 1.20.3 files share the same `present+id+count+nbt`
|
||||
shape in minecraft-data). <!-- UNCONFIRMED: exact NBT name-prefix removal commit -->
|
||||
- **`jukebox_playable` wire shape in 1.20.5**: present in the component type enum
|
||||
at id 42 per minecraft-data 1.20.5? The diff above shows `recipes` at 42 in 1.20.5
|
||||
and `jukebox_playable` absent — consistent with Mojang adding `jukebox_playable`
|
||||
in the 1.21 pre-releases. If a 1.20.5 release-candidate snapshot introduced it
|
||||
mid-stream, that is not captured in the current minecraft-data snapshot.
|
||||
<!-- UNCONFIRMED -->
|
||||
- **`itemCount` i8 vs VarInt**: confirmed VarInt from **1.20.5** — `ItemType1_20_5.java:51` reads `Types.VAR_INT`; `ItemType1_20_2.java:47` reads `readByte()` (i8). `minecraft-data` 1.20.5's `i8` entry is a pre-release snapshot artifact; corrected to `varint` in `minecraft-data` 1.21.1. Source: `ViaVersion/.../api/type/types/item/ItemType1_20_5.java` and `ItemType1_20_2.java`.
|
||||
- **1.20.2 NBT format (name-prefix removal)**: confirmed at **1.20.2** — `ItemType1_20_2.java:47` uses `Types.COMPOUND_TAG` (anonymous); `ItemType1_13_2.java:46` uses `Types.NAMED_COMPOUND_TAG`. There is no `ItemType1_20_3` or `ItemType1_20_4` (those versions reuse `ItemType1_20_2`), so the change landed exactly at the 1.20.2 protocol boundary. Source: `ViaVersion/.../api/type/types/item/ItemType1_20_2.java` vs `ItemType1_13_2.java`.
|
||||
- **`jukebox_playable` in 1.20.5**: confirmed absent — `minecraft-data` 1.20.5 `SlotComponentType` mappings show `recipes` at id 42; no `jukebox_playable` entry. The 1.21 pre-releases introduced it. The component table in this doc correctly reflects this split.
|
||||
|
||||
Reference in New Issue
Block a user