using System; using Cielonos.MainGame.Buffs; using Cielonos.MainGame.Buffs.Character; using SLSUtilities.General; namespace Cielonos.MainGame.Inventory.Collections { /// /// 自适应装甲 / Adaptive Armor /// 玩家受到伤害时,获得一个持续10秒的(护甲+5)的Buff,最高可叠加5层,每次叠加刷新持续时间。 /// public partial class AdaptiveArmor : PassiveEquipmentBase { private const string EventKey = "AdaptiveArmor"; public override void OnObtained() { base.OnObtained(); Action onAfterGetAttacked = OnAfterGetAttacked; player.eventSm.onAfterGetAttacked.Add(EventKey, onAfterGetAttacked.ToPrioritized()); } public override void OnDiscarded() { player.eventSm.onAfterGetAttacked.Remove(EventKey); // 移除残留的 Buff if (player.buffSm.TryGetBuff(out TemporaryArmor existingBuff)) { existingBuff.Remove(); } base.OnDiscarded(); } /// /// 玩家被攻击后触发,施加或叠加临时护甲 Buff。 /// private void OnAfterGetAttacked(AttackAreaBase attackArea, Attack.Result result) { float armorPerStack = passiveAttributeSm.GetItemAttribute("ArmorPerStack"); float duration = passiveAttributeSm.GetItemAttribute("BuffDuration"); int maxStacks = (int)passiveAttributeSm.GetItemAttribute("BuffMaxStacks"); if (armorPerStack <= 0f || duration <= 0f || maxStacks <= 0) return; new TemporaryArmor(armorPerStack, duration, maxStacks).Apply(player, player, this); } } public partial class AdaptiveArmor { /// /// 自适应装甲的Buff。 /// 默认持续时间为10秒,每层提供指定点护甲,最多叠加指定层。每次受到伤害时,如果已经有该Buff,则刷新持续时间并增加一层。 /// public class TemporaryArmor : CharacterBuffBase { private readonly float _armorPerStack; public TemporaryArmor(float armorPerStack, float duration, int maxStacks) { Initialize(BuffType.Positive, BuffDispelLevel.Basic); _armorPerStack = armorPerStack; this.contentSubmodule = new ContentSubmodule(this); this.timeSubmodule = new TimeSubmodule(this, duration); this.unitedStackSubmodule = new UnitedStackSubmodule(this, true, maxStacks); this.attributeSubmodule = new AttributeSubmodule(this); } public override bool OnBuffApply(out CharacterBuffBase existingBuff) { if (FindExistingSameBuff(out TemporaryArmor existing)) { existingBuff = existing; existing.timeSubmodule.RefreshDuration(); existing.unitedStackSubmodule.AddStack(1); existing.UpdateArmorValue(existing.unitedStackSubmodule.stackAmount); return false; } existingBuff = null; UpdateArmorValue(unitedStackSubmodule.stackAmount); return true; } /// /// 根据当前层数更新护甲加成数值。 /// private void UpdateArmorValue(int stacks) { attributeSubmodule.numericChange[CharacterAttribute.Armor] = stacks * _armorPerStack; attributeSubmodule.RefreshAllModifiedAttributes(); } } } }