예제 #1
0
        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);
                }
            }
        }