miduo_client/Assets/ManagedResources/~Lua/Modules/Battle/Logic/Weapon/WeaponSkill.lua

171 lines
5.7 KiB
Lua
Raw Normal View History

WeaponSkill = {}
function WeaponSkill:New()
local o = {}
setmetatable(o, self)
self.__index = self
return o
end
function WeaponSkill:Init(owner, group, index, skillData,playerSkillIndex)
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
--后端传过来的数据最后一个是主角技能
if owner.position==100 then
if playerSkillIndex==self.owner.skillNum then
self.isPlayerSkill=true
else
self.isPlayerSkill=false
end
end
self.curCastCount = 0
self.maxCastCount = self.skillData.maxCount
-- LogError("monster skill id=="..skillData.effect[1])
self.curRoundCount = 0
self.maxRoundCount = self.skillData.maxRoundCount
--MTrigger.AddSkill(self.skillData, self.skillData.triggerCondition, self)
local effectData = self.skillData.effect
self.id = tonumber(effectData[1]) -- 技能ID
self.ownHero=RoleManager.GetRoleByCampAndPos(owner.camp,owner.position)
-- 将技能加入触发检测
WeaponTrigger.AddSkill(self.skillData.triggerId, self.skillData.triggerCondition, self)
self.hitTime = effectData[2] -- 效果命中需要的时间
self.continueTime = effectData[3] -- 命中后伤害持续时间
self.attackCount = effectData[4] -- 伤害持续时间内伤害次数
-- 初始化
local effects = {}
2023-11-10 18:53:24 +08:00
LogRedTable(effectData)
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.BattleRoundChange,function (round)
self.curRoundCount = 0
end)
end
-- 是否可以释放
function WeaponSkill:canCastSkill()
-- 超出最大次数限制
if self.curCastCount >= self.maxCastCount then
return false
end
-- 超出轮数最大次数限制
if self.curRoundCount >= self.maxRoundCount then
return false
end
return true
end
function WeaponSkill: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.castDoneFunc()
return
end
--end
self.effectCaster:Cast()
end
-- 释放技能开始
if self.owner.type==BattleUnitType.Weapon then
if self.ownHero then
self.ownHero.Event:DispatchEvent(BattleEventName.WeaponSkillCast, self)
end
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 WeaponSkill:GetOwner()
return self.owner
end
function WeaponSkill:GetGroupIndex()
return self.groupIndex
end
-- 获取直接选择目标的ID
function WeaponSkill:GetDirectChooseId()
return self.effectCaster:GetDirectChooseId()
end
-- 获取技能的直接目标,和策划规定第一个效果的目标为直接效果目标,(包含miss的目标)
function WeaponSkill:GetDirectTargets()
return self.effectCaster:GetDirectTargets()
end
-- 获取直接目标不包含miss的目标可能为空
function WeaponSkill:GetDirectTargetsNoMiss()
return self.effectCaster:GetDirectTargetsNoMiss()
end
-- 获取技能目标最大人数
function WeaponSkill:GetMaxTargetNum()
return self.effectCaster:GetMaxTargetNum()
end
-- 获取直接目标,不包含放逐的目标,可能为空
function WeaponSkill:GetDirectTargetsNoExile()
return self.effectCaster:GetDirectTargetsNoExile()
end
-- 判断是否命中
function WeaponSkill:CheckTargetIsHit(role)
return self.effectCaster:CheckTargetIsHit(role)
end
-- 结束技能
function WeaponSkill:EndSkill()
-- 技能后摇
-- 技能结束后摇后结束技能释放
BattleLogic.WaitForTrigger(0.3, function()
-- 结束回调
self.isTriggePassivity=false
self.triggerPassivityId={}
if self.castDoneFunc then self.castDoneFunc() end
end)
--
self.effectTargets = {}
end
return WeaponSkill