From 2e1b683a4c29ddbe6855ada17ed0f3db9c8cd87e Mon Sep 17 00:00:00 2001 From: Tore Bergebakken Date: Sun, 2 Jun 2024 11:50:49 +0200 Subject: [PATCH] Make it possible to remove inputs --- Assets/Scenes/CraterTown.unity | 2 +- Assets/Scripts/Auction/AuctionDriver.cs | 4 +-- Assets/Scripts/Auction/BiddingPlatform.cs | 6 ++-- .../Control&Input/ItemSelectManager.cs | 8 +++--- .../PlayerInputManagerController.cs | 28 ++++++++++++------- ...2PeerTransport.cs => RPRNetworkManager.cs} | 28 +++++++++++++++++-- ...port.cs.meta => RPRNetworkManager.cs.meta} | 0 Assets/Scripts/Gamestate/MatchController.cs | 4 +-- Assets/Scripts/HealthController.cs | 2 +- .../PlayerSelect/PlayerSelectManager.cs | 18 ++++++------ Assets/Scripts/UI/ClientLobby.cs | 4 +-- .../Scripts/UI/MainMenu/MainMenuController.cs | 24 ++++++++-------- .../Scripts/UI/MainMenu/MainMenuMoveCamera.cs | 2 +- Assets/Scripts/Utils/SteamManager.cs | 4 +-- 14 files changed, 83 insertions(+), 51 deletions(-) rename Assets/Scripts/Control&Input/{Peer2PeerTransport.cs => RPRNetworkManager.cs} (96%) rename Assets/Scripts/Control&Input/{Peer2PeerTransport.cs.meta => RPRNetworkManager.cs.meta} (100%) diff --git a/Assets/Scenes/CraterTown.unity b/Assets/Scenes/CraterTown.unity index 157b833d6..9d22768ff 100644 --- a/Assets/Scenes/CraterTown.unity +++ b/Assets/Scenes/CraterTown.unity @@ -38,7 +38,7 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 662445327} - m_IndirectSpecularColor: {r: 0.06470767, g: 0.22111607, b: 0.4958092, a: 1} + m_IndirectSpecularColor: {r: 0.06792183, g: 0.22349986, b: 0.4966975, a: 1} m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: diff --git a/Assets/Scripts/Auction/AuctionDriver.cs b/Assets/Scripts/Auction/AuctionDriver.cs index 5973ee890..40814be19 100644 --- a/Assets/Scripts/Auction/AuctionDriver.cs +++ b/Assets/Scripts/Auction/AuctionDriver.cs @@ -79,7 +79,7 @@ private void Start() private IEnumerator WaitAndStartAuction() { // TODO add a timeout to this kinda thing - while (FindObjectsOfType().Count() < Peer2PeerTransport.NumPlayers) + while (FindObjectsOfType().Count() < RPRNetworkManager.NumPlayers) yield return null; availableAuctionStages = MatchController.Singleton.RoundCount switch @@ -180,7 +180,7 @@ private IEnumerator WaitAndSwitchToItemSelect() // Wait a couple o' frames so gun parts are sent to their respective players yield return null; yield return null; - Peer2PeerTransport.UpdatePlayerDetailsAfterAuction(); + RPRNetworkManager.UpdatePlayerDetailsAfterAuction(); RpcSwitchToItemSelect(); } diff --git a/Assets/Scripts/Auction/BiddingPlatform.cs b/Assets/Scripts/Auction/BiddingPlatform.cs index 42f45156d..e01473fa0 100644 --- a/Assets/Scripts/Auction/BiddingPlatform.cs +++ b/Assets/Scripts/Auction/BiddingPlatform.cs @@ -149,7 +149,7 @@ private void CmdPlaceBid(uint playerID) } // TODO verify that this player belongs to the source connection - if (!Peer2PeerTransport.PlayerInstanceByID.TryGetValue(playerID, out var player)) + if (!RPRNetworkManager.PlayerInstanceByID.TryGetValue(playerID, out var player)) { Debug.LogError($"Bidding platform received invalid player {playerID} from client!"); return; @@ -174,7 +174,7 @@ private void CmdPlaceBid(uint playerID) [ClientRpc] private void RpcAcceptBid(uint playerID) { - if (!Peer2PeerTransport.PlayerInstanceByID.TryGetValue(playerID, out var player)) + if (!RPRNetworkManager.PlayerInstanceByID.TryGetValue(playerID, out var player)) { Debug.LogError($"Bidding platform received invalid player {playerID} from server!"); return; @@ -247,7 +247,7 @@ private void EndAuction() [ClientRpc] private void RpcPerformTransaction(uint playerID, string itemID) { - if (!Peer2PeerTransport.PlayerInstanceByID.TryGetValue(playerID, out var player)) + if (!RPRNetworkManager.PlayerInstanceByID.TryGetValue(playerID, out var player)) { Debug.LogError($"Bidding platform received invalid player {playerID} from server!"); return; diff --git a/Assets/Scripts/Control&Input/ItemSelectManager.cs b/Assets/Scripts/Control&Input/ItemSelectManager.cs index d9c296aa0..857f3ae61 100644 --- a/Assets/Scripts/Control&Input/ItemSelectManager.cs +++ b/Assets/Scripts/Control&Input/ItemSelectManager.cs @@ -43,9 +43,9 @@ public void StartTrackingMenus() private void InitializeServerState() { - clientReadyByID = Peer2PeerTransport.Connections + clientReadyByID = RPRNetworkManager.Connections .ToDictionary(c => c.connectionId, c => false); - ((Peer2PeerTransport)NetworkManager.singleton).OnDisconnect += OnDisconnect; + ((RPRNetworkManager)NetworkManager.singleton).OnDisconnect += OnDisconnect; NetworkServer.RegisterHandler(OnClientReady); NetworkServer.RegisterHandler(OnClientNotReady); } @@ -54,7 +54,7 @@ private void OnDestroy() { if (isServer) { - ((Peer2PeerTransport)Peer2PeerTransport.singleton).OnDisconnect -= OnDisconnect; + ((RPRNetworkManager)RPRNetworkManager.singleton).OnDisconnect -= OnDisconnect; NetworkServer.UnregisterHandler(); NetworkServer.UnregisterHandler(); } @@ -69,7 +69,7 @@ private void Finish() [ClientRpc] private void RpcFinish() { - ((Peer2PeerTransport)Peer2PeerTransport.singleton).UpdateLoadout(); + ((RPRNetworkManager)RPRNetworkManager.singleton).UpdateLoadout(); StartCoroutine(MatchController.Singleton.WaitAndStartNextRound()); } diff --git a/Assets/Scripts/Control&Input/PlayerInputManagerController.cs b/Assets/Scripts/Control&Input/PlayerInputManagerController.cs index bda3f9e05..d7cfefade 100644 --- a/Assets/Scripts/Control&Input/PlayerInputManagerController.cs +++ b/Assets/Scripts/Control&Input/PlayerInputManagerController.cs @@ -10,8 +10,7 @@ public class PlayerInputManagerController : MonoBehaviour public List LocalPlayerInputs = new(); public Dictionary InputByPlayer = new(); - public List NetworkClients = new List(); - public int PlayerCount => Peer2PeerTransport.NumPlayers; + public int PlayerCount => RPRNetworkManager.NumPlayers; public PlayerInputManager PlayerInputManager; @@ -28,11 +27,12 @@ public class PlayerInputManagerController : MonoBehaviour public delegate void JoinEvent(InputManager inputManager); - public JoinEvent onPlayerInputJoined; + public JoinEvent OnPlayerInputJoined; + public JoinEvent OnPlayerInputLeft; public bool MatchHasAI = false; - void Awake() + private void Awake() { #region Singleton boilerplate @@ -57,13 +57,16 @@ void Awake() public void RemoveJoinListener() { + PlayerInputManager.DisableJoining(); PlayerInputManager.onPlayerJoined -= OnPlayerJoined; + PlayerInputManager.onPlayerLeft -= OnPlayerLeft; } public void AddJoinListener() { PlayerInputManager.EnableJoining(); PlayerInputManager.onPlayerJoined += OnPlayerJoined; + PlayerInputManager.onPlayerLeft += OnPlayerLeft; } public void RemoveListeners() @@ -73,21 +76,26 @@ public void RemoveListeners() private void OnPlayerJoined(PlayerInput playerInput) { - // TODO refactor this for online (should not source info from here) - var playerIdentity = playerInput.GetComponent(); - playerIdentity.color = playerColors[LocalPlayerInputs.Count]; - playerIdentity.playerName = playerNames[LocalPlayerInputs.Count]; - var inputManager = playerInput.GetComponent(); inputManager.PlayerCamera.enabled = false; LocalPlayerInputs.Add(inputManager); - onPlayerInputJoined?.Invoke(inputManager); + OnPlayerInputJoined?.Invoke(inputManager); // TODO: Make cursor visible if mouseandkeyboard input joims when our buttons can be clicked by a mouse.. if (NetworkManager.singleton.isNetworkActive) NetworkClient.Send(new PlayerConnectedMessage(LocalPlayerInputs.Count - 1)); } + private void OnPlayerLeft(PlayerInput playerInput) + { + var inputManager = playerInput.GetComponent(); + OnPlayerInputLeft?.Invoke(inputManager); + LocalPlayerInputs.Remove(inputManager); + + if (NetworkManager.singleton.isNetworkActive) + NetworkClient.Send(new PlayerDisconnectedInputMessage()); + } + public void JoinAllInputs() { for (int i = 0; i < LocalPlayerInputs.Count; i++) diff --git a/Assets/Scripts/Control&Input/Peer2PeerTransport.cs b/Assets/Scripts/Control&Input/RPRNetworkManager.cs similarity index 96% rename from Assets/Scripts/Control&Input/Peer2PeerTransport.cs rename to Assets/Scripts/Control&Input/RPRNetworkManager.cs index d897fe156..d983c1559 100644 --- a/Assets/Scripts/Control&Input/Peer2PeerTransport.cs +++ b/Assets/Scripts/Control&Input/RPRNetworkManager.cs @@ -38,6 +38,8 @@ public PlayerConnectedMessage(int inputID) public int inputID; } +public struct PlayerDisconnectedInputMessage : NetworkMessage { } + public struct PlayerLeftMessage : NetworkMessage { public PlayerLeftMessage(uint id) @@ -116,7 +118,7 @@ public enum PlayerType Remote } -public class Peer2PeerTransport : NetworkManager +public class RPRNetworkManager : NetworkManager { private const int FPSPlayerPrefabIndex = 0; private const int BiddingPlayerPrefabIndexOffset = 1; @@ -178,6 +180,7 @@ private void ResetState() public override void OnStartServer() { NetworkServer.RegisterHandler(OnSpawnPlayerInput); + NetworkServer.RegisterHandler(OnRemovePlayerInput); NetworkServer.RegisterHandler(OnReceiveUpdateLoadout); ResetState(); @@ -223,6 +226,28 @@ public override void OnServerDisconnect(NetworkConnectionToClient connection) OnDisconnect?.Invoke(connection.connectionId); } + private void OnRemovePlayerInput(NetworkConnectionToClient connection, PlayerDisconnectedInputMessage message) + { + if (!playersForConnection.TryGetValue(connection.connectionId, out var playerIDs)) + return; + var playerToRemove = PlayerDetails.Where(p => playerIDs.Contains(p.id)).OrderByDescending(p => p.localInputID).First(); + Debug.Log($"Removed player {playerToRemove.id} with local id {playerToRemove.localInputID} for connection {connection.connectionId}"); + + playerIDs.Remove(playerToRemove.id); + if (playerIDs.Count == 0) + { + connection.Disconnect(); + return; // OnServerDisconnect handles the rest of the job! + } + + connectedPlayers.Remove(playerToRemove.id); + if (!isInMatch) + { + availableColors.Push(playerToRemove.color); + NetworkServer.SendToAll(new PlayerLeftMessage(playerToRemove.id)); + } + } + public override void OnStopServer() { Debug.Log("Stopped server"); @@ -353,7 +378,6 @@ private void OnSpawnPlayerInput(NetworkConnectionToClient connection, PlayerConn return; // Register connection - PlayerInputManagerController.Singleton.NetworkClients.Add(connection); if (!connections.Contains(connection)) { connections.Add(connection); diff --git a/Assets/Scripts/Control&Input/Peer2PeerTransport.cs.meta b/Assets/Scripts/Control&Input/RPRNetworkManager.cs.meta similarity index 100% rename from Assets/Scripts/Control&Input/Peer2PeerTransport.cs.meta rename to Assets/Scripts/Control&Input/RPRNetworkManager.cs.meta diff --git a/Assets/Scripts/Gamestate/MatchController.cs b/Assets/Scripts/Gamestate/MatchController.cs index 98a861082..ada0c2191 100644 --- a/Assets/Scripts/Gamestate/MatchController.cs +++ b/Assets/Scripts/Gamestate/MatchController.cs @@ -164,10 +164,10 @@ private IEnumerator WaitForClientsAndInitialize() // TODO add a timeout thingy for when one player doesn't join in time // TODO keep loading screen open while this while loop spins // Spin while waiting for players to spawn - while (players.Count < Peer2PeerTransport.NumPlayers) + while (players.Count < RPRNetworkManager.NumPlayers) { #if UNITY_EDITOR - Debug.Log($"{players.Count} of {Peer2PeerTransport.NumPlayers} players spawned"); + Debug.Log($"{players.Count} of {RPRNetworkManager.NumPlayers} players spawned"); #endif yield return null; } diff --git a/Assets/Scripts/HealthController.cs b/Assets/Scripts/HealthController.cs index e265781f8..294aa8eab 100644 --- a/Assets/Scripts/HealthController.cs +++ b/Assets/Scripts/HealthController.cs @@ -49,7 +49,7 @@ public void DealDamage(DamageInfo info) [ClientRpc] private void DealDamageRpc(NetworkDamageInfo networkInfo) { - var source = Peer2PeerTransport.PlayerInstanceByID[networkInfo.sourcePlayer]; + var source = RPRNetworkManager.PlayerInstanceByID[networkInfo.sourcePlayer]; var info = new DamageInfo(source, networkInfo); ActuallyDealDamage(info); } diff --git a/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs b/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs index faee93e1e..bbf91b0fd 100644 --- a/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs +++ b/Assets/Scripts/PlayerSelect/PlayerSelectManager.cs @@ -51,23 +51,23 @@ private void Start() animatorParameters.Add(parameter.name); } - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved += UpdateLobby; - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRemoved += UpdateLobby; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved += UpdateLobby; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRemoved += UpdateLobby; } private void OnDestroy() { if (NetworkManager.singleton) { - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved -= UpdateLobby; - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRemoved -= UpdateLobby; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved -= UpdateLobby; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRemoved -= UpdateLobby; } } public void UpdateLobby() { var i = 0; - foreach (var player in Peer2PeerTransport.PlayerDetails) + foreach (var player in RPRNetworkManager.PlayerDetails) { SetupPlayerModel(player, i); i++; @@ -93,7 +93,7 @@ public void SetupPlayerModel(PlayerDetails player, int index) playerModels[index].GetComponentInChildren().material.color = player.color; // Set player model color playerModels[index].SetActive(true); // Show corresponding player model playerModels[index].transform.LookAt(new Vector3(playerSelectCam.transform.position.x, playerModels[index].transform.position.y, playerSelectCam.transform.position.z)); // Orient player model to look at camera - nameTags[index].text = Peer2PeerTransport.PlayerNameWithIndex(player); + nameTags[index].text = RPRNetworkManager.PlayerNameWithIndex(player); nameTags[index].enabled = true; joinText[index].enabled = false; } @@ -139,13 +139,13 @@ IEnumerator PlayRandomAnimation() yield return new WaitForSeconds(5f); while (true) { - int randomAnimatorNumber = Random.Range(0, playerInputManagerController.PlayerCount); // Choose random playermodel to animate + int randomAnimatorNumber = Random.Range(0, RPRNetworkManager.NumPlayers); // Choose random playermodel to animate Animator randomAnimator = playerAnimators[randomAnimatorNumber]; // Get the animator for one of the players that has a connected input // If randomAnimatorNumber is player all the way to the right, don't include cardpeek trigger string randomTrigger = ""; - if (randomAnimatorNumber == playerInputManagerController.PlayerCount - 1) + if (randomAnimatorNumber == RPRNetworkManager.NumPlayers - 1) { randomTrigger = randomAnimator.GetParameter(Random.Range(2, randomAnimator.parameterCount)).name; // Choose a random trigger to set, excluding CardPeek } @@ -159,7 +159,7 @@ IEnumerator PlayRandomAnimation() } - if ((randomTrigger == "CardPeek" || randomTrigger == "CardPeekReaction") && (playerInputManagerController.PlayerCount > 1) && (cardPeekCounter == 0)) + if ((randomTrigger == "CardPeek" || randomTrigger == "CardPeekReaction") && RPRNetworkManager.NumPlayers > 1 && cardPeekCounter == 0) { randomAnimator.SetTrigger("CardPeek"); playerAnimators[randomAnimatorNumber + 1].SetTrigger("CardPeekReaction"); diff --git a/Assets/Scripts/UI/ClientLobby.cs b/Assets/Scripts/UI/ClientLobby.cs index 575407d5e..f125c8279 100644 --- a/Assets/Scripts/UI/ClientLobby.cs +++ b/Assets/Scripts/UI/ClientLobby.cs @@ -13,7 +13,7 @@ public class ClientLobby : MonoBehaviour void Start() { environmentCamera.position = lobbyPosition.position; - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved += AddPlayer; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved += AddPlayer; } public void QuitLobby() @@ -28,6 +28,6 @@ private void AddPlayer(PlayerDetails details) private void OnDestroy() { - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved -= AddPlayer; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved -= AddPlayer; } } diff --git a/Assets/Scripts/UI/MainMenu/MainMenuController.cs b/Assets/Scripts/UI/MainMenu/MainMenuController.cs index 2f15c815a..dab186d85 100644 --- a/Assets/Scripts/UI/MainMenu/MainMenuController.cs +++ b/Assets/Scripts/UI/MainMenu/MainMenuController.cs @@ -88,9 +88,9 @@ private void Start() playerInputManagerController = PlayerInputManagerController.Singleton; playerInputManagerController.AddJoinListener(); playerInputManagerController.PlayerInputManager.splitScreen = false; - playerInputManagerController.onPlayerInputJoined += AddPlayer; + playerInputManagerController.OnPlayerInputJoined += AddPlayer; if (SceneManager.GetActiveScene().name == "Menu") - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved += UpdateStartButton; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved += UpdateStartButton; if (playerInputManagerController.LocalPlayerInputs.Count > 0) { // Already played, just show the menu. @@ -107,7 +107,7 @@ private void Start() // First time in menu, play intro video. introVideo.started += StopFirstFrame; DontDestroyOnLoad(EventSystem.current); - playerInputManagerController.onPlayerInputJoined += ShowSkipText; + playerInputManagerController.OnPlayerInputJoined += ShowSkipText; defaultMenu.SetActive(false); introRoutine = StartCoroutine(WaitForIntroVideoToEnd()); } @@ -137,7 +137,7 @@ private IEnumerator WaitForIntroVideoToEnd() private void ShowSkipText(InputManager inputManager) { skipIntroText.gameObject.SetActive(true); - playerInputManagerController.onPlayerInputJoined -= ShowSkipText; + playerInputManagerController.OnPlayerInputJoined -= ShowSkipText; inputManager.onAnyKey += SkipIntro; } @@ -162,7 +162,7 @@ private void SkipIntro() private void EndIntro() { sun.Restart(); - playerInputManagerController.onPlayerInputJoined -= ShowSkipText; + playerInputManagerController.OnPlayerInputJoined -= ShowSkipText; skipIntroText.gameObject.SetActive(false); introVideo.gameObject.SetActive(false); defaultMenu.SetActive(true); @@ -171,10 +171,10 @@ private void EndIntro() private void OnDestroy() { - playerInputManagerController.onPlayerInputJoined -= AddPlayer; - playerInputManagerController.onPlayerInputJoined -= ShowSkipText; + playerInputManagerController.OnPlayerInputJoined -= AddPlayer; + playerInputManagerController.OnPlayerInputJoined -= ShowSkipText; if (SceneManager.GetActiveScene().name == "Menu") - ((Peer2PeerTransport)NetworkManager.singleton).OnPlayerRecieved -= UpdateStartButton; + ((RPRNetworkManager)NetworkManager.singleton).OnPlayerRecieved -= UpdateStartButton; } /// @@ -233,7 +233,7 @@ public void SwitchToMenu(GameObject menu) public void ChangeScene(string name) { PlayerInputManagerController.Singleton.RemoveJoinListener(); - ((Peer2PeerTransport)NetworkManager.singleton).StartMatch(name); + ((RPRNetworkManager)NetworkManager.singleton).StartMatch(name); } /// @@ -288,7 +288,7 @@ public void ReturnToMainMenu() public void StartGameButton(Selectable target) { - bool canPlay = playerInputManagerController.MatchHasAI || PlayerInputManagerController.Singleton.PlayerCount > 1; + var canPlay = playerInputManagerController.MatchHasAI || RPRNetworkManager.NumPlayers > 1; if (canPlay) { SwitchToMenu(mapSelectMenu); @@ -319,7 +319,7 @@ public void UpdateStartButton(PlayerDetails details) private void SetStartButtonState() { - bool canPlay = (playerInputManagerController.MatchHasAI || Peer2PeerTransport.NumPlayers > 1); + bool canPlay = (playerInputManagerController.MatchHasAI || RPRNetworkManager.NumPlayers > 1); var colors = startButton.colors; colors.normalColor = canPlay ? colors.highlightedColor : colors.disabledColor; startButton.colors = colors; @@ -336,7 +336,7 @@ public void HostLocalLobby() public void StartTrainingMode() { PlayerInputManagerController.Singleton.RemoveJoinListener(); - Peer2PeerTransport.StartTrainingMode(); + RPRNetworkManager.StartTrainingMode(); playerSelectManager.UpdateLobby(); } diff --git a/Assets/Scripts/UI/MainMenu/MainMenuMoveCamera.cs b/Assets/Scripts/UI/MainMenu/MainMenuMoveCamera.cs index 0bb6d4aca..74bedb2f1 100644 --- a/Assets/Scripts/UI/MainMenu/MainMenuMoveCamera.cs +++ b/Assets/Scripts/UI/MainMenu/MainMenuMoveCamera.cs @@ -52,7 +52,7 @@ public void MoveToPlayerSelect() public void MoveToLevelSelect() { - if (!(PlayerInputManagerController.Singleton.MatchHasAI || PlayerInputManagerController.Singleton.PlayerCount > 1)) + if (!(PlayerInputManagerController.Singleton.MatchHasAI || RPRNetworkManager.NumPlayers > 1)) return; inLevelSelect = true; LeanTween.sequence().append(LeanTween.moveLocal(playerSelectCamera.gameObject, secondPosition.localPosition, 1).setEaseInOutExpo()); diff --git a/Assets/Scripts/Utils/SteamManager.cs b/Assets/Scripts/Utils/SteamManager.cs index 1787a5518..db7688f94 100644 --- a/Assets/Scripts/Utils/SteamManager.cs +++ b/Assets/Scripts/Utils/SteamManager.cs @@ -172,7 +172,7 @@ private void OnJoinRequest(GameLobbyJoinRequested_t callback) { // TODO verify that the lobby *should* be joined by more players! // and verify that this is run on the server! - if (Peer2PeerTransport.NumPlayers >= Peer2PeerTransport.MaxPlayers || Peer2PeerTransport.IsInMatch) + if (RPRNetworkManager.NumPlayers >= RPRNetworkManager.MaxPlayers || RPRNetworkManager.IsInMatch) return; SteamMatchmaking.JoinLobby(callback.m_steamIDLobby); } @@ -205,7 +205,7 @@ private void OnLobbyEnter(LobbyEnter_t callback) if (NetworkServer.active) return; // Only clients from here! - ((Peer2PeerTransport)NetworkManager.singleton).JoinLobby(SteamMatchmaking.GetLobbyData(new CSteamID(callback.m_ulSteamIDLobby), hostkey)); + ((RPRNetworkManager)NetworkManager.singleton).JoinLobby(SteamMatchmaking.GetLobbyData(new CSteamID(callback.m_ulSteamIDLobby), hostkey)); } private void OnLobbyUpdate(LobbyChatUpdate_t callback)