require("Modules/Battle/Logic/Base/EffectCaster") Skill = {} function Skill:New() local o = {cd=0, owner=0, sp=0, spPass=0, teamSkillType=0} setmetatable(o, self) self.__index = self return o end function Skill:Init(role, effectData, type, targets, isAdd, isRage,isTriggerJudge,isSpuer) --type 0 异妖 1 点技 2 滑技 self.type = type --skill = {技能ID, 命中时间, 持续时间, 伤害次数, {目标id1, 效果1, 效果2, ...},{目标id2, 效果3, 效果4, ...}, ...} --效果 = {效果类型id, 效果参数1, 效果参数2, ...} self.owner = role self.id = effectData[1] -- 技能ID self.hitTime = effectData[2] -- 效果命中需要的时间a EffectCombat.KeyFrame self.continueTime = effectData[3] -- 命中后伤害持续时间 EffectCombat.SkillDuration self.attackCount = effectData[4] -- 伤害持续时间内伤害次数 EffectCombat.SkillNumber self.skillnumberTime = effectData[5] -- 多段伤害的每段触发时间 self.AttackDisplaceOffset = effectData[6] -- 位移終點 self.isTriggePassivity = false -- 是否一个技能只触发一次被动 true:每次释放技能只会触发一次 self.triggerPassivityId={} self.isKill = false --是否技能击杀目标 self.isAdd = isAdd self.isRage = isRage self.isNotLoop= false self.targets={} self.skillDamage=0 self.AttactScale = 0 --用于追加的技能,设定其伤害的比例 self.effectiveTime = 0 --顺风/逆风生效次数 if isTriggerJudge~=nil then self.isTriggerJudge=isTriggerJudge else self.isTriggerJudge = true end self.isSpuer=isSpuer -- 初始化 local effects = {} for i=7, #effectData do table.insert(effects, effectData[i]) end self.effectCaster = EffectCaster:New() self.effectCaster:Init(self, effects, targets) end function Skill:Dispose() if self.effectCaster then self.effectCaster:Dispose() end self.effectCaster = nil end -- 获取拥有者 function Skill:GetOwner() return self.owner end -- 是否可以释放 function Skill:canCastSkill() return true end -- 释放技能 -- func 技能释放完成回调 function Skill:Cast(func) --基本是自身的dispose加回合切换的检测 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.isRage=false self.owner.Event:DispatchEvent(BattleEventName.CastRageBrfore, self) self.castDoneFunc() return end --end --具体effect的触发,注册延迟造成伤害事件 self.effectCaster:Cast() --LogError(self.id.."釋放完成"..os:clock()) end self.owner.Event:DispatchEvent(BattleEventName.SkillCastBefore, self) -- 释放技能开始 --playview的技能表现层通过这个触发,具体的在skillcaster里面的skillcast函数 --LogError("timestart"..os.date()) self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self) BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self) -- 只对效果1的目标发送事件,效果1是技能的直接伤害目标 self.effectCaster:ForeachTargets(function(role) role.Event:DispatchEvent(BattleEventName.BeSkillCast, self) end) --技能的施法时间计算,根据当前目标id关联的持续时间,取其中时间最长的一个 --local duration = self.hitTime + self.continueTime+(self.skillnumberTime[1][1]==0 and 0 or self.skillnumberTime[#self.skillnumberTime][2]/1000) local duration = self.continueTime -- 结算时间向后延长0.2秒,避免在效果结算完成前就结束了技能释放 local time=1.2 -- if self.id==1282 then -- time=1 -- end BattleLogic.WaitForTrigger(duration + time+((tonumber(self.skillnumberTime)==nil or self.skillnumberTime[1][1]==0) and 0 or self.skillnumberTime[#self.skillnumberTime][2])/1000, 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() --LogError("end"..os.date()) --技能消息发送完后 iskill 设置为false self.isKill=false end) end -- 获取直接选择目标的ID function Skill:GetDirectChooseId() return self.effectCaster:GetDirectChooseId() end -- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标,(包含miss的目标) function Skill:GetDirectTargets() return self.effectCaster:GetDirectTargets() end -- 获取直接目标,不包含miss的目标,可能为空 function Skill:GetDirectTargetsNoMiss() return self.effectCaster:GetDirectTargetsNoMiss() end -- 获取直接目标,不包含放逐的目标,可能为空 function Skill:GetDirectTargetsNoExile() return self.effectCaster:GetDirectTargetsNoExile() end -- 获取直接目标,不包含触发不灭的目标,可能为空 function Skill:GetDirectTargetsNoNoDead() return self.effectCaster:GetDirectTargetsNoNODead() end -- 获取技能目标最大人数 function Skill:GetMaxTargetNum() return self.effectCaster:GetMaxTargetNum() end -- 判断是否命中 function Skill:CheckTargetIsHit(role) return self.effectCaster:CheckTargetIsHit(role) end -- 结束技能 function Skill:EndSkill() -- 技能后摇 -- 技能结束后摇后结束技能释放 BattleLogic.WaitForTrigger(0.5, function() -- 结束回调 self.isTriggePassivity=false self.triggerPassivityId={} self.skillDamage=0 self.effectiveTime = 0 if self.castDoneFunc then self.castDoneFunc() end self.targets={} end) -- self.effectTargets = {} end