Update all codec to suspend; added a default ProtocolCryptoContext implementation

This commit is contained in:
2026-09-07 07:40:08 +08:00
parent 687039f69a
commit 641df674e4
296 files changed
+2199 -1818

No files matched your search

+1 -3
View File
@@ -14,7 +14,6 @@ kotlin {
commonMain.dependencies {
api(project(":common"))
api(project(":nbt"))
api(libs.kotlinx.coroutines)
}
jvmMain.dependencies {
@@ -27,8 +26,7 @@ kotlin {
}
jvmTest.dependencies {
implementation(libs.ktor.client.core)
implementation(libs.ktor.client.okhttp)
implementation(project(":protocol-encrypt"))
}
}
}
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.client
import cn.rtast.libmc.common.LibMCContext
import cn.rtast.libmc.protocol.crypto.ProtocolContext
import cn.rtast.libmc.protocol.crypto.ProtocolContextBuilder
import cn.rtast.libmc.common.crypto.ProtocolContext
import cn.rtast.libmc.common.crypto.ProtocolContextBuilder
import cn.rtast.libmc.protocol.event.InternalPacketDispatcher
import cn.rtast.libmc.protocol.event.PacketEventDispatcher
import cn.rtast.libmc.protocol.network.NetworkChannel
@@ -56,7 +56,7 @@ public class MinecraftClient internal constructor(
override val coroutineContext: CoroutineContext
get() = clientJob + ioDispatcher + CoroutineName("LibMC-MinecraftClient-$username")
public fun connect(protocolVersion: Int = 776) {
public suspend fun connect(protocolVersion: Int = 776) {
networkChannel.connect()
startListening()
networkChannel.sendPacket(
@@ -1,13 +0,0 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/7
*/
package cn.rtast.libmc.protocol.crypto
public interface NetworkCipher {
public fun encrypt(buffer: ByteArray, offset: Int, length: Int)
public fun decrypt(buffer: ByteArray, offset: Int, length: Int)
}
@@ -1,40 +0,0 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/7
*/
package cn.rtast.libmc.protocol.crypto
import cn.rtast.libmc.protocol.session.AuthenticationProvider
public data class ProtocolContext(
val rsaEncryptor: RSA1024Encryptor,
val sha1Hasher: Sha1Hasher,
val cipherFactory: (sharedKey: ByteArray) -> NetworkCipher,
val authProvider: AuthenticationProvider,
)
public class ProtocolContextBuilder internal constructor(private val onlineMode: Boolean) {
public lateinit var rsaEncryptor: RSA1024Encryptor
public lateinit var sha1Hasher: Sha1Hasher
public lateinit var cipherFactory: (sharedKey: ByteArray) -> NetworkCipher
public lateinit var authProvider: AuthenticationProvider
internal fun build(): ProtocolContext = ProtocolContext(
rsaEncryptor = if (::rsaEncryptor.isInitialized) rsaEncryptor else error("rsaEncryptor is required"),
sha1Hasher = if (::sha1Hasher.isInitialized) sha1Hasher else error("sha1Hasher is required"),
cipherFactory = if (::cipherFactory.isInitialized) cipherFactory else error("cipherFactory is required"),
authProvider = if (::authProvider.isInitialized && !onlineMode) authProvider else error("authProvider is required")
)
}
public fun interface RSA1024Encryptor {
public fun encrypt(key: ByteArray, data: ByteArray): ByteArray
}
public fun interface Sha1Hasher {
public fun hash(serverId: String, secretKey: ByteArray, publicKey: ByteArray): String
}
@@ -19,7 +19,7 @@ import cn.rtast.libmc.protocol.packet.play.serverbound.ServerboundConfigurationA
import cn.rtast.libmc.protocol.packet.play.serverbound.ServerboundKeepAlivePlayPacket
import cn.rtast.libmc.protocol.packet.play.serverbound.ServerboundPongPlayPacket
import cn.rtast.libmc.protocol.protocol.state.ProtocolState
import cn.rtast.libmc.protocol.session.AuthenticationProvider
import cn.rtast.libmc.common.crypto.AuthenticationProvider
import cn.rtast.libmc.protocol.util.generateRandom16Bytes
public class InternalPacketDispatcher(
@@ -31,19 +31,8 @@ public class InternalPacketDispatcher(
public suspend fun handleIncomingPackets(packet: MinecraftPacket) {
this.dispatchEvent(packet)
when (packet) {
is ClientboundLoginPacket -> this.handleLoginPackets(packet)
is ClientboundConfigurationPacket -> this.handleConfigurationPackets(packet)
is ClientboundPlayPacket -> this.handlePlayPackets(packet)
}
}
private suspend fun handleLoginPackets(packet: ClientboundLoginPacket) {
when (packet) {
is ClientboundDisconnectLoginPacket -> {
println("Login denied: ${packet.reason}")
client.close()
}
// login
is ClientboundDisconnectLoginPacket -> client.close()
is ClientboundSetCompressionPacket -> client.networkChannel.setCompression(packet.threshold)
is ClientboundLoginSuccessPacket -> {
client.networkChannel.sendPacket(ServerboundLoginAcknowledgedPacket)
@@ -67,13 +56,7 @@ public class InternalPacketDispatcher(
client.session.enableEncryption(sharedSecret)
}
else -> {}
}
}
private fun handleConfigurationPackets(packet: ClientboundConfigurationPacket) {
when (packet) {
is ClientboundDisconnectConfigurationPacket -> println("Configuration disconnected: ${packet.reason}")
// configuration
ClientboundFinishConfigurationPacket -> {
client.networkChannel.sendPacket(ServerboundAckFinishConfigurationPacket)
client.stateMachine.transitionTo(ProtocolState.PLAY)
@@ -91,24 +74,16 @@ public class InternalPacketDispatcher(
ServerboundSelectKnownPacksPacket(emptyList())
) // TODO empty resource packs list
is ClientboundCodeOfConductPacket -> client.networkChannel.sendPacket(ServerboundAcceptCodeOfConductPacket)
else -> {}
}
}
private fun handlePlayPackets(packet: ClientboundPlayPacket) {
when (packet) {
// play
is ClientboundDisconnectPlayPacket -> client.close()
is ClientboundKeepAlivePlayPacket -> client.networkChannel.sendPacket(ServerboundKeepAlivePlayPacket(id = packet.id))
is ClientboundLoginPlayPacket -> println("Successfully joined world Entity ID: ${packet.entityId}")
is ClientboundPingPacket -> client.networkChannel.sendPacket(ServerboundPongPlayPacket(packet.id))
is ClientboundPlayerChatMessagePacket -> println("[Player Chat Message] ${packet.message}")
ClientboundStartConfigurationPacket -> {
client.networkChannel.sendPacket(ServerboundConfigurationAcknowledgedPacket)
client.stateMachine.transitionTo(ProtocolState.CONFIGURATION)
}
is ClientboundSystemChatMessagePacket -> println("[System message] ${packet.content}")
else -> println(packet)
else -> {}
}
}
}
@@ -7,27 +7,27 @@
package cn.rtast.libmc.protocol.network
import cn.rtast.libmc.common.ReadChannel
import cn.rtast.libmc.common.WriteChannel
import cn.rtast.libmc.protocol.crypto.NetworkCipher
import cn.rtast.libmc.common.stream.ReadChannel
import cn.rtast.libmc.common.stream.WriteChannel
import cn.rtast.libmc.common.crypto.NetworkCipher
internal class CipherReadChannel(
private val delegate: ReadChannel,
private val crypto: NetworkCipher
) : ReadChannel() {
override fun readFully(out: ByteArray, start: Int, end: Int) {
override suspend fun readFully(out: ByteArray, start: Int, end: Int) {
delegate.readFully(out, start, end)
val length = end - start
if (length > 0) crypto.decrypt(out, start, length)
}
override fun readByte(): Byte {
override suspend fun readByte(): Byte {
val buf = ByteArray(1)
readFully(buf, 0, 1)
return buf[0]
}
override fun readBytes(length: Int): ByteArray {
override suspend fun readBytes(length: Int): ByteArray {
val bytes = ByteArray(length)
readFully(bytes, 0, length)
return bytes
@@ -38,14 +38,14 @@ internal class CipherWriteChannel(
private val delegate: WriteChannel,
private val crypto: NetworkCipher
) : WriteChannel() {
override fun writeFully(value: ByteArray, startIndex: Int, endIndex: Int) {
override suspend fun writeFully(value: ByteArray, startIndex: Int, endIndex: Int) {
val length = endIndex - startIndex
if (length <= 0) return
val encrypted = value.copyOfRange(startIndex, endIndex)
crypto.encrypt(encrypted, 0, length)
delegate.writeFully(encrypted, 0, length)
}
override fun flush() {
override suspend fun flush() {
delegate.flush()
}
}
@@ -7,9 +7,14 @@
package cn.rtast.libmc.protocol.network
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.crypto.NetworkCipher
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.writeBuffer
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.writeVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.stream.wrap
import cn.rtast.libmc.protocol.client.ClientStateMachine
import cn.rtast.libmc.protocol.crypto.NetworkCipher
import cn.rtast.libmc.protocol.protocol.GameProtocols
import kotlin.concurrent.Volatile
@@ -33,7 +38,7 @@ internal class NetworkChannel(
this.threshold = threshold
}
fun readNextPacket(): MinecraftPacket {
suspend fun readNextPacket(): MinecraftPacket {
val packetLength = session.readVarInt()
val rawFrameBytes = session.readBytes(packetLength)
val frameBuf = rawFrameBytes.wrap()
@@ -49,7 +54,7 @@ internal class NetworkChannel(
.decodePacket(packetId, payloadBuf)
}
fun sendPacket(packet: MinecraftPacket) {
suspend fun sendPacket(packet: MinecraftPacket) {
val uncompressedBodyBuf = BytesBuffer()
GameProtocols.serverboundGameProtocols
.getRegistry(stateMachine.currentState)
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.network
import cn.rtast.libmc.common.LibMCContext
import cn.rtast.libmc.common.ReadChannel
import cn.rtast.libmc.common.Socket
import cn.rtast.libmc.common.WriteChannel
import cn.rtast.libmc.protocol.crypto.NetworkCipher
import cn.rtast.libmc.common.stream.ReadChannel
import cn.rtast.libmc.common.stream.Socket
import cn.rtast.libmc.common.stream.WriteChannel
import cn.rtast.libmc.common.crypto.NetworkCipher
internal class NetworkSession(
private val host: String,
@@ -41,17 +41,17 @@ internal class NetworkSession(
this.writeChannel = CipherWriteChannel(currentWrite, cipher)
}
fun readByte(): Byte {
suspend fun readByte(): Byte {
val channel = requireNotNull(readChannel) { "ReadChannel not connected" }
return channel.readByte()
}
fun readBytes(length: Int): ByteArray {
suspend fun readBytes(length: Int): ByteArray {
val channel = requireNotNull(readChannel) { "ReadChannel not connected" }
return channel.readBytes(length)
}
fun readVarInt(): Int {
suspend fun readVarInt(): Int {
var numRead = 0
var result = 0
var read: Byte
@@ -65,7 +65,7 @@ internal class NetworkSession(
return result
}
fun writeFully(data: ByteArray) {
suspend fun writeFully(data: ByteArray) {
val channel = requireNotNull(writeChannel) { "WriteChannel not connected" }
channel.writeFully(data, 0, data.size)
channel.flush()
@@ -7,20 +7,20 @@
package cn.rtast.libmc.protocol.packet.configuration
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readMcString
import cn.rtast.libmc.common.writeMcString
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.writeMcString
public data class KnownPacks(val namespace: String, val id: String, val version: String) {
internal companion object Codec : PacketCodec<KnownPacks> {
override fun encode(buffer: BytesBuffer, value: KnownPacks) {
override suspend fun encode(buffer: BytesBuffer, value: KnownPacks) {
buffer.writeMcString(value.namespace)
buffer.writeMcString(value.id)
buffer.writeMcString(value.version)
}
override fun decode(buffer: BytesBuffer): KnownPacks {
override suspend fun decode(buffer: BytesBuffer): KnownPacks {
val namespace = buffer.readMcString()
val id = buffer.readMcString()
val version = buffer.readMcString()
@@ -7,7 +7,12 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readUuid
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
import kotlin.uuid.Uuid
@@ -18,10 +23,10 @@ public data class ClientboundAddResourcePackPacket(
val hash: String,
val forced: Boolean,
val prompt: NBTCompound,
) : ClientboundConfigurationPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundAddResourcePackPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundAddResourcePackPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundAddResourcePackPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundAddResourcePackPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundAddResourcePackPacket {
val uuid = buffer.readUuid()
val url = buffer.readMcString()
val hash = buffer.readMcString()
@@ -7,11 +7,12 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundClearDialogPacket : ClientboundConfigurationPacket,
public data object ClientboundClearDialogPacket : MinecraftPacket,
PacketCodec<ClientboundClearDialogPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundClearDialogPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundClearDialogPacket = ClientboundClearDialogPacket
override suspend fun encode(buffer: BytesBuffer, value: ClientboundClearDialogPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundClearDialogPacket = ClientboundClearDialogPacket
}
@@ -7,14 +7,15 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readMcString
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
public data class ClientboundCodeOfConductPacket(val codeOfConduct: String) : ClientboundConfigurationPacket {
public data class ClientboundCodeOfConductPacket(val codeOfConduct: String) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCodeOfConductPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCodeOfConductPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCodeOfConductPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCodeOfConductPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCodeOfConductPacket {
return ClientboundCodeOfConductPacket(buffer.readMcString())
}
}
@@ -1,12 +0,0 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/5
*/
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.packet.MinecraftPacket
public sealed interface ClientboundConfigurationPacket : MinecraftPacket
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundConfigurationShowDialogPacket(val dialog: NBTCompound) : ClientboundConfigurationPacket {
public data class ClientboundConfigurationShowDialogPacket(val dialog: NBTCompound) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundConfigurationShowDialogPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundConfigurationShowDialogPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundConfigurationShowDialogPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundConfigurationShowDialogPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundConfigurationShowDialogPacket {
return ClientboundConfigurationShowDialogPacket(buffer.readNetworkNBTCompound())
}
}
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
public data class ClientboundCookieRequestPacket(val key: Identifier) : ClientboundConfigurationPacket {
public data class ClientboundCookieRequestPacket(val key: Identifier) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCookieRequestPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCookieRequestPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCookieRequestPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCookieRequestPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCookieRequestPacket {
return ClientboundCookieRequestPacket(key = buffer.readIdentifier())
}
}
@@ -7,9 +7,9 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
@@ -18,8 +18,8 @@ public data class ClientboundCustomPayloadPacket(
val data: ByteArray,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCustomPayloadPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCustomPayloadPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCustomPayloadPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCustomPayloadPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCustomPayloadPacket {
val channel = buffer.readIdentifier()
val data = buffer.readRemainingBytes()
return ClientboundCustomPayloadPacket(channel, data)
@@ -7,18 +7,22 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.writeMcString
public data class ClientboundCustomReportDetailsPacket(val details: List<ReportDetail>) :
ClientboundConfigurationPacket {
public data class ClientboundCustomReportDetailsPacket(val details: List<ReportDetail>) : MinecraftPacket {
public data class ReportDetail(val title: String, val description: String) {
internal companion object Codec : PacketCodec<ReportDetail> {
override fun encode(buffer: BytesBuffer, value: ReportDetail) {
override suspend fun encode(buffer: BytesBuffer, value: ReportDetail) {
buffer.writeMcString(value.title)
buffer.writeMcString(value.description)
}
override fun decode(buffer: BytesBuffer): ReportDetail {
override suspend fun decode(buffer: BytesBuffer): ReportDetail {
val title = buffer.readMcString()
val description = buffer.readMcString()
return ReportDetail(title, description)
@@ -27,8 +31,8 @@ public data class ClientboundCustomReportDetailsPacket(val details: List<ReportD
}
internal companion object Codec : PacketCodec<ClientboundCustomReportDetailsPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCustomReportDetailsPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCustomReportDetailsPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCustomReportDetailsPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCustomReportDetailsPacket {
val detailCount = buffer.readVarInt()
val details = ArrayList<ReportDetail>(detailCount)
repeat(detailCount) { details.add(ReportDetail.decode(buffer)) }
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundDisconnectConfigurationPacket(val reason: NBTCompound) : ClientboundConfigurationPacket {
public data class ClientboundDisconnectConfigurationPacket(val reason: NBTCompound) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDisconnectConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDisconnectConfigurationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDisconnectConfigurationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDisconnectConfigurationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDisconnectConfigurationPacket {
return ClientboundDisconnectConfigurationPacket(reason = buffer.readNetworkNBTCompound())
}
}
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundFinishConfigurationPacket : ClientboundConfigurationPacket,
public data object ClientboundFinishConfigurationPacket : MinecraftPacket,
PacketCodec<ClientboundFinishConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundFinishConfigurationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundFinishConfigurationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundFinishConfigurationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundFinishConfigurationPacket {
return ClientboundFinishConfigurationPacket
}
}
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundKeepAliveConfigurationPacket(val id: Long) : ClientboundConfigurationPacket {
public data class ClientboundKeepAliveConfigurationPacket(val id: Long) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundKeepAliveConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundKeepAliveConfigurationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundKeepAliveConfigurationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundKeepAliveConfigurationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundKeepAliveConfigurationPacket {
return ClientboundKeepAliveConfigurationPacket(buffer.readLong())
}
}
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundPingConfigurationPacket(val id: Int) : ClientboundConfigurationPacket {
public data class ClientboundPingConfigurationPacket(val id: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPingConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPingConfigurationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPingConfigurationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPingConfigurationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPingConfigurationPacket {
return ClientboundPingConfigurationPacket(id = buffer.readInt())
}
}
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
import cn.rtast.libmc.protocol.protocol.game.registry.RegistryEntry
@@ -20,10 +21,10 @@ public data class ClientboundRegistryDataPacket(
*/
val registryId: Identifier,
val entries: List<RegistryEntry>,
) : ClientboundConfigurationPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundRegistryDataPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundRegistryDataPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundRegistryDataPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundRegistryDataPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundRegistryDataPacket {
val id = buffer.readIdentifier()
val entryCount = buffer.readVarInt()
val entries = ArrayList<RegistryEntry>(entryCount)
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readUuid
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readUuid
import kotlin.uuid.Uuid
public data class ClientboundRemoveResourcePackPacket(val uuid: Uuid) : ClientboundConfigurationPacket {
public data class ClientboundRemoveResourcePackPacket(val uuid: Uuid) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundRemoveResourcePackPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundRemoveResourcePackPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundRemoveResourcePackPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundRemoveResourcePackPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundRemoveResourcePackPacket {
val uuid = buffer.readUuid()
return ClientboundRemoveResourcePackPacket(uuid)
}
@@ -7,11 +7,12 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundResetChatPacket : ClientboundConfigurationPacket,
public data object ClientboundResetChatPacket : MinecraftPacket,
PacketCodec<ClientboundResetChatPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundResetChatPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundResetChatPacket = ClientboundResetChatPacket
override suspend fun encode(buffer: BytesBuffer, value: ClientboundResetChatPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundResetChatPacket = ClientboundResetChatPacket
}
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.packet.configuration.KnownPacks
public data class ClientboundSelectKnownPacksPacket(val knownPacks: List<KnownPacks>) : ClientboundConfigurationPacket {
public data class ClientboundSelectKnownPacksPacket(val knownPacks: List<KnownPacks>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundSelectKnownPacksPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundSelectKnownPacksPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundSelectKnownPacksPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundSelectKnownPacksPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundSelectKnownPacksPacket {
val packsCount = buffer.readVarInt()
val packs = List(packsCount) { KnownPacks.decode(buffer) }
return ClientboundSelectKnownPacksPacket(packs)
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.registry.report.ServerLink
public data class ClientboundServerLinksPacket(val links: List<ServerLink>) : ClientboundConfigurationPacket {
public data class ClientboundServerLinksPacket(val links: List<ServerLink>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundServerLinksPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundServerLinksPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundServerLinksPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundServerLinksPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundServerLinksPacket {
val count = buffer.readVarInt()
val links = ArrayList<ServerLink>(count)
repeat(count) { links.add(ServerLink.decode(buffer)) }
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readPrefixedByteArray
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readPrefixedByteArray
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
@@ -19,10 +20,10 @@ public data class ClientboundStoreCookiePacket(
* cookie
*/
val payload: ByteArray,
) : ClientboundConfigurationPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundStoreCookiePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundStoreCookiePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundStoreCookiePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundStoreCookiePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundStoreCookiePacket {
val key = buffer.readIdentifier()
val payload = buffer.readPrefixedByteArray()
return ClientboundStoreCookiePacket(key, payload)
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readMcString
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundTransferPacket(val host: String, val port: Int) : ClientboundConfigurationPacket {
public data class ClientboundTransferPacket(val host: String, val port: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundTransferPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundTransferPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundTransferPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundTransferPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundTransferPacket {
val host = buffer.readMcString()
val port = buffer.readVarInt()
return ClientboundTransferPacket(host, port)
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
public data class ClientboundUpdateEnabledFeaturesPacket(val features: List<Identifier>) :
ClientboundConfigurationPacket {
public data class ClientboundUpdateEnabledFeaturesPacket(val features: List<Identifier>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundUpdateEnabledFeaturesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundUpdateEnabledFeaturesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundUpdateEnabledFeaturesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundUpdateEnabledFeaturesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundUpdateEnabledFeaturesPacket {
val featureCount = buffer.readVarInt()
val features = ArrayList<Identifier>(featureCount)
repeat(featureCount) { features.add(buffer.readIdentifier()) }
@@ -7,24 +7,25 @@
package cn.rtast.libmc.protocol.packet.configuration.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.writeVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
import cn.rtast.libmc.protocol.protocol.game.writeIdentifier
public data class ClientboundUpdateTagsPacket(val registries: List<TaggedRegistry>) : ClientboundConfigurationPacket {
public data class ClientboundUpdateTagsPacket(val registries: List<TaggedRegistry>) : MinecraftPacket {
public data class TaggedRegistry(val registryId: Identifier, val tags: List<Tag>) {
internal companion object Codec : PacketCodec<TaggedRegistry> {
override fun encode(buffer: BytesBuffer, value: TaggedRegistry) {
override suspend fun encode(buffer: BytesBuffer, value: TaggedRegistry) {
buffer.writeIdentifier(value.registryId)
buffer.writeVarInt(value.tags.size)
value.tags.forEach { Tag.encode(buffer, it) }
}
override fun decode(buffer: BytesBuffer): TaggedRegistry {
override suspend fun decode(buffer: BytesBuffer): TaggedRegistry {
val id = buffer.readIdentifier()
val tagCount = buffer.readVarInt()
val tags = ArrayList<Tag>(tagCount)
@@ -36,13 +37,13 @@ public data class ClientboundUpdateTagsPacket(val registries: List<TaggedRegistr
public data class Tag(val name: Identifier, val entries: IntArray) {
internal companion object Codec : PacketCodec<Tag> {
override fun encode(buffer: BytesBuffer, value: Tag) {
override suspend fun encode(buffer: BytesBuffer, value: Tag) {
buffer.writeIdentifier(value.name)
buffer.writeVarInt(value.entries.size)
value.entries.forEach { buffer.writeVarInt(it) }
}
override fun decode(buffer: BytesBuffer): Tag {
override suspend fun decode(buffer: BytesBuffer): Tag {
val name = buffer.readIdentifier()
val entrySize = buffer.readVarInt()
val entries = ArrayList<Int>(entrySize)
@@ -68,8 +69,8 @@ public data class ClientboundUpdateTagsPacket(val registries: List<TaggedRegistr
}
internal companion object Codec : PacketCodec<ClientboundUpdateTagsPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundUpdateTagsPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundUpdateTagsPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundUpdateTagsPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundUpdateTagsPacket {
val registryCount = buffer.readVarInt()
val registries = ArrayList<TaggedRegistry>(registryCount)
repeat(registryCount) { registries.add(TaggedRegistry.decode(buffer)) }
@@ -7,13 +7,13 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data object ServerboundAcceptCodeOfConductPacket : MinecraftPacket,
PacketCodec<ServerboundAcceptCodeOfConductPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundAcceptCodeOfConductPacket) {}
override fun decode(buffer: BytesBuffer): ServerboundAcceptCodeOfConductPacket =
override suspend fun encode(buffer: BytesBuffer, value: ServerboundAcceptCodeOfConductPacket) {}
override suspend fun decode(buffer: BytesBuffer): ServerboundAcceptCodeOfConductPacket =
ServerboundAcceptCodeOfConductPacket
}
@@ -7,13 +7,13 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data object ServerboundAckFinishConfigurationPacket : MinecraftPacket,
PacketCodec<ServerboundAckFinishConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundAckFinishConfigurationPacket) {}
override fun decode(buffer: BytesBuffer): ServerboundAckFinishConfigurationPacket =
override suspend fun encode(buffer: BytesBuffer, value: ServerboundAckFinishConfigurationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ServerboundAckFinishConfigurationPacket =
throw UnsupportedOperationException()
}
@@ -7,16 +7,16 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.primitives.writeVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.writeIdentifier
public data class ServerboundCookieResponsePacket(val key: Identifier, val payload: ByteArray?) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundCookieResponsePacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundCookieResponsePacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundCookieResponsePacket) {
buffer.writeIdentifier(value.key)
if (value.payload != null) {
buffer.writeBoolean(true)
@@ -25,7 +25,7 @@ public data class ServerboundCookieResponsePacket(val key: Identifier, val paylo
} else buffer.writeBoolean(false)
}
override fun decode(buffer: BytesBuffer): ServerboundCookieResponsePacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundCookieResponsePacket =
throw UnsupportedOperationException()
}
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data class ServerboundKeepAliveConfigurationPacket(val id: Long) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundKeepAliveConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundKeepAliveConfigurationPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundKeepAliveConfigurationPacket) {
buffer.writeLong(value.id)
}
override fun decode(buffer: BytesBuffer): ServerboundKeepAliveConfigurationPacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundKeepAliveConfigurationPacket =
throw UnsupportedOperationException()
}
}
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data class ServerboundPongConfigurationPacket(val id: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundPongConfigurationPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundPongConfigurationPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundPongConfigurationPacket) {
buffer.writeInt(value.id)
}
override fun decode(buffer: BytesBuffer): ServerboundPongConfigurationPacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundPongConfigurationPacket =
throw UnsupportedOperationException()
}
}
@@ -7,20 +7,20 @@
package cn.rtast.libmc.protocol.packet.configuration.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.primitives.writeVarInt
import cn.rtast.libmc.protocol.packet.configuration.KnownPacks
public data class ServerboundSelectKnownPacksPacket(val knownPacks: List<KnownPacks>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundSelectKnownPacksPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundSelectKnownPacksPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundSelectKnownPacksPacket) {
buffer.writeVarInt(value.knownPacks.size)
value.knownPacks.forEach { KnownPacks.encode(buffer, it) }
}
override fun decode(buffer: BytesBuffer): ServerboundSelectKnownPacksPacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundSelectKnownPacksPacket =
throw UnsupportedOperationException()
}
}
@@ -7,11 +7,11 @@
package cn.rtast.libmc.protocol.packet.handshake
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writeMcString
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.primitives.writeMcString
import cn.rtast.libmc.common.primitives.writeVarInt
import cn.rtast.libmc.protocol.protocol.state.HandshakeIntent
public data class ServerboundHandshakePacket(
@@ -21,13 +21,13 @@ public data class ServerboundHandshakePacket(
val intent: HandshakeIntent,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundHandshakePacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundHandshakePacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundHandshakePacket) {
buffer.writeVarInt(value.protocolVersion)
buffer.writeMcString(value.serverAddress)
buffer.writeShort(value.serverPort.toShort())
buffer.writeVarInt(value.intent.intentID)
}
override fun decode(buffer: BytesBuffer): ServerboundHandshakePacket = throw UnsupportedOperationException()
override suspend fun decode(buffer: BytesBuffer): ServerboundHandshakePacket = throw UnsupportedOperationException()
}
}
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
@@ -17,10 +18,10 @@ public data class ClientboundCustomQueryPacket(
val messageId: Int,
val channel: Identifier,
val data: ByteArray,
) : ClientboundLoginPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCustomQueryPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCustomQueryPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCustomQueryPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCustomQueryPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCustomQueryPacket {
val messageId = buffer.readVarInt()
val channel = buffer.readIdentifier()
val data = buffer.readBytes(buffer.remaining.toInt())
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundDisconnectLoginPacket(val reason: NBTCompound) : ClientboundLoginPacket {
public data class ClientboundDisconnectLoginPacket(val reason: NBTCompound) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDisconnectLoginPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDisconnectLoginPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDisconnectLoginPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDisconnectLoginPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDisconnectLoginPacket {
return ClientboundDisconnectLoginPacket(reason = buffer.readNetworkNBTCompound())
}
}
@@ -7,10 +7,11 @@
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readMcString
import cn.rtast.libmc.common.readPrefixedByteArray
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readPrefixedByteArray
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Encryption_Request
@@ -24,10 +25,10 @@ public data class ClientboundHelloPacket(
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Encryption#Authentication
*/
val shouldAuthenticate: Boolean,
) : ClientboundLoginPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundHelloPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundHelloPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundHelloPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundHelloPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundHelloPacket {
val serverId = buffer.readMcString()
val publicKey = buffer.readPrefixedByteArray()
val verifyToken = buffer.readPrefixedByteArray()
@@ -1,12 +0,0 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/5
*/
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.packet.MinecraftPacket
public sealed interface ClientboundLoginPacket : MinecraftPacket
@@ -7,17 +7,18 @@
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readUuid
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readUuid
import cn.rtast.libmc.protocol.session.GameProfile
import kotlin.uuid.Uuid
public data class ClientboundLoginSuccessPacket(val gameProfile: GameProfile, val sessionId: Uuid) :
ClientboundLoginPacket {
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundLoginSuccessPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundLoginSuccessPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundLoginSuccessPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundLoginSuccessPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundLoginSuccessPacket {
val gameProfile = GameProfile.decode(buffer)
val sessionId = buffer.readUuid()
return ClientboundLoginSuccessPacket(gameProfile, sessionId)
@@ -7,18 +7,19 @@
package cn.rtast.libmc.protocol.packet.login.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.writeVarInt
public data class ClientboundSetCompressionPacket(val threshold: Int) : ClientboundLoginPacket {
public data class ClientboundSetCompressionPacket(val threshold: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundSetCompressionPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundSetCompressionPacket) {
buffer.writeVarInt(value.threshold)
override suspend fun encode(buffer: BytesBuffer, value: ClientboundSetCompressionPacket) {
buffer.writeVarInt(value = value.threshold)
}
override fun decode(buffer: BytesBuffer): ClientboundSetCompressionPacket {
override suspend fun decode(buffer: BytesBuffer): ClientboundSetCompressionPacket {
return ClientboundSetCompressionPacket(buffer.readVarInt())
}
}
@@ -7,20 +7,20 @@
package cn.rtast.libmc.protocol.packet.login.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writeOptionalPrefixedByteArray
import cn.rtast.libmc.common.writeVarInt
import cn.rtast.libmc.common.primitives.writeOptionalPrefixedByteArray
import cn.rtast.libmc.common.primitives.writeVarInt
public data class ServerboundCustomQueryAnswerPacket(val messageId: Int, val data: ByteArray?) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundCustomQueryAnswerPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundCustomQueryAnswerPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundCustomQueryAnswerPacket) {
buffer.writeVarInt(value.messageId)
buffer.writeOptionalPrefixedByteArray(value.data)
}
override fun decode(buffer: BytesBuffer): ServerboundCustomQueryAnswerPacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundCustomQueryAnswerPacket =
throw UnsupportedOperationException()
}
@@ -7,22 +7,22 @@
package cn.rtast.libmc.protocol.packet.login.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writePrefixedByteArray
import cn.rtast.libmc.common.primitives.writePrefixedByteArray
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Encryption
*/
public data class ServerboundKeyPacket(val sharedSecret: ByteArray, val verifyToken: ByteArray) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundKeyPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundKeyPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundKeyPacket) {
buffer.writePrefixedByteArray(value.sharedSecret)
buffer.writePrefixedByteArray(value.verifyToken)
}
override fun decode(buffer: BytesBuffer): ServerboundKeyPacket =
override suspend fun decode(buffer: BytesBuffer): ServerboundKeyPacket =
throw UnsupportedOperationException()
}
@@ -7,12 +7,13 @@
package cn.rtast.libmc.protocol.packet.login.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ServerboundLoginAcknowledgedPacket : MinecraftPacket,
PacketCodec<ServerboundLoginAcknowledgedPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundLoginAcknowledgedPacket) {}
override fun decode(buffer: BytesBuffer): ServerboundLoginAcknowledgedPacket = throw UnsupportedOperationException()
override suspend fun encode(buffer: BytesBuffer, value: ServerboundLoginAcknowledgedPacket) {}
override suspend fun decode(buffer: BytesBuffer): ServerboundLoginAcknowledgedPacket =
throw UnsupportedOperationException()
}
@@ -7,20 +7,21 @@
package cn.rtast.libmc.protocol.packet.login.serverbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.writeMcString
import cn.rtast.libmc.common.writeUuid
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.writeMcString
import cn.rtast.libmc.common.primitives.writeUuid
import kotlin.uuid.Uuid
public data class ServerboundLoginStartPacket(val username: String, val playerUuid: Uuid) : MinecraftPacket {
internal companion object Codec : PacketCodec<ServerboundLoginStartPacket> {
override fun encode(buffer: BytesBuffer, value: ServerboundLoginStartPacket) {
override suspend fun encode(buffer: BytesBuffer, value: ServerboundLoginStartPacket) {
buffer.writeMcString(value.username)
buffer.writeUuid(value.playerUuid)
}
override fun decode(buffer: BytesBuffer): ServerboundLoginStartPacket = throw UnsupportedOperationException()
override suspend fun decode(buffer: BytesBuffer): ServerboundLoginStartPacket =
throw UnsupportedOperationException()
}
}
@@ -7,17 +7,18 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Acknowledge_Block_Change
*/
public data class ClientboundAcknowledgeBlockChangePacket(val sequenceId: Int) : ClientboundPlayPacket {
public data class ClientboundAcknowledgeBlockChangePacket(val sequenceId: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundAcknowledgeBlockChangePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundAcknowledgeBlockChangePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundAcknowledgeBlockChangePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundAcknowledgeBlockChangePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundAcknowledgeBlockChangePacket {
return ClientboundAcknowledgeBlockChangePacket(buffer.readVarInt())
}
}
@@ -7,18 +7,19 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.StatisticsEntry
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Award_Statistics
*/
public data class ClientboundAwardStatisticsPacket(val stats: List<StatisticsEntry>) : ClientboundPlayPacket {
public data class ClientboundAwardStatisticsPacket(val stats: List<StatisticsEntry>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundAwardStatisticsPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundAwardStatisticsPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundAwardStatisticsPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundAwardStatisticsPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundAwardStatisticsPacket {
val count = buffer.readVarInt()
val stats = List(count) { StatisticsEntry.decode(buffer) }
return ClientboundAwardStatisticsPacket(stats)
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.block.BlockDestroyStage
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
@@ -21,10 +22,10 @@ public data class ClientboundBlockDestructionPacket(
val entityId: Int,
val location: BlockPos,
val stage: BlockDestroyStage,
) : ClientboundPlayPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundBlockDestructionPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundBlockDestructionPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundBlockDestructionPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundBlockDestructionPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundBlockDestructionPacket {
val entityId = buffer.readVarInt()
val location = buffer.readBlockPos()
val stage = buffer.readByte()
@@ -7,19 +7,20 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundBlockEntityDataPacket(val location: BlockPos, val type: Int, val data: NBTCompound) :
ClientboundPlayPacket {
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundBlockEntityDataPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundBlockEntityDataPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundBlockEntityDataPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundBlockEntityDataPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundBlockEntityDataPacket {
val location = buffer.readBlockPos()
val type = buffer.readVarInt()
val data = buffer.readNetworkNBTCompound()
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
@@ -29,10 +30,10 @@ public data class ClientboundBlockEventPacket(
* as it will infer the type of block based on the given position.
*/
val blockType: Int,
) : ClientboundPlayPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundBlockEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundBlockEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundBlockEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundBlockEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundBlockEventPacket {
val location = buffer.readBlockPos()
val actionId = buffer.readUByte()
val actionParameter = buffer.readUByte()
@@ -7,16 +7,17 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
public data class ClientboundBlockUpdatePacket(val location: BlockPos, val blockId: Int) : ClientboundPlayPacket {
public data class ClientboundBlockUpdatePacket(val location: BlockPos, val blockId: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundBlockUpdatePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundBlockUpdatePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundBlockUpdatePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundBlockUpdatePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundBlockUpdatePacket {
val position = buffer.readBlockPos()
val blockId = buffer.readVarInt()
return ClientboundBlockUpdatePacket(position, blockId)
@@ -7,10 +7,11 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readUuid
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readUuid
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.bossbar.BossBarAction
import cn.rtast.libmc.protocol.protocol.game.bossbar.BossBarColor
import cn.rtast.libmc.protocol.protocol.game.bossbar.BossBarDivision
@@ -18,10 +19,10 @@ import cn.rtast.libmc.protocol.protocol.game.bossbar.BossBarFlags
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
import kotlin.uuid.Uuid
public data class ClientboundBossEventPacket(val uuid: Uuid, val action: BossBarAction) : ClientboundPlayPacket {
public data class ClientboundBossEventPacket(val uuid: Uuid, val action: BossBarAction) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundBossEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundBossEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundBossEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundBossEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundBossEventPacket {
val uuid = buffer.readUuid()
val action = when (val actionId = buffer.readVarInt()) {
BossBarAction.ADD_ID -> {
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.protocol.registry.GameDifficulty
public data class ClientboundChangeDifficultyPacket(val difficulty: GameDifficulty, val locked: Boolean) :
ClientboundPlayPacket {
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundChangeDifficultyPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundChangeDifficultyPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundChangeDifficultyPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundChangeDifficultyPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundChangeDifficultyPacket {
val difficulty = GameDifficulty.fromID(buffer.readByte())
val locked = buffer.readBoolean()
return ClientboundChangeDifficultyPacket(difficulty, locked)
@@ -7,14 +7,15 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundChunkBatchFinishedPacket(val batchSize: Int) : ClientboundPlayPacket {
public data class ClientboundChunkBatchFinishedPacket(val batchSize: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundChunkBatchFinishedPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundChunkBatchFinishedPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundChunkBatchFinishedPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundChunkBatchFinishedPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundChunkBatchFinishedPacket {
return ClientboundChunkBatchFinishedPacket(buffer.readVarInt())
}
}
@@ -7,11 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundChunkBatchStartPacket : ClientboundPlayPacket,
public data object ClientboundChunkBatchStartPacket : MinecraftPacket,
PacketCodec<ClientboundChunkBatchStartPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundChunkBatchStartPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundChunkBatchStartPacket = ClientboundChunkBatchStartPacket
override suspend fun encode(buffer: BytesBuffer, value: ClientboundChunkBatchStartPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundChunkBatchStartPacket = ClientboundChunkBatchStartPacket
}
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.chunk.ChunkBiomeData
public data class ClientboundChunksBiomesPacket(val chunkBiomes: List<ChunkBiomeData>) : ClientboundPlayPacket {
public data class ClientboundChunksBiomesPacket(val chunkBiomes: List<ChunkBiomeData>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundChunksBiomesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundChunksBiomesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundChunksBiomesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundChunksBiomesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundChunksBiomesPacket {
val chunkCount = buffer.readVarInt()
val chunks = ArrayList<ChunkBiomeData>(chunkCount)
repeat(chunkCount) { chunks.add(ChunkBiomeData.decode(buffer)) }
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundClearTitlesPacket(val reset: Boolean) : ClientboundPlayPacket {
public data class ClientboundClearTitlesPacket(val reset: Boolean) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundClearTitlesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundClearTitlesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundClearTitlesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundClearTitlesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundClearTitlesPacket {
return ClientboundClearTitlesPacket(buffer.readBoolean())
}
}
@@ -7,7 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.writeMcString
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
import cn.rtast.libmc.protocol.protocol.util.writeNetworkNBTCompound
@@ -17,16 +22,16 @@ public data class ClientboundCommandSuggestionsPacket(
val start: Int,
val length: Int,
val matches: List<CommandSuggestionMatch>,
) : ClientboundPlayPacket {
) : MinecraftPacket {
public data class CommandSuggestionMatch(val match: String, val tooltip: NBTCompound?) {
internal companion object Codec : PacketCodec<CommandSuggestionMatch> {
override fun encode(buffer: BytesBuffer, value: CommandSuggestionMatch) {
override suspend fun encode(buffer: BytesBuffer, value: CommandSuggestionMatch) {
buffer.writeMcString(value.match)
buffer.writeBoolean(value.tooltip != null)
if (value.tooltip != null) buffer.writeNetworkNBTCompound(value.tooltip)
}
override fun decode(buffer: BytesBuffer): CommandSuggestionMatch {
override suspend fun decode(buffer: BytesBuffer): CommandSuggestionMatch {
val match = buffer.readMcString()
val hasTooltip = buffer.readBoolean()
val tooltip = if (hasTooltip) buffer.readNetworkNBTCompound() else null
@@ -36,8 +41,8 @@ public data class ClientboundCommandSuggestionsPacket(
}
internal companion object Codec : PacketCodec<ClientboundCommandSuggestionsPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCommandSuggestionsPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCommandSuggestionsPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCommandSuggestionsPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCommandSuggestionsPacket {
val id = buffer.readVarInt()
val start = buffer.readVarInt()
val length = buffer.readVarInt()
@@ -7,18 +7,19 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Close_Container
* This is the ID of the window that was closed. 0 for inventory.
*/
public data class ClientboundContainerClosePacket(val windowId: Int) : ClientboundPlayPacket {
public data class ClientboundContainerClosePacket(val windowId: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundContainerClosePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundContainerClosePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundContainerClosePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundContainerClosePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundContainerClosePacket {
return ClientboundContainerClosePacket(buffer.readVarInt())
}
}
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Set_Container_Property
@@ -18,10 +19,10 @@ public data class ClientboundContainerSetDataPacket(
val windowId: Int,
val property: Short,
val value: Short,
) : ClientboundPlayPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundContainerSetDataPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundContainerSetDataPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundContainerSetDataPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundContainerSetDataPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundContainerSetDataPacket {
val windowId = buffer.readVarInt()
val property = buffer.readShort()
val value = buffer.readShort()
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.readIdentifier
@@ -22,8 +22,8 @@ public data class ClientboundCooldownPacket(
val ticks: Int,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCooldownPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCooldownPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCooldownPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCooldownPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCooldownPacket {
val group = buffer.readIdentifier()
val ticks = buffer.readVarInt()
return ClientboundCooldownPacket(group, ticks)
@@ -7,18 +7,18 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readPrefixedStringArray
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readPrefixedStringArray
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.chat.ChatAction
public data class ClientboundCustomChatCompletionsPacket(val action: ChatAction, val entries: List<String>) :
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundCustomChatCompletionsPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundCustomChatCompletionsPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundCustomChatCompletionsPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundCustomChatCompletionsPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundCustomChatCompletionsPacket {
val action = ChatAction.fromID(buffer.readVarInt())
val entries = buffer.readPrefixedStringArray()
return ClientboundCustomChatCompletionsPacket(action, entries)
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.math.Vec3d
import cn.rtast.libmc.protocol.protocol.game.math.readVec3d
@@ -22,8 +22,8 @@ public data class ClientboundDamageEventPacket(
val position: Vec3d?,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDamageEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDamageEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDamageEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDamageEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDamageEventPacket {
val entityId = buffer.readVarInt()
val sourceTypeId = buffer.readVarInt()
val rawCauseId = buffer.readVarInt()
@@ -7,16 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readOptional
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readOptional
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundDeleteChatPacket(val messageId: Int, val signature: ByteArray?) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDeleteChatPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDeleteChatPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDeleteChatPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDeleteChatPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDeleteChatPacket {
val messageId = buffer.readVarInt()
val signature = buffer.readOptional { buffer.readBytes(256) }
return ClientboundDeleteChatPacket(messageId, signature)
@@ -7,12 +7,13 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundDelimiterPacket : ClientboundPlayPacket, PacketCodec<ClientboundDelimiterPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDelimiterPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDelimiterPacket {
public data object ClientboundDelimiterPacket : MinecraftPacket, PacketCodec<ClientboundDelimiterPacket> {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDelimiterPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDelimiterPacket {
return ClientboundDelimiterPacket
}
}
@@ -7,15 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundDisconnectPlayPacket(val reason: NBTCompound) : ClientboundPlayPacket {
public data class ClientboundDisconnectPlayPacket(val reason: NBTCompound) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDisconnectPlayPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDisconnectPlayPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDisconnectPlayPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDisconnectPlayPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDisconnectPlayPacket {
return ClientboundDisconnectPlayPacket(reason = buffer.readNetworkNBTCompound())
}
}
@@ -7,8 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.IdOrX
import cn.rtast.libmc.common.primitives.readIdOrX
import cn.rtast.libmc.common.primitives.readOptional
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.game.chat.InlineChatType
import cn.rtast.libmc.protocol.protocol.game.chat.readInlineChatType
@@ -21,8 +25,8 @@ public data class ClientboundDisguisedChatMessagePacket(
val targetName: NBTCompound?,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundDisguisedChatMessagePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundDisguisedChatMessagePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundDisguisedChatMessagePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundDisguisedChatMessagePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundDisguisedChatMessagePacket {
val message = buffer.readNetworkNBTCompound()
val chatType = buffer.readIdOrX { readInlineChatType() }
val senderName = buffer.readNetworkNBTCompound()
@@ -7,19 +7,20 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.Animations
/**
* ref: https://minecraft.wiki/w/Java_Edition_protocol/Packets#Entity_Animation
*/
public data class ClientboundEntityAnimationPacket(val entityId: Int, val animation: Animations) :
ClientboundPlayPacket {
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundEntityAnimationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundEntityAnimationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundEntityAnimationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundEntityAnimationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundEntityAnimationPacket {
val entityId = buffer.readVarInt()
val animation = Animations.fromID(buffer.readByte())
return ClientboundEntityAnimationPacket(entityId, animation)
@@ -7,11 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.effect.EntityEffectFlags
import cn.rtast.libmc.protocol.protocol.game.effect.readEntityEffectFlags
import cn.rtast.libmc.protocol.tick.ticks
import kotlin.time.Duration
@@ -25,13 +26,13 @@ public data class ClientboundEntityEffectPacket(
public val duration: Duration get() = if (durationTicks == -1) Duration.INFINITE else durationTicks.ticks
internal companion object Codec : PacketCodec<ClientboundEntityEffectPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundEntityEffectPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundEntityEffectPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundEntityEffectPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundEntityEffectPacket {
val entityId = buffer.readVarInt()
val effectId = buffer.readVarInt()
val amplifier = buffer.readVarInt()
val durationTicks = buffer.readVarInt()
val flags = EntityEffectFlags.fromByte(buffer.readByte())
val flags = buffer.readEntityEffectFlags()
return ClientboundEntityEffectPacket(entityId, effectId, amplifier, durationTicks, flags)
}
}
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data class ClientboundEntityEventPacket(
@@ -20,8 +20,8 @@ public data class ClientboundEntityEventPacket(
val status: Byte,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundEntityEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundEntityEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundEntityEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundEntityEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundEntityEventPacket {
val entityId = buffer.readInt()
val status = buffer.readByte()
return ClientboundEntityEventPacket(entityId, status)
@@ -7,8 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.IdOrX
import cn.rtast.libmc.common.primitives.readIdOrX
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.protocol.protocol.game.sound.SoundCategory
import cn.rtast.libmc.protocol.protocol.game.sound.SoundEvent
import cn.rtast.libmc.protocol.protocol.game.sound.readSoundEvent
@@ -22,8 +26,8 @@ public data class ClientboundEntitySoundEffectPacket(
val seed: Long,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundEntitySoundEffectPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundEntitySoundEffectPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundEntitySoundEffectPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundEntitySoundEffectPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundEntitySoundEffectPacket {
val soundEvent = buffer.readIdOrX { readSoundEvent() }
val category = SoundCategory.fromID(buffer.readVarInt())
val entityId = buffer.readVarInt()
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
/**
@@ -16,8 +16,8 @@ import cn.rtast.libmc.common.packet.MinecraftPacket
*/
public data class ClientboundGameEventPacket(val event: UByte, val value: Float) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundGameEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundGameEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundGameEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundGameEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundGameEventPacket {
val event = buffer.readUByte()
val value = buffer.readFloat()
return ClientboundGameEventPacket(event, value)
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.gamerule.GameRuleEntry
import cn.rtast.libmc.protocol.protocol.game.gamerule.readGameRule
public data class ClientboundGameRuleValuesPacket(val rules: List<GameRuleEntry>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundGameRuleValuesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundGameRuleValuesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundGameRuleValuesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundGameRuleValuesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundGameRuleValuesPacket {
val count = buffer.readVarInt()
val rules = ArrayList<GameRuleEntry>(count)
repeat(count) { rules.add(buffer.readGameRule()) }
@@ -7,15 +7,15 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundHurtAnimationPacket(val entityId: Int, val yaw: Float) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundHurtAnimationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundHurtAnimationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundHurtAnimationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundHurtAnimationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundHurtAnimationPacket {
val entityId = buffer.readVarInt()
val yaw = buffer.readFloat()
return ClientboundHurtAnimationPacket(entityId, yaw)
@@ -7,11 +7,11 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.readVarLong
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.common.primitives.readVarLong
public data class ClientboundInitializeWorldBorderPacket(
val centerX: Double,
@@ -24,8 +24,8 @@ public data class ClientboundInitializeWorldBorderPacket(
val warningTime: Int,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundInitializeWorldBorderPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundInitializeWorldBorderPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundInitializeWorldBorderPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundInitializeWorldBorderPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundInitializeWorldBorderPacket {
val centerX = buffer.readDouble()
val centerZ = buffer.readDouble()
val oldDiameter = buffer.readDouble()
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundKeepAlivePlayPacket(val id: Long) : ClientboundPlayPacket {
public data class ClientboundKeepAlivePlayPacket(val id: Long) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundKeepAlivePlayPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundKeepAlivePlayPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundKeepAlivePlayPacket =
override suspend fun encode(buffer: BytesBuffer, value: ClientboundKeepAlivePlayPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundKeepAlivePlayPacket =
ClientboundKeepAlivePlayPacket(buffer.readLong())
}
}
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
@@ -23,8 +23,8 @@ public data class ClientboundLevelEventPacket(
val disableRelativeVolume: Boolean,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundLevelEventPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundLevelEventPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundLevelEventPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundLevelEventPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundLevelEventPacket {
val eventId = buffer.readInt()
val location = buffer.readBlockPos()
val data = buffer.readInt()
@@ -7,14 +7,14 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
public data class ClientboundLinkEntitiesPacket(val attachedEntityId: Int, val holdingEntityId: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundLinkEntitiesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundLinkEntitiesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundLinkEntitiesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundLinkEntitiesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundLinkEntitiesPacket {
val attachedEntityId = buffer.readInt()
val holdingEntityId = buffer.readInt()
return ClientboundLinkEntitiesPacket(attachedEntityId, holdingEntityId)
@@ -7,9 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.GameMode
import cn.rtast.libmc.protocol.protocol.game.Identifier
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
@@ -40,10 +41,10 @@ public data class ClientboundLoginPlayPacket(
val seaLevel: Int,
val isOnlineMode: Boolean,
val enforceSecureChat: Boolean,
) : ClientboundPlayPacket {
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundLoginPlayPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundLoginPlayPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundLoginPlayPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundLoginPlayPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundLoginPlayPacket {
val entityId = buffer.readInt()
val isHardcore = buffer.readBoolean()
val dimensionNamesCount = buffer.readVarInt()
@@ -7,13 +7,13 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundLowDiskSpaceWarningPacket : MinecraftPacket,
PacketCodec<ClientboundLowDiskSpaceWarningPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundLowDiskSpaceWarningPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundLowDiskSpaceWarningPacket =
override suspend fun encode(buffer: BytesBuffer, value: ClientboundLowDiskSpaceWarningPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundLowDiskSpaceWarningPacket =
ClientboundLowDiskSpaceWarningPacket
}
@@ -7,18 +7,18 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.entity.MinecartStep
import cn.rtast.libmc.protocol.protocol.game.entity.readMinecartStep
public data class ClientboundMoveMinecartAlongTrackPacket(val entityId: Int, val steps: List<MinecartStep>) :
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundMoveMinecartAlongTrackPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundMoveMinecartAlongTrackPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundMoveMinecartAlongTrackPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundMoveMinecartAlongTrackPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundMoveMinecartAlongTrackPacket {
val entityId = buffer.readVarInt()
val stepCount = buffer.readVarInt()
val steps = ArrayList<MinecartStep>()
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.protocol.protocol.game.math.Vec3d
import cn.rtast.libmc.protocol.protocol.game.math.readVec3d
@@ -16,8 +16,8 @@ import cn.rtast.libmc.protocol.protocol.game.math.readVec3d
public data class ClientboundMoveVehiclePacket(val position: Vec3d, val yaw: Float, val pitch: Float) :
MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundMoveVehiclePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundMoveVehiclePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundMoveVehiclePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundMoveVehiclePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundMoveVehiclePacket {
val position = buffer.readVec3d()!!
val yaw = buffer.readFloat()
val pitch = buffer.readFloat()
@@ -7,16 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.player.Hand
public data class ClientboundOpenBookPacket(val hand: Hand) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundOpenBookPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundOpenBookPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundOpenBookPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundOpenBookPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundOpenBookPacket {
return ClientboundOpenBookPacket(Hand.fromID(buffer.readVarInt()))
}
}
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundOpenHorseScreenPacket(
val windowId: Int,
@@ -18,8 +18,8 @@ public data class ClientboundOpenHorseScreenPacket(
val entityId: Int,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundOpenHorseScreenPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundOpenHorseScreenPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundOpenHorseScreenPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundOpenHorseScreenPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundOpenHorseScreenPacket {
val windowId = buffer.readVarInt()
val columnsCount = buffer.readVarInt()
val entityId = buffer.readInt()
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
@@ -20,8 +20,8 @@ public data class ClientboundOpenScreenPacket(
val title: NBTCompound,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundOpenScreenPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundOpenScreenPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundOpenScreenPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundOpenScreenPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundOpenScreenPacket {
val windowId = buffer.readVarInt()
val windowType = buffer.readVarInt()
val title = buffer.readNetworkNBTCompound()
@@ -7,16 +7,16 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.protocol.protocol.game.block.BlockPos
import cn.rtast.libmc.protocol.protocol.game.block.readBlockPos
public data class ClientboundOpenSignEditorPacket(val location: BlockPos, val isFrontText: Boolean) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundOpenSignEditorPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundOpenSignEditorPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundOpenSignEditorPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundOpenSignEditorPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundOpenSignEditorPacket {
val location = buffer.readBlockPos()
val isFrontText = buffer.readBoolean()
return ClientboundOpenSignEditorPacket(location, isFrontText)
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundPickupItemPacket(
val collectedEntityId: Int,
@@ -21,8 +21,8 @@ public data class ClientboundPickupItemPacket(
val itemCount: Int,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPickupItemPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPickupItemPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPickupItemPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPickupItemPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPickupItemPacket {
val collectedEntityId = buffer.readVarInt()
val collectorEntityId = buffer.readVarInt()
val itemCount = buffer.readVarInt()
@@ -7,13 +7,14 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundPingPacket(val id: Int) : ClientboundPlayPacket {
public data class ClientboundPingPacket(val id: Int) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPingPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPingPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPingPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPingPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPingPacket {
return ClientboundPingPacket(id = buffer.readInt())
}
}
@@ -1,15 +0,0 @@
/*
* Copyright © 2026 RTAkland
* Author: RTAkland
* Date: 2026/9/5
*/
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.packet.MinecraftPacket
/**
* mark a packet that is used when join to the server
*/
public sealed interface ClientboundPlayPacket : MinecraftPacket
@@ -7,8 +7,8 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.protocol.protocol.game.player.PlayerAbilities
@@ -18,8 +18,8 @@ public data class ClientboundPlayerAbilitiesPacket(
val fovModifier: Float,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPlayerAbilitiesPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerAbilitiesPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerAbilitiesPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerAbilitiesPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerAbilitiesPacket {
val flag = PlayerAbilities.fromByte(buffer.readByte())
val flyingSpeed = buffer.readFloat()
val fovModifier = buffer.readFloat()
@@ -7,7 +7,12 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.*
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readMcString
import cn.rtast.libmc.common.primitives.readUuid
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
import kotlin.uuid.Uuid
@@ -30,7 +35,7 @@ public data class ClientboundPlayerChatMessagePacket(
val chatType: Int,
val senderName: NBTCompound,
val targetName: NBTCompound?,
) : ClientboundPlayPacket {
) : MinecraftPacket {
public enum class ChatFilterType(public val id: Int) {
PASS_THROUGH(0),
FULLY_FILTERED(1),
@@ -44,8 +49,8 @@ public data class ClientboundPlayerChatMessagePacket(
public data class PreviousMessageEntry(val messageId: Int, val signature: ByteArray?) {
internal companion object Codec : PacketCodec<PreviousMessageEntry> {
override fun encode(buffer: BytesBuffer, value: PreviousMessageEntry) {}
override fun decode(buffer: BytesBuffer): PreviousMessageEntry {
override suspend fun encode(buffer: BytesBuffer, value: PreviousMessageEntry) {}
override suspend fun decode(buffer: BytesBuffer): PreviousMessageEntry {
val messageId = buffer.readVarInt()
val signature = if (messageId == 0) buffer.readBytes(256) else null
return PreviousMessageEntry(messageId, signature)
@@ -69,8 +74,8 @@ public data class ClientboundPlayerChatMessagePacket(
}
internal companion object Codec : PacketCodec<ClientboundPlayerChatMessagePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerChatMessagePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerChatMessagePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerChatMessagePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerChatMessagePacket {
val globalIndex = buffer.readVarInt()
val sender = buffer.readUuid()
val index = buffer.readVarInt()
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.nbt.NBTCompound
import cn.rtast.libmc.protocol.protocol.util.readNetworkNBTCompound
public data class ClientboundPlayerCombatDeathPacket(val playerId: Int, val message: NBTCompound) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPlayerCombatDeathPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerCombatDeathPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerCombatDeathPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerCombatDeathPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerCombatDeathPacket {
val playerId = buffer.readVarInt()
val message = buffer.readNetworkNBTCompound()
return ClientboundPlayerCombatDeathPacket(playerId, message)
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.tick.ticks
import kotlin.time.Duration
public data class ClientboundPlayerEndCombatPacket(val duration: Duration) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPlayerEndCombatPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerEndCombatPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerEndCombatPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerEndCombatPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerEndCombatPacket {
return ClientboundPlayerEndCombatPacket(buffer.readVarInt().ticks) // convert int to minecraft ticks
}
}
@@ -7,12 +7,13 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data object ClientboundPlayerEnterCombatPacket : MinecraftPacket,
PacketCodec<ClientboundPlayerEnterCombatPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerEnterCombatPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerEnterCombatPacket = ClientboundPlayerEnterCombatPacket
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerEnterCombatPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerEnterCombatPacket =
ClientboundPlayerEnterCombatPacket
}
@@ -7,17 +7,17 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readPrefixed
import cn.rtast.libmc.common.readUuid
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.primitives.readPrefixed
import cn.rtast.libmc.common.primitives.readUuid
import kotlin.uuid.Uuid
public data class ClientboundPlayerInfoRemovePacket(val uuids: List<Uuid>) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPlayerInfoRemovePacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerInfoRemovePacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerInfoRemovePacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerInfoRemovePacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerInfoRemovePacket {
return ClientboundPlayerInfoRemovePacket(buffer.readPrefixed { readUuid() })
}
}
@@ -7,10 +7,10 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
import cn.rtast.libmc.protocol.protocol.game.math.Vec3d
import cn.rtast.libmc.protocol.protocol.game.math.readVec3d
import cn.rtast.libmc.protocol.protocol.game.player.AnchorPoint
@@ -26,8 +26,8 @@ public data class ClientboundPlayerLookAtPacket(
)
internal companion object Codec : PacketCodec<ClientboundPlayerLookAtPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerLookAtPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerLookAtPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerLookAtPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerLookAtPacket {
val fromAnchor = AnchorPoint.fromID(buffer.readVarInt())
val targetPosition = buffer.readVec3d()!!
val isEntity = buffer.readBoolean()
@@ -7,9 +7,9 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.packet.PacketCodec
public data class ClientboundPlayerRotationPacket(
val yaw: Float,
@@ -18,8 +18,8 @@ public data class ClientboundPlayerRotationPacket(
val relativePitch: Boolean,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundPlayerRotationPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundPlayerRotationPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundPlayerRotationPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundPlayerRotationPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundPlayerRotationPacket {
val yaw = buffer.readFloat()
val relativeYaw = buffer.readBoolean()
val pitch = buffer.readFloat()
@@ -7,15 +7,15 @@
package cn.rtast.libmc.protocol.packet.play.clientbound
import cn.rtast.libmc.common.BytesBuffer
import cn.rtast.libmc.common.PacketCodec
import cn.rtast.libmc.common.stream.BytesBuffer
import cn.rtast.libmc.common.packet.PacketCodec
import cn.rtast.libmc.common.packet.MinecraftPacket
import cn.rtast.libmc.common.readVarInt
import cn.rtast.libmc.common.primitives.readVarInt
public data class ClientboundProjectilePowerPacket(val entityId: Int, val power: Double) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundProjectilePowerPacket> {
override fun encode(buffer: BytesBuffer, value: ClientboundProjectilePowerPacket) {}
override fun decode(buffer: BytesBuffer): ClientboundProjectilePowerPacket {
override suspend fun encode(buffer: BytesBuffer, value: ClientboundProjectilePowerPacket) {}
override suspend fun decode(buffer: BytesBuffer): ClientboundProjectilePowerPacket {
val entityId = buffer.readVarInt()
val power = buffer.readDouble()
return ClientboundProjectilePowerPacket(entityId, power)
Loaded 100 of 296 files, more files were not shown because too many files have changed in this diff. Show more