123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- 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
- {
- /// <summary>
- ///BUFF:根据生命值改变伤害
- /// </summary>
- 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);
- }
- }
- }
- }
|