void CheckSameFPs(fp user)
        {
            List <fp> list = this.fplist.FindAll(x => x.hash == user.hash);

            if (list.Count > this.fp_limit)
            {
                list[list.Count - 1].client.Disconnect();
                this.fplist.Remove(list[list.Count - 1]);
                CheckSameFPs(user);
            }
        }
        public override bool OnPacketReceived(Packet packet, IClient client)
        {
            if (packet.Opcode == 0x133D && !fp_enabled)
            {
                packet.Replace(new Packet(0x2002));
                return(true);
            }

            if (packet.Opcode == 0x133D)
            {
                if (!fp_enabled)
                {
                    return(false);
                }

                try {
                    ushort version = packet.ReadUInt16();
                    packet.ReadAscii();

                    int    size           = packet.ReadUInt16();
                    byte[] bytes          = packet.ReadBytes(size);
                    byte[] decryptedbytes = AES.Decrypt(bytes);

                    PacketReader reader = new PacketReader(decryptedbytes);

                    string fp       = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadUInt16()));
                    bool   isVMWare = reader.ReadByte() == 1;
                    bool   isVPC    = reader.ReadByte() == 1;
                    string key      = Encoding.UTF8.GetString(reader.ReadBytes(reader.ReadUInt16()));

                    fp user = new fp()
                    {
                        client      = client,
                        hash        = fp,
                        isvmware    = isVMWare,
                        isvpc       = isVPC,
                        providerkey = key
                    };

                    fp find = this.fplist.Find(x => x.client == client);

                    if (user.isvmware && !fp_allow_vmware)
                    {
                        client.Disconnect();
                        GetLogger().Trace("The user will be disconnected due use VMWare.");
                        return(false);
                    }

                    if (user.isvpc && !fp_allow_vpc)
                    {
                        client.Disconnect();
                        GetLogger().Trace("The user will be disconnected due use VPC.");
                        return(false);
                    }

                    if (key != provider_key)
                    {
                        client.Disconnect();
                        GetLogger().Trace("The user will be disconnected due wrong provider key.");
                        return(false);
                    }



                    if (find == null)
                    {
                        this.fplist.Add(user);
                        CheckSameFPs(user);
                    }
                    else
                    {
                        this.fplist.Remove(find);
                        this.fplist.Add(user);
                        CheckSameFPs(user);
                    }

                    GetLogger().Trace("FP:" + user.hash);
                }
                catch (Exception e)
                {
                    GetLogger().Warn(e);
                    GetLogger().Trace("Something went wrong. The User IP = {0}, Packet Hex Bytes = {1}", client.IPAddress, ByteArrayExtension.HexDump(packet.GetBytes()));
                }

                packet.Replace(new Packet(0x2002));
                return(true);
            }

            if (packet.Opcode == 0xA102)
            {
                if (ip_enabled)
                {
                    List <IClient> ips = GetSameIPs(client);

                    if (ips.Count > ip_limit)
                    {
                        Packet resp = new Packet(packet.Opcode, packet.Encrypted, packet.Massive);
                        resp.WriteUInt8(0x02);
                        resp.WriteUInt8(0xF);
                        resp.Lock();
                        packet.Replace(resp);
                    }
                }


                if (fp_enabled)
                {
                    List <fp> fps = GetSameFps(client);

                    if (fps.Count > fp_limit || fps.Count == 0)
                    {
                        Packet resp = new Packet(packet.Opcode, packet.Encrypted, packet.Massive);
                        resp.WriteUInt8(0x02);
                        resp.WriteUInt8(0xF);
                        resp.Lock();
                        packet.Replace(resp);
                    }
                }
            }

            return(true);
        }
        List <fp> GetSameFps(IClient client)
        {
            fp find = this.fplist.Find(x => x.client == client);

            return(this.fplist.FindAll(x => x.hash == find.hash));
        }