171 lines
5.7 KiB
Lua
171 lines
5.7 KiB
Lua
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 |