Files
minecraft_protocol/versions/1.10.md
T
claude-timemachine d73c1c9537 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>
2026-06-19 14:15:32 +02:00

219 lines
12 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.
# Java Edition 1.10 — Protocol 210
**Release line:** 1.10, 1.10.1, 1.10.2 (all protocol 210)
**Protocol number:** 210
**Preceding protocol:** 110 (shared by 1.9.3 and 1.9.4)
**Release dates:**
- 1.10 — June 8, 2016 ([minecraft.wiki/w/Java_Edition_1.10](https://minecraft.wiki/w/Java_Edition_1.10), fetched 2026-06-19)
- 1.10.1 — June 22, 2016 ([minecraft.wiki/w/Java_Edition_1.10.1](https://minecraft.wiki/w/Java_Edition_1.10.1), fetched 2026-06-19)
- 1.10.2 — June 23, 2016 ([minecraft.wiki/w/Java_Edition_1.10.2](https://minecraft.wiki/w/Java_Edition_1.10.2), fetched 2026-06-19)
Sources used:
- ViaVersion `v1_9_3to1_10` package: `common/src/main/java/com/viaversion/viaversion/protocols/v1_9_3to1_10/` (git log: `cff9a87`, `64c128d`, `262677326`, `9f6e7fa`, `22d396d`, `e436bbe`, `864beef`, `463381b`, `1039b85`, `75d68516`, `5286efde`, `501f65e2`, `e965e971`)
- minecraft-data `data/pc/1.9.4/protocol.json` vs `data/pc/1.10/protocol.json`
- minecraft.wiki release articles (URLs above)
---
## Headline: The Frostburn Update — minor protocol bump
1.10 is a content update focused on cold and hot biomes: polar bears, husks (desert zombie variant), strays (ice skeleton variant), magma blocks, bone blocks, nether wart blocks, red nether bricks, structure void, and structure blocks. The jump from protocol 110 to 210 is a significant numeric gap but reflects only a small set of actual wire-format changes. No packets were added, removed, or renumbered. The entire translation in ViaVersion is handled by three packet rewrites plus a sound-ID remapping table.
**The bottom line from source:** `Protocol1_9_3To1_10.java` extends `AbstractProtocol<ClientboundPackets1_9_3, ClientboundPackets1_9_3, ServerboundPackets1_9_3, ServerboundPackets1_9_3>` — the input and output packet enums are identical, confirming zero structural additions or renumbering.
(Source: `common/.../v1_9_3to1_10/Protocol1_9_3To1_10.java`, line 40)
---
## Protocol changes vs 1.9.4 (protocol 110)
Authoritative diff: `minecraft-data data/pc/1.9.4/protocol.json` vs `data/pc/1.10/protocol.json` — three field-level changes across two packets (clientbound) and one packet (serverbound).
### Play state — Clientbound
#### 0x19 Named Sound Effect (`CUSTOM_SOUND`) — pitch type change
| Field | 1.9.4 | 1.10 |
|---|---|---|
| soundName | String | String |
| soundCategory | VarInt | VarInt |
| x | Int (fixed-point ×8) | Int |
| y | Int (fixed-point ×8) | Int |
| z | Int (fixed-point ×8) | Int |
| volume | Float | Float |
| **pitch** | **UByte (u8)** | **Float (f32)** |
Source: `minecraft-data data/pc/1.9.4/protocol.json` line 1194 vs `data/pc/1.10/protocol.json` line 1194.
ViaVersion translation: `Protocol1_9_3To1_10.java` `TO_NEW_PITCH` transformer at line 4247:
```java
public Float transform(PacketWrapper wrapper, Short inputValue) {
return inputValue / 63.0F;
}
```
The 1.9.4 `u8` pitch was a 063 scale divided by 63 to yield a float. 1.10 sends the float directly.
(Source: `common/.../v1_9_3to1_10/Protocol1_9_3To1_10.java` lines 6070)
#### 0x46 Sound Effect (`SOUND`) — pitch type change (same as above)
| Field | 1.9.4 | 1.10 |
|---|---|---|
| soundId | VarInt | VarInt |
| soundCategory | VarInt | VarInt |
| x | Int | Int |
| y | Int | Int |
| z | Int | Int |
| volume | Float | Float |
| **pitch** | **UByte (u8)** | **Float (f32)** |
Source: `minecraft-data data/pc/1.9.4/protocol.json` line 2657 vs `data/pc/1.10/protocol.json` line 2657.
Same `TO_NEW_PITCH` transformer applied. Additionally, `SOUND` carries an integer sound ID that is remapped — see Sound Registry section below.
(Source: `common/.../v1_9_3to1_10/Protocol1_9_3To1_10.java` lines 7390)
### Play state — Serverbound
#### 0x16 Resource Pack Status (`RESOURCE_PACK`) — hash field removed
| Field | 1.9.4 | 1.10 |
|---|---|---|
| **hash** | **String (removed)** | — |
| result | VarInt | VarInt |
In 1.9.x the client echoed back the resource pack hash string alongside the status result code. In 1.10 the hash field was dropped; the server tracks the hash from its own `Send Resource Pack` (0x32) packet.
Source: `minecraft-data data/pc/1.9.4/protocol.json` line 3402 vs `data/pc/1.10/protocol.json` line 3402.
ViaVersion works around this on the serverbound path by tracking the last hash sent in `ResourcePackTracker` storage and re-inserting it when translating a 1.10 client's status packet back to a 1.9.4 server:
```java
// Packet ResourcePack status (serverbound, 0x16)
handler(wrapper -> {
ResourcePackTracker tracker = wrapper.user().get(ResourcePackTracker.class);
wrapper.write(Types.STRING, tracker.getLastHash());
wrapper.write(Types.VAR_INT, wrapper.read(Types.VAR_INT));
});
```
(Source: `common/.../v1_9_3to1_10/Protocol1_9_3To1_10.java` lines 152161;
`common/.../v1_9_3to1_10/storage/ResourcePackTracker.java`)
---
## Packet inventory summary
No packet IDs added, removed, or renumbered between 1.9.4 (protocol 110) and 1.10 (protocol 210).
- Clientbound Play: 0x000x4B (76 packets) — **unchanged set**
- Serverbound Play: 0x000x1D (30 packets) — **unchanged set**
Confirmed by: `minecraft-data` mapping comparison (zero diff on packet ID↔name mappings) and ViaVersion using the same `ClientboundPackets1_9_3` / `ServerboundPackets1_9_3` enums for both sides of the translation.
---
## Sound registry expansion
The `SOUND` packet (0x46) addresses sounds by integer ID. 1.10 inserted 19 new sound events into the registry, shifting existing IDs upward in several ranges.
New sounds (source: `minecraft-data data/pc/1.9.4/sounds.json` vs `data/pc/1.10.2/sounds.json` — 444 → 463 entries):
| New sound event | Group |
|---|---|
| `block.enchantment_table.use` | Enchanting table |
| `entity.husk.ambient` / `.death` / `.hurt` / `.step` | Husk (4) |
| `entity.polar_bear.ambient` / `.baby_ambient` / `.death` / `.hurt` / `.step` / `.warning` | Polar bear (6) |
| `entity.stray.ambient` / `.death` / `.hurt` / `.step` | Stray (4) |
| `entity.wither_skeleton.ambient` / `.death` / `.hurt` / `.step` | Wither skeleton (4) |
The ViaVersion `getNewSoundId(int id)` method encodes the exact insertion points (source: `Protocol1_9_3To1_10.java` lines 165178):
```java
public int getNewSoundId(int id) {
int newId = id;
if (id >= 24) newId += 1; // enchanting table sound inserted
if (id >= 248) newId += 4; // husk (4 sounds)
if (id >= 296) newId += 6; // polar bear (6 sounds)
if (id >= 354) newId += 4; // stray (4 sounds)
if (id >= 372) newId += 4; // wither skeleton (4 sounds)
return newId;
}
```
A proxy translating a 1.9.4 server's `SOUND` packet for a 1.10 client must apply this remapping; in the reverse direction (1.10 client → 1.9.4 server) no remapping is needed for sound packets (sounds are identified by ID serverbound only in older custom-payload flows; `SOUND` is clientbound only).
---
## Entity metadata — No-Gravity index (entity data index 5)
ViaVersion's `EntityPacketRewriter1_10` adds entity data index 5 (`No Gravity`, Boolean) to all entities during the 1.9.4→1.10 translation:
```java
@Override
protected void registerRewrites() {
// The item data slot was created via the wrong entity type class,
// using an index of 6 instead of 5 for the item
filter().type(EntityTypes1_9.EntityType.POTION).removeIndex(5);
filter().addIndex(5); // No gravity
}
```
(Source: `common/.../v1_9_3to1_10/rewriter/EntityPacketRewriter1_10.java` lines 8286)
This means 1.10 added entity data index 5 (type: Boolean, default false) to the base entity class to control whether an entity ignores gravity. The POTION entity already used index 5 for a different purpose in 1.9.x (wrongly assigned), so ViaVersion strips that index from potions before adding the universal one.
The `NoGravity` flag in NBT was extended in 1.10 to work for all entity types (wiki note: previously worked for armor stands only). <!-- VERIFY: wiki article implies NoGravity became universal in 1.10 but does not give a precise "index 5 added in 1.10" citation; ViaVersion insertion is confirmed from source -->
---
## New blocks and items (protocol impact)
New item IDs in 1.10 (source: `minecraft-data data/pc/1.10/items.json`):
| Item name | ID |
|---|---|
| magma | 213 |
| nether_wart_block | 214 |
| red_nether_brick | 215 |
| bone_block | 216 |
| structure_void | 217 |
| structure_block | 255 |
These IDs appear in any packet carrying an `Item` slot (e.g., `CONTAINER_SET_SLOT` 0x16, `CONTAINER_SET_CONTENT` 0x14, `SET_EQUIPPED_ITEM` 0x3C, `SET_CREATIVE_MODE_SLOT` serverbound 0x18). A 1.9.x server does not recognise IDs 213217; ViaVersion replaces them with stone (id=1, data=0) on the serverbound path:
(Source: `common/.../v1_9_3to1_10/rewriter/ItemPacketRewriter1_10.java` lines 4148)
ViaVersion also handles `piston_extension` (block ID 36), which is a server-side technical block that can appear in `LEVEL_CHUNK` data; it replaces it with a configurable fallback via `isReplacePistons()` / `getPistonReplacementId()`.
(Source: `Protocol1_9_3To1_10.java` lines 125136)
## New mobs — entity type IDs
Husks, Strays, and Polar Bears are the three new mobs in 1.10. In the 1.10 protocol they do **not** have new entity type IDs. They are transmitted as variants of existing types using entity metadata:
- **Husk** — sent as Zombie (type ID 54); identified by entity data index 13 (ZombieType VarInt) = 6
- **Stray** — sent as Skeleton (type ID 51); identified by entity data index 12 (SkeletonType VarInt) = 2
- **Polar Bear** — sent as a distinct entity type <!-- VERIFY: polar bear may have been a new entity ID in 1.10; minecraft-data entities.json comparison shows no new entry, but the wiki mentions it as a new mob; EntityTypes1_9 does not list POLAR_BEAR, and the 1.10 minecraft-data entities.json only has 120 Villager as the highest mob, suggesting polar bear may be type 102 added in 1.10 but not reflected in the 1.9-era entities.json used for comparison -->
Wither Skeletons in 1.10: encoded as Skeleton (type ID 51) with SkeletonType = 1 (via entity data index 12). Separate type IDs for husk, stray, and wither skeleton were only introduced in 1.11.
(Source: `common/.../v1_10to1_11/rewriter/EntityPacketRewriter1_11.java` lines 346373 — the 1.11 rewriter shows exactly how 1.10's metadata-encoded variants map to 1.11's distinct entity IDs)
---
## Per-patch sub-sections
### 1.10.1 (protocol 210, released June 22, 2016)
No protocol changes. The update fixed 7 bugs, the most notable being a farmland hitbox adjustment (15/16-block height). Zero wire-format differences from 1.10.
(Source: minecraft.wiki/w/Java_Edition_1.10.1; minecraft-data 1.10 vs 1.10.1 protocol.json diff = 0 lines)
### 1.10.2 (protocol 210, released June 23, 2016)
No protocol changes. 73 bug fixes; witch splash sound reclassified to hostile category. Zero wire-format differences from 1.10.1.
(Source: minecraft.wiki/w/Java_Edition_1.10.2; minecraft-data 1.10.1 vs 1.10.2 protocol.json diff = 0 lines)
---
## Proxy and translation impact
A proxy or protocol translator bridging 1.10 clients and 1.9.x servers (or vice versa) must handle:
1. **Pitch type on SOUND (0x46) and CUSTOM_SOUND (0x19):** `u8 → f32` on the clientbound path. Conversion: `f32 = u8 / 63.0`.
2. **Sound ID remapping on SOUND (0x46):** Apply `getNewSoundId()` offsets when translating 1.9.x server sound IDs to 1.10 client IDs.
3. **Resource Pack Status (0x16, serverbound):** 1.10 client omits the hash string. When forwarding to a 1.9.x server, re-insert the hash last seen in the Send Resource Pack packet (0x32).
4. **New item IDs 213217 (serverbound):** Replace with a fallback (e.g., stone) before forwarding to 1.9.x servers that do not know these IDs.
5. **Entity data index 5 (No Gravity):** 1.10 clients expect index 5 on all entities. When a 1.9.x server does not send it, a proxy should synthesize it (default: false). Potion entities need special handling due to a metadata index collision in 1.9.x.
6. **Chunk data:** Format unchanged from 1.9.3/1.9.4 (`ChunkType1_9_3`); no translation needed beyond the piston block opt-in workaround.
No login, status, or handshake state changes in 1.10.