Files
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

12 KiB
Raw Permalink Blame History

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:

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:

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:

// 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):

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 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; previously it worked for armor stands only. (Confirmed: minecraft.wiki/w/Java_Edition_1.10, fetched 2026-06-19, states "NoGravity now works for all entities, not only armor stands." The ViaVersion insertion of entity data index 5 is separately confirmed from source as described above.)


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 with ID 102, which is a new entity type added in 1.10 (not present in 1.9). Confirmed: EntityTypes1_9.java in ViaVersion has no entry for ID 102 (highest animal is Rabbit=101); EntityTypes1_10.java adds POLAR_BEAR(102, ABSTRACT_ANIMAL). The minecraft-data entities.json for 1.10 does not list polar bear by name (the file covers only the 64 entity types tracked by minecraft-data and tops at Villager=120), but ViaVersion's type enum is the authoritative wire-level source. Unlike Husk and Stray, polar bear is NOT a metadata variant of an existing mob — it is a new first-class entity type. (Source: ViaVersion/api/…/entities/EntityTypes1_9.java — no entry at 102; EntityTypes1_10.java line 119 — POLAR_BEAR(102, ABSTRACT_ANIMAL).)

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.