fix(combat): 统一受击无敌闸门并修复 DoT 失效
将无敌判定收口到 PlayerController.TakeDamage(DamageInfo) 单一闸门并认 DamageFlags.IgnoreIFrame,PlayerStats 拆出原始扣血 ApplyDamage;新增 DamageFlags.IsDoT,持续伤害只扣血不打断硬直、不授予无敌。修复 DoT 绕过 HurtBox 时被 flag-blind 的整数 TakeDamage 静默吞没、且 FinalDamage 未结算(恒为0)的双重失效;敌人侧 DoT 标记 IsDoT 避免每 Tick 重置硬直。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -192,9 +192,23 @@ namespace BaseGames.Player
|
||||
/// <summary>Debug:开启/关闭无敌模式(不计入无敌帧,永久生效直至关闭)。</summary>
|
||||
public void SetGodMode(bool v) { _isGodMode = v; }
|
||||
|
||||
/// <summary>
|
||||
/// 受伤入口(含无敌帧判定)。供绕过 HurtBox 的简单环境伤害(如 World 危险区 HazardZone)直接调用。
|
||||
/// 经 HurtBox / PlayerController 流水线的伤害已在上游完成 flag 感知的无敌判定,应调用 <see cref="ApplyDamage"/>。
|
||||
/// </summary>
|
||||
public void TakeDamage(int amount)
|
||||
{
|
||||
if (_isGodMode || IsInvincible || !IsAlive || amount <= 0) return;
|
||||
if (IsInvincible) return;
|
||||
ApplyDamage(amount);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 原始扣血(不做无敌判定)。无敌是否生效由上游单一闸门(PlayerController.TakeDamage(DamageInfo))
|
||||
/// 依据 DamageFlags.IgnoreIFrame 决定;此处只负责扣血与广播。GodMode 仍然豁免。
|
||||
/// </summary>
|
||||
public void ApplyDamage(int amount)
|
||||
{
|
||||
if (_isGodMode || !IsAlive || amount <= 0) return;
|
||||
CurrentHP = Mathf.Max(0, CurrentHP - amount);
|
||||
_onHPChanged?.Raise(CurrentHP);
|
||||
OnDamaged?.Invoke();
|
||||
|
||||
Reference in New Issue
Block a user