using CommonAI.Zone; using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using System; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; using XmdsCommonServer.XLS.Data; using XmdsCommonSkill.Plugin.Buffs; using XmdsCommonSkill.Plugin.PassiveSkills.Magic; using static CommonAI.Zone.Instance.InstanceUnit; using static XmdsCommonSkill.Plugin.Buffs.XmdsBuff_SwordShadow; namespace XmdsCommonSkill.Plugin.Skills.Magic { /// /// 法师普攻 /// public class Magic_310000 : XmdsSkillBase { public static int ID = 310000; private static readonly byte MAX_MUTIL_STEP = 3; public override int SkillID { get { return ID; } } //编辑器写死 private static readonly byte actionqueueIndex_ZhiBao = 8; public XmdsSkillValue dmgValue; public AbstractSkill mPassiveSkill; //剑影基础伤害提高 //至宝被动 public AbstractSkill mSkill_ZhiBao; //攻击间隔 private int mAttackInterval; //当前动作形态 private byte mCurActionStep = 0; //下一次可攻击时间 private long mNextAttackTime = 0; protected override void OnInit(GameSkill info, XmdsVirtual unit, ref SkillTemplate template) { unit.RegistTryLaunchSkillEvent(OnTryLaunchSkillEventHandle, info); unit.RegistLaunchSkillOver(OnLaunchSkillOver, info); } protected override void OnInitOver(XmdsVirtual unit, GameSkill info) { //1. 剑影基础伤害加成 this.mPassiveSkill = unit.SkillHelper.GetPlayerSkillByIdExt(Magic_310601.ID); this.mSkill_ZhiBao = unit.SkillHelper.GetPlayerSkillByIdExt(Other_100200_ZhiBao.ID); } //接口之前相互手动调用 public override void DoSkillDispose(int skillID) { if(this.mSkill_ZhiBao != null && this.mSkill_ZhiBao.SkillID == skillID) { this.mSkill_ZhiBao = null; } } //剑影伤害计算 protected override void OnSkillDamagePerEvent(BattleParams param) { //1. 至宝改变技能形态 if (param.AtkProp.DamagePerID == Other_100200_ZhiBao.DAMAGE_INDEX) { param.SkillDamageAdd = mSkill_ZhiBao == null ? 0 : mSkill_ZhiBao.GetSkillValue(AbstractSkillType.Value1); param.SkillDamagePer = mSkill_ZhiBao == null ? 0 : mSkill_ZhiBao.GetSkillValue(AbstractSkillType.Value4); return; } ///////////////////////2. 自有技能逻辑 param.SkillDamageAdd = dmgValue.GetValue(1); param.SkillDamagePer = dmgValue.GetValue(2); //有剑影buff InstanceUnit unit = param.Attacker.mUnit; if (param.AtkProp.DamagePerID > 0) { //剑影被动效果 param.SkillDamagePer += mPassiveSkill.GetSkillValue(AbstractSkillType.Value4); //剑气层数效果 - 1层,伤害增加 param.SkillDamagePer += mPassiveSkill.GetSkillValue(AbstractSkillType.Value1); //剑气层数效果 - 2层,穿透增加 param.Source.ignoreDef = mPassiveSkill.GetSkillValue(AbstractSkillType.Value2); //剑气层数效果 - 3层,附带减速 if(mPassiveSkill.GetSkillValue(AbstractSkillType.Value3) > 0) { param.Hitter.mUnit.AddBuff(Magic_310601.Buff_SPEED_DOWN, param.Attacker.mUnit); } } } private bool OnTryLaunchSkillEventHandle(GameSkill skillInfo, ref InstanceUnit.SkillState skill, XmdsVirtual launcher, ref InstanceUnit.LaunchSkillParam param) { if (this.mNextAttackTime > CommonLang.CUtils.localTimeMS) { return false; } if (mSkill_ZhiBao != null && mSkill_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0) { skill.LockActionStep = actionqueueIndex_ZhiBao; return true; } InstanceUnit unit = launcher.mUnit; BuffState buff = unit.GetBuffByID(XmdsBuff_SwordShadow.BuffID); if (buff != null) { int step = 0; skill.LockActionStep = XmdsBuff_SwordShadow.GetShadowIndex(launcher, ref buff, ref step) + 2; } else { skill.LockActionStep = mCurActionStep; } return true; } private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill) { //攻速影响攻击间隔 float finalInterval = (mAttackInterval/* + skill.Data.ActionQueue[mCurActionStep].TotalTimeMS*/) / (XmdsUnitProp.PER * launcher.MirrorProp.AttackSpeed); this.mNextAttackTime = (int)finalInterval + CommonLang.CUtils.localTimeMS; if (mSkill_ZhiBao != null && mSkill_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0) { skill.LockActionStep = actionqueueIndex_ZhiBao; //技能使用强化效果, 偷懒用这个接口 mSkill_ZhiBao.GetSkillValue(AbstractSkillType.Value3); return 0; } BuffState buff = launcher.mUnit.GetBuffByID(XmdsBuff_SwordShadow.BuffID); if (buff != null) { int step = 0; skill.LockActionStep = XmdsBuff_SwordShadow.GetShadowIndex(launcher, ref buff, ref step) + 2; XmdsBuff_SwordShadow.LanucherNormalSkill(launcher, ref buff); //使用了一层buff if (buff.OverlayLevel == 255) { launcher.mUnit.removeBuff(XmdsBuff_SwordShadow.BuffID); } else { //刷新buff状态 launcher.mUnit.queueEvent(new SyncUnitBuffState(launcher.mUnit.ID, buff.ID, buff.OverlayLevel, buff.BuffExtData)); } } else { skill.LockActionStep = mCurActionStep; if (++mCurActionStep >= MAX_MUTIL_STEP) { mCurActionStep = 0; } } return 0; } protected override void OnInitConfig() { XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID); InitData(data, out dmgValue, XmdsSkillData.XmdsSkillDataKey.DmgRate); XmdsSkillValue tempValue; InitData(data, out tempValue, XmdsSkillData.XmdsSkillDataKey.ValueSet); this.mAttackInterval = tempValue.GetValue(); } } }