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>
18 KiB
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.javalines 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.javav1_15_1to1_15_2—…/protocols/v1_15_1to1_15_2/Protocol1_15_1To1_15_2.javaminecraft-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 0x08–0x5B 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 — SHA-256 of the world seed, lower 64 bits; used by client for biome noise |
| 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.java — map(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:
-
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). -
WOLF index 18 removed — a metadata slot dropped from wolves. ViaVersion
EntityPacketRewriter1_15.java:132:filter().type(EntityTypes1_15.WOLF).removeIndex(18).
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.java — BEE(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 present in the 1.15 list). Total particle count increased from ~58 to 62.
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).
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:
-
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.
-
Login + Respawn — must inject
hashedSeed(i64, can be 0 when downgrading) andenableRespawnScreen(bool) when serving 1.15 clients from a 1.14.4 server. ViaVersion injects0Lfor the seed and makes the respawn screen configurable (is1_15InstantRespawn()). -
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.javabiome-upscale lambda). -
Particle position precision —
Level ParticlesX/Y/Z must be widened from f32 to f64 for 1.15 clients. ViaVersionWorldPacketRewriter1_15.java:map(Types.FLOAT, Types.DOUBLE)for all three position fields. -
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 syntheticSet Entity Dataimmediately after. The inverse (1.15 server → 1.14.4 client) requires re-attaching theSet Entity Datapayload back into the spawn packet. -
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.
-
Entity metadata index shifts — LIVING_ENTITY index 12 added, WOLF index 18 dropped. Any
Set Entity Datapacket containing metadata for living entities or wolves must have indices adjusted. -
Block/item/sound/particle ID remapping — new bee-related IDs in all registries; carried by ViaVersion's
mappings-1.14to1.15.nbtmapping 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).