protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {

                if (DataThread != null)
                {
                    DataThread.Abort();
                }
                if (disposing)
                {
                    // Dispose managed resources.
                    if (Stream != null)
                    {
                        Stream.Dispose();
                    }
                    if (MainSocket != null)
                    {
                        MainSocket.Dispose();
                    }
                    if (PositionTimer != null)
                    {
                        PositionTimer.Dispose();
                    }
                }

                DataThread = null;
                ServerAddress = null;
                Server = null;
                disposed = true;

            }
        }
        public void Connect()
        {
            if (UseAuthentication)
            {
                this.SessionID = Authenticate();
                if (this.SessionID == "")
                {
                    Debug.Severe(new MinecraftClientConnectException("Authentication Failed."));
                    return;
                }
            }

            this.MainSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            while (!MainSocket.Connected)
            {
                try
                {
                    this.MainSocket.Connect(ServerAddress);
                }
                catch (Exception e) { Debug.Severe(e); }
            }

            this.Stream = new NetworkStream(MainSocket);
            this.Server = new MinecraftServer(MainSocket);
            this.Server.Password = "******";

            if (!SendInitialPackets())
            {
                Debug.Severe(new MinecraftClientConnectException());
                return;
            }

            this.Connected = true;
            this.PlayerLocation = new Location(0D, 0D, 0D, 0D + 1.65);
            this.PlayerRotation = new Rotation(0F, 0F);

            DataThread = new Thread(HandleData);
            DataThread.Start();

            PositionTimer = new System.Timers.Timer(100);
            PositionTimer.Elapsed += new ElapsedEventHandler(PositionTimer_Elapsed);
        }