private void FlushPacket(ServerGamePacket packet)
        {
            using (var stream = new MemoryStream())
                using (var writer = new GamePacketWriter(stream))
                {
                    writer.Write(packet.Size);
                    writer.Write(packet.Opcode, 16);
                    writer.WriteBytes(packet.Data);

                    SendRaw(stream.ToArray());
                }
        }
        /// <summary>
        /// Enqueue <see cref="IWritable"/> to be sent to the client.
        /// </summary>
        public void EnqueueMessage(IWritable message)
        {
            if (!MessageManager.GetOpcode(message, out GameMessageOpcode opcode))
            {
                log.Warn("Failed to send message with no attribute!");
                return;
            }

            if (opcode != GameMessageOpcode.ServerAuthEncrypted &&
                opcode != GameMessageOpcode.ServerRealmEncrypted)
            {
                log.Trace($"Sent packet {opcode}(0x{opcode:X}).");
            }

            var packet = new ServerGamePacket(opcode, message);

            outgoingPackets.Enqueue(packet);
        }