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

270 lines
21 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.
# 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). <!-- UNCONFIRMED: no available primary ref (minecraft-data, ViaVersion, Velocity, BungeeCord) contains the hashing implementation — none compute SHA-256 of the seed; Velocity names the field `partialHashedSeed` (confirming it is a partial/derived value) and ViaVersion synthesises `0L` when downgrading (ViaBackwards `EntityPacketRewriter1_15.java:106`). The SHA-256 lower-64-bit characterisation is the standard wiki.vg claim but was unverifiable from available Mojang-side source. --> |
| 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:
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.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 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:
```java
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 precision**`Level 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).