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

173 lines
6.4 KiB
Lua
Raw Normal View History

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
self.isNotLoop= false
self.targets={}
self.skillDamage=0
2022-04-19 17:23:37 +08:00
self.AttactScale = 0 --用于追加的技能,设定其伤害的比例
self.effectiveTime = 0 --顺风/逆风生效次数
if isTriggerJudge~=nil then
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
--放技能前判断是否有目标,没有就不会放技能,直接执行技能回调 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
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
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)
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秒,避免在效果结算完成前就结束了技能释放
local time=1.2
-- 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()
--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
-- 获取直接目标,不包含放逐的目标,可能为空
function Skill:GetDirectTargetsNoExile()
return self.effectCaster:GetDirectTargetsNoExile()
end
-- 获取直接目标,不包含触发不灭的目标,可能为空
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()
-- 技能后摇
-- 技能结束后摇后结束技能释放
BattleLogic.WaitForTrigger(0.5, function()
2020-11-01 15:46:48 +08:00
-- 结束回调
self.isTriggePassivity=false
self.triggerPassivityId={}
self.skillDamage=0
self.effectiveTime = 0
2020-11-01 15:46:48 +08:00
if self.castDoneFunc then self.castDoneFunc() end
self.targets={}
2020-11-01 15:46:48 +08:00
end)
--
self.effectTargets = {}
end