diff --git a/Game/Scripts/Networking/LobbyGameSceneCoordinator.cs b/Game/Scripts/Networking/LobbyGameSceneCoordinator.cs index 51cbd08..adc972c 100644 --- a/Game/Scripts/Networking/LobbyGameSceneCoordinator.cs +++ b/Game/Scripts/Networking/LobbyGameSceneCoordinator.cs @@ -223,6 +223,10 @@ namespace MegaKoop.Game.Networking if (thirdPersonCamera != null) { thirdPersonCamera.enabled = info.IsLocal; + if (info.IsLocal) + { + thirdPersonCamera.SetTarget(clone.transform); + } } } diff --git a/Game/Scripts/Networking/SteamCharacterNetworkBridge.cs b/Game/Scripts/Networking/SteamCharacterNetworkBridge.cs index b940e7f..1bea542 100644 --- a/Game/Scripts/Networking/SteamCharacterNetworkBridge.cs +++ b/Game/Scripts/Networking/SteamCharacterNetworkBridge.cs @@ -93,6 +93,15 @@ namespace MegaKoop.Game.Networking private void Update() { + if (networkManager == null) + { + networkManager = SteamCoopNetworkManager.Instance; + if (networkManager != null) + { + RegisterHandlers(); + } + } + if (networkManager == null) { return; @@ -178,7 +187,8 @@ namespace MegaKoop.Game.Networking } else { - characterController.enabled = false; + characterController.enabled = isLocalPlayer; + characterController.SetInputSource(null); } } diff --git a/Game/Scripts/Networking/SteamCoopNetworkManager.cs b/Game/Scripts/Networking/SteamCoopNetworkManager.cs index e46e07d..896a31f 100644 --- a/Game/Scripts/Networking/SteamCoopNetworkManager.cs +++ b/Game/Scripts/Networking/SteamCoopNetworkManager.cs @@ -132,11 +132,23 @@ namespace MegaKoop.Game.Networking isHost = steamService.IsHost; #if STEAMWORKSNET - if (steamService.IsInLobby && p2pTransport != null) + if (p2pTransport != null) { - if (ulong.TryParse(steamService.LobbyIdString, out ulong lobbyValue) && lobbyValue != 0) + if (steamService.IsInLobby) { - p2pTransport.SetActiveLobby(new CSteamID(lobbyValue)); + CSteamID lobbyId = steamService.LobbyId; + if (lobbyId != CSteamID.Nil) + { + p2pTransport.SetActiveLobby(lobbyId); + } + else if (ulong.TryParse(steamService.LobbyIdString, out ulong lobbyValue) && lobbyValue != 0) + { + p2pTransport.SetActiveLobby(new CSteamID(lobbyValue)); + } + } + else + { + p2pTransport.SetActiveLobby(CSteamID.Nil); } } #endif diff --git a/UI/Scripts/UGUIMultiplayerLobbyController.cs b/UI/Scripts/UGUIMultiplayerLobbyController.cs index 244b9e6..39d5e8a 100644 --- a/UI/Scripts/UGUIMultiplayerLobbyController.cs +++ b/UI/Scripts/UGUIMultiplayerLobbyController.cs @@ -79,6 +79,7 @@ namespace MegaKoop.UI // Steam service private SteamLobbyService steam; private LobbyGameSceneCoordinator lobbyGameCoordinator; + private SteamCoopNetworkManager coopNetworkManager; // Local state cache private bool IsInLobby => steam != null && steam.IsInLobby; @@ -386,12 +387,33 @@ namespace MegaKoop.UI EnsureComponent(); EnsureComponent(); - var coopManager = EnsureComponent(); - coopManager.SynchronizeWithLobby(steam); + coopNetworkManager = EnsureComponent(); + coopNetworkManager.SynchronizeWithLobby(steam); lobbyGameCoordinator = servicesRoot.GetComponent() ?? servicesRoot.AddComponent(); DontDestroyOnLoad(servicesRoot); } + + SyncCoopNetwork(); + } + + private void SyncCoopNetwork() + { + if (steam == null) + { + return; + } + + if (coopNetworkManager == null) + { +#if UNITY_2023_1_OR_NEWER + coopNetworkManager = Object.FindFirstObjectByType(FindObjectsInactive.Include); +#else + coopNetworkManager = Object.FindObjectOfType(); +#endif + } + + coopNetworkManager?.SynchronizeWithLobby(steam); } private void RegisterSteamEvents() @@ -404,6 +426,11 @@ namespace MegaKoop.UI steam.OnLobbyDataUpdated += OnLobbyDataUpdated; steam.OnJoinFailed += OnJoinFailed; steam.OnAvatarUpdated += OnAvatarUpdated; + steam.OnLobbyCreated += HandleLobbyCreatedSync; + steam.OnLobbyEntered += HandleLobbyEnteredSync; + steam.OnLobbyLeft += HandleLobbyLeftSync; + steam.OnMembersChanged += HandleMembersChangedSync; + steam.OnLobbyDataUpdated += HandleLobbyDataUpdatedSync; } private void UnregisterSteamEvents() @@ -416,6 +443,11 @@ namespace MegaKoop.UI steam.OnLobbyDataUpdated -= OnLobbyDataUpdated; steam.OnJoinFailed -= OnJoinFailed; steam.OnAvatarUpdated -= OnAvatarUpdated; + steam.OnLobbyCreated -= HandleLobbyCreatedSync; + steam.OnLobbyEntered -= HandleLobbyEnteredSync; + steam.OnLobbyLeft -= HandleLobbyLeftSync; + steam.OnMembersChanged -= HandleMembersChangedSync; + steam.OnLobbyDataUpdated -= HandleLobbyDataUpdatedSync; } private void OnLobbyCreated() @@ -451,6 +483,31 @@ namespace MegaKoop.UI UpdateUIFromSteam(); } + private void HandleLobbyCreatedSync() + { + SyncCoopNetwork(); + } + + private void HandleLobbyEnteredSync() + { + SyncCoopNetwork(); + } + + private void HandleLobbyLeftSync() + { + SyncCoopNetwork(); + } + + private void HandleMembersChangedSync() + { + SyncCoopNetwork(); + } + + private void HandleLobbyDataUpdatedSync() + { + SyncCoopNetwork(); + } + private void OnMembersChanged() => UpdateUIFromSteam(); private void OnLobbyDataUpdated() => UpdateUIFromSteam(); private void OnJoinFailed(string reason) { Debug.LogWarning($"[Lobby] Join failed: {reason}"); UpdateUIFromSteam(); }