Files
minecraft_protocol/versions/1.11.md
T
claude-timemachine a3d5f64ef5 verify pass: resolve VERIFY flags (corrections + citations + honest UNCONFIRMED)
Corrected real errors: several 1.7.x release dates, resource_pack_send version,
config packet ordering, structured-component count (56), PLAYER_LOADED (1.21.4),
entity_sound_effect field order. Confirmed+cited the rest; remaining ~19 items
re-marked UNCONFIRMED (third-party/ViaLegacy/26.2 internals unreachable from refs).

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

291 lines
19 KiB
Markdown
Raw 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.
# 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 (0x000x4b) 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 7184: `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 152162: `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 (036) 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 129156 and `data/PotionColorMappings1_11.java` — maps 37 old data values to new RGB color integers; marks indices 2124 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 87105.
#### `0x19 named_sound_effect` (Named Sound Effect / SOUND)
The sound ID space was renumbered. ViaVersion `getNewSoundId()` (`Protocol1_10To1_11.java` lines 190217) 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 162173:
```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 175187 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 218234 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 218234, 449, 450) with stone (ID 1) when sending to 1.10 servers. Source: `ItemPacketRewriter1_11.java` lines 9398.
### 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 6572.
### 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 4956; 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 3648.
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 218234, 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`)
---
## Resolved verification notes
**Shulker box item ID range (218234):** Confirmed against `minecraft-data/data/pc/1.11/items.json`. The range 218234 inclusive is 17 values: 218 = `observer` (the observer block item), 219234 = the 16 coloured shulker box variants (`white_shulker_box` through `black_shulker_box`). `totem` = 449, `shulker_shell` = 450 (outside this range). ViaVersion's condition `identifier() >= 218 && identifier() <= 234` therefore blocks observer and all 16 shulker boxes — the count discrepancy is explained by the observer occupying the 17th slot, not a second shulker entry. Source: `minecraft-data/data/pc/1.11/items.json`; `ItemPacketRewriter1_11.java` lines 9398.
**Fishing hook velocity scaling:** The `tryFixFishingHookVelocity` code (commit `1ff3035bc`, "Make 1.10->1.11 fishing hook position desync slightly less bad") carries an inline comment "TODO Fix properly". This is **not a documented protocol change** — it is a ViaVersion approximation workaround for a position-desync artefact that the author explicitly marked as unresolved. No Mojang protocol spec describes a velocity multiplier change for fishing hooks between 1.10 and 1.11.
**Chat length limit (100 → 256):** Confirmed from two directions. `Protocol1_10To1_11.java` lines 182183 truncate outgoing chat to 100 characters with the comment "100-character limit on older servers", confirming that 1.10 servers enforce a 100-character limit. The 1.11 server-side maximum is 256 characters (minecraft.wiki Java Edition 1.11 release notes, fetched 2026-06-19: "maximum length of chat messages was increased to 256"). ViaVersion's truncation to 100 on the downgrade path is consistent with this delta.