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秒。) /// class Pet_80005 : PetPassiveBase { public static readonly int ID = 80005; public static int Buff_ID = (int)XmdsBuffBase.XmdsBuffList.NEWPET_NEXTATK_CRIT; private static XmdsSkillValue triggerRate; // 触发几率 private static XmdsSkillValue triggerRateExt; // 命格增加几率 private static XmdsSkillValue triggerInterval; // 触发间隔 private static XmdsSkillValue buffValidTime; // buff有效时间 // 内部数据 private int mUUID_1 = 0; private int mUUID_2 = 0; private long mNextTriggerTime = 0; private int mTriggerFlag = 0; public override int SkillID { get { return ID; } } protected override void OnInit(GameSkill skillInfo, XmdsVirtual owner) { XmdsBuffPack pack = XmdsBuffFactory.GetInstance().GetXmdsBuffPack(Buff_ID); XmdsBuff_PropChange buff = (XmdsBuff_PropChange)pack.GetXmdsBuff(0); buff.CurentChangeType = XmdsVirtual.UnitAttributeType.CritRate_NormalAtk; buff.CurrentValue = 10000; // 必定暴击概率 buff.IsPercent = true; BuffTemplate bt = pack.mBuffTemplate; bt.IsHarmful = true; bt.LifeTimeMS = buffValidTime.GetValue(skillInfo.SkillLevel); pack.BindTemplateAndDispose(); owner.RegistSendBuff(bt); this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue(); mUUID_1 = owner.RegistOnHitOther(OnHandleHitOther, skillInfo, true); mUUID_2 = owner.RegistLaunchSkillOver(OnLaunchSkillOver, skillInfo, true); } protected override void OnSkillDataChange(GameSkill gs, XmdsVirtual unit) { var bt = unit.GetRegistBuff(Buff_ID); bt.LifeTimeMS = buffValidTime.GetValue(gs.SkillLevel); } private float OnHandleHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { UnitFateType fateType = attacker.GetUnitFateType(); // 触发时间间隔判断 if (fateType != UnitFateType.None && this.mNextTriggerTime < CommonLang.CUtils.localTimeMS && IsTrigger(attacker, triggerRate, triggerRateExt, skill, fateType)) { this.mTriggerFlag = 1; this.mNextTriggerTime = CommonLang.CUtils.localTimeMS + triggerInterval.GetValue(); } return damage; } private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill) { if (skill.GetSkillType() == XmdsSkillType.normalAtk) { if (this.mTriggerFlag == 1) { launcher.mUnit.AddBuff(Buff_ID, launcher.mUnit); this.mTriggerFlag = 2; base.NotifyTriggerAblity(launcher.mUnit, this.SkillID); } else if(this.mTriggerFlag == 2) { launcher.mUnit.removeBuff(Buff_ID); this.mTriggerFlag = 0; } } return 0; } 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 buffValidTime, XmdsSkillData.XmdsSkillDataKey.ValueSet4); } protected override void OnDispose(XmdsVirtual owner) { owner.UnRegistOnHitOther(mUUID_1); owner.UnRegistLaunchSkillOver(mUUID_2); } } }