WeaponSkill = {} function WeaponSkill:New() local o = {} setmetatable(o, self) self.__index = self return o end function WeaponSkill:Init(owner, group, index, skillData,playerSkillIndex) self.owner = owner self.group = group self.groupIndex = index self.skillData = skillData self.isKill = false --是否技能击杀目标 self.isAdd = false self.isRage = false self.type = BattleSkillType.Monster --后端传过来的数据最后一个是主角技能 if owner.position==100 then if playerSkillIndex==self.owner.skillNum then self.isPlayerSkill=true else self.isPlayerSkill=false end end self.curCastCount = 0 self.maxCastCount = self.skillData.maxCount -- LogError("monster skill id=="..skillData.effect[1]) self.curRoundCount = 0 self.maxRoundCount = self.skillData.maxRoundCount --MTrigger.AddSkill(self.skillData, self.skillData.triggerCondition, self) local effectData = self.skillData.effect self.id = tonumber(effectData[1]) -- 技能ID self.ownHero=RoleManager.GetRoleByCampAndPos(owner.camp,owner.position) -- 将技能加入触发检测 WeaponTrigger.AddSkill(self.skillData.triggerId, self.skillData.triggerCondition, self) self.hitTime = effectData[2] -- 效果命中需要的时间 self.continueTime = effectData[3] -- 命中后伤害持续时间 self.attackCount = effectData[4] -- 伤害持续时间内伤害次数 -- 初始化 local effects = {} for i=5, #effectData do table.insert(effects, effectData[i]) end self.effectCaster = EffectCaster:New() self.effectCaster:Init(self, effects, targets) --监听回合开始消息 BattleLogic.Event:AddEvent(BattleEventName.BattleRoundChange,function (round) self.curRoundCount = 0 end) end -- 是否可以释放 function WeaponSkill:canCastSkill() -- 超出最大次数限制 if self.curCastCount >= self.maxCastCount then return false end -- 超出轮数最大次数限制 if self.curRoundCount >= self.maxRoundCount then return false end return true end function WeaponSkill:Cast(func) self.castDoneFunc = func self.isTriggePassivity=false self.triggerPassivityId={} -- 技能效果生效 if self.effectCaster then --放技能前判断是否有目标,没有就不会放技能,直接执行技能回调 by 王振兴 2021/03/26 --为解决攻击目标只剩被放逐的单位导致技能播放异常 self.effectCaster:ChooseTarget() local targets=BattleUtil.LengthOfTable(self:GetDirectTargetsNoExile()) if targets==0 and self.castDoneFunc then self.castDoneFunc() return end --end self.effectCaster:Cast() end -- 释放技能开始 if self.owner.type==BattleUnitType.Weapon then if self.ownHero then self.ownHero.Event:DispatchEvent(BattleEventName.WeaponSkillCast, self) end end self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self) BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self) -- 只对效果1的目标发送事件,效果1是技能的直接伤害目标 self.effectCaster:ForeachTargets(function(role) role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) end) --技能的施法时间计算,根据当前目标id关联的持续时间,取其中时间最长的一个 local duration = self.hitTime + self.continueTime -- 结算时间向后延长0.2秒,避免在效果结算完成前就结束了技能释放 BattleLogic.WaitForTrigger(duration + 0.8, function() self.owner.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) BattleLogic.Event:DispatchEvent(BattleEventName.SkillCastEnd, self) -- 只对效果1的目标发送事件,效果1是技能的直接伤害目标 self.effectCaster:ForeachTargets(function(role) role.Event:DispatchEvent(BattleEventName.BeSkillCastEnd, self) end) -- 技能结束 self:EndSkill() --技能消息发送完后 iskill 设置为false self.isKill=false end) self.curRoundCount = self.curRoundCount+1 self.curCastCount =self.curCastCount+1 end function WeaponSkill:GetOwner() return self.owner end function WeaponSkill:GetGroupIndex() return self.groupIndex end -- 获取直接选择目标的ID function WeaponSkill:GetDirectChooseId() return self.effectCaster:GetDirectChooseId() end -- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标,(包含miss的目标) function WeaponSkill:GetDirectTargets() return self.effectCaster:GetDirectTargets() end -- 获取直接目标,不包含miss的目标,可能为空 function WeaponSkill:GetDirectTargetsNoMiss() return self.effectCaster:GetDirectTargetsNoMiss() end -- 获取技能目标最大人数 function WeaponSkill:GetMaxTargetNum() return self.effectCaster:GetMaxTargetNum() end -- 获取直接目标,不包含放逐的目标,可能为空 function WeaponSkill:GetDirectTargetsNoExile() return self.effectCaster:GetDirectTargetsNoExile() end -- 判断是否命中 function WeaponSkill:CheckTargetIsHit(role) return self.effectCaster:CheckTargetIsHit(role) end -- 结束技能 function WeaponSkill:EndSkill() -- 技能后摇 -- 技能结束后摇后结束技能释放 BattleLogic.WaitForTrigger(0.3, function() -- 结束回调 self.isTriggePassivity=false self.triggerPassivityId={} if self.castDoneFunc then self.castDoneFunc() end end) -- self.effectTargets = {} end return WeaponSkill