using CommonAI.Data; using CommonAI.Zone; using CommonAI.Zone.Formula; using CommonAI.Zone.Helper; using CommonAI.Zone.Instance; using XmdsCommon.Plugin; using XmdsCommonServer.Plugin; using XmdsCommonServer.Plugin.XmdsSkillTemplate.DamageCalculator; using XmdsCommonServer.Plugin.XmdsSkillTemplate.Skills; using XmdsCommonSkill.Plugin.Interface; using static XmdsCommonSkill.Plugin.Interface.ComSpellTemplate; namespace XmdsCommonSkill.Plugin.Buffs { //攻击创建额外法术 public class XmdsBuff_AttackCreateSpell : XmdsBuffBase { public XmdsSkillType pointSkillType = 0; // 0-所有类型技能 public XmdsSpellID createSpellID = 0; // 创建法术ID public int spellTriggerTimes = 0; // 法术触发次数 public int excludeSkillID = 0; public int addBuffID = 0; // 附加的BuffID // 额外伤害 public int damageAddition = 0; // 伤害加成 public int addFixedDamage = 0; // 附加固定伤害 public int chainLevel = 0; // 弹射 private int mTriggerSkillID = 0; //触发效果的技能ID private int mHandleUUID1 = 0; private int mHandleUUID2 = 0; public override int GetAbilityID() { return (int)XmdsCommon.Plugin.XmdsBuffProperties.XmdsBuffAbility.AttackCreateSpell; } public override void CopyTo(UnitBuff other) { var ret = other as XmdsBuff_AttackCreateSpell; ret.pointSkillType = this.pointSkillType; //0-所有类型技能 ret.createSpellID = this.createSpellID; //创建法术ID ret.spellTriggerTimes = this.spellTriggerTimes; ret.excludeSkillID = this.excludeSkillID; ret.addBuffID = this.addBuffID; ret.damageAddition = this.damageAddition; //伤害加成 ret.addFixedDamage = this.addFixedDamage; ret.chainLevel = this.chainLevel; base.CopyTo(other); } protected override void OnBindTemplate(ref BuffTemplate buffTemplate) { //DOT类技能首帧无效. buffTemplate.FirstTimeEnable = false; base.OnBindTemplate(ref buffTemplate); } public override void BuffBegin(XmdsVirtual hitter, XmdsVirtual attacker, InstanceUnit.BuffState state) { mHandleUUID1 = hitter.RegistOnHitOther(OnHitOther, null, true); mHandleUUID2 = hitter.RegistLaunchSkillOver(OnLaunchSkillOver, null, true); } public override void BuffEnd(XmdsVirtual hitter, InstanceUnit.BuffState state, bool replace) { hitter.UnRegistOnHitOther(mHandleUUID1); hitter.UnRegistLaunchSkillOver(mHandleUUID2); } protected virtual float OnHitOther(float damage, XmdsVirtual hitted, XmdsVirtual attacker, AttackSource source, ref XmdsVirtual.AtkResult result, DamageType damageType, GameSkill skill, ref bool isEndDispatch) { //技能类型和技能id匹配时 if(this.mTriggerSkillID > 0 && (this.pointSkillType == XmdsSkillType.none || this.pointSkillType == source.FromSkillType)) { //额外伤害 if (damageAddition != 0) { damage += damage * XmdsUnitProp.PER * this.damageAddition; } damage += this.addFixedDamage; //创建法术 if(this.createSpellID != 0 && this.spellTriggerTimes > 0) { this.spellTriggerTimes--; LaunchSpell ls = ComSpellTemplate.Instance().GetSpellByID(this.createSpellID); ls.ChainLevel = this.chainLevel; attacker.mUnit.Parent.unitLaunchSpell(this.pointSkillType, attacker.mUnit, ls, hitted.mUnit.X, hitted.mUnit.Y, hitted.mUnit.ID); } // 添加buff if(this.addBuffID != 0) { hitted.mUnit.AddBuff(this.addBuffID, attacker.mUnit); } } return damage; } private int OnLaunchSkillOver(GameSkill info, XmdsCommonServer.Plugin.XmdsVirtual launcher, CommonAI.Zone.Instance.InstanceUnit.SkillState skill) { if ((this.pointSkillType == XmdsSkillType.none || skill.GetSkillType() == this.pointSkillType) && (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 OnDispose() { base.OnDispose(); } } }