feat: 빈사/부활 시스템 및 ReviveEffect 추가
- PlayerNetworkController에 Revive(healthPercent) 메서드와 OnRevived 이벤트 추가 - ReviveEffect 스킬 이펙트 구현 (Area/Ally 타겟팅, healthPercent로 체력 복구) - GameManager가 OnRevived 구독하여 alivePlayers 동적 복구 - GameManager.Update에서 나중에 스폰된 플레이어 자동 구독 (MPP 대응) - SkillCancelReason에 Revive 추가 - 부활 스킬/이펙트 ScriptableObject 에셋 생성 (치유 클립 임시 사용) - PlayerSkillDebugMenu에 즉사/부활/리스폰/스폰/Client1 스킬 디버그 메뉴 추가 - PlayerAbnormalityDebugHUD에 부활 버튼 추가 - DebugExecuteSkillAsServer에 실패 원인 로그 추가 - AGENTS.md에 코드 변경 후 force reload 규칙 추가
This commit is contained in:
@@ -356,6 +356,7 @@ namespace Colosseum
|
||||
#region Player Death Tracking
|
||||
|
||||
private List<PlayerNetworkController> alivePlayers = new List<PlayerNetworkController>();
|
||||
private HashSet<PlayerNetworkController> subscribedPlayers = new HashSet<PlayerNetworkController>();
|
||||
|
||||
private IEnumerator WaitForPlayersAndSubscribe()
|
||||
{
|
||||
@@ -373,16 +374,27 @@ namespace Colosseum
|
||||
var players = FindObjectsByType<PlayerNetworkController>(FindObjectsSortMode.None);
|
||||
foreach (var player in players)
|
||||
{
|
||||
player.OnDeath += HandlePlayerDeath;
|
||||
if (!player.IsDead)
|
||||
{
|
||||
alivePlayers.Add(player);
|
||||
}
|
||||
SubscribeSinglePlayer(player);
|
||||
}
|
||||
|
||||
if (debugMode)
|
||||
{
|
||||
Debug.Log($"[GameManager] Subscribed to {players.Length} players, {alivePlayers.Count} alive");
|
||||
Debug.Log($"[GameManager] Subscribed to {subscribedPlayers.Count} players, {alivePlayers.Count} alive");
|
||||
}
|
||||
}
|
||||
|
||||
private void SubscribeSinglePlayer(PlayerNetworkController player)
|
||||
{
|
||||
if (player == null || subscribedPlayers.Contains(player))
|
||||
return;
|
||||
|
||||
player.OnDeath += HandlePlayerDeath;
|
||||
player.OnRevived += HandlePlayerRevived;
|
||||
subscribedPlayers.Add(player);
|
||||
|
||||
if (!player.IsDead)
|
||||
{
|
||||
alivePlayers.Add(player);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -392,8 +404,25 @@ namespace Colosseum
|
||||
foreach (var player in players)
|
||||
{
|
||||
player.OnDeath -= HandlePlayerDeath;
|
||||
player.OnRevived -= HandlePlayerRevived;
|
||||
}
|
||||
alivePlayers.Clear();
|
||||
subscribedPlayers.Clear();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// MPP 등으로 나중에 스폰된 플레이어를 동적으로 감지하여 구독합니다.
|
||||
/// </summary>
|
||||
private void Update()
|
||||
{
|
||||
if (!IsServer || currentState.Value != GameState.Playing)
|
||||
return;
|
||||
|
||||
var players = FindObjectsByType<PlayerNetworkController>(FindObjectsSortMode.None);
|
||||
for (int i = 0; i < players.Length; i++)
|
||||
{
|
||||
SubscribeSinglePlayer(players[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private void HandlePlayerDeath(PlayerNetworkController player)
|
||||
@@ -412,6 +441,19 @@ namespace Colosseum
|
||||
}
|
||||
}
|
||||
|
||||
private void HandlePlayerRevived(PlayerNetworkController player)
|
||||
{
|
||||
if (alivePlayers.Contains(player))
|
||||
return;
|
||||
|
||||
alivePlayers.Add(player);
|
||||
|
||||
if (debugMode)
|
||||
{
|
||||
Debug.Log($"[GameManager] Player revived. Alive: {alivePlayers.Count}");
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Boss Death Tracking
|
||||
|
||||
Reference in New Issue
Block a user