public bool Login(Data.Servers.Server server) { byte[] protocol_version = getVarInt(protocolversion); string server_address = server.Host; byte[] server_port = BitConverter.GetBytes(server.Port); Array.Reverse(server_port); byte[] next_state = getVarInt(2); byte[] handshake_packet = concatBytes(protocol_version, getString(server_address), server_port, next_state); SendPacket(0x00, handshake_packet); byte[] login_packet = getString(handler.getUsername()); SendPacket(0x00, login_packet); int packetID = -1; List <byte> packetData = new List <byte>(); while (true) { readNextPacket(ref packetID, packetData); if (packetID == 0x00) { handler.OnConnectionLost(Conn.DisconnectReason.LoginRejected, readNextString(packetData)); return(false); } else if (packetID == 0x01)//Encrypt { string serverID = readNextString(packetData); byte[] Serverkey = readNextByteArray(packetData); byte[] token = readNextByteArray(packetData); return(SwitchToEncrypted(serverID, Serverkey, token)); } else if (packetID == 0x02)//Logined { Debug.Log("Login Success"); login_phase = false; handler.OnLogin(packetData); StartUpdating(); return(true); } else { if (packetID == 0x03 && login_phase) { if (protocolversion >= MCVersion.MC18Version) { compression_treshold = readNextVarInt(packetData); handler.setCompression(compression_treshold); } } else { handler.receivePacket(packetID, packetData); } } } }
private async void CreateProxyBridge(Data.Servers.Server server) { if (this.Client.Connected) { await Task.Run(() => { TcpClient remote = new TcpClient(); try { remote.Connect(server.Host, server.Port); if (remote.Connected) { ProtocolConnection tmp = new ProtocolConnection(remote, server.Protocol, this); if (tmp.Login(server)) { if (Proxy != null) { Proxy.Dispose(); } Proxy = tmp; if (cRead == null || !cRead.IsAlive) { handlePacket(); } } else { tmp.Dispose(); } } } catch (Exception e) { Debug.Log(e.Message, "Exception"); if (trans_server) { SendMessage(string.Format(ServerData.MsgConnectFailed, e.Message)); } else { this.Close(); } } }); } }
private void ServerTransfer(List <string> args) { if (args.Count >= 2) { string name = args[1]; if (Data.Servers.servers.ContainsKey(name)) { Data.Servers.Server s = Data.Servers.servers[name]; trans_server = true; //getProtocol(s.Protocol); SendMessage(string.Format(ServerData.MsgServerTransform, name)); CreateProxyBridge(s); } else { SendMessage(ServerData.MsgServerNotFound); } } }