using CommonAI.Data; using CommonAI.Zone; using CommonAI.Zone.Formula; using CommonAI.Zone.Instance; using CommonLang; using System; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; namespace XmdsCommonSkill.Plugin.Buffs { /// ///BUFF:根据生命值改变伤害 /// public class XmdsBuff_AttackUpByHp : XmdsBuffBase { //每层攻击提高系数 public int ChangeValue = 0; //每损失百分比生命,提高一层攻击力 public int hpReduceLevel = 0; //生命值最低阀值 public int hpTriggerLower = 0; private float preOverlayer = 0; private int UUID = 0; private int mOpID = 0; //上一次触发时间 private long mPreTriggerTime = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.AttakUp_ByHp; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_AttackUpByHp; ret.ChangeValue = this.ChangeValue; ret.hpReduceLevel = this.hpReduceLevel; ret.hpTriggerLower = this.hpTriggerLower; base.CopyTo(other); } protected override void OnBindTemplate(ref BuffTemplate buffTemplate) { //DOT类技能首帧无效. buffTemplate.FirstTimeEnable = false; base.OnBindTemplate(ref buffTemplate); } public override void BuffBegin(XmdsVirtual hitter, XmdsVirtual attacker, InstanceUnit.BuffState state) { UUID = hitter.RegistOnHitDamage(OnUnitHitEvent, null); hitter.RemovePropChangeOperation(mOpID); this.TriggerAblity(hitter); } public override void BuffEnd(XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace) { hitter.UnRegistOnHitDamage(UUID); hitter.RemovePropChangeOperation(mOpID); } //被打监听. protected virtual float OnUnitHitEvent(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { this.TriggerAblity(hitted); return damage; } private void TriggerAblity(XmdsVirtual hitted) { if (hpReduceLevel <= 0) { return ; } float hpLevel = hitted.mUnit.CurrentHP * 1.0f / hitted.mUnit.MaxHP * XmdsDamageCalculator.PERER; if (hpLevel <= hpTriggerLower) { return ; } //每500ms检测一次 if (CommonLang.CUtils.localTimeMS - mPreTriggerTime < 500) { return; } //伤害减免 float maxPer = (XmdsDamageCalculator.PERER - hpLevel) / hpReduceLevel; if (maxPer > 0 && this.preOverlayer != maxPer) { mPreTriggerTime = CommonLang.CUtils.localTimeMS; if (mOpID > 0) { hitted.RemovePropChangeOperation(mOpID); } this.preOverlayer = maxPer; XmdsVirtual.PropChangeOperation pco = hitted.CreatePropChangeOpertation(this); pco.Type = XmdsVirtual.UnitAttributeType.Attack; pco.Value = (int)(maxPer * ChangeValue); pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent; mOpID = hitted.AddPropChangeOperation(pco); } } } }