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