public void ProcessPacket(ClientConnection client, BasePacket packet)
        {
            if ((packet.header.packetSize == 0x288) && (packet.data[0x34] == 'T'))              //Test Ticket Data
            {
                packet.DebugPrintPacket();
                //Crypto handshake
                ProcessStartSession(client, packet);
                return;
            }

            BasePacket.DecryptPacket(client.blowfish, ref packet);

            packet.DebugPrintPacket();

            List <SubPacket> subPackets = packet.GetSubpackets();

            foreach (SubPacket subpacket in subPackets)
            {
                subpacket.DebugPrintSubPacket();

                if (subpacket.header.type == 3)
                {
                    switch (subpacket.gameMessage.opcode)
                    {
                    case 0x03:
                        ProcessGetCharacters(client, subpacket);
                        break;

                    case 0x04:
                        ProcessSelectCharacter(client, subpacket);
                        break;

                    case 0x05:
                        ProcessSessionAcknowledgement(client, subpacket);
                        break;

                    case 0x0B:
                        ProcessModifyCharacter(client, subpacket);
                        break;

                    case 0x0F:
                    //Mod Retainers
                    default:
                        Program.Log.Debug("Unknown command 0x{0:X} received.", subpacket.gameMessage.opcode);
                        break;
                    }
                }
            }
        }