Skip to content

Multi-Version

This page serves as a quick-reference/guide on differences that came up as the Beta-era protocol was developed, including some info on Beta 1.8 and beyond.

The pre-netty Protocol was first created around Alpha v1.0.17 as it marked the reset of the Protocol version from 14 to 1. The protocol created was tweaked and changed, but left mostly similar until Snapshot 13w39b (Release 1.7.2, Protocol version 80), where it was finally replaced by the modern Netty-based Protocol.

WARNING

This page features incomplete and possibly erroneous information. Please double and triple check EVERYTHING said here.

Beta 1.8

Beta 1.8.x is a version often disliked by legacy Minecraft players, due to its addition of the hunger bar and less nostalgic world generation. However, it has interesting features for server admins like creative mode and flying, and the protocol still resembles Beta 1.7.3 closely.

To implement basic support, make the following changes to the login packet:

Clientbound

swift
func write(to buffer: inout ByteBuffer) throws {
    buffer.writeInteger(entityId)
    buffer.writeString16("")
    buffer.writeInteger(worldSeed)

    if beta18 {
        buffer.writeInteger(Int32(1)) // 0 for survival, 1 for creative
        buffer.writeInteger(dimension.rawValue)
        buffer.writeInteger(Int8(2)) // normal difficulty
        buffer.writeInteger(UInt8(128)) // world height
        buffer.writeInteger(UInt8(8)) // max players
    } else {
        buffer.writeInteger(dimension.rawValue)
    }
}

Serverbound

swift
init(from buffer: inout ByteBuffer) throws {
    protocolVersion = try buffer.readInteger()
    username = try buffer.readString16()
    let _: Int64 = try buffer.readInteger()

    if beta18 {
        let _: Int32 = try buffer.readInteger()
        let _: Int8 = try buffer.readInteger()
        let _: Int8 = try buffer.readInteger()
        let _: UInt8 = try buffer.readInteger()
        let _: UInt8 = try buffer.readInteger()
    } else {
        let _: Int8 = try buffer.readInteger()
    }
}

Other modified packets

Keep Alive

Now carries an int that the recipient echoes back.

FieldType
Keep Alive IDInteger

Set Health

Two fields appended after the existing Health.

FieldTypeDescription
FoodShort0 to 20
SaturationFloat

Respawn

The body is fully replaced. Wire order:

FieldTypeDescription
DimensionByte
DifficultyByte
Game ModeByte0 survival, 1 creative
World HeightShortAlways 128. This is a Byte in the Login packet.
World SeedLong

Game Event

A trailing byte is appended. It carries the new game mode (0/1) for state 3 ("game mode changed"), and is sent regardless of the state.

FieldType
Game ModeByte

Open Container

The Title field's type changed from String8 to String16.

New packets

Spawn XP Orb

Packet IDDirectionMojang NameMCP Name
0x1AClientboundTODOPacket26EntityExpOrb

Position is in block space.

FieldTypeDescription
Entity IDInteger
XIntegerThe X block position of the orb
YIntegerThe Y block position of the orb
ZIntegerThe Z block position of the orb
CountShortThe amount of XP the orb is worth

Apply Mob Effect

Packet IDDirectionMojang NameMCP Name
0x29ClientboundTODOPacket41EntityEffect
FieldTypeDescription
Entity IDInteger
Effect IDByte
AmplifierByteEffect tier minus one (0 = I)
DurationShortIn ticks

Remove Mob Effect

Packet IDDirectionMojang NameMCP Name
0x2AClientboundTODOPacket42RemoveEntityEffect
FieldType
Entity IDInteger
Effect IDByte

Set Experience

Packet IDDirectionMojang NameMCP Name
0x2BClientboundTODOPacket43Experience
FieldTypeDescription
Bar ProgressBytePosition of the green fill in the XP bar
LevelByteNumber rendered above the XP bar
Total XPShort

Creative Set Slot

Packet IDDirectionMojang NameMCP Name
0x6BBothTODOPacket107CreativeSetSlot

Sent by the client to set a slot in their inventory while in creative mode.

FieldTypeDescription
SlotShortThe destination slot. -1 means "drop into the world".
Item IDShort
CountShort
MetadataShort

Player List Item

Packet IDDirectionMojang NameMCP Name
0xC9ClientboundTODOPacket201PlayerInfo

Adds, updates, or removes an entry in the in-game player list overlay.

FieldTypeDescription
UsernameString16
OnlineByte1 to add or update, 0 to remove the entry
PingShortLatency in milliseconds. Bar count is <150, <300, <600, <1000, or <0 for none.

Server List Ping

Packet IDDirectionMojang NameMCP Name
0xFEServerboundTODOPacket254ServerPing

Empty payload. The server is expected to respond with a Disconnect packet whose reason holds the MOTD.

Registry additions

These don't change any packet shapes, but the new IDs can't be sent to a Beta 1.7.3 client.

Blocks

IDName
97Silverfish Block
98Stone Bricks
99Brown Mushroom Cap
100Red Mushroom Cap
101Iron Bars
102Glass Pane
103Melon
104Pumpkin Stem
105Melon Stem
106Vines
107Fence Gate
108Brick Stairs
109Stone Brick Stairs

Items

IDName
104Melon Slice
105Pumpkin Seeds
106Melon Seeds
107Raw Beef
108Steak
109Raw Chicken
110Cooked Chicken
111Rotten Flesh
112Ender Pearl

Entities

IDNameNotes
2XP OrbSpawned with its own packet (0x1A)
58Enderman
59Cave Spider
60Silverfish

Mob Effects

Referenced by 0x29 Apply Mob Effect and 0x2A Remove Mob Effect.

IDName
1Speed
2Slowness
3Haste
4Mining Fatigue
5Strength
6Instant Health
7Instant Damage
8Jump Boost
9Nausea
10Regeneration
11Resistance
12Fire Resistance
13Water Breathing
14Invisibility
15Blindness
16Night Vision
17Hunger
18Weakness
19Poison

MISSING

TODO: beta 1.2 and 1.1 sharing the same protocol version is suspicious, could be minecraft.wiki mistake

Versions

First VersionLast VersionProtocol VersionMinecraft Wiki Page
Alpha v1.0.17Alpha v1.0.17_041(undocumented)
Alpha v1.1.0Alpha v1.1.2_012(undocumented)
Alpha v1.2.0Alpha v1.2.1_013https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=prev&oldid=2769656
Alpha v1.2.2Alpha v1.2.24https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2769656
Alpha v1.2.3Alpha v1.2.3_045https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2769656
Alpha v1.2.3_05Alpha v1.2.66https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol?oldid=2769659
Beta 1.0Beta 1.1_017?TODO
Beta 1.1_02Beta 1.2_028https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol?oldid=2769711
Beta 1.3Beta 1.3_019https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol?oldid=2769723
Beta 1.4Beta 1.4_0110(not undocumented standalone, see 11)
Beta 1.5Beta 1.5_0211https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2769730
Beta 1.6 Test Build 3Beta 1.6 Test Build 312(undocumented)
Beta 1.6Beta 1.6.613https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2769745
Beta 1.7Beta 1.7.314https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol?oldid=2769763
Beta 1.8Beta 1.8.117https://minecraft.wiki/w/Minecraft_Wiki:Projects/wiki.vg_merge/Protocol?oldid=2769858
Beta 1.9 Pre-6Release 1.0.122TODO
12w01aRelease 1.123
12w03a12w05b24
12w06a12w06a25
12w07aRelease 1.126
12w01a12w07b27
12w08aRelease 1.2.328https://minecraft.wiki/w/Java_Edition_protocol/Packets?oldid=2770632
Release 1.2.412w15a29
12w16a12w16a30
12w17a12w17a31
Release 1.6.4Release 1.6.478https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2771078
13w38a13w38c79(undocumented)
13w39a13w39b80(undocumented)

From Snapshot 13w41a (Release 1.7) onward, the protocol was rewritten to use Netty, which goes about describing packet data entirely differently. Here's the first edit on the old Protocol docs to describe this change: https://minecraft.wiki/w/Java_Edition_protocol/Packets?direction=next&oldid=2771080

The Minecraft Wiki pre-netty rewrite protocol version list was used as a reference.