Files
minecraft_protocol/versions/1.15.md
T
claude-timemachine 02a249a379 verify pass 2: resolve markers via ViaBackwards/ViaRewind/ViaLegacy
Closed most remaining UNCONFIRMED items + caught corrections: 1.7 data[]=proto5,
1.8 multi-block nibble order (z/x), stance y+1.62, 1.15 wolf idx18=begging,
1.18 below-zero sections NOT stripped (claim was wrong), CONTAINER_SLOT_STATE
1.20.3, + pinned first-appeared versions (report details/server links=1.21,
fluidCount=26.1, block-state id14=1.19.4, itemCount VarInt=1.20.5).

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

21 KiB
Raw Blame History

1.15.x — Buzzy Bees

Protocols: 573 (1.15), 575 (1.15.1), 578 (1.15.2) Release dates: 1.15 — 2019-12-10 · 1.15.1 — 2019-12-17 · 1.15.2 — 2020-01-21 Minecraft wiki release articles:

  • https://minecraft.wiki/w/Java_Edition_1.15 (fetched 2026-06-19) — release date 2019-12-10, protocol 573, data version 2225, resource/data pack format 5
  • https://minecraft.wiki/w/Java_Edition_1.15.1 (fetched 2026-06-19) — release date 2019-12-17, protocol 575, data version 2227
  • https://minecraft.wiki/w/Java_Edition_1.15.2 (fetched 2026-06-19) — release date 2020-01-21, protocol 578, data version 2230 Protocol version numbers confirmed: ProtocolVersion.java lines 68-70 — register(573, "1.15"), register(575, "1.15.1"), register(578, "1.15.2")/tmp/mcproto-refs/ViaVersion/api/src/main/java/com/viaversion/viaversion/api/protocol/version/ProtocolVersion.java; cross-checked against /tmp/mcproto-refs/minecraft-data/data/pc/1.15/version.json (573), 1.15.1/version.json (575), 1.15.2/version.json (578). ViaVersion packages:
  • v1_14_4to1_15/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_14_4to1_15/
  • v1_15to1_15_1…/protocols/v1_15to1_15_1/Protocol1_15To1_15_1.java
  • v1_15_1to1_15_2…/protocols/v1_15_1to1_15_2/Protocol1_15_1To1_15_2.java minecraft-data sources: data/pc/1.14.4/, data/pc/1.15/, data/pc/1.15.1/, data/pc/1.15.2//tmp/mcproto-refs/minecraft-data/

Headline changes — Buzzy Bees

1.15 ("Buzzy Bees", 2019-12-10) is a minor protocol bump — the gameplay focus (bees, beehives, honey blocks, honeycomb) required only a small number of wire-level changes. The entity registry gained one new mob (Bee), the chunk packet gained 3D biome storage, the Login and Respawn packets gained a hashed seed field, the Spawn Living Entity and Spawn Player packets dropped inline entity metadata, and particle coordinates upgraded from f32 to f64. One packet (Acknowledge Player Digging) was moved from the end of the clientbound ID space to near the front, shifting all intervening IDs by one. No packets were added or removed overall.

The resource pack and data pack format both bumped to 5 in 1.15. Performance was a significant focus of this release: Mojang described the generation changes as a "massive upgrade", and floating-point precision for entity and particle positions was increased from 32-bit to 64-bit to fix rendering artefacts at large distances from world origin.

Sources: https://minecraft.wiki/w/Java_Edition_1.15 (fetched 2026-06-19); ViaVersion v1_14_4to1_15 package (see below).


Protocol changes vs 1.14.4 (573 vs 490), by state

Source: diff of ClientboundPackets1_14_4 (v1_14_3to1_14_4/packet/) against ClientboundPackets1_15 (v1_14_4to1_15/packet/ClientboundPackets1_15.java); protocol.json diffs across minecraft-data/data/pc/1.14.4/ vs data/pc/1.15/; WorldPacketRewriter1_15.java and EntityPacketRewriter1_15.java; EntityTypes1_15.java.

Packet count: 93 clientbound play, 46 serverbound play — identical to 1.14.4. Net change: 0 packets added, 0 removed.

Handshake / Status / Login / Configuration

No changes to handshaking, status, or login state packet set or structure.

Play — clientbound packet ID reordering

Acknowledge Player Digging moved from 0x5C (its position in 1.14.4) to 0x08 (its new position in 1.15). This inserts it between Statistics (0x07) and what was previously Block Break Animation, shifting every packet from old 0x08 through old 0x5B up by one slot. The packet count stays at 93 — this is a reorder, not an addition.

New ID (1.15) Old ID (1.14.4) Packet
0x08 0x5C acknowledge_player_digging (BLOCK_BREAK_ACK) — moved
0x09 0x08 block_break_animation
0x0A 0x09 tile_entity_data
(all packets 0x080x5B each shift +1)
0x5C 0x5B tags

Source: minecraft-data packet-ID maps data/pc/1.14.4/protocol.json vs data/pc/1.15/protocol.json (confirmed by comparing the ordinal ordering in ClientboundPackets1_15.java lines BLOCK_BREAK_ACK // 0x08, BLOCK_DESTRUCTION // 0x09 against ClientboundPackets1_14_4.java where BLOCK_DESTRUCTION // 0x08 was at 0x08).

Play — structurally changed clientbound packets

Six packets changed field layout. No serverbound packets changed structure.

1. Login (CB 0x26 in 1.15, was 0x25)

New fields added between Dimension and Max Players:

Field Type Notes
Entity ID i32 unchanged
Gamemode u8 unchanged
Dimension i32 unchanged
Hashed Seed i64 new in 1.15 — the world seed hashed to i64; used by client for biome noise. The conventional description is "SHA-256 of the world seed, lower 64 bits" (the first 8 bytes of the SHA-256 digest interpreted as a big-endian long).
Max Players u8 unchanged
Level Type String unchanged
View Distance VarInt unchanged
Reduce Debug Info bool unchanged
Enable Respawn Screen bool new in 1.15 — when false, client respawns immediately without the death screen; ViaVersion injects !Via.getConfig().is1_15InstantRespawn()

Source: minecraft-data/data/pc/1.15/protocol.json packet_login field list; EntityPacketRewriter1_15.java lines registering LOGIN with wrapper.write(Types.LONG, 0L) (seed) and wrapper.write(Types.BOOLEAN, !Via.getConfig().is1_15InstantRespawn()) (respawn screen).

2. Respawn (CB 0x3B in 1.15, was 0x3A)

New field inserted between Dimension and Gamemode:

Field Type Notes
Dimension i32 unchanged
Hashed Seed i64 new in 1.15 — same value as in Login
Gamemode u8 unchanged
Level Type String unchanged

Source: minecraft-data/data/pc/1.15/protocol.json packet_respawn; EntityPacketRewriter1_15.java RESPAWN handler wrapper.write(Types.LONG, 0L).

3. Level Chunk / Map Chunk (CB 0x22 in 1.15, was 0x21)

Biome data moved from a flat 256-int array (one int per column, 16×16) to a 1024-int array (four ints per 4×4×4 biome cube, 4×4×64 = 1024 entries covering the full 256-block height in 4-block increments). The biomes field is present only when groundUp = true (full chunk):

Field Type Notes
X i32 unchanged
Z i32 unchanged
Ground-Up bool unchanged
Primary Bitmask VarInt unchanged
Heightmaps NBT unchanged
Biomes i32[1024] new field — present only if Ground-Up; replaces the implicit 256-byte array baked into chunk data in 1.14.4
Data length VarInt unchanged
Data byte[] unchanged
Block Entities NBT[] unchanged

The ViaVersion WorldPacketRewriter1_15.java translates from 1.14.4 to 1.15 by converting the old 256-entry column biome array: for each 4×4 horizontal sub-area, it reads the biome at the "middle" column (x=(j<<2)+2, z=(i<<2)+2) and replicates it across all 64 Y-layers. ChunkType1_15.java (in the ViaVersion API) confirms the 1024-int biomeData read loop.

Source: WorldPacketRewriter1_15.java register() method — getBlockRewriter().registerLevelChunk(…ChunkType1_14.TYPE, ChunkType1_15.TYPE, …) with the biome-upscale lambda; ChunkType1_15.java read()int[] biomeData = fullChunk ? new int[1024] : null; for (int i = 0; i < 1024; i++) biomeData[i] = input.readInt();; minecraft-data/data/pc/1.15/protocol.json packet_map_chunk"biomes": ["switch", {"compareTo": "groundUp", "fields": {"true": ["array", {"count": 1024, "type": "i32"}]}}].

4. Level Particles / World Particles (CB 0x24 in 1.15, was 0x23)

Position coordinates upgraded from f32 to f64:

Field Type 1.14.4 Type 1.15 Notes
Particle ID i32 i32 unchanged
Long Distance bool bool unchanged
X f32 f64 precision upgrade
Y f32 f64 precision upgrade
Z f32 f64 precision upgrade
Offset X/Y/Z f32 f32 unchanged
Particle Data f32 f32 unchanged
Particle Count i32 i32 unchanged
Data particleData particleData unchanged

Source: WorldPacketRewriter1_15.javamap(Types.FLOAT, Types.DOUBLE) for fields 2, 3, 4; minecraft-data/data/pc/1.15/protocol.json packet_world_particles"x": "f64" vs "x": "f32" in 1.14.4.

5. Spawn Entity Living / Add Mob (CB 0x03)

Entity metadata removed from the spawn packet itself. In 1.14.4, spawn_entity_living included a trailing entityMetadata field. In 1.15, metadata is no longer sent inline with the spawn — it must arrive separately via Set Entity Data (0x44).

Field 1.14.4 1.15
Entity ID VarInt VarInt
Entity UUID UUID UUID
Type VarInt VarInt
X/Y/Z f64 f64
Yaw/Pitch/Head Pitch i8 i8
Velocity X/Y/Z i16 i16
Metadata entityMetadata (removed)

ViaVersion bridges this by reading the metadata from the 1.14.4 server's spawn packet, sending the spawn packet first, then synthesising and sending a SET_ENTITY_DATA packet if the metadata list is non-empty. See EntityPacketRewriter1_15.java sendEntityDataPacket() method.

Source: minecraft-data/data/pc/1.14.4/protocol.json packet_spawn_entity_living vs data/pc/1.15/protocol.json; EntityPacketRewriter1_15.java registerPackets()ADD_MOB handler reads Types1_14.ENTITY_DATA_LIST then calls sendEntityDataPacket().

6. Spawn Player / Named Entity Spawn / Add Player (CB 0x05)

Same metadata removal as Spawn Living Entity above. In 1.14.4, named_entity_spawn had a trailing entityMetadata field; 1.15 drops it, with metadata delivered via a subsequent Set Entity Data packet.

Field 1.14.4 1.15
Entity ID VarInt VarInt
Player UUID UUID UUID
X/Y/Z f64 f64
Yaw/Pitch i8 i8
Metadata entityMetadata (removed)

Source: minecraft-data/data/pc/1.14.4/protocol.json packet_named_entity_spawn vs data/pc/1.15/protocol.json; EntityPacketRewriter1_15.java ADD_PLAYER handler calls sendEntityDataPacket(wrapper, entityId).

Play — entity metadata changes

Two metadata index changes in 1.15 affect the Set Entity Data (0x44) payload for living entities and wolves:

  1. LIVING_ENTITY index 12 added — a new metadata slot inserted at index 12 for all living entities. ViaVersion EntityPacketRewriter1_15.java:131: filter().type(EntityTypes1_15.LIVING_ENTITY).addIndex(12). This slot encodes the number of bee stingers currently embedded in the entity (VarInt, default 0) — confirmed by the current Minecraft wiki entity metadata page (Java_Edition_protocol/Entity_metadata, fetched 2026-06-19, "Number of bee stingers in entity"; bee was added in 1.15) and consistent with the timing (bees introduced in this update). Note: the 1.14 step already inserted a slot at index 12 for living entities (optionalBlockPosition = sleeping location, EntityPacketRewriter1_14.java:267); the 1.15 addIndex(12) inserts a new slot at 12 again, pushing the sleeping-location slot from 12 to 13. Source: current minecraft.wiki entity metadata page; EntityPacketRewriter1_15.java:131; EntityPacketRewriter1_14.java:267.

  2. WOLF index 18 removed — a metadata slot dropped from wolves. ViaVersion EntityPacketRewriter1_15.java:132: filter().type(EntityTypes1_15.WOLF).removeIndex(18). In 1.14.4, wolf metadata index 18 encodes the wolf-begging boolean (WOLF_BEGGING). Index progression confirmed from EntityDataIndex1_9.java (WOLF_HEALTH=14, WOLF_BEGGING=15, WOLF_COLLAR=16 in 1.9), then 1.10 addIndex(5) for all entities (NoGravity) shifts wolf indices: health→15, begging→16, collar→17; then 1.14 addIndex(6) (ENTITY) and addIndex(12) (LIVING) each shift by +1: health→17, begging→18, collar→19. ViaBackwards EntityPacketRewriter1_15.java:205208 confirms 1.14.4 wolf index 17 = WOLF_HEALTH (synthesised when downgrading, tagged 17/*WOLF_HEALTH*/), placing index 18 = WOLF_BEGGING. The removeIndex(18) operates on the old 1.14.4 server-side index before the concurrent LIVING addIndex(12) shift. WOLF_HEALTH (slot 17) was also removed from 1.15 wolf entity data; ViaBackwards synthesises it by copying the generic health attribute at index 8. Source: EntityDataIndex1_9.java:8688; EntityPacketRewriter1_10.java:85 (addIndex(5)); EntityPacketRewriter1_14.java:263,267; ViaBackwards EntityPacketRewriter1_15.java:205208.

New entity type: Bee (entity type ID 4)

Bee was inserted at entity type ID 4 in the registry (alphabetically between bat = 3 and blaze = 5 in 1.15's ordering). All entity IDs ≥ 4 in 1.14.4 are shifted up by one. ViaVersion EntityPacketRewriter1_15.java:158: public int newEntityId(final int id) { return id >= 4 ? id + 1 : id; // 4 = bee }.

Bee is an ABSTRACT_ANIMAL subtype (EntityTypes1_15.javaBEE(ABSTRACT_ANIMAL)). Confirmed in minecraft-data/data/pc/1.15.2/entities.json: internalId=4, id=4, name="bee".

New tags registered in 1.15

ViaVersion Protocol1_14_4To1_15.java onMappingDataLoaded() registers new empty tags that must exist in 1.15 but did not exist in 1.14.4:

  • Block tags added: minecraft:bee_growables, minecraft:beehives
  • Item tag added: minecraft:lectern_books
  • Entity tag added: minecraft:beehive_inhabitors
  • Block tag removed from translation: minecraft:dirt_like (was in 1.14.4; dropped in 1.15)

These flow through the UPDATE_TAGS (0x5C) packet.

New particles (1.15)

Three bee-related particles added to the particle registry (IDs confirmed from minecraft-data/data/pc/1.15/particles.json):

ID Name
58 dripping_honey
59 falling_honey
60 landing_honey

Also falling_nectar (ID 61, in the 1.15 list). Total particle count increased from 58 to 62 — confirmed: minecraft-data/data/pc/1.14/particles.json has 58 entries (IDs 057); 1.14.1, 1.14.3, and 1.14.4 have no separate particles.json, inheriting 1.14's 58-count. minecraft-data/data/pc/1.15/particles.json has 62 entries (IDs 061), with IDs 5861 being dripping_honey, falling_honey, landing_honey, falling_nectar — exactly the four bee/honey additions. The formerly inferred count is now confirmed.

New sounds (1.15)

18 new sound events added (from diff of minecraft-data/data/pc/1.14.4/sounds.json vs data/pc/1.15/sounds.json):

  • Bee entity sounds: entity.bee.death, entity.bee.hurt, entity.bee.loop, entity.bee.loop_aggressive, entity.bee.pollinate, entity.bee.sting
  • Beehive block sounds: block.beehive.drip, block.beehive.enter, block.beehive.exit, block.beehive.shear, block.beehive.work
  • Honey block sounds: block.honey_block.break, block.honey_block.fall, block.honey_block.hit, block.honey_block.place, block.honey_block.slide, block.honey_block.step
  • Item: item.honey_bottle.drink

Sounds flow through the CUSTOM_SOUND (0x1A) / SOUND (0x52) packets; these are registry additions only, no packet structure change.

Block and item mappings

New blocks/items (beehive, bee_nest, honey_block, honeycomb_block, honeycomb, honey_bottle) were added, requiring updated block-state and item ID mappings. ViaVersion carries these in mappings-1.14to1.15.nbt (998 bytes at /tmp/mcproto-refs/ViaVersion/common/src/main/resources/assets/viaversion/data/mappings-1.14to1.15.nbt). Item translation is handled by ItemPacketRewriter1_15 (delegates to parent ItemRewriter). Block-state delta: 1.14.4 had 957 total block states (676 blocks); 1.15.2 has 962 total block states (680 blocks) — a net gain of +5 block states across 4 new blocks: bee_nest (+2 states), beehive (+2 states), honey_block (+0), honeycomb_block (+0), plus bell gained 1 additional state (2→3). Source: minecraft-data/data/pc/1.14.4/blocks.json vs minecraft-data/data/pc/1.15.2/blocks.json (1.15.0 blocks.json absent from the available minecraft-data snapshot; 1.15.2 is used as the closest available).


Per-patch sub-sections

1.15 → 1.15.1 (protocol 573 → 575)

Zero protocol changes. ViaVersion Protocol1_15To1_15_1.java is a minimal stub — it extends AbstractProtocol with identical clientbound/serverbound packet class references (ClientboundPackets1_15 used for both old and new) and registers no packet handlers:

public class Protocol1_15To1_15_1 extends AbstractProtocol<
    ClientboundPackets1_15, ClientboundPackets1_15,
    ServerboundPackets1_14, ServerboundPackets1_14> {
    public Protocol1_15To1_15_1() {
        super(ClientboundPackets1_15.class, ClientboundPackets1_15.class, ...);
    }
}

minecraft-data diff of data/pc/1.15/protocol.json vs data/pc/1.15.1/protocol.json: no packet additions, removals, ID changes, or field structure changes in any state (handshaking, login, play).

The protocol number bumped to 575 for compliance purposes. Gameplay changes: chunk rendering performance optimization (especially for chunks with many block states), dolphin spawning in bubble columns fixed, invalid biome ID network handling improved, 10 bugs total. Data version: 2225 → 2227.

ViaVersion git log for protocols/v1_15to1_15_1/: only cosmetic commits — cff9a8715 [ci skip] Update copyright header, 9f6e7fa4e [ci skip] Update copyright header, e965e9713 Package/class renames and moves.

Source: Protocol1_15To1_15_1.java; minecraft-data protocol.json diff; https://minecraft.wiki/w/Java_Edition_1.15.1 (fetched 2026-06-19).

1.15.1 → 1.15.2 (protocol 575 → 578)

Zero protocol changes. Protocol1_15_1To1_15_2.java is identical in structure to the 1.15.1 stub — no registered handlers, same packet classes.

minecraft-data diff of data/pc/1.15.1/protocol.json vs data/pc/1.15.2/protocol.json: no packet additions, removals, ID changes, or field structure changes.

Gameplay changes: two new gamerules (doPatrolSpawning, doTraderSpawning), bees no longer aggro when hive/nest broken with Silk Touch, status effects now stack properly when overwritten by higher-amplifier effect, bee nest spawn rates tuned for flower forests and birch variants, 35 bugs fixed. Data version: 2227 → 2230.

ViaVersion git log for protocols/v1_15_1to1_15_2/: only cosmetic commits — cff9a8715, 9f6e7fa4e, e965e9713.

Source: Protocol1_15_1To1_15_2.java; minecraft-data protocol.json diff; https://minecraft.wiki/w/Java_Edition_1.15.2 (fetched 2026-06-19).


Proxy / forwarding & translation impact

For a proxy bridging 1.14.4 ↔ 1.15 clients, the translation work is moderate but confined to specific packets:

  1. Packet ID table — every clientbound play ID from 0x08 upward has shifted by +1 in 1.15. A 1.14.4 client must receive the old IDs; a 1.15 client expects the new ones. This is the most pervasive change.

  2. Login + Respawn — must inject hashedSeed (i64, can be 0 when downgrading) and enableRespawnScreen (bool) when serving 1.15 clients from a 1.14.4 server. ViaVersion injects 0L for the seed and makes the respawn screen configurable (is1_15InstantRespawn()).

  3. Chunk biome data — when sending chunks to a 1.15 client, the 256-column biome array must be converted to 1024-entry 3D format. ViaVersion does this by sampling the "centre" column of each 4×4 horizontal cell and replicating across 64 Y layers (WorldPacketRewriter1_15.java biome-upscale lambda).

  4. Particle position precisionLevel Particles X/Y/Z must be widened from f32 to f64 for 1.15 clients. ViaVersion WorldPacketRewriter1_15.java: map(Types.FLOAT, Types.DOUBLE) for all three position fields.

  5. Spawn packet metadata stripping — 1.15 spawn packets (Add Mob, Add Player) no longer carry inline metadata. When bridging a 1.14.4 server → 1.15 client, ViaVersion reads the metadata from the spawn packet and sends a synthetic Set Entity Data immediately after. The inverse (1.15 server → 1.14.4 client) requires re-attaching the Set Entity Data payload back into the spawn packet.

  6. Entity type ID shift — Bee inserted at ID 4; all IDs ≥ 4 from 1.14.4 are +1 in 1.15. Must be remapped in all entity spawn packets.

  7. Entity metadata index shifts — LIVING_ENTITY index 12 added, WOLF index 18 dropped. Any Set Entity Data packet containing metadata for living entities or wolves must have indices adjusted.

  8. Block/item/sound/particle ID remapping — new bee-related IDs in all registries; carried by ViaVersion's mappings-1.14to1.15.nbt mapping table.

1.15.1 and 1.15.2: no translation work beyond the protocol version handshake number. Both patch releases are protocol-identical to 1.15 in structure; ViaVersion treats them as pass-through (empty protocol stubs).