MSkill = {} function MSkill:New() local o = {} setmetatable(o, self) self.__index = self return o end function MSkill:Init(owner, group, index, skillData) LogBattle("MSkill Init") 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 self.curCastCount = 0 self.maxCastCount = self.skillData.maxCount self.curRoundCount = 0 self.maxRoundCount = self.skillData.maxRoundCount -- 将技能加入触发检测 MTrigger.AddSkill(self.skillData.triggerId, self.skillData.triggerCondition, self) local effectData = self.skillData.effect self.id = effectData[1] -- 技能ID 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.BattleRoundStart,function (round) self.curRoundCount = 0 end) end -- 是否可以释放 function MSkill:canCastSkill() -- 超出最大次数限制 if self.curCastCount >= self.maxCastCount then return false end -- 超出轮数最大次数限制 if self.curRoundCount >= self.maxRoundCount then return false end return true end function MSkill:Cast(func) self.castDoneFunc = func self.isTriggePassivity=false self.triggerPassivityId={} -- 技能效果生效 if self.effectCaster then self.effectCaster:Cast() 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 MSkill:GetOwner() return self.owner end function MSkill:GetGroupIndex() return self.groupIndex end -- 获取直接选择目标的ID function MSkill:GetDirectChooseId() return self.effectCaster:GetDirectChooseId() end -- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标,(包含miss的目标) function MSkill:GetDirectTargets() return self.effectCaster:GetDirectTargets() end -- 获取直接目标,不包含miss的目标,可能为空 function MSkill:GetDirectTargetsNoMiss() return self.effectCaster:GetDirectTargetsNoMiss() end -- 获取技能目标最大人数 function MSkill:GetMaxTargetNum() return self.effectCaster:GetMaxTargetNum() end -- 判断是否命中 function MSkill:CheckTargetIsHit(role) return self.effectCaster:CheckTargetIsHit(role) end -- 结束技能 function MSkill:EndSkill() -- 技能后摇 -- 技能结束后摇后结束技能释放 BattleLogic.WaitForTrigger(0.3, function() -- 结束回调 self.isTriggePassivity=false self.triggerPassivityId={} if self.castDoneFunc then self.castDoneFunc() end end) -- self.effectTargets = {} end return MSkill