using CommonAI.Zone.Instance; using CommonAI.Zone.Formula; using System; using System.Collections.Generic; using System.Linq; using System.Text; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using CommonAI.Data; using CommonLang; namespace XmdsCommonSkill.Plugin.Buffs { /// /// debuff创建者及队友攻击,回血 /// public class XmdsBuff_AttackAddHP : XmdsBuffBase { public bool isLimitMax = true; public int totalAddHp; public float damageToHp = 0.1f; public bool inOnlySelf = true; //避免这一次攻击就会回血 private long mBuffStartTriggerTime = 0; //buff创建者 private XmdsVirtual buffSender = null; private int mHandleUUID = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.Attack_AddHP; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_AttackAddHP; ret.totalAddHp = this.totalAddHp; ret.damageToHp = this.damageToHp; ret.isLimitMax = this.isLimitMax; ret.inOnlySelf = this.inOnlySelf; base.CopyTo(other); } protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, InstanceUnit.BuffState state) { this.buffSender = attacker; //注册监听. mHandleUUID = hitter.RegistOnHitDamage(OnHandlerHitDamage, null); this.mBuffStartTriggerTime = CommonLang.CUtils.localTimeMS + 200; //Console.WriteLine("begin -" + this.mBuffStartTriggerTime); } protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace) { //取消监听. hitter.UnRegistOnHitDamage(mHandleUUID); } //单位被攻击时,判断是否符合条件触发BUFF效果. private float OnHandlerHitDamage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { long lStarttime = CommonLang.CUtils.localTimeMS; if (damage > 0 && this.mBuffStartTriggerTime < lStarttime && this.buffSender.IsAllies(attacker, true, true)) { int baseAddHP = CUtils.CastInt(damage * this.damageToHp); if (isLimitMax) { int AddHP = Math.Min(baseAddHP, totalAddHp);//; AddHP = Math.Max(1, AddHP); attacker.mUnit.AddHP(AddHP, attacker.mUnit); totalAddHp -= AddHP; if (totalAddHp <= 0) { hitted.mUnit.removeBuff(this.BindBuffID); } } else { attacker.mUnit.AddHP(baseAddHP, attacker.mUnit); } } return damage; } protected override void OnDispose() { base.OnDispose(); } } }