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

171 lines
5.7 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.

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 = {}
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