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

22 KiB
Raw Blame History

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.YYY.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.

Chunk section changes

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 0x4000011F0x4000012F (snapshot-1 to rc-3) ViaVersion ProtocolVersion.java:96; minecraft-data protocolVersions.json; mc-wiki
26.2 776 0x400001340x40000142 (snapshot-2 to rc-2) minecraft-data protocolVersions.json; mc-wiki
26w14a 0x40000131 — (interstitial snapshot, April-type) minecraft-data protocolVersions.json (dataVersion 5000)