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; }