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>
12 KiB
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, fetched 2026-06-19)
- 1.10.1 — June 22, 2016 (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, fetched 2026-06-19)
Sources used:
- ViaVersion
v1_9_3to1_10package: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.jsonvsdata/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 42–47:
public Float transform(PacketWrapper wrapper, Short inputValue) {
return inputValue / 63.0F;
}
The 1.9.4 u8 pitch was a 0–63 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 60–70)
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 73–90)
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:
// 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 152–161;
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: 0x00–0x4B (76 packets) — unchanged set
- Serverbound Play: 0x00–0x1D (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 165–178):
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:
@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 82–86)
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).
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 213–217; ViaVersion replaces them with stone (id=1, data=0) on the serverbound path:
(Source: common/.../v1_9_3to1_10/rewriter/ItemPacketRewriter1_10.java lines 41–48)
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 125–136)
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
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 346–373 — 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:
- Pitch type on SOUND (0x46) and CUSTOM_SOUND (0x19):
u8 → f32on the clientbound path. Conversion:f32 = u8 / 63.0. - Sound ID remapping on SOUND (0x46): Apply
getNewSoundId()offsets when translating 1.9.x server sound IDs to 1.10 client IDs. - 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).
- New item IDs 213–217 (serverbound): Replace with a fallback (e.g., stone) before forwarding to 1.9.x servers that do not know these IDs.
- 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.
- 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.