using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using XmdsCommonServer.Plugin; using XmdsCommonServer.XLS.Data; using XmdsCommonSkill.Plugin.Buffs; using System; using static CommonAI.Zone.Instance.InstanceUnit; using XmdsCommon.Plugin; using CommonAI.Zone; using XmdsCommonServer.Plugin.Units; using CommonAI.Zone.Formula; using XmdsCommonSkill.Plugin.Skills; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using CommonAI.Data; using CommonLang; using XmdsCommonSkill.Plugin.PassiveSkills.Pet20200515; namespace XmdsCommonSkill.Plugin.PassiveSkills.Remedy { /// /// NewPet - 血2(玩家受到怪物攻击时,有N%几率承担N%来自怪物对玩家的伤害。冷却时间N秒。) /// class Pet_80013 : PetPassiveBase { public static readonly int ID = 80013; private static XmdsSkillValue triggerRate; // 触发几率 private static XmdsSkillValue triggerRateExt; // 命格增加几率 private static XmdsSkillValue triggerInterval; // 触发间隔 private static XmdsSkillValue absorbRate; // 承担伤害比例 // 内部数据 private int mUUID_1 = 0; private XmdsVirtual mPetMaster = null; private XmdsVirtual mPet = null; private long mNextTriggerTime = 0; public override int SkillID { get { return ID; } } protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner) { if(owner is XmdsVirtual_Pet) { this.mPet = owner; InstancePet pet = owner.mUnit as InstancePet; mPetMaster = pet.Master.Virtual as XmdsVirtual; if(mPetMaster != null && mPet.GetUnitFateType() != UnitFateType.None) { mUUID_1 = mPetMaster.RegistOnHitDamage(OnHandleHitDmage, skillInfo, true); } this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue(); } } private float OnHandleHitDmage(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { int absorbDamage = 0; if (damageType == DamageType.Damage && this.mNextTriggerTime < CommonLang.CUtils.localTimeMS && !attacker.IsPlayerUnit() && IsTrigger(hitted, triggerRate, triggerRateExt, skill, mPet.GetUnitFateType())) { absorbDamage = CUtils.CastInt(damage * XmdsUnitProp.PER * absorbRate.GetValue(skill.SkillLevel)); // 吸收主人伤害 if(absorbDamage > 0) { this.mPet.mUnit.ReduceHP(absorbDamage, attacker.mUnit); } this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue(); base.NotifyTriggerAblity(mPet.mUnit, this.SkillID); } return damage - absorbDamage; } protected override void OnInitSkillParam() { XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID); InitData(data, out triggerRate, XmdsSkillData.XmdsSkillDataKey.ValueSet); InitData(data, out triggerRateExt, XmdsSkillData.XmdsSkillDataKey.ValueSet2); InitData(data, out triggerInterval, XmdsSkillData.XmdsSkillDataKey.ValueSet3); InitData(data, out absorbRate, XmdsSkillData.XmdsSkillDataKey.ValueSet4); } protected override void OnDispose(XmdsVirtual owner) { if (mPetMaster != null) { mPetMaster.UnRegistOnHitDamage(mUUID_1); } } } }