private static void AddIps(UdpItem item, UdpListener udp, ulong time)
        {
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            ushort          port   = packet;
            UdpNode         node   = UdpNodeManager.Find(x => x.IP.Equals(((IPEndPoint)item.EndPoint).Address));

            if (node != null)
            {
                node.Port = port;
            }
            else
            {
                UdpNodeManager.Add(item.EndPoint);
            }

            while (packet.Remaining > 5)
            {
                UdpNode n = new UdpNode();
                n.IP   = packet;
                n.Port = packet;
                UdpNodeManager.Add(n);
            }

            udp.SendDatagram(new UdpItem
            {
                Data     = UdpOutbound.AckIps(((IPEndPoint)item.EndPoint).Address, time),
                EndPoint = item.EndPoint,
                Msg      = UdpMsg.OP_SERVERLIST_ACKIPS
            });
        }
        public UdpChannelItem(EndPoint addr, byte[] packet)
        {
            UdpPacketReader reader = new UdpPacketReader(packet.Skip(1).ToArray());

            this.IP       = ((IPEndPoint)addr).Address;
            this.Port     = reader;
            this.Users    = reader;
            this.Name     = reader;
            this.Topic    = reader;
            this.Language = reader;
            this.Version  = reader;
            byte count = reader;

            if (count > 0)
            {
                List <IPEndPoint> servers = new List <IPEndPoint>();

                for (int i = 0; i < count; i++)
                {
                    IPAddress ip   = reader;
                    ushort    port = reader;
                    servers.Add(new IPEndPoint(ip, port));
                }

                this.Servers = servers.ToArray();
            }
            else
            {
                this.Servers = new IPEndPoint[] { }
            };
        }
    }
        private static void WantCheckFirewall(UdpItem item, UdpListener udp, ulong time)
        {
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            ushort          port   = packet;
            FirewallTest    fw     = udp.TestRemoteFirewall;

            if (fw != null)
            {
                fw.Cookie   = AccountManager.NextCookie;
                fw.EndPoint = item.EndPoint;
                fw.Time     = time;

                udp.SendDatagram(new UdpItem
                {
                    Data     = UdpOutbound.ReadyCheckFirewall(fw),
                    EndPoint = item.EndPoint,
                    Msg      = UdpMsg.OP_SERVERLIST_READYTOCHECKFIREWALL
                });
            }
            else
            {
                udp.SendDatagram(new UdpItem
                {
                    Data     = UdpOutbound.CheckFirewallBusy(((IPEndPoint)item.EndPoint).Address, time),
                    EndPoint = item.EndPoint,
                    Msg      = UdpMsg.OP_SERVERLIST_CHECKFIREWALLBUSY
                });
            }
        }
        private static void ProceedCheckFirewall(UdpItem item, UdpListener udp, ulong time)
        {
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            ushort          port   = packet;
            uint            cookie = packet;

            udp.StartRemoteFirewallTest(cookie);
        }
        private static void CheckFirewallBusy(UdpItem item, UdpListener udp, ulong time)
        {
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            ushort          port   = packet;

            while (packet.Remaining > 5)
            {
                UdpNode n = new UdpNode();
                n.IP   = packet;
                n.Port = packet;
                UdpNodeManager.Add(n);
            }
        }
        private static void ReadyToCheckFirewall(UdpItem item, UdpListener udp, ulong time)
        {
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            uint            cookie = packet;

            if (!udp.ServerAddressReceived)
            {
                udp.ServerAddressReceived = true;
                Settings.ExternalIP       = packet;
                ServerCore.Log("server address reported as " + Settings.ExternalIP);
            }

            udp.SendDatagram(new UdpItem
            {
                Data     = UdpOutbound.ProceedCheckFirewall(cookie),
                EndPoint = item.EndPoint,
                Msg      = UdpMsg.OP_SERVERLIST_PROCEEDCHECKFIREWALL
            });

            udp.AddChecker(((IPEndPoint)item.EndPoint).Address);
        }
        private static void AckIps(UdpItem item, UdpListener udp, ulong time)
        {
            UdpStats.ACKIPS++;
            UdpPacketReader packet = new UdpPacketReader(item.Data);
            ushort          port   = packet;
            UdpNode         node   = UdpNodeManager.Find(x => x.IP.Equals(((IPEndPoint)item.EndPoint).Address));

            if (node != null)
            {
                node.Port = port;
                node.Ack++;
                node.LastConnect = time;
                node.Try         = 0;
            }

            while (packet.Remaining > 5)
            {
                UdpNode n = new UdpNode();
                n.IP   = packet;
                n.Port = packet;
                UdpNodeManager.Add(n);
            }
        }