skillManager.lua 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. local skillManager = class("skillManager")
  2. local skillBehaviorSeq = require("skill/skillBehaviorSeq")
  3. local skillBehaviorDartle = require("skill/skillBehaviorDartle")
  4. local SKILL_ROOT_BEHIND = 1
  5. local SKILL_ROOT_FRONT = 2
  6. local Queue = requireUtil( "queue" )
  7. local SKILL_BEHAVIOR_LIMIT = 200 -- 技能特效数量上限(主玩家特效不受此限制)
  8. function skillManager:ctor()
  9. end
  10. function skillManager:destory()
  11. if skillManager.instance then
  12. skillManager.instance:Cleanup()
  13. skillManager.instance = nil
  14. end
  15. end
  16. function skillManager:Inst()
  17. if not skillManager.instance then
  18. skillManager.instance = skillManager.new()
  19. skillManager.instance:Init()
  20. end
  21. return skillManager.instance
  22. end
  23. function skillManager:Init()
  24. self:Cleanup()
  25. end
  26. function skillManager:LoadConfig()
  27. self._config = requireGameConfig("cfg_skill_present")
  28. end
  29. function skillManager:getSkillDataByID(skillID)
  30. return self._config[skillID]
  31. end
  32. function skillManager:Cleanup()
  33. self._config = {}
  34. self._rootNode = {}
  35. self._behaviors = {}
  36. self._launchCache = {}
  37. self._behaviorIDPool = Queue.new()
  38. self._behaviorIDCount = 0
  39. end
  40. function skillManager:CleanupBehaviors()
  41. for k, v in pairs(self._rootNode) do
  42. v:removeAllChildren()
  43. end
  44. self._behaviors = {}
  45. self._launchCache = {}
  46. self._behaviorIDPool:clear()
  47. self._behaviorIDCount = 0
  48. end
  49. function skillManager:Tick(dt)
  50. local removed = {}
  51. for _, behavior in pairs(self._behaviors) do
  52. if behavior:isInvalid() then
  53. removed[#removed + 1] = behavior
  54. else
  55. behavior:Tick(dt)
  56. end
  57. end
  58. for _, behavior in pairs(removed) do
  59. local behaviorID = behavior:GetID()
  60. self:RecycleBehaviorID(behaviorID)
  61. self._behaviors[behaviorID] = nil
  62. end
  63. -- 表现
  64. while #self._launchCache > 0 do
  65. local launchData = table.remove(self._launchCache, 1)
  66. self:LaunchSkill(launchData)
  67. end
  68. end
  69. function skillManager:LaunchSkillPresent(data)
  70. self._launchCache[#self._launchCache + 1] = data
  71. end
  72. function skillManager:LaunchSkill(data)
  73. local skillID = data.skillID
  74. if not skillID then
  75. return false
  76. end
  77. local config = self._config[skillID]
  78. if not config then
  79. return false
  80. end
  81. -- 设置屏蔽
  82. if CHECK_SETTING(global.MMO.SETTING_IDX_SKILL_EFFECT_SHOW) == 1 then
  83. return false
  84. end
  85. -- 技能表现峰值
  86. if self:GetBehaviorCount() >= SKILL_BEHAVIOR_LIMIT and data.launcherID ~= global.gamePlayerController:GetMainPlayerID() then
  87. return false
  88. end
  89. -- 记录技能原ID,链接技能通过原ID计算技能速度
  90. data.srcSkillID = data.srcSkillID or skillID
  91. -- 处理连接命中特效无法连接上的问题
  92. local function linkSkillFunc()
  93. if config.linkSkill and config.linkSkill >= 1 and self._config[config.linkSkill] then
  94. local linkData = clone(data)
  95. linkData.skillID = self._config[config.linkSkill].id
  96. self:LaunchSkill(linkData)
  97. end
  98. end
  99. -- exist behavior
  100. if data.skillStage then
  101. local behavior = nil
  102. for _, v in pairs(self._behaviors) do
  103. if not v:isInvalid() and v._data.launcherID == data.launcherID and v._data.skillStage == 1 and v._data.skillID == skillID then
  104. behavior = v
  105. break
  106. end
  107. end
  108. if behavior then
  109. behavior:setData(data)
  110. behavior:joinLaunchOver()
  111. linkSkillFunc()
  112. return true
  113. end
  114. end
  115. -- new behavior
  116. local behaviorID = self:GetBehaviorID()
  117. local behavior = self:CreateSkillBehavior(behaviorID, data)
  118. self._behaviors[behaviorID] = behavior
  119. linkSkillFunc()
  120. end
  121. function skillManager:CreateSkillBehavior(behaviorID, data)
  122. local skillID = data.skillID
  123. local config = self._config[skillID]
  124. local behavior = nil
  125. if config.type == 1 then
  126. behavior = skillBehaviorDartle.new(behaviorID, data, config)
  127. else
  128. behavior = skillBehaviorSeq.new(behaviorID, data, config)
  129. end
  130. behavior:setNodeParent(self:GetRootNode(0 ~= config.pos), self:GetRootNode(0 ~= 0), self:GetRootNode(0 ~= config.hitPos))
  131. behavior:init()
  132. behavior:launch()
  133. return behavior
  134. end
  135. function skillManager:GetRootNode(isBehind)
  136. if not self._rootNode[SKILL_ROOT_BEHIND] or not self._rootNode[SKILL_ROOT_FRONT] then
  137. local rootB = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_SKILL_BEHIND)
  138. local rootF = global.sceneGraphCtl:GetSceneNode(global.MMO.NODE_SKILL)
  139. self._rootNode[SKILL_ROOT_BEHIND] = cc.Node:create()
  140. rootB:addChild(self._rootNode[SKILL_ROOT_BEHIND], 99999)
  141. self._rootNode[SKILL_ROOT_FRONT] = cc.Node:create()
  142. rootF:addChild(self._rootNode[SKILL_ROOT_FRONT], 99999)
  143. self._rootNode[SKILL_ROOT_BEHIND]._IsSkillEffect = true--做个标识 内挂特效屏蔽用
  144. self._rootNode[SKILL_ROOT_FRONT]._IsSkillEffect = true
  145. end
  146. if isBehind then
  147. return self._rootNode[SKILL_ROOT_BEHIND]
  148. else
  149. return self._rootNode[SKILL_ROOT_FRONT]
  150. end
  151. end
  152. function skillManager:GetBehaviorID()
  153. if self._behaviorIDPool:empty() then
  154. self._behaviorIDCount = self._behaviorIDCount + 1
  155. return self._behaviorIDCount
  156. end
  157. return self._behaviorIDPool:pop()
  158. end
  159. function skillManager:RecycleBehaviorID(id)
  160. self._behaviorIDPool:push(id)
  161. end
  162. function skillManager:GetBehaviorCount()
  163. return self._behaviorIDCount - self._behaviorIDPool:size()
  164. end
  165. return skillManager