using UnityEngine; using System.Collections; /// /// MinimapMarkerManager - Automatically adds MinimapMarker components to all characters. /// Works in BOTH Cash System mode AND Practice mode. /// Attach to a manager object in the scene or it will be created automatically. /// public class MinimapMarkerManager : MonoBehaviour { [Header("Settings")] [SerializeField] private bool autoSetupOnStart = true; [SerializeField] private float refreshInterval = 2f; private static MinimapMarkerManager instance; public static MinimapMarkerManager Instance => instance; private void Awake() { if (instance != null && instance != this) { Destroy(gameObject); return; } instance = this; } private void Start() { // REMOVED: Cash System only check - now works in ALL modes // This allows minimap markers in Practice mode too // Configure Main Camera to NOT render minimap layers ConfigureMainCamera(); if (autoSetupOnStart) { StartCoroutine(SetupMarkersDelayed()); } Debug.Log("[MinimapMarkerManager] Initialized - works in all game modes"); } /// /// Configure Main Camera to exclude minimap marker layers /// private void ConfigureMainCamera() { Camera mainCam = Camera.main; if (mainCam == null) return; int minimapLayer = LayerMask.NameToLayer("Minimap"); if (minimapLayer >= 0) { // Remove Minimap layer from main camera culling mask mainCam.cullingMask &= ~(1 << minimapLayer); Debug.Log($"[MinimapMarkerManager] Excluded 'Minimap' layer from Main Camera"); } else { // Remove layer 31 (fallback) from main camera culling mask mainCam.cullingMask &= ~(1 << 31); Debug.Log("[MinimapMarkerManager] Excluded layer 31 (fallback) from Main Camera"); } } private IEnumerator SetupMarkersDelayed() { // Wait for characters to spawn yield return new WaitForSeconds(1.5f); SetupAllMarkers(); // Periodic refresh for newly spawned characters while (enabled) { yield return new WaitForSeconds(refreshInterval); RefreshMarkers(); } } /// /// Add MinimapMarker to all characters that don't have one /// public void SetupAllMarkers() { // Find all team members (characters) TeamMember[] allTeamMembers = FindObjectsOfType(); foreach (var member in allTeamMembers) { AddMarkerIfMissing(member.gameObject); } // Find all characters with HealthNew (covers AI enemies too) HealthNew[] allCharacters = FindObjectsOfType(); foreach (var character in allCharacters) { AddMarkerIfMissing(character.gameObject); } // Find all CashBags and add object markers (only relevant in Cash System) CashMag[] allCashBags = FindObjectsOfType(); foreach (var cashBag in allCashBags) { AddObjectMarkerIfMissing(cashBag.gameObject); } // Find all TeamVaults and add object markers TeamVault[] allVaults = FindObjectsOfType(); foreach (var vault in allVaults) { AddObjectMarkerIfMissing(vault.gameObject); } Debug.Log($"[MinimapMarkerManager] Setup markers: {allTeamMembers.Length} characters, " + $"{allCashBags.Length} cashbags, {allVaults.Length} vaults"); } /// /// Check for new characters and objects and add markers /// public void RefreshMarkers() { // Only add markers to NEW objects that don't have them yet // The "IfMissing" check prevents duplicates TeamMember[] allTeamMembers = FindObjectsOfType(); foreach (var member in allTeamMembers) { AddMarkerIfMissing(member.gameObject); } // NOTE: We intentionally skip HealthNew scan to avoid double-adding // to characters that already got a marker via TeamMember above. // Skip CashBag/Vault refresh — they get their marker once in SetupAllMarkers // and the component stays on the prefab/instance. Re-scanning caused duplicates. // Refresh colors on all markers MinimapMarker.RefreshAllMarkers(); } private void AddObjectMarkerIfMissing(GameObject obj) { if (obj.GetComponent() == null) { obj.AddComponent(); Debug.Log($"[MinimapMarkerManager] Added MinimapObjectMarker to {obj.name}"); } } private void AddMarkerIfMissing(GameObject character) { if (character.GetComponent() == null) { character.AddComponent(); Debug.Log($"[MinimapMarkerManager] Added MinimapMarker to {character.name}"); } } /// /// Manually add marker to a specific character /// public void AddMarker(GameObject character) { AddMarkerIfMissing(character); } /// /// Static helper to ensure manager exists in scene /// public static void EnsureExists() { if (instance == null) { GameObject managerObj = new GameObject("MinimapMarkerManager"); managerObj.AddComponent(); Debug.Log("[MinimapMarkerManager] Created MinimapMarkerManager automatically"); } } }