163 lines
5.6 KiB
Lua
163 lines
5.6 KiB
Lua
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 |