Files
minecraft_protocol/versions/26.md
T
claude-timemachine cf6aa978d0 verify pass 3: FML token correction + BungeeGuard/cmd-providers from live source
archive.org Wayback was network-blocked; pivoted to live GitHub. Key fix: FML
host token is \0FML\0 (not \0FML2/3\0 — those are FMLNETVERSION ints on the
fml:handshake channel); modern Forge uses \0FORGE/\0FORGEn. Confirmed BungeeGuard
backend token check (lucko source), 4 cmd suggestion providers, 26.2 interval_select
worldgen-only, corrected 1.14 villager metadata layout.

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

346 lines
22 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.
# 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 | 2026-04-01 |
| 26.1.2 | 775 | 4790 | 2026-04-09 |
| 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.1.1 (fetched 2026-06-19), minecraft.wiki/w/Java_Edition_26.1.2 (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. All 776 protocol claims in this section remain wiki-sourced and should be re-verified against ViaVersion `v26_1to26_2` once that package ships.
### 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 (send/accept/decline/cancel/remove via new UI on title screen and pause menu). No new protocol packets documented — minecraft.wiki/w/Java_Edition_26.2 describes it as a client-side UI feature with no wire-level packet additions.
- **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 and should be reverified against ViaVersion `v26_1to26_2` once available.
#### 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`. Server-side worldgen only — minecraft.wiki/w/Java_Edition_26.2 documents these as feature-type configuration renames (datapack fields `base_block`, `pointed_block`, `replaceable_blocks`); no chunk data format change documented.
#### New density function
`minecraft:interval_select`: threshold-based density function selector. Server-side only (world generation); not directly in the play protocol. Confirmed worldgen-only: minecraft.wiki/w/Java_Edition_26.2 describes it under "Density functions" as "Selects between a number of density functions based on an input density function and a set of threshold values" — no wire packet presence documented. (checked 2026-06-19)
#### Predicate restructuring
Entity predicate `type` field renamed to `minecraft:entity_type`; new `minecraft:entity_tags` sub-predicate. Wiki confirms the predicate restructuring but does not specify which packets carry the changed predicate format. <!-- UNCONFIRMED: packet impact (e.g. whether `COMMANDS` argument node serialization changed) not verifiable from wiki alone; ViaVersion v26_1to26_2 source required; minecraft.wiki/w/Java_Edition_26.2 checked 2026-06-19 — wiki notes command format changes (team color args now lowercase+underscores only) but does not document COMMANDS packet arg-node structure changes; no other source available -->
#### Chunk section changes
<!-- UNCONFIRMED: minecraft.wiki/w/Java_Edition_26.2 (checked 2026-06-19) does not document any chunk section wire format change in 26.2; format is assumed identical to 26.1 (non-air-block count short + fluid count short + block palette + biome palette). Cannot confirm without ViaVersion v26_1to26_2 source or packet capture. -->
#### 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.
All items above are derived from wiki analysis only; reverify against ViaVersion `v26_1to26_2` once that package 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) |