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);
                    }
                }
            }
        }
示例#2
0
 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();
                 }
             }
         });
     }
 }
示例#3
0
 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);
         }
     }
 }