| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- local skillManager = class("skillManager")
- local skillBehaviorSeq = require("skill/skillBehaviorSeq")
- local skillBehaviorDartle = require("skill/skillBehaviorDartle")
- local SKILL_ROOT_BEHIND = 1
- local SKILL_ROOT_FRONT = 2
- local Queue = requireUtil( "queue" )
- local SKILL_BEHAVIOR_LIMIT = 200 -- 技能特效数量上限(主玩家特效不受此限制)
- function skillManager:ctor()
- end
- function skillManager:destory()
- if skillManager.instance then
- skillManager.instance:Cleanup()
- skillManager.instance = nil
- end
- end
- function skillManager:Inst()
- if not skillManager.instance then
- skillManager.instance = skillManager.new()
- skillManager.instance:Init()
- end
- return skillManager.instance
- end
- function skillManager:Init()
- self:Cleanup()
- end
- function skillManager:LoadConfig()
- self._config = requireGameConfig("cfg_skill_present")
- end
- function skillManager:getSkillDataByID(skillID)
- return self._config[skillID]
- end
- function skillManager:Cleanup()
- self._config = {}
- self._rootNode = {}
- self._behaviors = {}
- self._launchCache = {}
- self._behaviorIDPool = Queue.new()
- self._behaviorIDCount = 0
- end
- function skillManager:CleanupBehaviors()
- for k, v in pairs(self._rootNode) do
- v:removeAllChildren()
- end
- self._behaviors = {}
- self._launchCache = {}
- self._behaviorIDPool:clear()
- self._behaviorIDCount = 0
- end
- function skillManager:Tick(dt)
- local removed = {}
- for _, behavior in pairs(self._behaviors) do
- if behavior:isInvalid() then
- removed[#removed + 1] = behavior
- else
- behavior:Tick(dt)
- end
- end
- for _, behavior in pairs(removed) do
- local behaviorID = behavior:GetID()
- self:RecycleBehaviorID(behaviorID)
- self._behaviors[behaviorID] = nil
- end
- -- 表现
- while #self._launchCache > 0 do
- local launchData = table.remove(self._launchCache, 1)
- self:LaunchSkill(launchData)
- end
- end
- function skillManager:LaunchSkillPresent(data)
- self._launchCache[#self._launchCache + 1] = data
- end
- function skillManager:LaunchSkill(data)
- local skillID = data.skillID
- if not skillID then
- return false
- end
- local config = self._config[skillID]
- if not config then
- return false
- end
- -- 设置屏蔽
- if CHECK_SETTING(global.MMO.SETTING_IDX_SKILL_EFFECT_SHOW) == 1 then
- return false
- end
- -- 技能表现峰值
- if self:GetBehaviorCount() >= SKILL_BEHAVIOR_LIMIT and data.launcherID ~= global.gamePlayerController:GetMainPlayerID() then
- return false
- end
-
- -- 记录技能原ID,链接技能通过原ID计算技能速度
- data.srcSkillID = data.srcSkillID or skillID
- -- 处理连接命中特效无法连接上的问题
- local function linkSkillFunc()
- if config.linkSkill and config.linkSkill >= 1 and self._config[config.linkSkill] then
- local linkData = clone(data)
- linkData.skillID = self._config[config.linkSkill].id
- self:LaunchSkill(linkData)
- end
- end
- -- exist behavior
- if data.skillStage then
- local behavior = nil
- for _, v in pairs(self._behaviors) do
- if not v:isInvalid() and v._data.launcherID == data.launcherID and v._data.skillStage == 1 and v._data.skillID == skillID then
- behavior = v
- break
- end
- end
- if behavior then
- behavior:setData(data)
- behavior:joinLaunchOver()
- linkSkillFunc()
- return true
- end
- end
-
- -- new behavior
- local behaviorID = self:GetBehaviorID()
- local behavior = self:CreateSkillBehavior(behaviorID, data)
- self._behaviors[behaviorID] = behavior
- linkSkillFunc()
- end
- function skillManager:CreateSkillBehavior(behaviorID, data)
- local skillID = data.skillID
- local config = self._config[skillID]
-
- local behavior = nil
- if config.type == 1 then
- behavior = skillBehaviorDartle.new(behaviorID, data, config)
- else
- behavior = skillBehaviorSeq.new(behaviorID, data, config)
- end
- behavior:setNodeParent(self:GetRootNode(0 ~= config.pos), self:GetRootNode(0 ~= 0), self:GetRootNode(0 ~= config.hitPos))
- behavior:init()
- behavior:launch()
- return behavior
- end
- function skillManager:GetRootNode(isBehind)
- if not self._rootNode[SKILL_ROOT_BEHIND] or not self._rootNode[SKILL_ROOT_FRONT] then
- local rootB = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_SKILL_BEHIND)
- local rootF = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_SKILL)
- self._rootNode[SKILL_ROOT_BEHIND] = cc.Node:create()
- rootB:addChild(self._rootNode[SKILL_ROOT_BEHIND], 99999)
- self._rootNode[SKILL_ROOT_FRONT] = cc.Node:create()
- rootF:addChild(self._rootNode[SKILL_ROOT_FRONT], 99999)
- self._rootNode[SKILL_ROOT_BEHIND]._IsSkillEffect = true--做个标识 内挂特效屏蔽用
- self._rootNode[SKILL_ROOT_FRONT]._IsSkillEffect = true
- end
- if isBehind then
- return self._rootNode[SKILL_ROOT_BEHIND]
- else
- return self._rootNode[SKILL_ROOT_FRONT]
- end
- end
- function skillManager:GetBehaviorID()
- if self._behaviorIDPool:empty() then
- self._behaviorIDCount = self._behaviorIDCount + 1
- return self._behaviorIDCount
- end
- return self._behaviorIDPool:pop()
- end
- function skillManager:RecycleBehaviorID(id)
- self._behaviorIDPool:push(id)
- end
- function skillManager:GetBehaviorCount()
- return self._behaviorIDCount - self._behaviorIDPool:size()
- end
- return skillManager
|