using CommonAI.Data; using CommonAI.Zone.Formula; using CommonAI.Zone.Instance; using System; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; namespace XmdsCommonSkill.Plugin.Buffs { /// /// 护盾BUFF.限制单位每次最多受到的伤害. /// public class XmdsBuff_Shield_LimitingDamage : XmdsBuffBase { /// /// 吸收伤害总量. /// public int AbsorbDamageSum = 0; /// /// 是否吸收过量伤害. /// public bool AbsorbOverFlowDamage = true; private int mLimitingDamage = 1; /// /// 单次攻击最多可受的伤害. /// public int LimitingDamage { get { return mLimitingDamage; } set { mLimitingDamage = Math.Max(1, value); } } private int mHandleUUID = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.SHIELD_LimitingDamage; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_Shield_LimitingDamage; ret.AbsorbDamageSum = this.AbsorbDamageSum; ret.AbsorbOverFlowDamage = this.AbsorbOverFlowDamage; ret.LimitingDamage = this.LimitingDamage; base.CopyTo(other); } protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, InstanceUnit.BuffState state) { //注册监听. mHandleUUID = hitter.RegistOnHitDamage(OnHandleHitDmage, null); XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】增加限制伤害护盾.", hitter.mProp.ServerData.BaseInfo.name); } protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace) { //取消监听. hitter.UnRegistOnHitDamage(mHandleUUID); XmdsVirtual.FormatLog("BuffBegin : 单位【{0}】失去限制伤害护盾.", hitter.mProp.ServerData.BaseInfo.name); } //单位被攻击时.伤害吸收计算. private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { int ret = (int)damage; //damage > 0是伤害,damage < 0是加血机制. if (damage > 0 && AbsorbDamageSum > 0) { //if (ret > LimitingDamage) //{ ret = LimitingDamage; //} hitted.SendBattleHintNumberB2C(ret, XmdsVirtual.UnitHitEventState.Normal); AbsorbDamageSum -= ret; AbsorbDamageSum = Math.Max(0, AbsorbDamageSum); if (AbsorbDamageSum <= 0) { //破盾. hitted.mUnit.removeBuff(BindBuffID); } } return 0; } } }