40 lines
1.5 KiB
Kotlin
40 lines
1.5 KiB
Kotlin
package space.blokk.net
|
|
|
|
import io.netty.buffer.ByteBuf
|
|
import io.netty.channel.ChannelHandlerContext
|
|
import io.netty.handler.codec.MessageToMessageCodec
|
|
import space.blokk.net.MinecraftProtocolDataTypes.readVarInt
|
|
import space.blokk.net.MinecraftProtocolDataTypes.writeVarInt
|
|
import java.io.IOException
|
|
|
|
class PacketMessageCodec(private val session: BlokkSession) : MessageToMessageCodec<ByteBuf, PacketMessage<*>>() {
|
|
override fun channelActive(ctx: ChannelHandlerContext) {
|
|
session.onConnect()
|
|
}
|
|
|
|
override fun channelInactive(ctx: ChannelHandlerContext) {
|
|
session.onDisconnect()
|
|
}
|
|
|
|
override fun encode(ctx: ChannelHandlerContext, msg: PacketMessage<*>, out: MutableList<Any>) {
|
|
if (msg !is OutgoingPacketMessage<*>) throw UnsupportedOperationException("Only outgoing packets can get encoded")
|
|
|
|
val dst = ctx.alloc().buffer()
|
|
dst.writeVarInt(msg.packetCodec.id)
|
|
msg.encodePacket(dst)
|
|
out.add(dst)
|
|
}
|
|
|
|
override fun decode(ctx: ChannelHandlerContext, msg: ByteBuf, out: MutableList<Any>) {
|
|
val packetID = msg.readVarInt()
|
|
|
|
val codec = session.currentProtocol!!.incomingPacketCodecsByID[packetID]
|
|
?: throw IOException("Client sent an unknown packet (ID: $packetID)")
|
|
|
|
out.add(IncomingPacketMessage(session, codec.decode(msg)))
|
|
}
|
|
|
|
override fun exceptionCaught(ctx: ChannelHandlerContext, cause: Throwable) {
|
|
session.failBecauseOfClient("${cause::class.java.name}: ${cause.message}")
|
|
}
|
|
}
|