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
|
||||
}
|
||||
|
||||
internal fun BytesBuffer.readParticleData(id: Int): ParticleData = readParticleData(ParticleType.fromID(id))
|
||||
|
||||
internal fun BytesBuffer.readParticleData(type: ParticleType): ParticleData {
|
||||
return when (type) {
|
||||
ParticleType.ANGRY_VILLAGER,
|
||||
|
||||
+1
-1
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user