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) // Ensure only the server assigns IDs and initializes { m_Platforms = GetComponentsInChildren().ToList(); for (int i = 0; i < m_Platforms.Count; i++) { m_Platforms[i].AssignID(i + 1); // IDs start from 1 } Debug.Log("All platforms have been assigned unique IDs."); Starter(); } } void Starter() { int platformsToSpawn = PlayerPrefs.GetInt("NumberOfLobbyPlayers") - 1; if (platformsToSpawn <= 0) return; m_Platforms.ForEach(platform => platform.gameObject.SetActive(false)); for (int i = 0; i < platformsToSpawn; i++) m_Platforms[i].gameObject.SetActive(true); m_Platforms = m_Platforms.Where(p => p.gameObject.activeInHierarchy).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 ); } 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 == platformId); return platform ? platform.transform.position : Vector3.zero; } public Platform GetPlatformById(int platformId) { return m_Platforms.FirstOrDefault(p => p.PlatformID == platformId); } } }