private static async Task <GameServer[]> LoadLobbies()
        {
            if (_currentLobbiesTask != null)
            {
                return(await _currentLobbiesTask);
            }
            var servers = await(_currentLobbiesTask = SteamLobbyManager.LoadLobbies());

            _currentLobbiesTask = null;
            return(servers);
        }
Exemple #2
0
        private void AddValidServer(IPEndPoint remote)
        {
            string key    = String.Format("{0}:{1}", remote.Address, remote.Port);
            var    server = new GameServer();

            server["IPAddress"]     = remote.Address.ToString();
            server["QueryPort"]     = remote.Port.ToString();
            server["LastRefreshed"] = DateTime.UtcNow.ToString();
            server["LastPing"]      = DateTime.UtcNow.ToString();

            server["hostport"]  = remote.Port.ToString();
            server["localport"] = remote.Port.ToString();

            SteamLobbyManager.CreatePublicLobby(server, CancellationToken.None, CoreContext.ThunderHawkModManager.ActiveModRevision);
        }
Exemple #3
0
        private bool ParseServerDetails(IPEndPoint remote, byte[] data)
        {
            string receivedData = Encoding.UTF8.GetString(data);

            //Console.WriteLine(receivedData.Replace("\x00", "\\x00").Replace("\x02", "\\x02"));

            // split by 000 (info/player separator) and 002 (players/teams separator)
            // the players/teams separator is really 00, but because 00 may also be used elsewhere (an empty value for example), we hardcode it to 002
            // the 2 is the size of the teams, for BF2 this is always 2.
            string[] sections = receivedData.Split(new string[] { "\x00\x00\x00", "\x00\x00\x02" }, StringSplitOptions.None);

            //Console.WriteLine(sections.Length);

            if (sections.Length != 3 && !receivedData.EndsWith("\x00\x00"))
            {
                return(true); // true means we don't send back a response
            }
            string serverVars = sections[0];

            //string playerVars = sections[1];
            //string teamVars = sections[2];

            string[] serverVarsSplit = serverVars.Split(new string[] { "\x00" }, StringSplitOptions.None);

            var server = new GameServer();

            server["IPAddress"]     = remote.Address.ToString();
            server["QueryPort"]     = remote.Port.ToString();
            server["LastRefreshed"] = DateTime.UtcNow.ToString();
            server["LastPing"]      = DateTime.UtcNow.ToString();
            server["country"]       = "??";

            for (int i = 0; i < serverVarsSplit.Length - 1; i += 2)
            {
                if (serverVarsSplit[i] == "hostname")
                {
                    server.Set(serverVarsSplit[i], Regex.Replace(serverVarsSplit[i + 1], @"\s+", " ").Trim());
                }
                else
                {
                    server.Set(serverVarsSplit[i], serverVarsSplit[i + 1]);
                }
            }

            var gamename = server.Get <string>("gamename");

            if (server.Get <string>("statechanged") == "3" && gamename.Equals("whamdowfram", StringComparison.Ordinal))
            {
                ServerContext.ChatServer.SentServerMessageToClient("Вы создаете хост для игры в авто. Другие игроки увидят ваш хост через некоторое время (до минуты), получат оповещение и смогут подключиться для игры.\n\r");
            }

            server["hostport"]  = remote.Port.ToString();
            server["localport"] = remote.Port.ToString();

            var gamevariant = server.Get <string>("gamevariant");

            /*if (!gamevariant.IsNullOrWhiteSpace())
             * {
             *  if (gamevariant != SteamConstants.GameVariant)
             *  {
             *      ServerContext.ChatServer.SentServerMessageToClient("Вы используете не ту версию модификации. Вам необходимо использовать Soulstorm Bugfix Mod 1.56a.\r\n");
             *  }
             * }*/

            // you've got to have all these properties in order for your server to be valid
            if (!String.IsNullOrWhiteSpace(server.Get <string>("hostname")) &&
                !String.IsNullOrWhiteSpace(gamevariant) &&
                !String.IsNullOrWhiteSpace(server.Get <string>("gamever")) &&
                !String.IsNullOrWhiteSpace(server.Get <string>("gametype")) &&
                server.Get <string>("maxplayers") != "0")
            {
                server.Valid = true;
            }

            // if the server list doesn't contain this server, we need to return false in order to send a challenge
            // if the server replies back with the good challenge, it'll be added in AddValidServer
            if (!SteamLobbyManager.IsInLobbyNow)
            {
                return(false);
            }

            if (server.Properties.TryGetValue("statechanged", out string value))
            {
                var strValue = value?.ToString();

                if (strValue == "2")
                {
                    SteamLobbyManager.LeaveFromCurrentLobby();
                    return(true);
                }
            }

            PortBindingManager.ClearPortBindings();

            var wasJoinable = SteamLobbyManager.IsLobbyJoinable;

            SteamLobbyManager.UpdateCurrentLobby(server, CoreContext.ThunderHawkModManager.ActiveModRevision);

            if (!wasJoinable && SteamLobbyManager.IsLobbyJoinable)
            {
                var hostname = server.Get <string>("hostname");

                if (gamename == "whamdowfram")
                {
                    ServerContext.ChatServer.SendAutomatchGameBroadcast(hostname, int.Parse(server.Get <string>("maxplayers")));
                }
            }

            return(true);
        }