using CommonAI.Zone; using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using CommonLang; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; using XmdsCommonServer.XLS.Data; using XmdsCommonSkill.Plugin.Buffs; using XmdsCommonSkill.Plugin.Interface; using XmdsCommonSkill.Plugin.PassiveSkills.Magic; using XmdsCommonSkill.Plugin.PassiveSkills.Remedy; using static CommonAI.Zone.Instance.InstanceUnit; using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate; namespace XmdsCommonSkill.Plugin.Skills.Remedy { /// /// 治疗普攻: /// public class Remedy_510000 : RemedySkillBase { public static readonly int ID = 510000; private static readonly byte MAX_MUTIL_STEP = 3; // 伤害倍数:固定值_百分比 protected XmdsSkillValue valueSet; //强化普攻伤害系数 public AbstractSkill damagePer_3_4; public AbstractSkill damagePer_3_5; public AbstractSkill damagePer_5_5; //至宝被动 public AbstractSkill damagePer_ZhiBao; //锁定index private static readonly int damgeAddAll = -1; private static readonly int damageIndex_Normal = 1; // 普通普攻 private static readonly int damageIndex_3_4 = 2; // 飞花伤害 private static readonly int damageIndex_3_5 = 3; // 弹射伤害 //Action帧 private static readonly int actionqueueIndex_3_4 = 3; private static readonly int actionqueueIndex_3_5 = 4; private static readonly int actionqueueIndex_ZhiBao = 5; //攻击间隔 private int mAttackInterval; //当前动作形态 private byte mCurActionStep = 0; //下一次可攻击时间 private long mNextAttackTime = 0; public override int SkillID {get{return ID;}} protected override void OnInit(GameSkill info, XmdsVirtual unit, ref SkillTemplate template) { base.OnInit(info, unit, ref template); unit.RegistTryLaunchSkillEvent(OnTryLaunchSkillEventHandle, info); unit.RegistLaunchSkillOver(OnLaunchSkillOver, info); unit.RegistSkillBlockEvent(OnSkillBlockEvent, info); this.RegistEvent(EventType.UseFormluaType, OnUseFormluaTypeEvent); } protected override void OnInitOver(XmdsVirtual unit, GameSkill info) { //普攻伤害加成 this.damagePer_3_4 = unit.SkillHelper.GetPlayerSkillById(Remedy_510340.ID); //3-5, 3-6的效果 this.damagePer_3_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510350.ID); if (this.damagePer_3_5 == null) { this.damagePer_3_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510360.ID); } this.damagePer_5_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510550.ID); if (this.damagePer_5_5 == null) { this.damagePer_5_5 = unit.SkillHelper.GetPlayerSkillById(Remedy_510560.ID); } this.damagePer_ZhiBao = unit.SkillHelper.GetPlayerSkillByIdExt(Other_100200_ZhiBao.ID); } //接口之前相互手动调用 public override void DoSkillDispose(int skillID) { if (this.damagePer_ZhiBao != null && this.damagePer_ZhiBao.SkillID == skillID) { this.damagePer_ZhiBao = null; } } protected override void OnSkillDamagePerEvent(BattleParams param) { //1. 至宝改变技能形态 if(param.AtkProp.DamagePerID == Other_100200_ZhiBao.DAMAGE_INDEX) { param.SkillDamageAdd = damagePer_ZhiBao == null ? 0 : damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value1); param.SkillDamagePer = damagePer_ZhiBao == null ? 0 : damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value4); return; } ///////////////////////2. 自有技能逻辑 //3-5弹射有加血,特殊处理 if(param.UseDamageType == CommonAI.Data.DamageType.Heal && param.AtkProp.DamagePerID == damageIndex_3_5) { param.SkillDamagePer = this.GetSkillDamageAdd(param.Attacker, param.AtkProp.DamagePerID, AbstractSkillType.Value2); return; } param.SkillDamageAdd = valueSet.GetValue(1); param.SkillDamagePer = valueSet.GetValue(2); //5-5的全部基础伤害加成 //MMO-16584 sub MMO-16572修改成治疗buff状态下才有这个效果 if(param.Attacker.mUnit.GetBuffByID(Remedy_510500.Buff_ID) != null) { param.SkillDamagePer += this.GetSkillDamageAdd(param.Attacker, damgeAddAll); } //特殊普攻形态伤害加成 if(param.AtkProp.DamagePerID != damgeAddAll) { param.SkillDamagePer += this.GetSkillDamageAdd(param.Attacker, param.AtkProp.DamagePerID); } } private bool OnTryLaunchSkillEventHandle(GameSkill info, ref InstanceUnit.SkillState skill, XmdsVirtual launcher, ref InstanceUnit.LaunchSkillParam param) { if (this.mNextAttackTime > CommonLang.CUtils.localTimeMS) { return false; } if(damagePer_ZhiBao != null && damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0) { skill.LockActionStep = actionqueueIndex_ZhiBao; } else if (launcher.mUnit.GetBuffByID(Remedy_510350.Buff_ID_3_5) != null) { skill.LockActionStep = actionqueueIndex_3_5; } else if (launcher.mUnit.GetBuffByID(Remedy_510340.Buff_ID_3_4) != null) { skill.LockActionStep = actionqueueIndex_3_4; } 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 (damagePer_ZhiBao != null && damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value2) > 0) { skill.LockActionStep = actionqueueIndex_ZhiBao; //技能使用强化效果, 偷懒用这个接口 damagePer_ZhiBao.GetSkillValue(AbstractSkillType.Value3); } else if (launcher.mUnit.GetBuffByID(Remedy_510340.Buff_ID_3_4) != null) { skill.LockActionStep = actionqueueIndex_3_4; launcher.mUnit.removeBuff(Remedy_510340.Buff_ID_3_4); } else if (launcher.mUnit.GetBuffByID(Remedy_510350.Buff_ID_3_5) != null) { skill.LockActionStep = actionqueueIndex_3_5; launcher.mUnit.removeBuff(Remedy_510350.Buff_ID_3_5); } else { skill.LockActionStep = mCurActionStep; if (++mCurActionStep >= MAX_MUTIL_STEP) { mCurActionStep = 0; } } return 0; } // 技能被打断监听 private bool OnSkillBlockEvent(XmdsVirtual launcher, InstanceUnit.StateSkill skill, InstanceUnit.State newState) { //float finalInterval = mAttackInterval / (XmdsUnitProp.PER * launcher.MirrorProp.AttackSpeed); //this.mNextAttackTime = (int)finalInterval + CommonLang.CUtils.localTimeMS; return true; } private void OnUseFormluaTypeEvent(BattleParams param) { if (damageIndex_3_5 == param.AtkProp.DamagePerID) { param.UseDamageType = base.AutoGetDamageType(param); } else { param.UseDamageType = CommonAI.Data.DamageType.Damage; } } protected override void OnInitConfig() { XmdsSkillData data = XmdsDataMgr.GetInstance().GetXmdsSkillData(ID); base.InitBaseConfig(data); InitData(data, out valueSet, XmdsSkillData.XmdsSkillDataKey.DmgRate); XmdsSkillValue tempValue; InitData(data, out tempValue, XmdsSkillData.XmdsSkillDataKey.ValueSet); this.mAttackInterval = tempValue.GetValue(); } private int GetSkillDamageAdd(XmdsVirtual unit, int type, AbstractSkillType skillType = AbstractSkillType.Value1) { if (type == damageIndex_Normal) { } else if (type == damageIndex_3_4) { return this.damagePer_3_4 == null ? 0 : this.damagePer_3_4.GetSkillValue(skillType); } else if (type == damageIndex_3_5) { return this.damagePer_3_5 == null ? 0 : this.damagePer_3_5.GetSkillValue(skillType); } else if (type == damgeAddAll) { return this.damagePer_5_5 == null ? 0 : this.damagePer_5_5.GetSkillValue(skillType); } return 0; } } }