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