/// <summary>
 /// Receive a packet and apply it.
 /// </summary>
 /// <param name="ID">The packet type ID</param>
 /// <param name="packet">The packet object itself</param>
 /// <param name="data">The data in the packet</param>
 public static void ReceivePacket(int ID, AbstractPacketIn packet, byte[] data, bool IsChunkPacket)
 {
     try
     {
         packet.IsChunkConnection = IsChunkPacket;
         if (packet.ReadBytes(data))
         {
             packet.Apply();
         }
         else
         {
             UIConsole.WriteLine(TextStyle.Color_Error + "Impure packet from server, ID " + ID + " ICP:" + IsChunkPacket);
         }
     }
     catch (Exception ex)
     {
         UIConsole.WriteLine(TextStyle.Color_Error + "Bad packet from server, ID " + ID + " ICP:" + IsChunkPacket + ": " + ex.ToString());
     }
 }
        /// <summary>
        /// Tick the entire network engine.
        /// </summary>
        public static void Tick()
        {
            if (!Connected)
            {
                return;
            }
            try
            {
                int waiting = Connection.Available;
                if (waiting > 1024 * 1024 - bufferpos)
                {
                    waiting = 1024 * 1024 - bufferpos;
                }
                if (waiting > 0)
                {
                    Connection.Receive(buffer, bufferpos, waiting, SocketFlags.None);
                    bufferpos += waiting;
                    while (true)
                    {
                        if (bufferpos < 5)
                        {
                            break;
                        }
                        if (!Connected)
                        {
                            break;
                        }
                        int recd = BitConverter.ToInt32(buffer, 0);
                        if (bufferpos < 5 + recd)
                        {
                            break;
                        }
                        byte[] packet = new byte[recd];
                        Array.Copy(buffer, 5, packet, 0, recd);
                        int ID = buffer[4];
                        Array.Copy(buffer, recd + 5, buffer, 0, bufferpos - (recd + 5));
                        bufferpos -= recd + 5;
                        AbstractPacketIn apacket = null;
                        switch (ID)
                        {
                        case 1:
                            apacket = new PingPacketIn();
                            break;

                        case 2:
                            apacket = new ConfirmPositionPacketIn();
                            break;

                        case 3:
                            apacket = new MessagePacketIn();
                            break;

                        case 4:
                            apacket = new NewEntityPacketIn();
                            break;

                        case 5:
                            apacket = new DespawnEntityPacketIn();
                            break;

                        case 6:
                            apacket = new EntityPositionPacketIn();
                            break;

                        case 255:
                            apacket = new DisconnectPacketIn();
                            break;

                        default:
                            UIConsole.WriteLine("Invalid packet from server, ID " + ID);
                            break;
                        }
                        if (apacket != null)
                        {
                            ReceivePacket(ID, apacket, packet, false);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SysConsole.Output(OutputType.ERROR, "Networking: " + ex.ToString());
                Disconnect();
            }
            try
            {
                int waiting = ChunkConnection.Available;
                if (waiting > 1024 * 1024 - bufferpos2)
                {
                    waiting = 1024 * 1024 - bufferpos2;
                }
                if (waiting > 0)
                {
                    ChunkConnection.Receive(buffer2, bufferpos2, waiting, SocketFlags.None);
                    bufferpos2 += waiting;
                    while (true)
                    {
                        if (bufferpos2 < 5)
                        {
                            break;
                        }
                        if (!Connected)
                        {
                            break;
                        }
                        int recd = BitConverter.ToInt32(buffer2, 0);
                        if (bufferpos2 < 5 + recd)
                        {
                            break;
                        }
                        byte[] packet = new byte[recd];
                        Array.Copy(buffer2, 5, packet, 0, recd);
                        int ID = buffer2[4];
                        Array.Copy(buffer2, recd + 5, buffer2, 0, bufferpos2 - (recd + 5));
                        bufferpos2 -= recd + 5;
                        AbstractPacketIn apacket = null;
                        switch (ID)
                        {
                        case 0:
                            apacket = new ChunkPacketIn();
                            break;

                        case 1:
                            apacket = new PingPacketIn();
                            break;

                        case 4:
                            apacket = new BlockPacketIn();
                            break;

                        default:
                            UIConsole.WriteLine("Invalid secondary packet from server, ID " + ID);
                            break;
                        }
                        if (apacket != null)
                        {
                            ReceivePacket(ID, apacket, packet, true);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SysConsole.Output(OutputType.ERROR, "Networking (Secondary): " + ex.ToString());
                Disconnect();
            }
        }