Implemented 0x24-ClientboundExplodePacket
This commit is contained in:
5 files changed
+79
-3
No files matched your search
+57
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+16
@@ -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,
|
||||||
|
)
|
||||||
+2
@@ -45,6 +45,8 @@ public sealed interface ParticleData {
|
|||||||
public data class Item(val itemStack: ItemStack) : 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 {
|
internal fun BytesBuffer.readParticleData(type: ParticleType): ParticleData {
|
||||||
return when (type) {
|
return when (type) {
|
||||||
ParticleType.ANGRY_VILLAGER,
|
ParticleType.ANGRY_VILLAGER,
|
||||||
|
|||||||
+1
-1
@@ -96,7 +96,7 @@ internal object GamePacketsProtocolRegistry {
|
|||||||
register(0x21, ClientboundDisguisedChatMessagePacket)
|
register(0x21, ClientboundDisguisedChatMessagePacket)
|
||||||
register(0x22, ClientboundEntityEventPacket)
|
register(0x22, ClientboundEntityEventPacket)
|
||||||
register(0x23, ClientboundTeleportEntityPacket)
|
register(0x23, ClientboundTeleportEntityPacket)
|
||||||
// register(0x24, ClientboundExplodePacket)
|
register(0x24, ClientboundExplodePacket)
|
||||||
register(0x25, ClientboundUnloadChunkPacket)
|
register(0x25, ClientboundUnloadChunkPacket)
|
||||||
register(0x26, ClientboundGameEventPacket)
|
register(0x26, ClientboundGameEventPacket)
|
||||||
register(0x27, ClientboundGameRuleValuesPacket)
|
register(0x27, ClientboundGameRuleValuesPacket)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ package client
|
|||||||
import cn.rtast.libmc.crypto.AuthenticationProvider
|
import cn.rtast.libmc.crypto.AuthenticationProvider
|
||||||
import cn.rtast.libmc.protocol.client.createMinecraftClient
|
import cn.rtast.libmc.protocol.client.createMinecraftClient
|
||||||
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundContainerSetSlotPacket
|
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.ClientboundLevelParticlePacket
|
||||||
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundLightUpdatePacket
|
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundLightUpdatePacket
|
||||||
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundPlayerChatMessagePacket
|
import cn.rtast.libmc.protocol.packet.play.clientbound.ClientboundPlayerChatMessagePacket
|
||||||
@@ -102,8 +103,8 @@ class TestClient {
|
|||||||
println(it)
|
println(it)
|
||||||
}
|
}
|
||||||
cli.onPacket<ClientboundPlayerChatMessagePacket> { chatTracker.onReceivePlayerChat(it.messageSignature) }
|
cli.onPacket<ClientboundPlayerChatMessagePacket> { chatTracker.onReceivePlayerChat(it.messageSignature) }
|
||||||
cli.onPacket<ClientboundLightUpdatePacket> { println(it) }
|
cli.onPacket<ClientboundExplodePacket> { println(it) }
|
||||||
cli.on { packet, direction -> println("$direction -> $packet") }
|
// cli.on { packet, direction -> println("$direction -> $packet") }
|
||||||
cli.connect()
|
cli.connect()
|
||||||
|
|
||||||
// awaitCancellation()
|
// awaitCancellation()
|
||||||
|
|||||||
Reference in New Issue
Block a user