miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/Role/Skill.lua

163 lines
5.6 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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) --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
self.continueTime = effectData[3] -- 命中后伤害持续时间
self.attackCount = effectData[4] -- 伤害持续时间内伤害次数
self.skillnumberTime = effectData[5] -- 多段伤害的每段触发时间
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 --用于追加的技能,设定其伤害的比例
if isTriggerJudge~=nil then
self.isTriggerJudge=isTriggerJudge
else
self.isTriggerJudge = true
end
-- 初始化
local effects = {}
for i=6, #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)
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
self.effectCaster:Cast()
LogError(self.id.."釋放完成"..os:clock())
end
self.owner.Event:DispatchEvent(BattleEventName.SkillCastBefore, self)
-- 释放技能开始
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
-- 结算时间向后延长0.2秒,避免在效果结算完成前就结束了技能释放
local time=1.2
-- if self.id==1282 then
-- time=1
-- end
BattleLogic.WaitForTrigger(duration + time, 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)
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
if self.castDoneFunc then self.castDoneFunc() end
self.targets={}
end)
--
self.effectTargets = {}
end