Type-safe, auto-generated Minecraft protocol packets in Kotlin — for every release version from 1.7 to 1.21.11 (55 versions, 43 distinct protocol definitions, ~7200 packet classes).
The packets are generated with KotlinPoet from
PrismarineJS/minecraft-data.
Most packets are fully typed data classes with generated serializers; packets that use protocol
constructs that cannot be expressed in a typed way (entity metadata, particles, registry holders, ...)
fall back to a raw: ByteArray payload so every packet of every version still round-trips correctly.
Every version has a codec in MinecraftCodecs:
val codec = MinecraftCodecs.V1_20_1
// or dynamically:
val codec = MinecraftCodecs.fromProtocolVersion(ProtocolVersion.fromProtocolNumber(763)!!)
val codecPacket = codec.getCodecPacket(PacketDirection.SERVERBOUND, PacketState.HANDSHAKING, 0x00)Packets are plain data classes with a companion PacketSerializer:
import io.layercraft.packetlib.packets.v1_20.handshaking.serverbound.SetProtocolPacket
val packet = SetProtocolPacket(763, "localhost", 25565u, 1)
SetProtocolPacket.serialize(output, packet)
val decoded = SetProtocolPacket.deserialize(input)input/output are your implementations of MCProtocolDeserializer / MCProtocolSerializer
(see the example implementations: https://gist.github.com/Newspicel/54184b844dee00a4f351e58de033e071).
The :generator module downloads the protocol definitions from minecraft-data (cached in
generator/.cache) and regenerates all packet classes, codecs and the ProtocolVersion enum:
./gradlew :generator:run # all release versions
./gradlew :generator:run -PmcVersions=1.20.1 # only specific versionsGradle Kotlin
repositories {
maven { url = uri("https://jitpack.io") }
}
dependencies {
implementation("com.github.layercraft:packetlib:<version>")
}Gradle Groovy
repositories {
maven { url = 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.layercraft:packetlib:<version>'
}Maven
<project>
...
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
...
<dependencies>
<dependency>
<groupId>com.github.layercraft</groupId>
<artifactId>packetlib</artifactId>
<version><version></version>
</dependency>
</dependencies>
...
</project>Gradle Kotlin
repositories {
maven {
url = uri("https://maven.pkg.github.com/Layercraft/PacketLib")
credentials {
username = project.findProperty("gpr.user") as String? ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") as String? ?: System.getenv("TOKEN")
}
}
}
dependencies {
implementation("io.layercraft.connector:packetlib:<version>")
}- PrismarineJS/minecraft-data for the protocol data
- minecraft.wiki (formerly wiki.vg) for the protocol documentation