minecraft_protocol: foundation + per-version protocol docs 1.7.10->26.2
8 topical docs (overview, data types, lifecycle, handshake, status/ping, login+encryption, configuration, version-differences) + proxy-forwarding set + 16 per-version release-line docs, sourced from minecraft.wiki, ViaVersion (source + commits), minecraft-data, node-minecraft-protocol, Velocity, BungeeCord. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,288 @@
|
||||
# 1.11.x — The Exploration Update
|
||||
|
||||
| Release | Protocol | Date | minecraft-data dir |
|
||||
|---|---|---|---|
|
||||
| 1.11 | **315** | 2016-11-14 | `data/pc/1.11` |
|
||||
| 1.11.1 | **316** | 2016-12-20 | *(inherits 1.11)* |
|
||||
| 1.11.2 | **316** | 2016-12-21 | `data/pc/1.11.2` |
|
||||
|
||||
**Sources:**
|
||||
- Release notes: [minecraft.wiki/w/Java_Edition_1.11](https://minecraft.wiki/w/Java_Edition_1.11) (fetched 2026-06-19); [minecraft.wiki/w/Java_Edition_1.11.1](https://minecraft.wiki/w/Java_Edition_1.11.1) (fetched 2026-06-19); [minecraft.wiki/w/Java_Edition_1.11.2](https://minecraft.wiki/w/Java_Edition_1.11.2) (fetched 2026-06-19)
|
||||
- ViaVersion `v1_10to1_11`: `/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_10to1_11/` — `Protocol1_10To1_11.java`, `rewriter/EntityPacketRewriter1_11.java`, `rewriter/ItemPacketRewriter1_11.java`, `data/EntityMappings1_11.java`, `data/BlockEntityMappings1_11.java`, `data/PotionColorMappings1_11.java`
|
||||
- ViaVersion `v1_11to1_11_1`: `/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_11to1_11_1/` — `Protocol1_11To1_11_1.java`, `rewriter/ItemPacketRewriter1_11_1.java`
|
||||
- minecraft-data: `/tmp/mcproto-refs/minecraft-data/data/pc/1.10/`, `1.11/`, `1.11.2/`
|
||||
|
||||
---
|
||||
|
||||
## Headline
|
||||
|
||||
The Exploration Update shipped woodland mansions, the illager mob family (evokers, vindicators, vexes), llamas, shulker boxes, the observer block, and a totem of undying. From a **protocol standpoint this is a minor-to-medium bump**: no packets were added or removed between 1.10 (protocol 210) and 1.11 (protocol 315); however, several existing packets received field-level changes and the entire entity/block-entity NBT namespace was migrated from Pascal-cased legacy names to `snake_case` namespaced identifiers. The 315→316 bump (1.11.1) is one of the smallest in the entire 1.x series — only one serverbound packet was changed to handle a new item added in 1.11.1.
|
||||
|
||||
---
|
||||
|
||||
## Protocol changes vs 1.10 (315)
|
||||
|
||||
Confirmed by diff of `minecraft-data/data/pc/1.10/protocol.json` vs `data/pc/1.11/protocol.json` and ViaVersion `v1_10to1_11` rewriters.
|
||||
|
||||
### Packet IDs — no change
|
||||
|
||||
All 76 clientbound play packets (0x00–0x4b) and all serverbound play packets share identical IDs between protocol 210 (1.10) and 315 (1.11). The packet *set* is unchanged. All changes are within existing packet payloads.
|
||||
|
||||
Sources: `minecraft-data` `1.10/protocol.json` vs `1.11/protocol.json` — `toClient` and `toServer` mapping tables are byte-for-byte identical; ViaVersion `Protocol1_10To1_11` extends `AbstractProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3>` reusing the unchanged 1.9.3 packet enum for both old and new sides.
|
||||
|
||||
### Play — Clientbound
|
||||
|
||||
#### `0x03 spawn_entity_living` (Spawn Living Entity / ADD_MOB)
|
||||
|
||||
The `type` field changed wire format:
|
||||
|
||||
| Version | Field | Wire type |
|
||||
|---|---|---|
|
||||
| 1.10 (210) | `type` | `u8` (unsigned byte) |
|
||||
| 1.11 (315) | `type` | `varint` |
|
||||
|
||||
Source: `minecraft-data/data/pc/1.10/protocol.json` `packet_spawn_entity_living.type = "u8"` vs `1.11/protocol.json` `type = "varint"`. Confirmed by ViaVersion `EntityPacketRewriter1_11.java` line 123: `map(Types.UNSIGNED_BYTE, Types.VAR_INT); // 2 - Entity Type`.
|
||||
|
||||
This is necessary because 1.11 expanded the entity type table to numbered IDs well beyond 255 and reorganised the ID space (see Entity Type Remapping below).
|
||||
|
||||
#### `0x45 title` (Title / SET_TITLES)
|
||||
|
||||
An **action bar action was inserted** at index 2, shifting the existing timing action from 2 to 3:
|
||||
|
||||
| Action index | 1.10 (210) | 1.11 (315) |
|
||||
|---|---|---|
|
||||
| 0 | Set title | Set title |
|
||||
| 1 | Set subtitle | Set subtitle |
|
||||
| 2 | Set times | **Set action bar** (new) |
|
||||
| 3 | — | Set times (was 2) |
|
||||
| 4 | Hide | Hide (was 3) |
|
||||
| 5 | Reset | Reset (was 4) |
|
||||
|
||||
Source: `minecraft-data/data/pc/1.10/protocol.json` title `text.fields` = `{"0":"string","1":"string"}`, `fadeIn.fields` = `{"2":"i32"}` vs `1.11/protocol.json` text `fields` = `{"0":"string","1":"string","2":"string"}`, `fadeIn.fields` = `{"3":"i32"}`. Confirmed by ViaVersion `Protocol1_10To1_11.java` lines 71–84: `if (action >= 2) { wrapper.set(Types.VAR_INT, 0, action + 1); }` — increments the action number for any value ≥ 2 to make room for action bar at index 2.
|
||||
|
||||
#### `0x48 collect` (Take Item Entity / TAKE_ITEM_ENTITY)
|
||||
|
||||
A third field `pickupItemCount` was added:
|
||||
|
||||
| Version | Fields |
|
||||
|---|---|
|
||||
| 1.10 (210) | `collectedEntityId` (varint), `collectorEntityId` (varint) |
|
||||
| 1.11 (315) | `collectedEntityId` (varint), `collectorEntityId` (varint), `pickupItemCount` (varint) |
|
||||
|
||||
Source: `minecraft-data/data/pc/1.10/protocol.json` `packet_collect` has 2 fields; `1.11/protocol.json` has 3, adding `pickupItemCount`. Confirmed by ViaVersion `EntityPacketRewriter1_11.java` lines 152–162: `wrapper.write(Types.VAR_INT, 1); // 2 - Pickup Count` — injects a hardcoded `1` to synthesise the field when translating from 1.11 to 1.10 clients.
|
||||
|
||||
#### `0x21 world_event` (Effect / LEVEL_EVENT)
|
||||
|
||||
Effect ID **2002** (splash potion impact) was split: linear potion data values (0–36) that previously encoded potion type as a damage-value integer were replaced by **color-based RGB values**. Additionally, instant-effect potions (Instant Health, Instant Damage) were reclassified to use a new effect ID **2007** rather than 2002.
|
||||
|
||||
Source: ViaVersion `Protocol1_10To1_11.java` lines 129–156 and `data/PotionColorMappings1_11.java` — maps 37 old data values to new RGB color integers; marks indices 21–24 as `isInstant = true` which triggers the 2002→2007 remap.
|
||||
|
||||
#### `0x09 tile_entity_data` / `0x20 map_chunk` (Block Entity Data / Level Chunk)
|
||||
|
||||
Block entity `id` tags in NBT were migrated from **PascalCase** legacy strings to **`minecraft:snake_case`** namespaced identifiers. This affects both the inline block entity list in `LEVEL_CHUNK` (0x20) and the standalone `BLOCK_ENTITY_DATA` (0x09) packet.
|
||||
|
||||
Full mapping (old → new), source `BlockEntityMappings1_11.java` in `v1_10to1_11/data/`:
|
||||
|
||||
| Old | New |
|
||||
|---|---|
|
||||
| `Furnace` | `minecraft:furnace` |
|
||||
| `Chest` | `minecraft:chest` |
|
||||
| `EnderChest` | `minecraft:ender_chest` |
|
||||
| `RecordPlayer` | `minecraft:jukebox` |
|
||||
| `Trap` | `minecraft:dispenser` |
|
||||
| `Dropper` | `minecraft:dropper` |
|
||||
| `Sign` | `minecraft:sign` |
|
||||
| `MobSpawner` | `minecraft:mob_spawner` |
|
||||
| `Music` | `minecraft:noteblock` |
|
||||
| `Piston` | `minecraft:piston` |
|
||||
| `Cauldron` | `minecraft:brewing_stand` |
|
||||
| `EnchantTable` | `minecraft:enchanting_table` |
|
||||
| `Airportal` | `minecraft:end_portal` |
|
||||
| `Beacon` | `minecraft:beacon` |
|
||||
| `Skull` | `minecraft:skull` |
|
||||
| `DLDetector` | `minecraft:daylight_detector` |
|
||||
| `Hopper` | `minecraft:hopper` |
|
||||
| `Comparator` | `minecraft:comparator` |
|
||||
| `FlowerPot` | `minecraft:flower_pot` |
|
||||
| `Banner` | `minecraft:banner` |
|
||||
| `Structure` | `minecraft:structure_block` |
|
||||
| `EndGateway` | `minecraft:end_gateway` |
|
||||
| `Control` | `minecraft:command_block` |
|
||||
|
||||
#### `0x0a block_action` (Block Action / BLOCK_EVENT)
|
||||
|
||||
For piston blocks (block type IDs 33 and 29), ViaVersion optionally cancels the block action packet entirely when `isPistonAnimationPatch` is enabled, to suppress rendering glitches on 1.10 clients watching 1.11 servers. This is a ViaVersion compat workaround, not a protocol format change. Source: `Protocol1_10To1_11.java` lines 87–105.
|
||||
|
||||
#### `0x19 named_sound_effect` (Named Sound Effect / SOUND)
|
||||
|
||||
The sound ID space was renumbered. ViaVersion `getNewSoundId()` (`Protocol1_10To1_11.java` lines 190–217) documents the shifts:
|
||||
|
||||
| Range | Change |
|
||||
|---|---|
|
||||
| ID 196 | Removed entirely (experience orb pickup sound) |
|
||||
| IDs ≥ 85 | +2 (shulker box sounds inserted) |
|
||||
| IDs ≥ 176 | +1 (guardian flop sound inserted) |
|
||||
| IDs ≥ 197 | +8 (evocation sounds: 8 new IDs) |
|
||||
| IDs ≥ 207 | −1 (accounts for the removed ID 196 orb sound) |
|
||||
| IDs ≥ 279 | +9 (llama sounds: 9 new IDs) |
|
||||
| IDs ≥ 296 | +1 (mule chest sound inserted) |
|
||||
| IDs ≥ 390 | +4 (vex sounds: 4 new IDs) |
|
||||
| IDs ≥ 400 | +3 (vindication illager sounds: 3 new IDs) |
|
||||
| IDs ≥ 450 | +1 (elytra sound inserted) |
|
||||
| IDs ≥ 455 | +1 (empty bottle sound inserted) |
|
||||
| IDs ≥ 470 | +1 (totem use sound inserted) |
|
||||
|
||||
### Play — Serverbound
|
||||
|
||||
#### `0x08 block_place` (Use Item On / PLAYER_BLOCK_PLACEMENT)
|
||||
|
||||
The cursor position fields `cursorX/Y/Z` changed from **signed byte (`i8`, encoded as fixed-point ×16)** to **float (`f32`)**:
|
||||
|
||||
| Version | `cursorX/Y/Z` type |
|
||||
|---|---|
|
||||
| 1.10 (210) | `i8` (signed byte, value × 16 ÷ 16.0 to recover float) |
|
||||
| 1.11 (315) | `f32` (IEEE 754 float) |
|
||||
|
||||
Source: `minecraft-data/data/pc/1.10/protocol.json` `packet_block_place.cursorX = "i8"` vs `1.11/protocol.json` `cursorX = "f32"`. Confirmed by ViaVersion `Protocol1_10To1_11.java` lines 162–173:
|
||||
```java
|
||||
private static final ValueTransformer<Float, Short> toOldByte = new ValueTransformer<>(Types.UNSIGNED_BYTE) {
|
||||
public Short transform(PacketWrapper wrapper, Float inputValue) {
|
||||
return (short) (inputValue * 16);
|
||||
}
|
||||
};
|
||||
// ...
|
||||
map(Types.FLOAT, toOldByte); // cursorX
|
||||
map(Types.FLOAT, toOldByte); // cursorY
|
||||
map(Types.FLOAT, toOldByte); // cursorZ
|
||||
```
|
||||
The transformer multiplies the incoming float by 16 and casts to byte to send the old format to 1.10 servers.
|
||||
|
||||
#### `0x02 chat` (Chat Message)
|
||||
|
||||
The server-side chat message **length limit was raised from 100 to 256 characters**. ViaVersion truncates outgoing messages to 100 characters when sending to 1.10 servers. Source: `Protocol1_10To1_11.java` lines 175–187 and minecraft.wiki 1.11 release notes (fetched 2026-06-19).
|
||||
|
||||
### Entity type ID remapping and NBT namespace migration
|
||||
|
||||
1.11 was the first version to apply a comprehensive **entity ID/name restructure**. Two changes happened simultaneously:
|
||||
|
||||
1. **Numeric IDs were reorganised**: Several sub-types previously encoded via metadata (elder guardian, wither skeleton, stray, husk, zombie villager, skeleton horse, zombie horse, donkey, mule) became **distinct entity type IDs**. In 1.10, only one `EntityHorse` type existed (ID 100); in 1.11, five separate IDs exist: horse (100), donkey (31), mule (32), skeleton horse (28), zombie horse (29). Similarly the single `Skeleton` (51) split into skeleton (51), wither skeleton (5), and stray (6). This is why ViaVersion's `rewriteEntityType()` in `EntityPacketRewriter1_11.java` reads metadata index 12 (skeleton sub-type), 13 (zombie sub-type), or 14 (horse sub-type) to decide the correct new entity ID.
|
||||
|
||||
2. **Entity save-data names were namespaced**: All entity NBT `id` strings were migrated from PascalCase (`EntityHorse`, `LavaSlime`, `MushroomCow`, etc.) to `minecraft:snake_case` (`horse`, `magma_cube`, `mooshroom`, etc.). Full mapping in `EntityMappings1_11.java` in `v1_10to1_11/data/` (74 entries). This affects spawn eggs (item 383) and monster spawner block entities.
|
||||
|
||||
New mob entity type IDs in 1.11 (minecraft-data `1.11/entities.json`):
|
||||
|
||||
| Entity | Type ID (mob) | Object ID |
|
||||
|---|---|---|
|
||||
| `evocation_fangs` | 33 | 79 |
|
||||
| `evocation_illager` (evoker) | 34 | — |
|
||||
| `vex` | 35 | — |
|
||||
| `vindication_illager` (vindicator) | 36 | — |
|
||||
| `llama` | 103 | — |
|
||||
| `llama_spit` | 104 | 68 |
|
||||
| `zombie_villager` | 27 | — |
|
||||
|
||||
### Item changes (1.10 → 1.11)
|
||||
|
||||
New items added (minecraft-data `1.11/items.json` diff vs `1.10/items.json`):
|
||||
|
||||
| Item | Notes |
|
||||
|---|---|
|
||||
| `observer` | Block + item; IDs 218–234 range on server |
|
||||
| `white_shulker_box` – `black_shulker_box` | 16 coloured variants |
|
||||
| `totem` | Totem of undying |
|
||||
| `shulker_shell` | Crafting ingredient |
|
||||
|
||||
ViaVersion replaces any of these items (IDs 218–234, 449, 450) with stone (ID 1) when sending to 1.10 servers. Source: `ItemPacketRewriter1_11.java` lines 93–98.
|
||||
|
||||
### Item NBT: enchantment glint behaviour change
|
||||
|
||||
In 1.10, an item with an empty `ench` list tag (`[]`) displayed an enchantment glint. In 1.11+, the list must contain at least one element. ViaVersion adds a dummy compound entry to empty `ench` tags when sending to 1.10 clients (and removes it on the server path). Source: `ItemPacketRewriter1_11.java` lines 65–72.
|
||||
|
||||
### Item NBT: negative amount handling
|
||||
|
||||
1.11 servers can send items with `amount <= 0` to indicate "nothing here" in certain contexts. 1.10 clients interpret amount 0 as a bug. ViaVersion stores the real amount in an NBT tag (`VV|Amount`) and sets `amount = 1` before forwarding to old clients. Source: `ItemPacketRewriter1_11.java` lines 49–56; commit `d0ed52878 Save negative item amounts in 1.10->1.11`.
|
||||
|
||||
---
|
||||
|
||||
## Per-patch: 315 (1.11) vs 316 (1.11.1 and 1.11.2)
|
||||
|
||||
### 1.11.1 — protocol 316 (2016-12-20)
|
||||
|
||||
**Gameplay additions** (minecraft.wiki 1.11.1, fetched 2026-06-19):
|
||||
- Iron nuggets added (item ID 452, smelting iron tools/armor)
|
||||
- Sweeping Edge enchantment added for swords
|
||||
- Fireworks now boost elytra-flying players and deal damage on explosion
|
||||
- Mending and Infinity enchantments became mutually exclusive on bows
|
||||
- 41 bugs fixed
|
||||
|
||||
**Protocol change — one packet:**
|
||||
|
||||
Only the serverbound `SET_CREATIVE_MODE_SLOT` (0x18) was affected. ViaVersion `Protocol1_11To1_11_1` (`v1_11to1_11_1`) registers exactly one handler — `ItemPacketRewriter1_11_1.registerPackets()` which registers only `registerSetCreativeModeSlot`. The rewriter's `handleItemToServer` replaces item ID 452 (iron nugget) with stone (ID 1) when sending to 1.11 servers that do not know about that item.
|
||||
|
||||
Source: `v1_11to1_11_1/Protocol1_11To1_11_1.java` (only `itemRewriter.register()` called, no other packet registrations); `v1_11to1_11_1/rewriter/ItemPacketRewriter1_11_1.java` lines 36–48.
|
||||
|
||||
ViaVersion git log for `v1_11to1_11_1/`:
|
||||
```
|
||||
cff9a8715 [ci skip] Update copyright header
|
||||
9f6e7fa4e [ci skip] Update copyright header
|
||||
1039b8556 Add remaining item types to item rewriter implementations (#3931)
|
||||
75d86851c Apply IJ code reformat, rename rewriter methods, change metadata references to entity data
|
||||
5286efde1 Move type instances out of its enclosing class
|
||||
501f65e21 Packet and entity type renames
|
||||
e965e9713 Package/class renames and moves
|
||||
```
|
||||
(`git -C /tmp/mcproto-refs/ViaVersion log --oneline -- common/.../protocols/v1_11to1_11_1/ | head -20`)
|
||||
|
||||
The protocol between 1.11 (315) and 1.11.1 (316) is otherwise **identical** in every other respect. No packet IDs changed, no fields changed in any other packet.
|
||||
|
||||
### 1.11.2 — protocol 316 (2016-12-21)
|
||||
|
||||
1.11.2 shares **the same protocol number (316)** as 1.11.1. minecraft-data confirms: `data/pc/1.11.2/version.json` → `"version": 316`. The 1.11.2 directory in minecraft-data contains only `protocolComments.json`, `sounds.json` (493 sounds), and `version.json` — no separate `protocol.json`, confirming no protocol difference from 1.11.1.
|
||||
|
||||
Gameplay: one block change (cobblestone walls can no longer be jumped over) and 24 bug fixes. Source: minecraft.wiki 1.11.2 (fetched 2026-06-19). No protocol-level changes.
|
||||
|
||||
---
|
||||
|
||||
## Proxy / ViaVersion translation impact
|
||||
|
||||
Translating a **1.10 client (210) connecting to a 1.11 server (315)** requires all of the following, implemented in `v1_10to1_11/`:
|
||||
|
||||
1. **Entity spawn type field**: `ADD_MOB` type field → downcast varint to unsigned byte before forwarding to 1.10 client.
|
||||
2. **Entity type splitting**: ViaVersion must read entity metadata on spawn to determine which 1.11 entity type the 1.10 monolithic type maps to (e.g. reading skeleton sub-type metadata index 12 to emit `wither_skeleton` vs `skeleton` vs `stray` to old clients).
|
||||
3. **Title action bar shift**: Decrement action index by 1 for any value ≥ 2 when sending to 1.10 clients (so the new action bar action 2 is dropped; existing times/hide/reset shift back).
|
||||
4. **Collect pickup count**: Synthesise (drop) the new `pickupItemCount` field when forwarding to 1.10 clients.
|
||||
5. **Block placement cursor**: Convert `f32` cursor fields to `i8` (×16) when forwarding serverbound to 1.11 servers from 1.10 clients.
|
||||
6. **Block entity NBT**: Translate all block entity `id` tags from `minecraft:snake_case` → PascalCase on the way to 1.10 clients (and vice versa serverbound).
|
||||
7. **Entity NBT names**: Translate entity names in spawn eggs and spawner block entities.
|
||||
8. **Sound IDs**: Remap or cancel sound effect IDs per the offset table.
|
||||
9. **Potion splash effect IDs**: Remap effect 2002 data values and redirect instant potions to new effect ID 2007.
|
||||
10. **Item ID blocking**: Block unknown items (IDs 218–234, 449, 450) by replacing with stone before forwarding to 1.10 servers.
|
||||
11. **Enchantment glint compat**: Inject dummy `ench` entry for empty-list items destined for 1.10 clients.
|
||||
12. **Chat length truncation**: Trim outgoing chat to 100 chars for 1.10 servers.
|
||||
|
||||
Translating a **1.11 client (315) connecting to a 1.11.1 server (316)**, or vice versa, requires only:
|
||||
|
||||
- Block item ID 452 (iron nugget) in creative-mode slot packets sent to 1.11 (315) servers.
|
||||
|
||||
No entity, sound, block entity, or packet-structure translation is needed across the 315→316 boundary.
|
||||
|
||||
ViaVersion git log for `v1_10to1_11/` (selected relevant commits):
|
||||
```
|
||||
7b097b3e5 Strip trailing on chat messages in 1.10->1.11 (#4686)
|
||||
3ba86741f Send default entity data for items in 1.10->1.11 (#4265)
|
||||
5287d4fb4 Fix enchantment glint behaviour in 1.10->1.11 (#4156)
|
||||
c5dc5b2bf Actually restrict velocity change to fishing hooks
|
||||
1ff3035bc Make 1.10->1.11 fishing hook position desync slightly less bad
|
||||
d0ed52878 Save negative item amounts in 1.10->1.11 (#3921)
|
||||
ae3042074 Add trade list rewriter functions to ItemRewriter (#3926)
|
||||
8f8f5e72c Default rewriter registrations across protocols
|
||||
```
|
||||
(`git -C /tmp/mcproto-refs/ViaVersion log --oneline -- common/.../protocols/v1_10to1_11/ | head -20`)
|
||||
|
||||
---
|
||||
|
||||
## VERIFY flags
|
||||
|
||||
- <!-- VERIFY --> The exact IDs for the 16 shulker box item variants (listed as 218–234 in `ItemPacketRewriter1_11.java` lines 93–94) — the comment says `item.identifier() >= 218 && item.identifier() <= 234` which is 17 values (218..234 inclusive), but only 16 colors exist. One of the 17 slots may be the shulker shell or observer. Confirm against `1.11/items.json` item ID table.
|
||||
- <!-- VERIFY --> Fishing hook velocity scaling change (noted in ViaVersion commit `1ff3035bc` and code `tryFixFishingHookVelocity` which multiplies x/z by 1.33 and y by 1.2) — whether this is a documented protocol change or solely a ViaVersion approximation fix is unclear from the code comment ("TODO Fix properly").
|
||||
- <!-- VERIFY --> Chat length limit change from 100 to 256: wiki says 256; ViaVersion truncates to 100 for 1.10 servers. Confirm the exact 1.11 server-side maximum from protocol spec or `PacketDecoder`.
|
||||
Reference in New Issue
Block a user