using System.Collections; using System.Collections.Generic; using System.Linq; using Unity.BossRoom.Gameplay.GameplayObjects.Character; using Unity.Netcode; using UnityEngine; namespace Unity.Multiplayer.Samples.BossRoom { public class PlatformManager : NetworkBehaviour { public static PlatformManager Instance; 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() { 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 } } /// /// Coroutine to delay server-side setup. /// private IEnumerator DelayedServerSetup() { yield return new WaitForSeconds(0.5f); // Delay for 0.5 seconds PlatformSelectionServerRpc(); // Call ServerRpc after delay } /// /// Coroutine to delay client-side setup. /// private IEnumerator DelayedClientSetup() { yield return new WaitForSeconds(0.5f); 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 PlatformSelectionServerRpc() { 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 ClientEnablePlatformClientRpc(int[] platformIDs) { 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(); } public Platform FindNearestUnoccupiedPlatform(Vector3 position) { 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 AreAllPlatformsOccupied() { return m_Platforms.All(platform => platform.IsOccupied); } public bool AssignPlayerToPlatform(ServerCharacter player) { 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; } public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) { return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId); } public bool IsPlatformOccupied(Platform platform) { return platform.IsOccupied; } 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) { return m_Platforms.FirstOrDefault(p => p.PlatformID.Value == platformId); } } }