Esempio n. 1
0
 /// <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;
 }
Esempio n. 2
0
 /// <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();
 }
Esempio n. 3
0
 /// <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;
 }
Esempio n. 4
0
 public DotaHandshake(
     DOTAConnectDetails details,
     DotaGameState state,
     DotaGameConnection connection)
 {
     this.details     = details;
     this.connection  = connection;
     this.state       = state;
     client_challenge = (uint)new Random().Next();
 }
Esempio n. 5
0
 public DotaHandshake(
     DOTAConnectDetails details,
     DotaGameState state,
     DotaGameConnection connection)
 {
     this.details = details;
     this.connection = connection;
     this.state = state;
     client_challenge = (uint) new Random().Next();
 }
Esempio n. 6
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;
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        /// <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();
        }
Esempio n. 9
0
        /// <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();
        }
Esempio n. 10
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 + ".");
        }