건물 체력 시스템 추가
건물 시야 시스템은 기본 건물데이터에 통합
This commit is contained in:
@@ -113,41 +113,136 @@ namespace Northbound
|
||||
return false;
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
|
||||
public void PlaceBuildingServerRpc(int buildingIndex, Vector3 position, int rotation)
|
||||
/// <summary>
|
||||
/// 건물 배치 요청 (클라이언트에서 호출)
|
||||
/// </summary>
|
||||
public void RequestPlaceBuilding(int buildingIndex, Vector3 position, int rotation)
|
||||
{
|
||||
if (buildingIndex < 0 || buildingIndex >= availableBuildings.Count)
|
||||
if (!NetworkManager.Singleton.IsClient)
|
||||
{
|
||||
Debug.LogWarning("[BuildingManager] 클라이언트가 아닙니다.");
|
||||
return;
|
||||
}
|
||||
|
||||
ulong clientId = NetworkManager.Singleton.LocalClientId;
|
||||
PlaceBuildingServerRpc(buildingIndex, position, rotation, clientId);
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
|
||||
private void PlaceBuildingServerRpc(int buildingIndex, Vector3 position, int rotation, ulong requestingClientId)
|
||||
{
|
||||
// 보안 검증 1: 유효한 클라이언트인지 확인
|
||||
if (!NetworkManager.Singleton.ConnectedClients.ContainsKey(requestingClientId))
|
||||
{
|
||||
Debug.LogWarning($"<color=red>[BuildingManager] 유효하지 않은 클라이언트 ID: {requestingClientId}</color>");
|
||||
return;
|
||||
}
|
||||
|
||||
// 보안 검증 2: 건물 인덱스 유효성 확인
|
||||
if (buildingIndex < 0 || buildingIndex >= availableBuildings.Count)
|
||||
{
|
||||
Debug.LogWarning($"<color=red>[BuildingManager] 유효하지 않은 건물 인덱스: {buildingIndex} (클라이언트: {requestingClientId})</color>");
|
||||
return;
|
||||
}
|
||||
|
||||
BuildingData data = availableBuildings[buildingIndex];
|
||||
|
||||
// IsValidPlacement now returns snapped position in groundPosition
|
||||
if (!IsValidPlacement(data, position, rotation, out Vector3 snappedPosition))
|
||||
// 보안 검증 3: 건물 데이터 유효성 확인
|
||||
if (data == null || data.prefab == null)
|
||||
{
|
||||
Debug.LogWarning($"<color=red>[BuildingManager] 건물 데이터가 유효하지 않습니다. (클라이언트: {requestingClientId})</color>");
|
||||
return;
|
||||
}
|
||||
|
||||
// 배치 가능 여부 확인
|
||||
if (!IsValidPlacement(data, position, rotation, out Vector3 snappedPosition))
|
||||
{
|
||||
Debug.LogWarning($"<color=yellow>[BuildingManager] 건물 배치 불가능 위치 (클라이언트: {requestingClientId})</color>");
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3Int gridPosition = WorldToGrid(snappedPosition);
|
||||
|
||||
// Spawn building at snapped position
|
||||
// 건물 생성
|
||||
GameObject buildingObj = Instantiate(data.prefab, snappedPosition + data.placementOffset, Quaternion.Euler(0, rotation * 90f, 0));
|
||||
NetworkObject netObj = buildingObj.GetComponent<NetworkObject>();
|
||||
|
||||
if (netObj != null)
|
||||
{
|
||||
netObj.Spawn();
|
||||
// 건물의 소유자를 설정
|
||||
netObj.SpawnWithOwnership(requestingClientId);
|
||||
|
||||
Building building = buildingObj.GetComponent<Building>();
|
||||
if (building == null)
|
||||
{
|
||||
building = buildingObj.AddComponent<Building>();
|
||||
}
|
||||
|
||||
building.Initialize(data, gridPosition, rotation);
|
||||
// 건물 초기화
|
||||
building.Initialize(data, gridPosition, rotation, requestingClientId);
|
||||
placedBuildings.Add(building);
|
||||
|
||||
Debug.Log($"<color=green>[BuildingManager] {data.buildingName} 건설 완료 (소유자: {requestingClientId}, 위치: {gridPosition})</color>");
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError($"<color=red>[BuildingManager] NetworkObject 컴포넌트가 없습니다! (Prefab: {data.prefab.name})</color>");
|
||||
Destroy(buildingObj);
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveBuilding(Building building)
|
||||
{
|
||||
if (placedBuildings.Contains(building))
|
||||
{
|
||||
placedBuildings.Remove(building);
|
||||
Debug.Log($"<color=yellow>[BuildingManager] 건물 제거됨: {building.buildingData?.buildingName ?? "Unknown"}</color>");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 사전 배치 건물 등록 (씬에 미리 있는 건물용)
|
||||
/// </summary>
|
||||
public void RegisterPrePlacedBuilding(Building building)
|
||||
{
|
||||
if (!placedBuildings.Contains(building))
|
||||
{
|
||||
placedBuildings.Add(building);
|
||||
Debug.Log($"<color=cyan>[BuildingManager] 사전 배치 건물 등록: {building.buildingData?.buildingName ?? building.gameObject.name}</color>");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 위치에 건물이 있는지 확인
|
||||
/// </summary>
|
||||
public Building GetBuildingAtPosition(Vector3Int gridPosition)
|
||||
{
|
||||
foreach (var building in placedBuildings)
|
||||
{
|
||||
if (building != null && building.gridPosition == gridPosition)
|
||||
{
|
||||
return building;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 특정 소유자의 모든 건물 가져오기
|
||||
/// </summary>
|
||||
public List<Building> GetBuildingsByOwner(ulong ownerId)
|
||||
{
|
||||
List<Building> ownedBuildings = new List<Building>();
|
||||
|
||||
foreach (var building in placedBuildings)
|
||||
{
|
||||
if (building != null && building.GetOwnerId() == ownerId)
|
||||
{
|
||||
ownedBuildings.Add(building);
|
||||
}
|
||||
}
|
||||
|
||||
return ownedBuildings;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user