/// <summary> /// Init a new game connect session. /// </summary> /// <param name="deets"></param> /// <param name="toArray"></param> /// <param name="poolBuilder">Pool builder</param> internal DotaGameSession(DOTAConnectDetails deets, IDotaGameController[] controllers, DotaEntityPool.Builder poolBuilder) { _details = deets; Running = false; _gameState = new DotaGameState(deets); _gameState.EntityPool = poolBuilder.Build(_gameState); _connection = null; Controllers = controllers; }
/// <summary> /// Initialize the signon handler. /// </summary> /// <param name="state"></param> /// <param name="connection"></param> public DotaSignon(DotaGameState state, DotaGameConnection connection, DOTAConnectDetails details) { this.state = state; this.details = details; this.connection = connection; entityUpdater = new EntityUpdater(state); sendTableFlattener = new SendTableFlattener(); stringTableUpdater = new StringTableUpdater(); }
public DotaHandshake( DOTAConnectDetails details, DotaGameState state, DotaGameConnection connection) { this.details = details; this.connection = connection; this.state = state; client_challenge = (uint)new Random().Next(); }
public DotaHandshake( DOTAConnectDetails details, DotaGameState state, DotaGameConnection connection) { this.details = details; this.connection = connection; this.state = state; client_challenge = (uint) new Random().Next(); }
/// <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; }
public static DotaGameConnection CreateWith(DOTAConnectDetails details) { var connection = new DotaGameConnection(); for (uint i = 0; i < NUM_STREAMS; ++i) { connection.streams[i] = Stream.Create(); } for (uint i = 0; i < NUM_SUBCHANNELS; ++i) { connection.subchannels[i] = Subchannel.Create(i); } if (details.ConnectInfo.StartsWith("=")) { throw new NotImplementedException( "STEAM3 datagram connection not implemented yet. Use a less advanced datacenter."); } // Parse the IP address IPEndPoint endp; IPAddress addr; var parts = details.ConnectInfo.Split(':'); if (!IPAddress.TryParse(parts[0], out addr)) { throw new InvalidOperationException("Invalid IP address specified on lobby."); } endp = new IPEndPoint(addr, int.Parse(parts[1])); connection.socket.Connect(endp); connection.state = State.Opened; return(connection); }
/// <summary> /// Instantiates a new game state. /// </summary> /// <param name="details">Details</param> /// <param name="pool">Entity pool</param> internal DotaGameState(DOTAConnectDetails details) { _details = details; CVars = new Dictionary <string, string>(); Strings = new List <StringTable>(); StringsIndex = new Dictionary <string, int>(); Classes = new List <EntityClass>(); ClassesByName = new Dictionary <string, EntityClass>(); SendTables = new List <SendTable>(); FlatTables = new List <FlatTable>(); Properties = new Dictionary <PropertyHandle, Property>(); Slots = new Dictionary <uint, Slot>(); Created = new List <uint>(); Deleted = new List <uint>(); ChatMessages = new List <CUserMsg_SayText2>(); GameEvents = new List <CSVCMsg_GameEvent>(); ChatEvents = new List <CDOTAUserMsg_ChatEvent>(); Reset(); }
/// <summary> /// Instantiates a new game state. /// </summary> /// <param name="details">Details</param> /// <param name="pool">Entity pool</param> internal DotaGameState(DOTAConnectDetails details) { _details = details; CVars = new Dictionary<string, string>(); Strings = new List<StringTable>(); StringsIndex = new Dictionary<string, int>(); Classes = new List<EntityClass>(); ClassesByName = new Dictionary<string, EntityClass>(); SendTables = new List<SendTable>(); FlatTables = new List<FlatTable>(); Properties = new Dictionary<PropertyHandle, Property>(); Slots = new Dictionary<uint, Slot>(); Created = new List<uint>(); Deleted = new List<uint>(); ChatMessages = new List<CUserMsg_SayText2>(); GameEvents = new List<CSVCMsg_GameEvent>(); ChatEvents = new List<CDOTAUserMsg_ChatEvent>(); Reset(); }
/// <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 + "."); }