public void QueryLiveInfo(Action <Networking.ServerInfo> onServerRulesReceived, Action <Networking.ServerInfo> onQueryDone) { if (!SteamManager.IsInitialized) { return; } if (int.TryParse(QueryPort, out int parsedPort) && IPAddress.TryParse(IP, out IPAddress parsedIP)) { if (MatchmakingPingResponse?.QueryActive ?? false) { MatchmakingPingResponse.Cancel(); } MatchmakingPingResponse = new Steamworks.SteamMatchmakingPingResponse( (server) => { ServerName = server.Name; RespondedToSteamQuery = true; PlayerCount = server.Players; MaxPlayers = server.MaxPlayers; HasPassword = server.Passworded; PingChecked = true; Ping = server.Ping; LobbyID = 0; TaskPool.Add("QueryServerRules (QueryLiveInfo)", server.QueryRulesAsync(), (t) => { onQueryDone(this); if (t.Status == TaskStatus.Faulted) { TaskPool.PrintTaskExceptions(t, "Failed to retrieve rules for " + ServerName); return; } var rules = ((Task <Dictionary <string, string> >)t).Result; SteamManager.AssignServerRulesToServerInfo(rules, this); onServerRulesReceived(this); }); }, () => { RespondedToSteamQuery = false; }); MatchmakingPingResponse.HQueryPing(parsedIP, parsedPort); } else if (OwnerID != 0) { if (SteamFriend == null) { SteamFriend = new Steamworks.Friend(OwnerID); } if (LobbyID == 0) { TaskPool.Add("RequestSteamP2POwnerInfo", SteamFriend?.RequestInfoAsync(), (t) => { onQueryDone(this); if ((SteamFriend?.IsPlayingThisGame ?? false) && ((SteamFriend?.GameInfo?.Lobby?.Id ?? 0) != 0)) { LobbyID = SteamFriend?.GameInfo?.Lobby?.Id.Value ?? 0; Steamworks.SteamMatchmaking.OnLobbyDataChanged += UpdateInfoFromSteamworksLobby; SteamFriend?.GameInfo?.Lobby?.Refresh(); } else { RespondedToSteamQuery = false; } }); } else { onQueryDone(this); } } }