Ejemplo n.º 1
0
        /// <summary>
        ///     Connect to the game server. Will use existing lobby on default.
        /// </summary>
        /// <param name="lobb"></param>
        public void Connect(CSODOTALobby lobb = null)
        {
            if (_connectDetails != null)
            {
                Disconnect();
            }

            lobb = lobb ?? DotaGc.Lobby;
            if (lobb == null)
            {
                Log("No lobby so not connecting.");
                return;
            }

            _connectLobby = lobb;
            if (_appOwnershipTicket == null)
            {
                Log("Waiting for ownership ticket...");
                _waitingForAuthTicket = true;
                FetchAppTicket();
                return;
            }

            _authTicket = AuthTicket.CreateAuthTicket(_gameConnectTokens.Dequeue(), publicIP);

            var ver = new CMsgAuthTicket
            {
                gameid       = (uint)DotaGc.GameID,
                h_steam_pipe = 327684,
                ticket       = _authTicket
            };

            using (var stream = Bitstream.CreateWith(_authTicket))
                ver.ticket_crc = CrcUtils.Compute32(stream);

            _connectDetails = new DOTAConnectDetails
            {
                AuthTicket       = _authTicket,
                ServerAuthTicket = AuthTicket.CreateServerTicket(DotaGc.SteamClient.SteamID, _authTicket, _appOwnershipTicket),
                ConnectInfo      = lobb.connect,
                ConnectID        = _connectAttempt++,
                AuthTicketCRC    = ver.ticket_crc,
                Name             = DotaGc.SteamClient.GetHandler <SteamFriends>().GetPersonaName(),
                PassKey          = lobb.pass_key,
                SteamId          = DotaGc.SteamClient.SteamID.ConvertToUInt64()
            };

            var msg = new ClientMsgProtobuf <CMsgClientAuthList>(EMsg.ClientAuthList)
            {
                Body =
                {
                    tokens_left      = (uint)_gameConnectTokens.Count,
                    app_ids          = { (uint)DotaGc.GameID },
                    tickets          = { ver },
                    message_sequence = 2 // Second in sequence.
                }
            };

            DotaGc.SteamClient.Send(msg);
            Log("Sent crc ticket auth list, hash: " + ver.ticket_crc + ".");
        }