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>() { override fun channelActive(ctx: ChannelHandlerContext) { session.onConnect() } override fun channelInactive(ctx: ChannelHandlerContext) { session.onDisconnect() } override fun encode(ctx: ChannelHandlerContext, msg: PacketMessage<*>, out: MutableList) { 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) { 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}") } }