2021-04-20 13:58:00 +08:00
|
|
|
|
require("Modules/Battle/Logic/Base/EffectCaster")
|
2020-11-01 15:46:48 +08:00
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
2023-07-13 14:38:34 +08:00
|
|
|
|
function Skill:Init(role, effectData, type, targets, isAdd, isRage,isTriggerJudge,isSpuer) --type 0 异妖 1 点技 2 滑技
|
2020-11-01 15:46:48 +08:00
|
|
|
|
self.type = type
|
|
|
|
|
--skill = {技能ID, 命中时间, 持续时间, 伤害次数, {目标id1, 效果1, 效果2, ...},{目标id2, 效果3, 效果4, ...}, ...}
|
|
|
|
|
--效果 = {效果类型id, 效果参数1, 效果参数2, ...}
|
|
|
|
|
self.owner = role
|
|
|
|
|
self.id = effectData[1] -- 技能ID
|
2023-07-13 14:38:34 +08:00
|
|
|
|
self.hitTime = effectData[2] -- 效果命中需要的时间a EffectCombat.KeyFrame
|
|
|
|
|
self.continueTime = effectData[3] -- 命中后伤害持续时间 EffectCombat.SkillDuration
|
|
|
|
|
self.attackCount = effectData[4] -- 伤害持续时间内伤害次数 EffectCombat.SkillNumber
|
2023-07-06 14:08:10 +08:00
|
|
|
|
self.skillnumberTime = effectData[5] -- 多段伤害的每段触发时间
|
2023-07-13 14:38:34 +08:00
|
|
|
|
self.AttackDisplaceOffset = effectData[6] -- 位移終點
|
2020-11-01 15:46:48 +08:00
|
|
|
|
self.isTriggePassivity = false -- 是否一个技能只触发一次被动 true:每次释放技能只会触发一次
|
|
|
|
|
self.triggerPassivityId={}
|
|
|
|
|
self.isKill = false --是否技能击杀目标
|
|
|
|
|
self.isAdd = isAdd
|
|
|
|
|
self.isRage = isRage
|
2021-07-15 18:20:38 +08:00
|
|
|
|
self.isNotLoop= false
|
2022-03-17 16:15:34 +08:00
|
|
|
|
self.targets={}
|
2022-03-18 15:47:16 +08:00
|
|
|
|
self.skillDamage=0
|
2022-04-19 17:23:37 +08:00
|
|
|
|
self.AttactScale = 0 --用于追加的技能,设定其伤害的比例
|
2023-08-29 17:58:24 +08:00
|
|
|
|
self.effectiveTime = 0 --顺风/逆风生效次数
|
2021-02-23 16:03:10 +08:00
|
|
|
|
if isTriggerJudge~=nil then
|
2021-01-27 13:50:26 +08:00
|
|
|
|
self.isTriggerJudge=isTriggerJudge
|
|
|
|
|
else
|
|
|
|
|
self.isTriggerJudge = true
|
|
|
|
|
end
|
2023-07-13 14:38:34 +08:00
|
|
|
|
self.isSpuer=isSpuer
|
2020-11-01 15:46:48 +08:00
|
|
|
|
-- 初始化
|
|
|
|
|
local effects = {}
|
2023-07-13 14:38:34 +08:00
|
|
|
|
for i=7, #effectData do
|
2020-11-01 15:46:48 +08:00
|
|
|
|
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)
|
2023-08-28 11:34:43 +08:00
|
|
|
|
--基本是自身的dispose加回合切换的检测
|
2020-11-01 15:46:48 +08:00
|
|
|
|
self.castDoneFunc = func
|
|
|
|
|
self.isTriggePassivity=false
|
|
|
|
|
self.triggerPassivityId={}
|
|
|
|
|
-- 技能效果生效
|
|
|
|
|
if self.effectCaster then
|
2021-03-26 16:50:49 +08:00
|
|
|
|
--放技能前判断是否有目标,没有就不会放技能,直接执行技能回调 by 王振兴 2021/03/26
|
|
|
|
|
--为解决攻击目标只剩被放逐的单位导致技能播放异常
|
|
|
|
|
self.effectCaster:ChooseTarget()
|
2021-04-07 20:14:43 +08:00
|
|
|
|
local targets=BattleUtil.LengthOfTable(self:GetDirectTargetsNoExile())
|
2021-03-26 16:50:49 +08:00
|
|
|
|
if targets==0 and self.castDoneFunc then
|
2021-03-27 12:37:50 +08:00
|
|
|
|
self.isRage=false
|
2021-11-17 15:01:24 +08:00
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.CastRageBrfore, self)
|
2021-03-26 16:50:49 +08:00
|
|
|
|
self.castDoneFunc()
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
--end
|
2023-07-17 18:47:07 +08:00
|
|
|
|
--具体effect的触发,注册延迟造成伤害事件
|
2020-11-01 15:46:48 +08:00
|
|
|
|
self.effectCaster:Cast()
|
2023-07-13 14:38:34 +08:00
|
|
|
|
--LogError(self.id.."釋放完成"..os:clock())
|
2020-11-01 15:46:48 +08:00
|
|
|
|
end
|
2021-07-02 09:56:06 +08:00
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.SkillCastBefore, self)
|
2020-11-01 15:46:48 +08:00
|
|
|
|
-- 释放技能开始
|
2023-07-13 14:38:34 +08:00
|
|
|
|
--playview的技能表现层通过这个触发,具体的在skillcaster里面的skillcast函数
|
2023-09-20 18:00:40 +08:00
|
|
|
|
--LogError("timestart"..os.date())
|
2020-11-01 15:46:48 +08:00
|
|
|
|
self.owner.Event:DispatchEvent(BattleEventName.SkillCast, self)
|
|
|
|
|
BattleLogic.Event:DispatchEvent(BattleEventName.SkillCast, self)
|
|
|
|
|
-- 只对效果1的目标发送事件,效果1是技能的直接伤害目标
|
|
|
|
|
self.effectCaster:ForeachTargets(function(role)
|
2020-11-02 11:54:48 +08:00
|
|
|
|
role.Event:DispatchEvent(BattleEventName.BeSkillCast, self)
|
2020-11-01 15:46:48 +08:00
|
|
|
|
end)
|
|
|
|
|
--技能的施法时间计算,根据当前目标id关联的持续时间,取其中时间最长的一个
|
2023-09-18 15:41:32 +08:00
|
|
|
|
--local duration = self.hitTime + self.continueTime+(self.skillnumberTime[1][1]==0 and 0 or self.skillnumberTime[#self.skillnumberTime][2]/1000)
|
|
|
|
|
local duration = self.continueTime
|
2020-11-01 15:46:48 +08:00
|
|
|
|
-- 结算时间向后延长0.2秒,避免在效果结算完成前就结束了技能释放
|
2023-02-24 11:02:14 +08:00
|
|
|
|
local time=1.2
|
2021-12-13 18:56:49 +08:00
|
|
|
|
-- if self.id==1282 then
|
|
|
|
|
-- time=1
|
|
|
|
|
-- end
|
2023-10-23 17:04:59 +08:00
|
|
|
|
BattleLogic.WaitForTrigger(duration + time+((tonumber(self.skillnumberTime)==nil or self.skillnumberTime[1][1]==0) and 0 or self.skillnumberTime[#self.skillnumberTime][2])/1000, function()
|
2020-11-01 15:46:48 +08:00
|
|
|
|
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()
|
2023-10-20 18:30:02 +08:00
|
|
|
|
--LogError("end"..os.date())
|
2020-11-01 15:46:48 +08:00
|
|
|
|
--技能消息发送完后 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
|
2021-03-26 16:50:49 +08:00
|
|
|
|
|
2021-03-27 12:37:50 +08:00
|
|
|
|
-- 获取直接目标,不包含放逐的目标,可能为空
|
2021-03-26 16:50:49 +08:00
|
|
|
|
function Skill:GetDirectTargetsNoExile()
|
|
|
|
|
return self.effectCaster:GetDirectTargetsNoExile()
|
|
|
|
|
end
|
2021-09-27 17:33:51 +08:00
|
|
|
|
|
|
|
|
|
-- 获取直接目标,不包含触发不灭的目标,可能为空
|
|
|
|
|
function Skill:GetDirectTargetsNoNoDead()
|
|
|
|
|
return self.effectCaster:GetDirectTargetsNoNODead()
|
|
|
|
|
end
|
2020-11-01 15:46:48 +08:00
|
|
|
|
-- 获取技能目标最大人数
|
|
|
|
|
function Skill:GetMaxTargetNum()
|
|
|
|
|
return self.effectCaster:GetMaxTargetNum()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 判断是否命中
|
|
|
|
|
function Skill:CheckTargetIsHit(role)
|
|
|
|
|
return self.effectCaster:CheckTargetIsHit(role)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 结束技能
|
|
|
|
|
function Skill:EndSkill()
|
|
|
|
|
-- 技能后摇
|
|
|
|
|
-- 技能结束后摇后结束技能释放
|
2023-02-24 11:02:14 +08:00
|
|
|
|
BattleLogic.WaitForTrigger(0.5, function()
|
2020-11-01 15:46:48 +08:00
|
|
|
|
-- 结束回调
|
|
|
|
|
self.isTriggePassivity=false
|
|
|
|
|
self.triggerPassivityId={}
|
2022-03-18 15:47:16 +08:00
|
|
|
|
self.skillDamage=0
|
2023-08-29 17:58:24 +08:00
|
|
|
|
self.effectiveTime = 0
|
2020-11-01 15:46:48 +08:00
|
|
|
|
if self.castDoneFunc then self.castDoneFunc() end
|
2022-03-17 16:15:34 +08:00
|
|
|
|
self.targets={}
|
2020-11-01 15:46:48 +08:00
|
|
|
|
end)
|
|
|
|
|
--
|
|
|
|
|
self.effectTargets = {}
|
|
|
|
|
end
|