From 787ff091ad9ffe448870a060a35661fcedc17a1f Mon Sep 17 00:00:00 2001 From: RTAkland Date: Fri, 11 Sep 2026 12:21:55 +0800 Subject: [PATCH] Implemented 0x24-ClientboundExplodePacket --- .../clientbound/ClientboundExplodePacket.kt | 57 +++++++++++++++++++ .../game/particle/BlockParticleAlternative.kt | 16 ++++++ .../protocol/game/particle/ParticleData.kt | 2 + .../registry/GamePacketsProtocolRegistry.kt | 2 +- .../commonTest/kotlin/client/TestClient.kt | 5 +- 5 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/packet/play/clientbound/ClientboundExplodePacket.kt create mode 100644 libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/BlockParticleAlternative.kt diff --git a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/packet/play/clientbound/ClientboundExplodePacket.kt b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/packet/play/clientbound/ClientboundExplodePacket.kt new file mode 100644 index 0000000..ba83f5c --- /dev/null +++ b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/packet/play/clientbound/ClientboundExplodePacket.kt @@ -0,0 +1,57 @@ +/* + * Copyright © 2026 RTAkland + * Author: RTAkland + * Date: 2026/9/11 + */ + + +package cn.rtast.libmc.protocol.packet.play.clientbound + +import cn.rtast.libmc.network.BytesBuffer +import cn.rtast.libmc.packet.MinecraftPacket +import cn.rtast.libmc.packet.PacketCodec +import cn.rtast.libmc.primitives.* +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.particle.BlockParticleAlternative +import cn.rtast.libmc.protocol.protocol.game.particle.ParticleData +import cn.rtast.libmc.protocol.protocol.game.particle.readParticleData +import cn.rtast.libmc.protocol.protocol.game.sound.SoundEvent +import cn.rtast.libmc.protocol.protocol.game.sound.readSoundEvent + +public data class ClientboundExplodePacket( + val position: Vec3d, + val radius: Float, + val blockCount: Int, + val playerDeltaVelocity: Vec3d?, + val explosionParticleId: Int, + val explosionParticleData: ParticleData, + val explosionSound: IdOrX, + val blockParticleAlternative: List, +) : MinecraftPacket { + internal companion object Codec : PacketCodec { + override fun encode(buffer: BytesBuffer, value: ClientboundExplodePacket) {} + override fun decode(buffer: BytesBuffer): ClientboundExplodePacket { + val position = buffer.readVec3d() + val radius = buffer.readFloat() + val blockCount = buffer.readInt() + val playerDeltaVelocity = buffer.readPrefixOptional { readVec3d() } + val explosionParticleId = buffer.readVarInt() + val explosionParticleData = buffer.readParticleData(explosionParticleId) + val explosionSound = buffer.readIdOrX { readSoundEvent() } + val blockParticleAlternative = buffer.readPrefixed { + val altParticleId = buffer.readVarInt() + val particleData = buffer.readParticleData(altParticleId) + val scaling = buffer.readFloat() + val speed = buffer.readFloat() + val weight = buffer.readVarInt() + BlockParticleAlternative(altParticleId, particleData, scaling, speed, weight) + } + return ClientboundExplodePacket( + position, radius, blockCount, playerDeltaVelocity, + explosionParticleId, explosionParticleData, + explosionSound, blockParticleAlternative + ) + } + } +} \ No newline at end of file diff --git a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/BlockParticleAlternative.kt b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/BlockParticleAlternative.kt new file mode 100644 index 0000000..c96cc90 --- /dev/null +++ b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/BlockParticleAlternative.kt @@ -0,0 +1,16 @@ +/* + * Copyright © 2026 RTAkland + * Author: RTAkland + * Date: 2026/9/11 + */ + + +package cn.rtast.libmc.protocol.protocol.game.particle + +public data class BlockParticleAlternative( + val particleId: Int, + val particleData: ParticleData, + val scaling: Float, + val speed: Float, + val weight: Int, +) \ No newline at end of file diff --git a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/ParticleData.kt b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/ParticleData.kt index d82656a..5be7154 100644 --- a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/ParticleData.kt +++ b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/protocol/game/particle/ParticleData.kt @@ -45,6 +45,8 @@ public sealed interface ParticleData { public data class Item(val itemStack: ItemStack) : ParticleData } +internal fun BytesBuffer.readParticleData(id: Int): ParticleData = readParticleData(ParticleType.fromID(id)) + internal fun BytesBuffer.readParticleData(type: ParticleType): ParticleData { return when (type) { ParticleType.ANGRY_VILLAGER, diff --git a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/registry/GamePacketsProtocolRegistry.kt b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/registry/GamePacketsProtocolRegistry.kt index 3e59d5c..006b52c 100644 --- a/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/registry/GamePacketsProtocolRegistry.kt +++ b/libmc-protocol/src/commonMain/kotlin/cn/rtast/libmc/protocol/registry/GamePacketsProtocolRegistry.kt @@ -96,7 +96,7 @@ internal object GamePacketsProtocolRegistry { register(0x21, ClientboundDisguisedChatMessagePacket) register(0x22, ClientboundEntityEventPacket) register(0x23, ClientboundTeleportEntityPacket) -// register(0x24, ClientboundExplodePacket) + register(0x24, ClientboundExplodePacket) register(0x25, ClientboundUnloadChunkPacket) register(0x26, ClientboundGameEventPacket) register(0x27, ClientboundGameRuleValuesPacket) diff --git a/libmc-protocol/src/commonTest/kotlin/client/TestClient.kt b/libmc-protocol/src/commonTest/kotlin/client/TestClient.kt index 11deb9f..40ebbde 100644 --- a/libmc-protocol/src/commonTest/kotlin/client/TestClient.kt +++ b/libmc-protocol/src/commonTest/kotlin/client/TestClient.kt @@ -10,6 +10,7 @@ package client import cn.rtast.libmc.crypto.AuthenticationProvider import cn.rtast.libmc.protocol.client.createMinecraftClient import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundContainerSetSlotPacket +import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundExplodePacket import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundLevelParticlePacket import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundLightUpdatePacket import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundPlayerChatMessagePacket @@ -102,8 +103,8 @@ class TestClient { println(it) } cli.onPacket { chatTracker.onReceivePlayerChat(it.messageSignature) } - cli.onPacket { println(it) } - cli.on { packet, direction -> println("$direction -> $packet") } + cli.onPacket { println(it) } +// cli.on { packet, direction -> println("$direction -> $packet") } cli.connect() // awaitCancellation()