Skip to content

Layercraft/PacketLib

Repository files navigation

Java CI with Gradle Gradle Publish

PacketLib - Type-safe Minecraft protocol packets for Kotlin

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.

Usage

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

Regenerating the packets

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 versions

Repo

Jitpack:

Gradle 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>&lt;version&gt;</version>
        </dependency>
    </dependencies>
    ...
</project>

Github Packages:

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>")
}

Thanks

About

A library for serializing Minecraft Packets typesafe in Kotlin

Topics

Resources

License

Stars

2 stars

Watchers

1 watching

Forks

Packages

 
 
 

Contributors

Languages