using CommonAI.Data; using CommonAI.Zone.Formula; using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using System; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; namespace XmdsCommonSkill.Plugin.Buffs { //下次普通攻击暴击 & 回血 public class XmdsBuff_NextAttackCrit_AddHP : XmdsBuffBase { public int excludeSkillID = 0; public int addHPPer = 0; public int criteRate = 10000; private int mTriggerSkillID = 0; //触发效果的技能ID private int mOpID = 0; private int mHandleUUID1 = 0; private int mHandleUUID2 = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.NextAttakCrit_AddHP; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_NextAttackCrit_AddHP; ret.excludeSkillID = this.excludeSkillID; ret.addHPPer = this.addHPPer; ret.criteRate = this.criteRate; base.CopyTo(other); } protected override void OnBuffBegin(XmdsCommonServer.Plugin.XmdsVirtual hitter, XmdsCommonServer.Plugin.XmdsVirtual attacker, CommonAI.Zone.Instance.InstanceUnit.BuffState state) { XmdsVirtual.PropChangeOperation pco = hitter.CreatePropChangeOpertation(this); pco.Type = XmdsVirtual.UnitAttributeType.CritRate_NormalAtk; pco.Value = this.criteRate; pco.OpType = XmdsVirtual.PropChangeOperation.OperateType.Percent; mOpID = hitter.AddPropChangeOperation(pco); mHandleUUID1 = hitter.RegistOnHitOther(OnHandleHitOther, null); mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true); } private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { if (this.mTriggerSkillID > 0 && source.FromSkillType == XmdsSkillType.normalAtk) { int addHP = System.Math.Max(1, Convert.ToInt32(damage * XmdsUnitProp.PER * addHPPer)); attacker.mUnit.AddHP(addHP, attacker.mUnit); } return damage; } // buff效果也可能是在其他模块监听的OnLaunchSkillOver调用的 private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill) { if (skill.GetSkillType() == XmdsSkillType.normalAtk && (this.excludeSkillID == 0 || this.excludeSkillID != skill.Data.ID)) { if (this.mTriggerSkillID > 0) { launcher.mUnit.removeBuff(this.BindBuffID); } else { this.mTriggerSkillID = skill.Data.ID; } } return 0; } protected override void OnBuffEnd(XmdsCommonServer.Plugin.XmdsVirtual hitter, CommonAI.Zone.Instance.InstanceUnit.BuffState state, bool replace) { //取消监听. hitter.UnRegistOnHitOther(mHandleUUID1); hitter.UnRegistLaunchSkillOver(mHandleUUID2); if(mOpID > 0) { hitter.RemovePropChangeOperation(mOpID); } } protected override void OnDispose() { base.OnDispose(); } } }