using UnityEngine; using Unity.Netcode; namespace Northbound { /// /// 블랙스미스 건물 - 업그레이드 구매 가능 /// public class Blacksmith : NetworkBehaviour, IInteractable, IVisionProvider, ITeamMember { [Header("Vision Settings")] [Tooltip("블랙스미스가 제공하는 시야 범위")] public float visionRange = 10f; [Header("Team")] [Tooltip("건물의 팀")] public TeamType initialTeam = TeamType.Player; [Header("UI Reference")] [SerializeField] private GameObject _upgradePopupPrefab; private GameObject _popupInstance; private UpgradeListPopup _upgradePopup; private void Awake() { // 프리팹이 없으면 Resources에서 로드 if (_upgradePopupPrefab == null) { _upgradePopupPrefab = Resources.Load("UI/Upgrade/UpgradeListPopup"); } } #region IInteractable Implementation public bool CanInteract(ulong playerId) { return true; } public void Interact(ulong playerId) { OpenUpgradePopup(playerId); } public string GetInteractionPrompt() { return "[F] Upgrade"; } public string GetInteractionAnimation() { return ""; } public EquipmentData GetEquipmentData() { return null; } public Transform GetTransform() { return transform; } #endregion private void OpenUpgradePopup(ulong playerId) { // 플레이어의 UpgradeManager와 Stats 찾기 var playerObj = GetPlayerObject(playerId); if (playerObj == null) { Debug.LogWarning($"[Blacksmith] 플레이어 {playerId}를 찾을 수 없습니다."); return; } var upgradeManager = playerObj.GetComponent(); var playerStats = playerObj.GetComponent(); if (upgradeManager == null || playerStats == null) { Debug.LogWarning("[Blacksmith] PlayerUpgradeManager 또는 PlayerStats가 없습니다."); return; } // 팝업 생성 if (_popupInstance == null && _upgradePopupPrefab != null) { _popupInstance = Instantiate(_upgradePopupPrefab); _upgradePopup = _popupInstance.GetComponent(); if (_upgradePopup == null) { _upgradePopup = _popupInstance.AddComponent(); } } // 팝업 초기화 및 열기 if (_upgradePopup != null) { _upgradePopup.Initialize(upgradeManager, playerStats); } } private GameObject GetPlayerObject(ulong playerId) { if (NetworkManager.Singleton == null) return null; // NetworkManager에서 플레이어 오브젝트 찾기 foreach (var netObj in NetworkManager.Singleton.SpawnManager.SpawnedObjects.Values) { var controller = netObj.GetComponent(); if (controller != null && controller.OwnerPlayerId == playerId) { return netObj.gameObject; } } return null; } public override void OnDestroy() { if (_popupInstance != null) { Destroy(_popupInstance); } base.OnDestroy(); } #region NetworkBehaviour Overrides public override void OnNetworkSpawn() { if (IsServer) { // 시야 제공자로 등록 FogOfWarSystem.Instance?.RegisterVisionProvider(this); } } public override void OnNetworkDespawn() { if (IsServer) { // 시야 제공자 등록 해제 FogOfWarSystem.Instance?.UnregisterVisionProvider(this); } } #endregion #region IVisionProvider Implementation public ulong GetOwnerId() => 0; // 블랙스미스는 모든 플레이어에게 시야 제공 public float GetVisionRange() => visionRange; Transform IVisionProvider.GetTransform() => transform; public bool IsActive() => IsSpawned; TeamType IVisionProvider.GetTeam() => initialTeam; #endregion #region ITeamMember Implementation public TeamType GetTeam() => initialTeam; public bool IsDead() => false; // 블랙스미스는 파괴되지 않음 public void SetTeam(TeamType team) { // 블랙스미스의 팀은 변경할 수 없음 Debug.LogWarning("[Blacksmith] 블랙스미스의 팀은 변경할 수 없습니다."); } #endregion } }