Files
zeling_v2/Assets/_Game/Scripts/Combat/StatusEffects/FireEffect.cs
T
joywayerandClaude Opus 4.8 0491e3f919 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>
2026-06-11 16:30:56 +08:00

49 lines
1.8 KiB
C#

namespace BaseGames.Combat.StatusEffects
{
/// <summary>
/// 燃烧效果(架构 06_CombatModule §11)。
/// 规则:不可叠加(MaxStacks = 1);重复施加刷新持续时间;每 0.5 秒造成 1 点 True 伤害。
/// </summary>
public class FireEffect : StatusEffect
{
private const float BaseDuration = 3.0f; // 持续 3 秒
private const float DotInterval = 0.5f; // 每 0.5 秒一次
public override StatusEffectType EffectType => StatusEffectType.Fire;
public override int MaxStacks => 1;
private static readonly StatusEffectType[] s_MutualExclusions = { StatusEffectType.Freeze };
/// <summary>施加燃烧时移除冻结(火冰互斥)。</summary>
public override StatusEffectType[] MutualExclusions => s_MutualExclusions;
public FireEffect()
{
TickInterval = DotInterval;
}
public override void OnApply(StatusEffectManager owner)
{
base.OnApply(owner);
owner?.SetShaderParam("_FireGlow", 1f);
}
/// <summary>每次 DoT Tick 造成 1 点 True 伤害(绕过护盾,无敌帧不免疫)。</summary>
public override void OnTick()
{
var info = new DamageInfo.Builder()
.SetRaw(1)
.SetType(DamageType.True)
.SetFlags(DamageFlags.IgnoreIFrame | DamageFlags.IsDoT)
.Build();
Owner?.ApplyDirectDamage(info);
}
public override void OnExpire()
{
Owner?.SetShaderParam("_FireGlow", 0f);
}
protected override float GetBaseDuration() => BaseDuration;
public override string GetDisplayName() => "燃烧";
}
}