Implemented 0x24-ClientboundExplodePacket

This commit is contained in:
2026-09-11 12:21:55 +08:00
parent faff00cfc1
commit 787ff091ad
5 files changed
+79 -3

No files matched your search

@@ -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<SoundEvent>,
val blockParticleAlternative: List<BlockParticleAlternative>,
) : MinecraftPacket {
internal companion object Codec : PacketCodec<ClientboundExplodePacket> {
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
)
}
}
}
@@ -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,
)
@@ -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,
@@ -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)
@@ -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<ClientboundPlayerChatMessagePacket> { chatTracker.onReceivePlayerChat(it.messageSignature) }
cli.onPacket<ClientboundLightUpdatePacket> { println(it) }
cli.on { packet, direction -> println("$direction -> $packet") }
cli.onPacket<ClientboundExplodePacket> { println(it) }
// cli.on { packet, direction -> println("$direction -> $packet") }
cli.connect()
// awaitCancellation()