示例#1
0
        private void completeDisconnect(params object[] args)
        {
            if (CurrentState == ConnectionState.Disconnect)
            {
                return;
            }

            DisconnectReason reason  = (DisconnectReason)args[0];
            Chat             message = null;

            if (args.Length > 1)
            {
                message = (Chat)args[1];
            }
            ClientDisconnectInfo cdi = new ClientDisconnectInfo();

            cdi.CustomDisconnectMessage = message;
            cdi.DisconnectingClient     = this;
            cdi.Reason = reason;
            OnDisconnect?.Invoke(cdi);
            message = cdi.CustomDisconnectMessage;
            if (message != null && (cdi.Reason == DisconnectReason.KeepAlivePacketTimedOut || cdi.Reason == DisconnectReason.ClientDisconnectedFromMCSharpApi || cdi.Reason == DisconnectReason.PlayerKickedFromMCSharpApi || cdi.Reason == DisconnectReason.ClientMinecraftVersionNotAccepted || cdi.Reason == DisconnectReason.TimedOutDuringHandshakeOrLogin || cdi.Reason == DisconnectReason.ServerAtMaxCapacity))
            {
                if (CurrentState == ConnectionState.Login)
                {
                    DisconnectLogin disconnectLogin = new DisconnectLogin();
                    disconnectLogin.DisconnectReason = message;
                    SendPacket(disconnectLogin);
                }
                else if (CurrentState == ConnectionState.Play)
                {
                    // TODO: DisconnectPlay
                }
            }
            sendThread.FinishUp();
            sendThread.Dispose();
            tcpClient.Close();

            Server.removeClient(this);
            CurrentState = ConnectionState.Disconnect;
        }