Exemplo n.º 1
0
 /// <summary>
 ///     Disconnect from the game server or cancel connection attempt.
 /// </summary>
 public void Disconnect()
 {
     if (_connectDetails == null)
     {
         return;
     }
     _connectDetails = null;
     Session?.Stop();
     Session = null;
     _waitingForAuthTicket = false;
 }
Exemplo n.º 2
0
        /// <summary>
        ///     Registers all internal handlers.
        /// </summary>
        private void RegisterCallbacks()
        {
            var cbs = _registeredCallbacks;

            cbs.Add(
                new Callback <SteamApps.AppOwnershipTicketCallback>(cb =>
            {
                if (cb.AppID != (uint)DotaGc.GameID || cb.Result != EResult.OK || cb.Ticket == null)
                {
                    return;
                }
                _appOwnershipTicket = cb.Ticket;
                Log("Received app ownership ticket with " + _appOwnershipTicket.Length + " length.");
                if (_waitingForAuthTicket)
                {
                    _waitingForAuthTicket = false;
                    Connect(_connectLobby);
                }
            }, Callbacks)
                );
            cbs.Add(
                new Callback <DotaGCHandler.GCWelcomeCallback>(callback => FetchAppTicket(), Callbacks)
                );
            cbs.Add(
                new Callback <SteamApps.GameConnectTokensCallback>(cb =>
            {
                Log("Received " + cb.Tokens.Count + " game connect tokens, keeping a total of " + cb.TokensToKeep +
                    ", currently have " + _gameConnectTokens.Count + ".");
                foreach (var tok in cb.Tokens)
                {
                    _gameConnectTokens.Enqueue(tok);
                }
                var rem = (int)cb.TokensToKeep - _gameConnectTokens.Count;
                while (rem > 0)
                {
                    _gameConnectTokens.Dequeue();
                    rem--;
                }
            }, Callbacks)
                );
            cbs.Add(
                new Callback <SteamUser.LoggedOnCallback>(cb =>
            {
                if (cb.Result == EResult.OK)
                {
                    publicIP = cb.PublicIP;
                }
            }, Callbacks)
                );
            cbs.Add(
                new Callback <DotaGCHandler.AuthListAck>(cb =>
            {
                if (_connectDetails == null || cb.authAck.ticket_crc[0] != _connectDetails.AuthTicketCRC)
                {
                    return;
                }
                Log("Received ack for auth ticket, proceeding with connection.");
                BeginServerSession();
            }, Callbacks)
                );
            cbs.Add(
                new Callback <DotaGCHandler.BeginSessionResponse>(cb =>
            {
                if (cb.response.Result != EResult.OK)
                {
                    Log("Result for session start is " + cb.response.Result + ", not ok!");
                    Disconnect();
                    return;
                }

                if (_connectDetails == null)
                {
                    Log("Received a session create response with no connectDetails, disconnecting...");
                    Disconnect();
                    return;
                }

                _connectDetails.SteamworksSessionId = cb.response.SessionId;

                Log("Session start received with ID " + _connectDetails.SteamworksSessionId +
                    ", starting game session...");
                Session           = new DotaGameSession(_connectDetails, Controllers.ToArray(), EntityBuilder);
                Session.Callback += (sender, args) => DotaGc.SteamClient.PostCallback(args.msg);
                Session.Closed   += (s, a) => Disconnect();
                Session.Start();
            }, Callbacks)
                );
        }