minecraft_protocol: foundation + per-version protocol docs 1.7.10->26.2

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>
This commit is contained in:
claude-timemachine
2026-06-19 14:15:32 +02:00
commit d73c1c9537
35 changed files with 8894 additions and 0 deletions
+345
View File
@@ -0,0 +1,345 @@
# Java Edition 26.x — Protocol 775 (26.1) / 776 (26.2)
| Version | Protocol | Data Version | Release Date |
|---|---|---|---|
| 26.1 | 775 | 4786 | 2026-03-24 |
| 26.1.1 | 775 | 4788 | <!-- VERIFY exact date --> |
| 26.1.2 | 775 | 4790 | <!-- VERIFY exact date --> |
| 26.2 | 776 | 4903 | 2026-06-16 |
Sources: minecraft.wiki/w/Java_Edition_26.1 (fetched 2026-06-19), minecraft.wiki/w/Java_Edition_26.2 (fetched 2026-06-19), minecraft-data `protocolVersions.json` (`/tmp/mcproto-refs/minecraft-data/data/pc/common/protocolVersions.json`), ViaVersion `ProtocolVersion.java:96` (`/tmp/mcproto-refs/ViaVersion`).
---
## The versioning-scheme rename: `1.X.Y` → `YY.N.hotfix`
### What changed
Starting with 26.1 (released 2026-03-24), Mojang retired the `1.X.Y` naming convention it had used since Java Edition's early release era and replaced it with a **calendar-based `year.drop.hotfix`** format.
> "This is the first Java Edition release version to use the new 'year.drop.hotfix' version format announced in December 2025."
> — minecraft.wiki/w/Java_Edition_26.1 (fetched 2026-06-19)
**What the fields mean:**
| Field | Meaning | Example |
|---|---|---|
| `YY` | Two-digit year | `26` = 2026 |
| `N` | Drop number within that year (first, second, …) | `1` = first 2026 drop, `2` = second |
| `.hotfix` | Optional patch suffix; shares the same protocol number as the base drop | `26.1.1`, `26.1.2` |
The old `1.X.Y` scheme was a pseudo-semver inherited from pre-1.0 Minecraft versioning and carried no calendar meaning. The new format makes the release cadence legible at a glance and aligns Java Edition with Mojang's publicly communicated "drops" model (multiple major content updates per year instead of one big annual release).
### What did NOT change
- **Protocol wire format**: the protocol version number continues the existing integer sequence (`773 = 1.21.9`, `774 = 1.21.11`, `775 = 26.1`, `776 = 26.2`). The rename is purely in the human-readable game version string; the handshake's VarInt protocol field is unaffected.
- **Snapshot scheme**: pre-release builds still use the `0x40000000` high-bit convention (`0x40000000 + N`). 26.1's snapshot range ran `0x4000011F` (snapshot-1) through `0x4000012F` (rc-3); 26.2's ran `0x40000134` (snapshot-2) through `0x40000142` (rc-2). Source: minecraft-data `protocolVersions.json`.
- **Snapshot naming convention**: the `YYwNNa` week-snapshot style is still used — `26w14a` appears in minecraft-data between 26.1.2 and the first 26.2 snapshot (dataVersion 5000, protocol `0x40000131`), consistent with how April-type or interstitial snapshots have always been named.
---
## 26.1 — Protocol 775 (vs 1.21.11 / protocol 774)
**Release name:** "Tiny Takeover"
**Development timeline:** 11 snapshots, 3 pre-releases, 3 release candidates.
**Pack formats:** Resource pack 84.0, Data pack 101.1.
**Minimum Java:** Java SE 25 (LTS); first version to require Java 25.
**Obfuscation:** First release without an obfuscated jar variant.
ViaVersion package: `v1_21_11to26_1/` at `/tmp/mcproto-refs/ViaVersion/common/src/main/java/com/viaversion/viaversion/protocols/v1_21_11to26_1/`.
### Headline gameplay changes (mc-wiki, fetched 2026-06-19)
- **Golden Dandelion**: new flower (crafted from 1 dandelion + 8 gold nuggets) that pauses/resumes baby mob aging on right-click.
- **Baby mob overhaul**: updated models, textures, and sounds for 70+ baby mobs — cats, chickens, cows, horses, wolves, pigs, sheep, rabbits, axolotls, squids, foxes, goats, camels, armadillos, polar bears, llamas, zombies, husks, drowned, piglins, villagers, zombie villagers. Dedicated baby armor textures; saddles and armor no longer rendered on baby pigs, camels, wolves.
- **Craftable name tags**: paper + any nugget type (previously uncraftable).
- **Note block trumpet**: new instrument on copper blocks; sound varies with oxidation level.
- **`/swing` command**: animate entity arm movements.
- **`/time` redesign**: now references world clocks (dimension-specific timekeeping registry).
- **Villager trades data-driven**: `villager_trade` and `trade_set` datapack types.
- **Stonecutter**: deepslate and stone craftable directly into variants.
- **Requires Java SE 25**: first such requirement.
### Protocol changes in 775
Sources: ViaVersion `ClientboundPackets26_1.java`, `ServerboundPackets26_1.java`, `Protocol1_21_11To26_1.java`, `ChunkSectionType26_1.java`, `EntityDataTypes26_1.java` (all under `/tmp/mcproto-refs/ViaVersion/...`).
#### New clientbound packets (play state)
Three packets present in 26.1 but absent from 1.21.11:
| ID | Name | Purpose |
|---|---|---|
| `0x27` | `GAME_RULE_VALUES` | Sends current game rule values to the client (new in 26.1; replaces or supplements the `/gamerule` response flow) |
| `0x32` | `LOW_DISK_SPACE_WARNING` | Server notifies client of low disk space condition |
> Note: `CLEAR_DIALOG` (0x8B) and `SHOW_DIALOG` (0x8C) and `TRACKED_WAYPOINT` (0x8A) already existed in 1.21.11 at `0x89`, `0x8A`, `0x88` respectively. They shifted by two positions because `GAME_RULE_VALUES` and `LOW_DISK_SPACE_WARNING` were inserted earlier in the enum. All IDs shifted accordingly from `GAME_RULE_VALUES`'s position onward.
`PLAYER_ROTATION` (`0x49`) similarly existed in 1.21.11 at `0x47`; no new packet, just renumbered by the two insertions above it.
ViaVersion cancels `GAME_RULE_VALUES` when translating 26.1→1.21.11 (i.e. it is dropped for older clients); `LOW_DISK_SPACE_WARNING` is likewise unhandled (implicitly cancelled). Source: `Protocol1_21_11To26_1.java` — only `SET_TIME`, `UPDATE_TAGS`, and `LEVEL_CHUNK_WITH_LIGHT` are explicitly remapped.
#### New serverbound packets (play state)
Four packets present in 26.1 but absent from 1.21.11 / 1.21.6:
| ID | Name | ViaVersion translation |
|---|---|---|
| `0x01` | `ATTACK` | Split from old `INTERACT`; maps to `INTERACT` with action=1 (Attack) |
| `0x39` | `SET_GAME_RULE` | Client requests a game rule change; ViaVersion **cancels** this packet (action==`Request game rule values` case) |
| `0x3E` | `SPECTATE_ENTITY` | Split from `INTERACT`; maps to `INTERACT` with action=1 (Attack) on the target entity |
| `0x44` | `CUSTOM_CLICK_ACTION` | Custom UI click action (existed in 1.21.6 at `0x41`; renumbered by the three insertions above) |
Source: `EntityPacketRewriter26_1.java:registerPackets()` + `ServerboundPackets26_1.java`.
**INTERACT refactor** (significant): In 26.1 the monolithic `INTERACT` packet (which carried action=0/interact, 1/attack, 2/interact-at) is split. `ATTACK` carries the attack action; `SPECTATE_ENTITY` carries spectate. The old `INTERACT` (0x1A) remains for right-click interact. ViaVersion synthesizes the old format from the new: for `ATTACK` and `SPECTATE_ENTITY` it writes entity ID + action=1 (Attack) + sneaking state. Sneaking state is now tracked from `PLAYER_INPUT` flags (bit 5) rather than from `INTERACT`'s `secondaryAction` field; ViaVersion stores this in `PlayerSneaking` per-connection storage. Source: `EntityPacketRewriter26_1.java`.
#### `SET_TIME` restructured (play state, 0x71 → new multi-clock format)
Old format (1.21.11):
```
Long game_time total world age ticks
Long day_time current day time (negative = paused)
Boolean tick_day_time whether time advances
```
New format (26.1):
```
Long game_time total world age ticks
VarInt clock_count number of clock entries (typically 1)
for each clock:
VarInt clock_id registry index into world_clock dimension
VarLong total_ticks current tick count for this clock
Float partial_tick sub-tick interpolation
Float tick_rate 0.0 = paused, 1.0 = normal
```
ViaVersion translation: writes `clock_count=1`, `clock_id=0` (overworld), then maps the old `day_time` to `total_ticks` and `tick_day_time` to `tick_rate` (0F or 1F). Source: `Protocol1_21_11To26_1.java:registerClientbound(SET_TIME)`.
The restructuring is driven by the new **world clock registry** (`world_clock`) that allows per-dimension custom time tracking. ViaVersion injects `world_clock` registry data with entries for `overworld` and `the_end` during `FINISH_CONFIGURATION`. Source: `Protocol1_21_11To26_1.java:appendClientbound(FINISH_CONFIGURATION)`.
#### Chunk section format change (`LEVEL_CHUNK_WITH_LIGHT`)
26.1 adds a **fluid count** short to the chunk section header:
Old section header (1.21.51.21.11):
```
Short non_air_blocks_count
[block palette]
[biome palette]
```
New section header (26.1):
```
Short non_air_blocks_count
Short fluid_count ← NEW
[block palette]
[biome palette]
```
ViaVersion computes `fluid_count` from the block palette during downgrade (scanning each block ID against a set of known fluid block-states). Source: `ChunkSectionType26_1.java:read/write`, `BlockItemPacketRewriter26_1.java:replaceClientbound(LEVEL_CHUNK_WITH_LIGHT)`.
#### Entity data type additions
`EntityDataTypes26_1` adds four new sound-variant entity data types (indices 22, 24, 29, 31), interleaved among the existing variant types:
| Index | Name |
|---|---|
| 22 | `catSoundVariant` |
| 24 | `cowSoundVariant` |
| 29 | `pigSoundVariant` |
| 31 | `chickenSoundVariant` |
These drive the new per-mob sound variant system (distinct cries for different cat breeds, cow breeds, etc.). Existing variant indices above these shift accordingly. Source: `EntityDataTypes26_1.java`.
ViaVersion inserts/removes these via `dataTypeMapper().added(entityDataTypes.catSoundVariant)…register()` in `EntityPacketRewriter26_1.registerRewrites()`.
Also new entity data indices per the entity rewriter:
- Villager: index 19 added (`is_villager_data_finalized`)
- Zombie Villager: index 21 added (`is_villager_data_finalized`)
Source: `EntityPacketRewriter26_1.java:registerRewrites()`.
#### Item component changes
Several structured data keys were renamed/versioned for 26.1. ViaVersion translates:
| Old key (1.21.11) | New key (26.1) | Change |
|---|---|---|
| `JUKEBOX_PLAYABLE1_21_5` | `JUKEBOX_PLAYABLE26_1` | Internal Holder type change (key vs inline data) |
| `INSTRUMENT1_21_5` | `INSTRUMENT26_1` | EitherHolder → Holder |
| `PROVIDES_TRIM_MATERIAL1_21_5` | `PROVIDES_TRIM_MATERIAL26_1` | EitherHolder unwrapping |
| `CHICKEN_VARIANT1_21_5` | `CHICKEN_VARIANT26_1` | Either resolved to int |
| `ZOMBIE_NAUTILUS_VARIANT1_21_11` | `ZOMBIE_NAUTILUS_VARIANT26_1` | Either resolved to int |
| `DAMAGE_TYPE1_21_11` | `DAMAGE_TYPE26_1` | EitherHolder → int |
| `PROVIDES_BANNER_PATTERNS1_21_5` | `PROVIDES_BANNER_PATTERNS26_1` | Key → HolderSet |
| `DAMAGE_RESISTANT1_21_2` | `DAMAGE_RESISTANT26_1` | Tag key → HolderSet |
| `BLOCKS_ATTACKS1_21_5` | `BLOCKS_ATTACKS26_1` | Gains `bypassedBy` field |
New components not present in 1.21.11 (removed on downgrade):
| Component | Description |
|---|---|
| `ADDITIONAL_TRADE_COST` | Transient modifier for villager trade quantities |
| `DYE` | Dye color component for generic color interactions |
| `CAT_SOUND_VARIANT` | Per-item cat sound variant |
| `CHICKEN_SOUND_VARIANT` | Per-item chicken sound variant |
| `COW_SOUND_VARIANT` | Per-item cow sound variant |
| `PIG_SOUND_VARIANT` | Per-item pig sound variant |
Container item `null` semantics: 26.1 uses `null` for empty container slots instead of empty item objects (`count=0`). ViaVersion converts bidirectionally. Source: `BlockItemPacketRewriter26_1.java:upgradeData/downgradeData`.
#### Registry additions (via FINISH_CONFIGURATION injection)
ViaVersion injects these registries for 26.1 clients during configuration:
| Registry key | Contents |
|---|---|
| `world_clock` | `overworld`, `the_end` — dimension clock entries |
| `cat_sound_variant` | Cat breed sound mappings |
| `cow_sound_variant` | Cow variant sound mappings |
| `pig_sound_variant` | Pig variant sound mappings |
| `chicken_sound_variant` | Chicken variant sound mappings |
Also adds `FINISH_CONFIGURATION`-time tag patches: emits an empty `UPDATE_TAGS` if no tags packet was received (to ensure damage type and banner pattern tags are populated). Source: `Protocol1_21_11To26_1.java`.
#### Villager/dimension registry rewrites
The `dimension_type` registry entry gains `has_ender_dragon_fight` (computed from key == `the_end`) and `visual/ambient_light_color`. `wolf_sound_variant` entries are restructured into `adult_sounds`/`baby_sounds` compound tags. `wolf_variant` gains `baby_assets`. `frog_variant`, `chicken_variant`, `cow_variant`, `pig_variant`, `cat_variant` all gain asset-id affixes and baby asset IDs. Source: `Protocol1_21_11To26_1.java:onMappingDataLoaded`.
#### `UPDATE_TAGS` / configuration tags
`UPDATE_TAGS` is replaced via `replaceClientbound` in both play and configuration state to track whether tags were sent (for the FINISH_CONFIGURATION injection logic). A large set of `damage_type` and `banner_pattern` empty tags are added for compatibility. Source: `Protocol1_21_11To26_1.java:handleTags`.
---
## 26.2 — Protocol 776 (vs 26.1 / protocol 775)
**Release name:** "Chaos Cubed"
**Release date:** 2026-06-16
**Development timeline:** 8 snapshots, 6 pre-releases, 2 release candidates.
**Pack formats:** Resource pack 88.0, Data pack 107.1.
**Minimum Java:** Java SE 25 (unchanged).
> **Source note:** The ViaVersion clone (`/tmp/mcproto-refs/ViaVersion`) predates 26.2 — no `v26_1to26_2` package exists in the local ref. Protocol 776 is confirmed from minecraft-data `protocolVersions.json` (entry `{'minecraftVersion': '26.2', 'version': 776, 'dataVersion': 4903}`) and minecraft.wiki/w/Java_Edition_26.2 (fetched 2026-06-19). The packet-level diff below is from wiki sources only. <!-- VERIFY once ViaVersion ships v26_1to26_2 -->
### Headline gameplay changes (mc-wiki, fetched 2026-06-19)
- **Sulfur Caves biome**: new underground biome with sulfur spikes (stalactite/stalagmite mechanics), sulfur springs, and distinctive lighting.
- **New blocks**: sulfur block, polished sulfur, sulfur bricks, sulfur stairs/slabs/walls, chiseled sulfur; cinnabar block and all its variants (same palette); potent sulfur (creates geysers); sulfur spike.
- **Sulfur Cube mob**: passive mob with 12 archetypes (`regular`, `bouncy`, `slow_bouncy`, `fast_flat`, `slow_flat`, `light`, `fast_sliding`, `slow_sliding`, `high_resistance`, `sticky`, `explosive`, `hot`). Physics properties driven by absorbed blocks; can absorb TNT to become explosive.
- **Music Disc "Bounce"**: by fingerspit.
- **`/unpublish` command**: disconnects the integrated (LAN) server.
- **Friends List**: in-game friend request management system. <!-- VERIFY wire-level packet -->
- **Vulkan 1.2 renderer** (experimental): optional renderer with automatic OpenGL fallback.
### Protocol changes in 776
Sources: minecraft.wiki/w/Java_Edition_26.2 (fetched 2026-06-19). No ViaVersion source available for this bump. All protocol claims in this section are wiki-only. <!-- VERIFY -->
#### New entity attributes
Five new entity attributes registered server-side and sent in `UPDATE_ATTRIBUTES`:
| Attribute | Range | Purpose |
|---|---|---|
| `minecraft:air_drag_modifier` | 0.02048.0 | Air resistance multiplier |
| `minecraft:bounciness` | 0.01.0 | Restitution coefficient for bounce mechanics |
| `minecraft:friction_modifier` | 0.02048.0 | Surface friction multiplier |
| `minecraft:below_name_distance` | 0.0512.0 | Minimum distance to show name tag below |
| `minecraft:name_tag_distance` | 0.0512.0 | Maximum render distance for name tag |
#### New game event
`minecraft:bounce` (vibration frequency 2): emitted when an entity with non-zero `bounciness` attribute collides with a surface. Carried in `GAME_EVENT` packets.
#### New item component
`minecraft:sulfur_cube_content`: holds the block stack absorbed by a Sulfur Cube entity, driving archetype behavior.
#### New registry
`minecraft:sulfur_cube_archetype`: 12 entries (`regular`, `bouncy`, `slow_bouncy`, `fast_flat`, `slow_flat`, `light`, `fast_sliding`, `slow_sliding`, `high_resistance`, `sticky`, `explosive`, `hot`). Sent via `REGISTRY_DATA` during configuration.
#### World generation feature renames
`pointed_dripstone` feature type renamed to `speleothem`; `dripstone_cluster` renamed to `speleothem_cluster`. Impacts `LEVEL_CHUNK_WITH_LIGHT` structural data for affected chunk regions. <!-- VERIFY if this touches the wire format or only server-side gen -->
#### New density function
`minecraft:interval_select`: threshold-based density function selector. Server-side only (world generation); not directly in the play protocol. <!-- VERIFY -->
#### Predicate restructuring
Entity predicate `type` field renamed to `minecraft:entity_type`; new `minecraft:entity_tags` sub-predicate. Affects datapack commands and any packets that embed predicates (e.g. `COMMANDS` argument types). <!-- VERIFY exact packet impact -->
#### Chunk section changes
<!-- VERIFY: unknown whether 26.2 changes the chunk section format vs 26.1. The ViaVersion source is absent; assume format is identical to 26.1 (non-air + fluid count shorts + block/biome palettes) unless wiki or ViaVersion indicates otherwise. -->
#### Particle additions
Five new particles: `geyser_base`, `geyser_poof`, `geyser_plume`, `geyser`, `sulfur_cube_goo`. These appear in `LEVEL_PARTICLES` and `SET_ENTITY_DATA` payloads.
---
## 1.21 trajectory continuity
Both 26.1 and 26.2 continue the patterns established in 1.21.x:
- **Structured item components** (`minecraft:*` data components introduced in 1.20.5): 26.1 extends this with `dye`, `additional_trade_cost`, sound variant components; 26.2 adds `sulfur_cube_content`. The `EitherHolder` intermediate layer introduced in 1.21.x is being progressively resolved to plain `Holder` or `int` IDs (see 26.1 item component changes above).
- **Registry-driven content**: new registries (`world_clock`, `sulfur_cube_archetype`, sound variant registries) follow the Configuration-state `REGISTRY_DATA` pattern established in 1.20.2.
- **Chunk section header**: grew from 1.21.5's block-palette-only header to 1.21.x's non-air count, then 26.1 adds fluid count. Still the same short+palette+palette structure.
- **Bundle delimiter and batched chunk delivery**: unchanged from 1.21.x.
- **Snapshot high-bit scheme**: `0x40000000 + N` for all pre-release builds — unbroken from 1.13.
---
## Proxy and ViaVersion translation notes
### 26.1 (775): fully supported by ViaVersion clone
ViaVersion's `v1_21_11to26_1` package translates in both directions. Key proxy concerns:
| Concern | What to do |
|---|---|
| Chunk section fluid count | Recompute from block palette on downgrade; inject zero on upgrade |
| ATTACK / SPECTATE_ENTITY → INTERACT | Map to `action=1` (attack); track sneak state from `PLAYER_INPUT` bit 5 |
| INTERACT → ATTACK + optional INTERACT_AT | Split one packet into two for upgrade (entity id + action + location) |
| SET_TIME multi-clock → old format | Use clock 0 (overworld) only; extract `total_ticks` + `tick_rate` |
| SET_GAME_RULE serverbound cancel | Drop `SET_GAME_RULE` action=2 (request values) entirely |
| GAME_RULE_VALUES cancel | Not sent to 1.21.11 clients |
| LOW_DISK_SPACE_WARNING cancel | Not sent to older clients |
| World clock registry injection | Inject `world_clock` entries in FINISH_CONFIGURATION |
| Sound variant registries | Inject `cat_sound_variant`, `cow_sound_variant`, etc. in FINISH_CONFIGURATION |
| Entity data index shifts | catSoundVariant@22, cowSoundVariant@24, pigSoundVariant@29, chickenSoundVariant@31 inserted |
| Item component renames | See table in §item-component-changes above |
Source: `Protocol1_21_11To26_1.java`, `EntityPacketRewriter26_1.java`, `BlockItemPacketRewriter26_1.java`.
### 26.2 (776): no ViaVersion source in local clone
The ViaVersion ref predates 26.2. Expected translation requirements (from wiki analysis):
- New entity attributes (`air_drag_modifier`, `bounciness`, etc.) in `UPDATE_ATTRIBUTES` must be stripped for 26.1 clients.
- `sulfur_cube_archetype` registry must be injected or stripped.
- Five new particles must be remapped or dropped.
- `sulfur_cube_content` item component must be removed on downgrade.
- New game event `bounce` can be suppressed without client-visible impact.
- Entity predicate restructuring may affect `COMMANDS` packet argument types.
<!-- VERIFY all 776 proxy notes once ViaVersion v26_1to26_2 ships -->
---
## Version map summary
| Version string | Protocol | Snapshot range | Confirmed by |
|---|---|---|---|
| 26.126.1.2 | 775 | `0x4000011F``0x4000012F` (snapshot-1 to rc-3) | ViaVersion `ProtocolVersion.java:96`; minecraft-data `protocolVersions.json`; mc-wiki |
| 26.2 | 776 | `0x40000134``0x40000142` (snapshot-2 to rc-2) | minecraft-data `protocolVersions.json`; mc-wiki |
| 26w14a | `0x40000131` | — (interstitial snapshot, April-type) | minecraft-data `protocolVersions.json` (dataVersion 5000) |