2023-04-06 14:02:32 +08:00
|
|
|
|
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)
|
2023-04-06 14:02:32 +08:00
|
|
|
|
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
|