From e580effe3c101dfcd3a561ba9f863816f89dce8c Mon Sep 17 00:00:00 2001 From: Ali Sharoz Date: Mon, 6 Jan 2025 22:50:11 +0500 Subject: [PATCH] Bug Fixed --- .../Character/ServerCharacter.cs | 6 +- Assets/Scripts/Gameplay/Platform.cs | 2 +- Assets/Scripts/Gameplay/PlatformManager.cs | 168 ++++++++++++++---- Assets/Scripts/Gameplay/ScoreManager.cs | 2 +- 4 files changed, 136 insertions(+), 42 deletions(-) diff --git a/Assets/Scripts/Gameplay/GameplayObjects/Character/ServerCharacter.cs b/Assets/Scripts/Gameplay/GameplayObjects/Character/ServerCharacter.cs index 8d704a5..28dccd6 100644 --- a/Assets/Scripts/Gameplay/GameplayObjects/Character/ServerCharacter.cs +++ b/Assets/Scripts/Gameplay/GameplayObjects/Character/ServerCharacter.cs @@ -307,7 +307,7 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character private void HandleOccupiedPlatform(Platform currentPlatform) { - var nearestPlatform = PlatformManager.Instance.GetNearestAvailablePlatform(transform.position); + var nearestPlatform = PlatformManager.Instance.FindNearestUnoccupiedPlatform(transform.position); if (nearestPlatform != null) { Debug.Log($"Platform {currentPlatform.PlatformID} is occupied. Moving to nearest Platform {nearestPlatform.PlatformID}."); @@ -389,8 +389,8 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character public void InitiateSwap(ServerCharacter initiatingPlayer, ServerCharacter targetPlayer) { - var initiatingPlatform = PlatformManager.Instance.GetPlayerPlatform(initiatingPlayer); - var targetPlatform = PlatformManager.Instance.GetPlayerPlatform(targetPlayer); + var initiatingPlatform = PlatformManager.Instance.GetPlatformOccupiedByPlayer(initiatingPlayer); + var targetPlatform = PlatformManager.Instance.GetPlatformOccupiedByPlayer(targetPlayer); if (initiatingPlatform == null || targetPlatform == null) { diff --git a/Assets/Scripts/Gameplay/Platform.cs b/Assets/Scripts/Gameplay/Platform.cs index d05bd4b..a7bb1de 100644 --- a/Assets/Scripts/Gameplay/Platform.cs +++ b/Assets/Scripts/Gameplay/Platform.cs @@ -25,7 +25,7 @@ namespace Unity.Multiplayer.Samples.BossRoom animator = GetComponent(); } - public void Initialize(int id) + public void AssignID(int id) { if (IsServer) PlatformID.Value = id; } diff --git a/Assets/Scripts/Gameplay/PlatformManager.cs b/Assets/Scripts/Gameplay/PlatformManager.cs index 2171339..d7fec63 100644 --- a/Assets/Scripts/Gameplay/PlatformManager.cs +++ b/Assets/Scripts/Gameplay/PlatformManager.cs @@ -10,81 +10,175 @@ namespace Unity.Multiplayer.Samples.BossRoom public class PlatformManager : NetworkBehaviour { public static PlatformManager Instance; - private List platforms; + public List m_Platforms; + public int numberOfPlayers = 2; // Number of players (n) + public float planeRadius = 4f; // Radius of the circular plane private void Awake() { if (Instance != null && Instance != this) + { Destroy(gameObject); + } else + { Instance = this; + } } private void Start() { - platforms = GetComponentsInChildren(true).ToList(); - if (IsServer) StartCoroutine(ServerSetup()); - else StartCoroutine(ClientSetup()); + if (IsServer) + { + m_Platforms = GetComponentsInChildren(true).ToList(); + for (int i = 0; i < m_Platforms.Count; i++) + { + m_Platforms[i].AssignID(i + 1); // Initialize platforms with unique IDs + } + StartCoroutine(DelayedServerSetup()); + } + else + { + StartCoroutine(DelayedClientSetup()); // Delay to give time to load + } } - private IEnumerator ServerSetup() + /// + /// Coroutine to delay server-side setup. + /// + private IEnumerator DelayedServerSetup() { - yield return new WaitForSeconds(0.5f); - ActivatePlatformsServerRpc(); + yield return new WaitForSeconds(0.5f); // Delay for 0.5 seconds + PlatformSelectionServerRpc(); // Call ServerRpc after delay } - private IEnumerator ClientSetup() + /// + /// Coroutine to delay client-side setup. + /// + private IEnumerator DelayedClientSetup() { yield return new WaitForSeconds(0.5f); - platforms = GetComponentsInChildren(true).ToList(); + m_Platforms = GetComponentsInChildren(true).ToList(); // Populate client platform list + Debug.Log($"Client platform list initialized. Platform count: {m_Platforms.Count}"); } [ServerRpc(RequireOwnership = false)] - private void ActivatePlatformsServerRpc() + private void PlatformSelectionServerRpc() { - int activeCount = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1; - if (activeCount <= 0) return; - - platforms.ForEach(p => p.gameObject.SetActive(false)); - for (int i = 0; i < activeCount; i++) - platforms[i].gameObject.SetActive(true); - - var activeIds = platforms.Where(p => p.gameObject.activeSelf).Select(p => p.PlatformID.Value).ToArray(); - ActivatePlatformsClientRpc(activeIds); + int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1; + + m_Platforms.ForEach(platform => platform.gameObject.SetActive(false)); + Debug.Log("Disabled all platforms on the server."); + + if (platformsToSpawn > 0) + { + for (int i = 0; i < platformsToSpawn; i++) + { + m_Platforms[i].gameObject.SetActive(true); + Debug.Log($"Enabled platform with ID {m_Platforms[i].PlatformID.Value} on server."); + } + } + m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); + //float angleIncrement = 360f / platformsToSpawn; + //for (int i = 0; i < platformsToSpawn; i++) + //{ + // m_Platforms[i].transform.position = new Vector3( + // Mathf.Cos(i * angleIncrement * Mathf.Deg2Rad) * planeRadius, + // 0f, + // Mathf.Sin(i * angleIncrement * Mathf.Deg2Rad) * planeRadius + // ); + //} + + int[] platformIDs = m_Platforms.Select(p => p.PlatformID.Value).ToArray(); + ClientEnablePlatformClientRpc(platformIDs); } [ClientRpc] - private void ActivatePlatformsClientRpc(int[] platformIds) + private void ClientEnablePlatformClientRpc(int[] platformIDs) { - platforms = GetComponentsInChildren(true).ToList(); - platforms.ForEach(p => p.gameObject.SetActive(false)); + m_Platforms = GetComponentsInChildren(true).ToList(); // Ensure the platform list is refreshed + Debug.Log($"Client received platform IDs: {string.Join(",", platformIDs)}"); + Debug.Log($"Client platform list count: {m_Platforms.Count}"); + + foreach (var platform in m_Platforms) + { + platform.gameObject.SetActive(false); + Debug.Log($"Disabled platform with ID: {platform.PlatformID.Value}"); + } + + foreach (int id in platformIDs) + { + var platformToEnable = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == id); + if (platformToEnable != null) + { + platformToEnable.gameObject.SetActive(true); + Debug.Log($"Enabled platform with ID: {id}"); + } + else + { + Debug.LogError($"Platform with ID {id} not found on client."); + } + } + m_Platforms = m_Platforms.Where(platform => platform.gameObject.activeSelf).ToList(); - foreach (int id in platformIds) - platforms.FirstOrDefault(p => p.PlatformID.Value == id)?.gameObject.SetActive(true); } - - public Platform GetNearestAvailablePlatform(Vector3 position) + public Platform FindNearestUnoccupiedPlatform(Vector3 position) { - return IsServer ? platforms.Where(p => !p.IsOccupied).OrderBy(p => Vector3.Distance(position, p.transform.position)).FirstOrDefault() : null; + if (!IsServer) + { + Debug.LogError("FindNearestUnoccupiedPlatform should only be called on the server."); + return null; + } + + return m_Platforms + .Where(platform => !platform.IsOccupied) + .OrderBy(platform => Vector3.Distance(position, platform.transform.position)) + .FirstOrDefault(); } - public bool AllPlatformsOccupied() => platforms.All(p => p.IsOccupied); + public bool AreAllPlatformsOccupied() + { + return m_Platforms.All(platform => platform.IsOccupied); + } public bool AssignPlayerToPlatform(ServerCharacter player) { - if (!IsServer) return false; - - var availablePlatform = platforms.FirstOrDefault(p => !p.IsOccupied); - if (availablePlatform == null) return false; + if (!IsServer) + { + Debug.LogError("AssignPlayerToPlatform should only be called on the server."); + return false; + } + + var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied); + if (platform != null) + { + platform.Occupy(player); + return true; + } + + Debug.LogWarning($"No unoccupied platforms available for {player.name}."); + return false; + } - availablePlatform.Occupy(player); - return true; + public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) + { + return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); } - public Platform GetPlayerPlatform(ServerCharacter player) => platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); + public bool IsPlatformOccupied(Platform platform) + { + return platform.IsOccupied; + } - public Vector3 GetPlatformPosition(int platformId) => platforms.FirstOrDefault(p => p.PlatformID.Value == platformId)?.transform.position ?? Vector3.zero; + public Vector3 GetPlatformPosition(int platformId) + { + var platform = m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); + return platform ? platform.transform.position : Vector3.zero; + } - public Platform GetPlatformById(int platformId) => platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); + public Platform GetPlatformById(int platformId) + { + return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); + } } } diff --git a/Assets/Scripts/Gameplay/ScoreManager.cs b/Assets/Scripts/Gameplay/ScoreManager.cs index 5076bb7..488da8e 100644 --- a/Assets/Scripts/Gameplay/ScoreManager.cs +++ b/Assets/Scripts/Gameplay/ScoreManager.cs @@ -101,7 +101,7 @@ public class ScoreManager : NetworkBehaviour private IEnumerator ApplyCrowPenaltyCoroutine() { - yield return new WaitUntil(() => PlatformManager.Instance != null && PlatformManager.Instance.AllPlatformsOccupied()); + yield return new WaitUntil(() => PlatformManager.Instance != null && PlatformManager.Instance.AreAllPlatformsOccupied()); while (true) {