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; private List m_Platforms; 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(); // Assign unique IDs to each platform 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."); } } 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); } } }