feat: 경직 면역 기반 시전 보호 및 지원 스킬 안정성 보강
- 경직 면역 이상상태와 시전 시작 효과를 추가해 철벽, 방어 태세, 치유, 광역 치유, 보호막에 데이터 기반 시전 보호를 연결 - AbnormalityManager와 HitReactionController가 경직 면역 상태를 존중하도록 보강해 일반 피격 반응으로 인한 즉시 취소를 줄임 - SkillData에 castStartEffects를 추가하고 SkillController가 시전 시작 효과를 실행하도록 확장 - 드로그전 재검증에서 철벽, 치유, 광역 치유가 실제 전투 중 취소 없이 완료되는 것을 확인하고 보호막의 후속 피격 체감을 추가 점검 대상으로 정리 - HUD/문서 반영 과정에서 필요한 TMP_MaruBuri, TMP_SuseongBatang 아틀라스 갱신을 함께 포함
This commit is contained in:
@@ -68,6 +68,9 @@ namespace Colosseum.Abnormalities
|
||||
[Tooltip("플레이어 HUD의 이상상태 UI에 표시할지 여부")]
|
||||
public bool showInUI = true;
|
||||
|
||||
[Tooltip("활성 중에는 일반 피격 반응(경직, 넉백, 다운)을 무시할지 여부")]
|
||||
public bool ignoreHitReaction = false;
|
||||
|
||||
[Header("스탯 수정자")]
|
||||
[Tooltip("스탯에 적용할 수정자 목록")]
|
||||
public List<AbnormalityStatModifier> statModifiers = new List<AbnormalityStatModifier>();
|
||||
|
||||
@@ -31,6 +31,7 @@ namespace Colosseum.Abnormalities
|
||||
private int stunCount;
|
||||
private int silenceCount;
|
||||
private int invincibleCount;
|
||||
private int hitReactionImmuneCount;
|
||||
private float slowMultiplier = 1f;
|
||||
private float incomingDamageMultiplier = 1f;
|
||||
|
||||
@@ -38,6 +39,7 @@ namespace Colosseum.Abnormalities
|
||||
private NetworkVariable<int> syncedStunCount = new NetworkVariable<int>(0);
|
||||
private NetworkVariable<int> syncedSilenceCount = new NetworkVariable<int>(0);
|
||||
private NetworkVariable<int> syncedInvincibleCount = new NetworkVariable<int>(0);
|
||||
private NetworkVariable<int> syncedHitReactionImmuneCount = new NetworkVariable<int>(0);
|
||||
private NetworkVariable<float> syncedSlowMultiplier = new NetworkVariable<float>(1f);
|
||||
|
||||
// 네트워크 동기화용 데이터
|
||||
@@ -58,6 +60,11 @@ namespace Colosseum.Abnormalities
|
||||
/// </summary>
|
||||
public bool IsInvincible => GetCurrentInvincibleCount() > 0;
|
||||
|
||||
/// <summary>
|
||||
/// 일반 피격 반응 무시 상태 여부
|
||||
/// </summary>
|
||||
public bool IsHitReactionImmune => GetCurrentHitReactionImmuneCount() > 0;
|
||||
|
||||
/// <summary>
|
||||
/// 이동 속도 배율 (1.0 = 기본, 0.5 = 50% 감소)
|
||||
/// </summary>
|
||||
@@ -131,6 +138,7 @@ namespace Colosseum.Abnormalities
|
||||
syncedStunCount.OnValueChanged += HandleSyncedStunChanged;
|
||||
syncedSilenceCount.OnValueChanged += HandleSyncedSilenceChanged;
|
||||
syncedInvincibleCount.OnValueChanged += HandleSyncedInvincibleChanged;
|
||||
syncedHitReactionImmuneCount.OnValueChanged += HandleSyncedHitReactionImmuneChanged;
|
||||
syncedSlowMultiplier.OnValueChanged += HandleSyncedSlowChanged;
|
||||
|
||||
if (networkController != null)
|
||||
@@ -150,6 +158,7 @@ namespace Colosseum.Abnormalities
|
||||
syncedStunCount.OnValueChanged -= HandleSyncedStunChanged;
|
||||
syncedSilenceCount.OnValueChanged -= HandleSyncedSilenceChanged;
|
||||
syncedInvincibleCount.OnValueChanged -= HandleSyncedInvincibleChanged;
|
||||
syncedHitReactionImmuneCount.OnValueChanged -= HandleSyncedHitReactionImmuneChanged;
|
||||
syncedSlowMultiplier.OnValueChanged -= HandleSyncedSlowChanged;
|
||||
|
||||
if (networkController != null)
|
||||
@@ -431,6 +440,11 @@ namespace Colosseum.Abnormalities
|
||||
{
|
||||
bool enteredStun = false;
|
||||
|
||||
if (data.ignoreHitReaction)
|
||||
{
|
||||
hitReactionImmuneCount++;
|
||||
}
|
||||
|
||||
switch (data.controlType)
|
||||
{
|
||||
case ControlType.Stun:
|
||||
@@ -461,6 +475,11 @@ namespace Colosseum.Abnormalities
|
||||
|
||||
private void RemoveControlEffect(AbnormalityData data)
|
||||
{
|
||||
if (data.ignoreHitReaction)
|
||||
{
|
||||
hitReactionImmuneCount = Mathf.Max(0, hitReactionImmuneCount - 1);
|
||||
}
|
||||
|
||||
switch (data.controlType)
|
||||
{
|
||||
case ControlType.Stun:
|
||||
@@ -516,6 +535,8 @@ namespace Colosseum.Abnormalities
|
||||
|
||||
private int GetCurrentInvincibleCount() => IsServer ? invincibleCount : syncedInvincibleCount.Value;
|
||||
|
||||
private int GetCurrentHitReactionImmuneCount() => IsServer ? hitReactionImmuneCount : syncedHitReactionImmuneCount.Value;
|
||||
|
||||
private float GetCurrentSlowMultiplier() => IsServer ? slowMultiplier : syncedSlowMultiplier.Value;
|
||||
|
||||
private void SyncControlEffects()
|
||||
@@ -526,6 +547,7 @@ namespace Colosseum.Abnormalities
|
||||
syncedStunCount.Value = stunCount;
|
||||
syncedSilenceCount.Value = silenceCount;
|
||||
syncedInvincibleCount.Value = invincibleCount;
|
||||
syncedHitReactionImmuneCount.Value = hitReactionImmuneCount;
|
||||
syncedSlowMultiplier.Value = slowMultiplier;
|
||||
}
|
||||
|
||||
@@ -606,6 +628,14 @@ namespace Colosseum.Abnormalities
|
||||
OnAbnormalitiesChanged?.Invoke();
|
||||
}
|
||||
|
||||
private void HandleSyncedHitReactionImmuneChanged(int oldValue, int newValue)
|
||||
{
|
||||
if (oldValue == newValue)
|
||||
return;
|
||||
|
||||
OnAbnormalitiesChanged?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 사망 시 활성 이상 상태를 모두 제거합니다.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user