/// <summary> /// Add a server to the list of servers /// </summary> /// <param name="lobby">The <see cref="Steamworks.Data.Lobby"/> of the lobby/server to add to the list</param> private void AddServer(Steamworks.Data.Lobby lobby) { for (int i = 0; i < serverList.Count; ++i) { var server = serverList[i]; if (server.lobby.Id == lobby.Id) { // Already have that server listed nothing else to do return; } } var serverListItemData = new ServerListItemData { ListItem = GameObject.Instantiate <ServerListEntry>(serverListEntryTemplate, servers.content), lobby = lobby }; // Make the list item visible serverListItemData.ListItem.gameObject.SetActive(true); // Make sure we periodically re-request the lobby/server data so the server information in the list is // up-to-date serverListItemData.NextUpdate = Time.time + 5.0f + UnityEngine.Random.Range(0.0f, 1.0f); // Add the server to the list. serverList.Add(serverListItemData); // Make sure the the newly added server is not selected on the UI SetListItemSelected(serverListItemData, false); // Make sure every item in the UI is positioned well RepositionItems(); return; }
/// <summary> /// Connect this FacepunchP2PClient to a steam lobby /// </summary> /// <param name="lobbyToJoin">The Facepunch <see cref="Steamworks.Data.Lobby"/> object to join</param> /// <param name="pendCreates">Immediately set the NetWorker::PendCreates to true</param> public void Connect(Steamworks.Data.Lobby lobbyToJoin, bool pendCreates = false) { if (Disposed) { throw new ObjectDisposedException("FacepunchP2PClient", "This object has been disposed and can not be used to connect, please use a new FacepunchP2PClient"); } ConnectToLobbyAsync(lobbyToJoin, pendCreates); }
/// <summary> /// Connects to a Steam Lobby then kicks off connection to the lobby owner's SteamId /// </summary> /// <param name="lobbyToJoin">The <see cref="Steamworks.Data.Lobby"/> to join</param> /// <param name="pendCreates">Set the NetWorker::PendCreates to true</param> private async void ConnectToLobbyAsync(Steamworks.Data.Lobby lobbyToJoin, bool pendCreates) { RoomEnter roomEnter = await lobbyToJoin.Join(); if (roomEnter != RoomEnter.Success) { return; } Lobby = lobbyToJoin; Connect(Lobby.Owner.Id, pendCreates); }
/// <summary> /// Handle the RequestLobbyData Steam API callback /// </summary> /// <param name="result">The <see cref="LobbyDataUpdate_t"/> result set</param> private void OnLobbyDataUpdated(Steamworks.Data.Lobby lobby) { for (int i = 0; i < serverList.Count; i++) { if (serverList[i].lobby.Id == lobby.Id) { // No-one is in the lobby, get rid! if (lobby.MemberCount == 0) { RemoveServer(i); return; } foreach (var entry in lobby.Data) { switch (entry.Key) { case "name": serverList[i].ListItem.serverName.text = entry.Value; break; case "fnr_gameType": serverList[i].ListItem.gameType.text = entry.Value; break; case "fnr_gameMode": serverList[i].ListItem.gameMode.text = entry.Value; break; default: break; } } var maxPlayers = lobby.MaxMembers; var currPlayers = lobby.MemberCount; serverList[i].ListItem.playerCount.text = $"{currPlayers}/{maxPlayers}"; return; } } }
private void UpdateInfoFromSteamworksLobby(Steamworks.Data.Lobby lobby) { if (lobby.Id != LobbyID) { return; } Steamworks.SteamMatchmaking.OnLobbyDataChanged -= UpdateInfoFromSteamworksLobby; if (string.IsNullOrWhiteSpace(lobby.GetData("haspassword"))) { return; } bool.TryParse(lobby.GetData("haspassword"), out bool hasPassword); int.TryParse(lobby.GetData("playercount"), out int currPlayers); int.TryParse(lobby.GetData("maxplayernum"), out int maxPlayers); UInt64 ownerId = SteamManager.SteamIDStringToUInt64(lobby.GetData("lobbyowner")); if (OwnerID != ownerId) { return; } ServerName = lobby.GetData("name"); IP = ""; Port = ""; QueryPort = ""; PlayerCount = currPlayers; MaxPlayers = maxPlayers; HasPassword = hasPassword; RespondedToSteamQuery = true; LobbyID = lobby.Id; OwnerID = ownerId; PingChecked = false; OwnerVerified = true; SteamManager.AssignLobbyDataToServerInfo(lobby, this); }
/// <summary> /// Sets the lobby to be joined when clicking the connect button. /// Usually called by the <see cref="JoinMenu"/> when a server list item is clicked /// </summary> /// <param name="steamId"></param> public void SetSelectedLobby(Steamworks.Data.Lobby lobby) { selectedLobby = lobby; }
public void OnLobbyJoinRequested(Steamworks.Data.Lobby lobby, Steamworks.SteamId friendId) { SteamManager.JoinLobby(lobby.Id, true); }
private void OnLobbyMemberLeave(Steamworks.Data.Lobby lobby, Friend friend) { BeardedManStudios.Forge.Logging.BMSLog.Log(friend.Name + " left the lobby"); }