Files
Northbound/Assets/Scripts/Buildings/Blacksmith.cs

183 lines
5.1 KiB
C#

using UnityEngine;
using Unity.Netcode;
namespace Northbound
{
/// <summary>
/// 블랙스미스 건물 - 업그레이드 구매 가능
/// </summary>
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<GameObject>("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<PlayerUpgradeManager>();
var playerStats = playerObj.GetComponent<PlayerStats>();
if (upgradeManager == null || playerStats == null)
{
Debug.LogWarning("[Blacksmith] PlayerUpgradeManager 또는 PlayerStats가 없습니다.");
return;
}
// 팝업 생성
if (_popupInstance == null && _upgradePopupPrefab != null)
{
_popupInstance = Instantiate(_upgradePopupPrefab);
_upgradePopup = _popupInstance.GetComponent<UpgradeListPopup>();
if (_upgradePopup == null)
{
_upgradePopup = _popupInstance.AddComponent<UpgradeListPopup>();
}
}
// 팝업 초기화 및 열기
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<NetworkPlayerController>();
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
}
}