源战役客户端
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

1306 linhas
36 KiB

  1. require("game.skill.SkillVo")
  2. SkillManager = SkillManager or BaseClass(BaseVo, true)
  3. local SkillManager = SkillManager
  4. SkillManager.REQUEST_CCMD_EVENT = "SkillManager.REQUEST_CCMD_EVENT"
  5. SkillManager.UPDATE_SKILL_LIST = "UPDATE_SKILL_LIST"
  6. SkillManager.RESET_SKILL_LIST = "RESET_SKILL_LIST"
  7. SkillManager.START_SKILL_CD = "START_SKILL_CD"
  8. SkillManager.FORCE_RELEASE_BASE_SKILL = "FORCE_RELEASE_BASE_SKILL"
  9. SkillManager.FORCE_STOP_BASE_SKILL = "FORCE_STOP_BASE_SKILL"
  10. SkillManager.SHORT_CUT_SKILL_ACTIVE = "SHORT_CUT_SKILL_ACTIVE"
  11. SkillManager.SHORT_CUT_SKILL_ACTIVE_IN_STORY = "SHORT_CUT_SKILL_ACTIVE_IN_STORY"
  12. SkillManager.SHORT_CUT_SKILL_ACTIVE_BY_INDEX = "SHORT_CUT_SKILL_ACTIVE_BY_INDEX"
  13. SkillManager.SHOW_USE_SKILL_TIP = "SHOW_USE_SKILL_TIP"
  14. SkillManager.LOCK_CD = "LOCK_CD"
  15. SkillManager.REFRESH_CD = "SkillManager.REFRESH_CD"
  16. SkillManager.CHANGE_GOD_GUIDE = "SkillManager.CHANGE_GOD_GUIDE"
  17. SkillManager.HIT_SKILL_GUIDE = "SkillManager.HIT_SKILL_GUIDE"
  18. SkillManager.SET_SKILL_GRAY_STATE = "SkillManager.SET_SKILL_GRAY_STATE"
  19. SkillManager.SKILL_LEVEL_UP = "SkillManager.SKILL_LEVEL_UP" --技能升级
  20. SkillManager.ThreeAttackSkills =
  21. {
  22. --key:职业@性别
  23. ["1@1"] = {101001,101002,101003,101004},
  24. ["2@2"] = {102001,102002,102003,102004},
  25. ["3@1"] = {103001,103002,103003,103004},
  26. ["4@2"] = {104001,104002,104003,104004},
  27. }
  28. --怒气技能id
  29. SkillManager.AngerSkill =
  30. {
  31. ["1@1"] = 101091,
  32. ["2@2"] = 102091,
  33. ["3@1"] = 103091,
  34. ["4@2"] = 104091,
  35. }
  36. SkillManager.GodThreeAttackSkills =
  37. {
  38. }
  39. SkillManager.ThreeAttackSkillInfo =
  40. {
  41. --职业普攻
  42. [101001] = 4, [101002] = 4, [101003] = 4, [101004] = 4,
  43. [102001] = 4, [102002] = 4, [102003] = 4, [102004] = 4,
  44. [103001] = 4, [103002] = 4, [103003] = 4, [103004] = 4,
  45. [104001] = 4, [104002] = 4, [104003] = 4, [104004] = 4,
  46. }
  47. --被动技能显示类型 (暂时只支持2个)
  48. -- 1 表示 PVE
  49. -- 2 表示 PVP
  50. -- 3 表示 单体
  51. -- 4 表示 群攻
  52. SkillManager.PassivesSkillTypeList =
  53. {
  54. [20000] = {1,3,},
  55. [20001] = {2,4,},
  56. }
  57. SkillManager.MonsterBaseSkill_1 = 1110000001
  58. SkillManager.MonsterBaseSkill_2 = 1110000003
  59. SkillManager.SkillCacheTime = 1.5 --技能缓存时间
  60. --技能攻击类型 1只发起攻击(默认) 2只显示技能范围ui 3.两者都有
  61. SkillManager.SKILL_ATTACK_TYPE = {
  62. ONLY_FIRE_ATTACK = 1,
  63. ONLY_SHOW_RANGE = 2,
  64. ATTACK_AND_RANGE = 3,
  65. }
  66. SkillManager.JUMP_SKILL_ID = 10001 --跳跃技能
  67. SkillManager.GodSkillId = 1234578 --变身降神的技能id
  68. -- SkillManager.BabyDunMainRoleBaseSkill = 502001 -- 宝宝副本主角普攻技能
  69. SkillManager.BabyDunMainRoleBaseSkill = 502002 -- 宝宝副本主角普攻技能
  70. function SkillManager:__init()
  71. SkillManager.Instance=self
  72. self:ResetData()
  73. end
  74. function SkillManager:__delete()
  75. end
  76. function SkillManager:ResetData()
  77. self.currentSkillId = 0 --点击技能栏选择的技能
  78. self.currentSkillVo = nil --当前技能VO
  79. self.currentAttackRange = 0 --根据当前技能和角色角色,取到的当前攻击距离
  80. self.curSelectSkillId = 0 --技能面板的选中的技能id
  81. self.mySkillList = {} --我的技能表
  82. self.shortcutList = {} --快捷栏列表 出战的职业技能列表
  83. self.dailyLightSkill = {} --幻光技能
  84. self.skillUseList = {} --快捷栏类表 技能id为Key
  85. self.replaceSkillList = {} --一些特殊效果发过来的替换当前技能的
  86. self.replaceNewSkillList = {} --一些特殊效果发过来的替换当前技能的
  87. self.has_replace_skill_del = false --是否有替换的删除
  88. self.cur_shortcut_plan = 1
  89. self.skill_Rigidity = nil --施法僵直结束的时候(注意和技能CD不一样,是说必须等到该时间点之后,才能尝试释放下个技能)
  90. --主角技能用到的特效列表
  91. self.particle_list = {}
  92. self.three_attack_index = 1 --三段攻击的当前序号
  93. -- self.cached_skills = {} --缓存的技能列表
  94. self.cached_skill_id = nil --缓存的技能id
  95. self.otherSkillList = {} --所有技能(除了主角的技能表)
  96. --主技能最近一次释放的时间列表
  97. self.release_main_skill_time_list = {}
  98. --被动技能cd列表
  99. self.release_passive_skill_time_list = {}
  100. self.cd_skill_list = {}
  101. self.shortcut_gray_flag = 0
  102. self.start_time = 0
  103. self.server_time = 0
  104. self.every_dot_time = 0
  105. self.max_dot = 0
  106. self.switch_cd = 0 --降神主界面图标信息
  107. self.curr_god_dot = 0 --当前的降神点数
  108. self.curr_god_state = -1 --当前降神的出战状态 -1无 0未开启 1已开启未出战 2已出战未变身 3变身中
  109. self.can_use_hit_skill = true --是否可以使用羁绊技能
  110. self.scene_mgr = SceneManager:getInstance()
  111. self.hide_black_views_list = {} --隐藏技能的黑色遮罩
  112. self.skill_back_swing_list = {} --技能后摇列表
  113. self.multi_skill_list = {} --多段伤害技能列表
  114. --新手期特殊表现技能id
  115. self.guide_skill_list = {
  116. --key:职业@性别
  117. ["1@1"] = {
  118. show_list = {101011,101031,101003,101061},
  119. real_list = {101001,101002,101003,101004},
  120. },
  121. ["2@2"] = {
  122. show_list = {102011,102031,102003,102061},
  123. real_list = {102001,102002,102003,102004},
  124. },
  125. ["3@1"] = {
  126. show_list = {103061,103011,103003,103004},
  127. real_list = {103001,103002,103003,103004},
  128. },
  129. ["4@2"] = {
  130. show_list = {104061,104011,104003,104004},
  131. real_list = {104001,104002,104003,104004},
  132. },
  133. }
  134. self.cur_guide_skill_index = 1
  135. end
  136. function SkillManager:ClearData()
  137. self:ResetData()
  138. end
  139. function SkillManager:AddReleaseMainSkill(skill_id)
  140. if not self:IsThreeAttackSkill(skill_id) then
  141. self.release_main_skill_time_list[skill_id] = Status.NowTime
  142. end
  143. end
  144. function SkillManager:GetReleaseMainSkill(skill_id)
  145. return self.release_main_skill_time_list[skill_id]
  146. end
  147. function SkillManager:AddReleasePassiveSkill(skill_id, last_trigger_time)
  148. self.release_passive_skill_time_list[skill_id] = last_trigger_time
  149. end
  150. function SkillManager:GetReleasePassiveSkill(skill_id)
  151. return self.release_passive_skill_time_list[skill_id] or 0
  152. end
  153. function SkillManager:AddCDItem(skill_id,item)
  154. self.cd_skill_list[skill_id] = item
  155. end
  156. function SkillManager:RemoveCdItem(skill_id)
  157. self.cd_skill_list[skill_id] = nil
  158. end
  159. function SkillManager:Update(now_time, elapsed_time)
  160. if self.three_attack_index ~= 1 and self.skill_Rigidity and now_time - self.skill_Rigidity > 3 then
  161. -- Message.show("Update重置重置")
  162. SkillManager.ResetThreeAttackIndex(self)
  163. SkillManager.ClearCachedSkill(self)
  164. end
  165. if self.cache_skill_time and now_time - self.cache_skill_time > self.cache_secs then --缓存的技能超过一定时间就会清空
  166. self.cache_skill_time = false
  167. SkillManager.ClearCachedSkill(self)
  168. end
  169. -- if TableSize(self.replaceSkillList) > 0 then
  170. -- self.has_replace_skill_del = false
  171. -- for index,info in pairs(self.replaceSkillList) do
  172. -- if TimeUtil:getServerTimeMs( ) - info.end_time >= 0 then
  173. -- self.replaceSkillList[info.skill_id] = nil
  174. -- self.replaceNewSkillList[info.new_skill_id] = nil
  175. -- self.has_replace_skill_del = true
  176. -- end
  177. -- end
  178. -- if self.has_replace_skill_del then
  179. -- self:Fire(SkillManager.UPDATE_SKILL_LIST)
  180. -- end
  181. -- end
  182. end
  183. function SkillManager:ResetThreeAttackIndex(bool)
  184. -- if bool then
  185. self.three_attack_index = 1
  186. -- end
  187. end
  188. function SkillManager:getThreeAttackIndex()
  189. return self.three_attack_index
  190. end
  191. --角色的基本技能
  192. function SkillManager:IsThreeAttackSkill(id)
  193. return SkillManager.ThreeAttackSkillInfo[id]
  194. end
  195. --怪物的基本技能
  196. function SkillManager:IsMonsterBaseSkill(id)
  197. return SkillManager.MonsterBaseSkill_1 == id or SkillManager.MonsterBaseSkill_2 == id
  198. end
  199. --得到基础技能id
  200. function SkillManager:getBaseSkill(career,index)
  201. career = career or RoleManager.Instance.mainRoleInfo.career
  202. index = index or self.three_attack_index
  203. local sex = RoleManager.Instance.mainRoleInfo.sex
  204. local turn = RoleManager.Instance.mainRoleInfo.turn
  205. local id = SkillManager.ThreeAttackSkills[career.."@"..sex][index]
  206. return id
  207. end
  208. function SkillManager:resetRigidityTime()
  209. self.Rigidity_start_time = Status.NowTime
  210. end
  211. -------------------------------------------
  212. function SkillManager:getInstance()
  213. if SkillManager.Instance==nil then
  214. SkillManager.New()
  215. end
  216. return SkillManager.Instance
  217. end
  218. function SkillManager:getSkill(id)
  219. if id == nil or id <= 0 then
  220. return
  221. end
  222. if self.mySkillList[id] ~= nil then
  223. return self.mySkillList[id]
  224. end
  225. if self:getSkillFromConfig(id) == nil then
  226. print(string.format("getSkill:warning! can't find skill(%s) in data_skill.db!", id))
  227. return nil
  228. end
  229. if self.otherSkillList[id] == nil then
  230. local skillVo = SkillVo.New(id)
  231. self.otherSkillList[id] = skillVo
  232. end
  233. return self.otherSkillList[id]
  234. end
  235. --根据副技能组装出对应的主技能
  236. function SkillManager:PackageMainSkillId(combo_skill)
  237. return math.floor(combo_skill / 10) * 10 + 1 --主技能最后一位一定为1
  238. end
  239. --返回主角的技能需要用到的所有特效资源
  240. function SkillManager:getParticleList()
  241. return self.particle_list
  242. end
  243. --改变释放的技能
  244. -- skillId 可传nil
  245. function SkillManager:setCurrentSkillId(skillId)
  246. -- skillId = skillId or self:getBaseSkill()
  247. if self.currentSkillId ~= skillId then
  248. self.currentSkillId = skillId
  249. self.currentSkillVo = self:getSkill(skillId)
  250. -- self:Fire(SkillManager.CHANGESKILL)
  251. --刷新攻击距离
  252. self:UpdateAttackDistance()
  253. end
  254. end
  255. --返回当前技能id,可能为nil
  256. function SkillManager:getCurrentSkillId()
  257. return self.currentSkillId
  258. end
  259. --返回当前可用技能,如果当前技能id为nil,则返回普攻技能
  260. function SkillManager:getCurrentSkill()
  261. return self.currentSkillVo
  262. end
  263. --复位技能 技能成功释放后设置CD
  264. function SkillManager:ResetSkill(skillId)
  265. self.cacheReset_skillId = skillId
  266. self:SetCacheResetSkillId()
  267. end
  268. --[[
  269. .
  270. zsm
  271. ]]
  272. function SkillManager:getSkillFromConfig(id)
  273. return ConfigItemMgr.Instance:GetSkillItem(id)
  274. end
  275. --[[
  276. is_have:
  277. ]]
  278. function SkillManager:GetSkillPower( id,level,is_get )
  279. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  280. local power = 0
  281. if skill_cfg ~= nil then
  282. if skill_cfg.lvs[level] ~= nil then
  283. local cfg = skill_cfg.lvs[level]
  284. if cfg and cfg.power then
  285. local skill_power = Trim(cfg.power)
  286. if string.len(skill_power) > 0 then
  287. power = power + tonumber(skill_power)
  288. end
  289. end
  290. if cfg.base_attr then
  291. local attr_list = stringtotable(cfg.base_attr)
  292. if #attr_list > 0 then
  293. power = GetFighting(attr_list,is_get)
  294. end
  295. end
  296. end
  297. end
  298. print("技能战力 :", id,level,power)
  299. return power
  300. end
  301. --[[
  302. id和技能等级
  303. yzd
  304. ]]
  305. function SkillManager:GetSkillFromConfigByIdAndLevel(id,level)
  306. local description = ""
  307. local name = ""
  308. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  309. if skill_cfg ~= nil then
  310. if skill_cfg.lvs[level] ~= nil then
  311. description = skill_cfg.lvs[level].desc
  312. name = skill_cfg.name
  313. end
  314. end
  315. return description, name
  316. end
  317. --[[
  318. id
  319. yzd
  320. ]]
  321. function SkillManager:GetSkillNameById(id)
  322. local name = ""
  323. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  324. if skill_cfg ~= nil then
  325. name = skill_cfg.name
  326. end
  327. return name
  328. end
  329. --[[
  330. id
  331. yzd
  332. ]]
  333. function SkillManager:GetSKillCareerById(id)
  334. local career
  335. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  336. if skill_cfg ~= nil then
  337. name = skill_cfg.career
  338. end
  339. return name
  340. end
  341. --[[
  342. CD
  343. id和技能等级
  344. yzd
  345. ]]
  346. function SkillManager:GetSkillCdByIdAndLevel(id,level)
  347. local cd
  348. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  349. if skill_cfg ~= nil then
  350. if skill_cfg.lvs[level] ~= nil then
  351. cd = skill_cfg.lvs[level].cd
  352. end
  353. end
  354. return cd
  355. end
  356. --[[
  357. id和技能等级
  358. yzd
  359. ]]
  360. function SkillManager:GetSkillDistanceByIdAndLevel(id,level)
  361. local distance
  362. local skill_cfg = ConfigItemMgr.Instance:GetSkillItem(id)
  363. if skill_cfg ~= nil then
  364. if skill_cfg.lvs[level] ~= nil then
  365. distance = skill_cfg.lvs[level].distance
  366. end
  367. end
  368. return distance
  369. end
  370. --获取战斗技能配置信息
  371. function SkillManager:GetFightSkillMovie(skill_id)
  372. return Config.CareerFightMovies[skill_id] or Config.MonsterFightMovies[skill_id] --or Config.StarFightMovies[skill_id] or {}
  373. end
  374. --处理三段攻击技能
  375. function SkillManager:IncreaseThreeAttackIndex(skillId)
  376. local i = self.three_attack_index + 1
  377. if i > SkillManager.ThreeAttackSkillInfo[skillId] then
  378. i = 1
  379. end
  380. self.three_attack_index = i
  381. end
  382. --设置施法僵直的时间秒数,结束时间
  383. function SkillManager:SetSkillRigidity(time_len)
  384. if time_len > 4 then
  385. print("施法僵直异常,", time_len)
  386. time_len = 4
  387. end
  388. time_len = time_len - 0.1 --僵直时间统一减少,方便动作衔接
  389. self.Rigidity_start_time = self.Rigidity_start_time or Status.NowTime
  390. local time_off = Status.NowTime - self.Rigidity_start_time
  391. local rigidity_end_time = time_len + Status.NowTime - time_off
  392. --可能服务端有延迟 赋值到一个较短的值
  393. if self.skill_Rigidity and rigidity_end_time < self.skill_Rigidity then
  394. return
  395. end
  396. self.skill_Rigidity = rigidity_end_time
  397. end
  398. --判断角色是否在施法僵直的过程中
  399. function SkillManager:isInRigidity()
  400. if self.skill_Rigidity and Status.NowTime - self.skill_Rigidity < -4 then
  401. print("SkillManager:isInRigidity:在异常CD中,", Status.NowTime - self.skill_Rigidity)
  402. end
  403. return (self.skill_Rigidity ~= nil and Status.NowTime < self.skill_Rigidity)
  404. end
  405. function SkillManager:GetRigidityLeftTime()
  406. if not self.skill_Rigidity then
  407. return 0
  408. end
  409. return self.skill_Rigidity - Status.NowTime
  410. end
  411. function SkillManager:AddCacheSkill(id, cache_secs)
  412. --缓存一个技能
  413. if not id then
  414. return
  415. end
  416. local skillVo = SkillManager.Instance:getSkill(id)
  417. if skillVo and skillVo:CoolDown() then
  418. self.cached_skill_id =id
  419. self.cache_skill_time = Status.NowTime
  420. self.cache_secs = cache_secs or SkillManager.SkillCacheTime
  421. end
  422. end
  423. function SkillManager:ClearCachedSkill()
  424. self.cached_skill_id = nil
  425. end
  426. function SkillManager:PopCachedSkill()
  427. if self.cached_skill_id then
  428. local cached_id = self.cached_skill_id
  429. self.cached_skill_id = nil
  430. return cached_id
  431. end
  432. end
  433. function SkillManager:CreateSkillList()
  434. self.mySkillList = {}
  435. --主角技能用到的特效列表
  436. -- self.particle_list = {}
  437. local len = UserMsgAdapter.ReadFmt("h")
  438. local three_attack_level = nil
  439. for index = 1, len do
  440. local skillId,skillLv = UserMsgAdapter.ReadFmt("ih")
  441. print("= = = = = = = skillId,skillLv", skillId,skillLv)
  442. local skill_cfg = self:getSkillFromConfig(skillId)
  443. if skill_cfg ~= nil then
  444. local skillVo = self.mySkillList[skillId] or SkillVo.New(skillId)
  445. skillVo.level = skillLv
  446. self.mySkillList[skillId] = skillVo
  447. --[[
  448. --把技能用到的特效资源记录下来
  449. local movie_cfg = SkillManager.Instance:GetFightSkillMovie(skillId)
  450. if movie_cfg and movie_cfg.particles then
  451. local particles = movie_cfg.particles
  452. for _, particle_info in pairs(particles) do
  453. local res = particle_info.res
  454. if res then
  455. table.insert(self.particle_list, res)
  456. -- print("用到的特效:", res)
  457. end
  458. end
  459. end
  460. ]]
  461. else
  462. print(string.format("CreateSkillList:warning! can't find skill(%s) in data_skill.db!", skillId))
  463. end
  464. end
  465. GlobalEventSystem:Fire(EventName.GET_SKILL_SHORTCUT) --刷新快捷栏
  466. self.currentSkillId = self:getBaseSkill()
  467. self.currentSkillVo = self:getSkill(self.currentSkillId)
  468. self:UpdateAttackDistance()
  469. end
  470. function SkillManager:AddSkillToSkillList(skillId)
  471. local skill_cfg = self:getSkillFromConfig(skillId)
  472. if skill_cfg ~= nil then
  473. local skillVo = self.mySkillList[skillId] or SkillVo.New(skillId)
  474. skillVo.level = 1
  475. self.mySkillList[skillId] = skillVo
  476. end
  477. end
  478. --is_base 是否获取基本技能
  479. function SkillManager:GetShortCutList()
  480. return self.shortcutList
  481. end
  482. --技能是否在快捷栏上面
  483. function SkillManager:IsSkillHasUse(id)
  484. if not id then
  485. return
  486. end
  487. return self.skillUseList[id]
  488. end
  489. function SkillManager:SetHitSkillVo(vo)
  490. local skill_vo = self:getSkill(vo.id)
  491. if skill_vo then
  492. self.skillUseList[vo.id] = vo
  493. self.shortcutList[vo.pos] = skill_vo
  494. end
  495. end
  496. --获取羁绊技能数据
  497. function SkillManager:GetHitSkillVo()
  498. return self.shortcutList[9]
  499. end
  500. function SkillManager:getCfgInitiativeSkillList(career,sex)
  501. local mvo = RoleManager.Instance:GetMainRoleVo()
  502. local key = mvo.career .. "@" .. mvo.sex
  503. if career and sex then
  504. key = career .. "@" .. sex
  505. end
  506. return Config.ConfigSkillUI.InitiativeSkill[key]
  507. end
  508. --刷新攻击距离
  509. function SkillManager:UpdateAttackDistance()
  510. local skillVo = self.currentSkillVo
  511. if skillVo == nil then
  512. self.currentAttackRange = 0
  513. return
  514. end
  515. local skill_distance = skillVo:GetDistance() or 100
  516. skill_distance = skill_distance
  517. if skill_distance < 50 then
  518. skill_distance = 50
  519. end
  520. self.currentAttackRange = skill_distance
  521. end
  522. --返回当前可用技能的攻击距离
  523. function SkillManager:GetCurrentAttackRange()
  524. return self.currentAttackRange
  525. end
  526. --检测是否是缓存技能id
  527. function SkillManager:CheckCacheSkill(id)
  528. if self.cacheReset_skillId and self.cacheReset_skillId == id then
  529. return true
  530. else
  531. return false
  532. end
  533. end
  534. --显示技能cd
  535. function SkillManager:SetCacheResetSkillId()
  536. local skillVo = self:getSkill(self.cacheReset_skillId)
  537. if skillVo ~= nil and skillVo:getCd() ~= 0 then
  538. local cdTime = 1
  539. cdTime = skillVo:getCd()/1000
  540. skillVo:startCD()
  541. self:Fire(SkillManager.START_SKILL_CD,self.cacheReset_skillId,cdTime)
  542. end
  543. -- if self.cacheReset_skillId == self.currentSkillId then
  544. self:setCurrentSkillId()
  545. -- end
  546. self.cacheReset_skillId = nil
  547. end
  548. function SkillManager:ClearAllSkillCD()
  549. for id,info in pairs(self.cd_skill_list) do
  550. self:ClearSkillCD(id)
  551. end
  552. end
  553. function SkillManager:ClearSkillCD(skill_id)
  554. local skillVo = self:getSkill(skill_id)
  555. if skillVo then
  556. skillVo:clearCD()
  557. self:Fire(SkillManager.START_SKILL_CD,skill_id,0)
  558. end
  559. end
  560. function SkillManager:LockCD(lock)
  561. SkillManager:getInstance():Fire(SkillManager.LOCK_CD,lock)
  562. end
  563. --完成当前攻击后释放的技能
  564. function SkillManager:SetAttackCompleteSkill(skill_id)
  565. self.fire_skill_id_after_current_attack = skill_id
  566. end
  567. function SkillManager:GetAngrySkillVo( )
  568. local career = RoleManager.Instance.mainRoleInfo.career
  569. local sex = RoleManager.Instance.mainRoleInfo.sex
  570. local career_str = career.."@"..sex
  571. local skill_id = SkillManager.AngerSkill[career_str]
  572. local skill_vo = self.mySkillList[skill_id]
  573. return skill_vo
  574. end
  575. -- 判断是否为怒气技能
  576. function SkillManager:IsAngrySkill( skill_id )
  577. for k,v in pairs(SkillManager.AngerSkill) do
  578. if v == skill_id then
  579. return true
  580. end
  581. end
  582. return false
  583. end
  584. function SkillManager:PrepareAutoFightSkill(not_auto_release_assist_skill)
  585. local now_skill_vo = self:getCurrentSkill()
  586. if now_skill_vo and not now_skill_vo:CoolDown() then
  587. now_skill_vo = nil
  588. end
  589. --怒气技能满足条件就放
  590. local anger_skill_vo = self:GetAngrySkillVo( )
  591. local role_vo = RoleManager.Instance.mainRoleInfo
  592. if anger_skill_vo and role_vo.angry_value > 0 and role_vo.angry_value == role_vo.max_angry_value and anger_skill_vo:CoolDown() then
  593. -- local can_auto = AutoFightManager:getInstance():FindSkillIsAuto(anger_skill_vo.id)
  594. -- if can_auto then
  595. self:setCurrentSkillId(anger_skill_vo.id)
  596. return anger_skill_vo.id
  597. -- end
  598. end
  599. --如果当前没技能,就随机一个
  600. if now_skill_vo == nil then
  601. local short_cut_list = self:GetShortCutList()
  602. local main_role = Scene:getInstance():GetMainRole()
  603. local is_in_god_state = main_role and main_role:IsInGodState()
  604. if is_in_god_state then
  605. local id = RoleManager.Instance:GetMainRoleVo():GetGodID()
  606. short_cut_list = GodModel:getInstance():GetGodSkillList(id)
  607. end
  608. local skills_can_use = {}
  609. --把所有可用的非普通攻击技能塞进队列,准备随机一个
  610. local main_role = Scene.Instance.main_role
  611. if not main_role then
  612. return false
  613. end
  614. local id,skillVo,can_auto
  615. for i, vo in pairs(short_cut_list) do
  616. if is_in_god_state then
  617. id = vo
  618. else
  619. id = vo.id
  620. end
  621. skillVo = self:getSkill(id)
  622. if skillVo then
  623. can_auto = AutoFightManager:getInstance():FindSkillIsAuto(id)
  624. if can_auto and skillVo:CoolDown() then
  625. table.insert(skills_can_use, skillVo)
  626. end
  627. end
  628. end
  629. --随机取技能
  630. if #skills_can_use >= 1 then
  631. local max_cd_time = 0
  632. local max_skill_vo = nil
  633. for i, skillVo in pairs(skills_can_use) do
  634. if skillVo:getCd() > max_cd_time then
  635. max_cd_time = skillVo:getCd()
  636. max_skill_vo = skillVo
  637. end
  638. end
  639. now_skill_vo = max_skill_vo
  640. if now_skill_vo then
  641. self:setCurrentSkillId(now_skill_vo.id)
  642. end
  643. end
  644. if now_skill_vo == nil then
  645. local id = self:getBaseSkill()
  646. self:setCurrentSkillId(id)
  647. now_skill_vo = self:getSkill(id)
  648. end
  649. end
  650. if now_skill_vo ~= nil then
  651. return now_skill_vo.id
  652. end
  653. return nil
  654. end
  655. -- 宝宝副本定制自动挂机自动技能
  656. function SkillManager:PrepareAutoFightSkillInBabyDun(not_auto_release_assist_skill)
  657. local now_skill_vo = self:getCurrentSkill()
  658. if now_skill_vo and not now_skill_vo:CoolDown() then
  659. now_skill_vo = nil
  660. end
  661. local dun_model = BaseDungeonModel:getInstance()
  662. --如果当前没技能,就随机一个
  663. if now_skill_vo == nil then
  664. -- 获取宝宝副本内技能 (1技能位置|2技能id|3技能解锁波数|4技能释放消耗能量)
  665. local short_cut_list = dun_model:GetBabyDunSkillList()
  666. -- 获取宝宝副本内玩家当前能量值
  667. local energy = dun_model:GetBabyDunEnergyValue()
  668. local main_role = Scene:getInstance():GetMainRole()
  669. local skills_can_use = {}
  670. --把所有可用的非普通攻击技能塞进队列,准备随机一个
  671. local main_role = Scene.Instance.main_role
  672. if not main_role then
  673. return false
  674. end
  675. local skill_id, skillVo, can_auto
  676. for i, cfg_data in pairs(short_cut_list) do
  677. if energy >= cfg_data[4] then -- 能量满足需求,加入到候选列表中
  678. skill_id = cfg_data[2]
  679. skillVo = self:getSkill(skill_id)
  680. if skillVo then
  681. can_auto = AutoFightManager:getInstance():FindSkillIsAuto(skill_id)
  682. if can_auto and skillVo:CoolDown() then
  683. table.insert(skills_can_use, skillVo)
  684. end
  685. end
  686. end
  687. end
  688. --随机取技能
  689. if #skills_can_use >= 1 then
  690. local max_cd_time = 0
  691. local max_skill_vo = nil
  692. for i, skillVo in pairs(skills_can_use) do
  693. if skillVo:getCd() > max_cd_time then
  694. max_cd_time = skillVo:getCd()
  695. max_skill_vo = skillVo
  696. end
  697. end
  698. now_skill_vo = max_skill_vo
  699. if now_skill_vo then
  700. self:setCurrentSkillId(now_skill_vo.id)
  701. end
  702. end
  703. if now_skill_vo == nil then
  704. local id = SkillManager.BabyDunMainRoleBaseSkill
  705. self:setCurrentSkillId(id)
  706. now_skill_vo = self:getSkill(id)
  707. end
  708. end
  709. if now_skill_vo ~= nil then
  710. return now_skill_vo.id
  711. end
  712. return nil
  713. end
  714. --提前获取下一个可释放的技能,保证技能连招流畅
  715. function SkillManager:GetNextSkill( )
  716. local main_role = Scene.Instance.main_role
  717. if not main_role then
  718. return false
  719. end
  720. --怒气技能
  721. local anger_skill_vo = self:GetAngrySkillVo( )
  722. local role_vo = RoleManager.Instance.mainRoleInfo
  723. if anger_skill_vo and role_vo.angry_value > 0 and role_vo.angry_value == role_vo.max_angry_value and anger_skill_vo:CoolDown() then
  724. return anger_skill_vo.id
  725. end
  726. --随机取技能
  727. local skills_can_use = {}
  728. for id, skill_vo in pairs(self.skillUseList) do
  729. if skill_vo then
  730. local can_auto = AutoFightManager:getInstance():FindSkillIsAuto(id)
  731. if can_auto and skill_vo:CoolDown() then
  732. table.insert(skills_can_use, skill_vo)
  733. end
  734. end
  735. end
  736. local now_skill_vo
  737. if #skills_can_use >= 1 then
  738. local max_cd_time = 0
  739. local max_skill_vo = nil
  740. for i, skillVo in pairs(skills_can_use) do
  741. if skillVo:getCd() > max_cd_time then
  742. max_cd_time = skillVo:getCd()
  743. max_skill_vo = skillVo
  744. end
  745. end
  746. now_skill_vo = max_skill_vo
  747. if now_skill_vo then
  748. return now_skill_vo.id
  749. end
  750. end
  751. --随机普攻
  752. if now_skill_vo == nil then
  753. local id = self:getBaseSkill()
  754. return id
  755. end
  756. end
  757. --主角是否可以发起攻击
  758. function SkillManager:CanAttack(skill_id,show_tip)
  759. local main_role = Scene.Instance.main_role
  760. if main_role == nil then
  761. return false
  762. end
  763. if main_role:IsInState(PoseState.DEAD) or main_role:IsInState(PoseState.DOWN) or main_role:IsInState(PoseState.RISE) or main_role:IsInState(PoseState.HITED)
  764. or main_role:IsInState(PoseState.RUSH) or main_role:IsInState(PoseState.JUMP)
  765. or main_role:IsInState(PoseState.FLY_SHOE) or main_role:IsInState(PoseState.TASK_JUMP)
  766. or main_role:IsSwimState() then
  767. return false
  768. end
  769. local tip_str = ""
  770. if skill_id then
  771. local skillVo = self:getSkill(skill_id)
  772. if skillVo == nil then
  773. print("取不到技能信息??: skill_id:", skill_id)
  774. return false
  775. end
  776. if self:isInRigidity() then
  777. if show_tip and skill_id ~= SkillManager.JUMP_SKILL_ID and skillVo:CoolDown() then
  778. self:AddCacheSkill(skill_id)
  779. end
  780. return false
  781. end
  782. local main_role_buff = main_role.buff_manager
  783. if skill_id ~= self:getBaseSkill() and skillVo:CoolDown() == false then
  784. tip_str = "技能冷却时间未到"
  785. elseif RoleManager.Instance.mainRoleInfo.ghost_mode == 1 then
  786. tip_str = "幽灵状态,不能发起攻击"
  787. -- elseif skillVo:getAnger() > RoleManager.Instance.mainRoleInfo.anger then
  788. -- tip_str = "怒气不足"
  789. elseif main_role_buff:hasYunBuff() then
  790. tip_str = "眩晕状态不能释放技能"
  791. -- elseif main_role_buff:hasMabiBuff() then
  792. -- tip_str = "麻痹状态不能释放技能"
  793. -- elseif main_role_buff:hasDingshenBuff() then
  794. -- tip_str = "定身状态不能释放技能"
  795. -- elseif main_role_buff:hasHunluanBuff() then
  796. -- tip_str = "混乱状态不能释放技能"
  797. -- elseif main_role_buff:hasChanraoBuff() then
  798. -- tip_str = "缠绕状态不能释放技能"
  799. -- elseif main_role_buff:hasTuidingBuff() then
  800. -- tip_str = "推顶状态不能释放技能"
  801. -- elseif main_role:IsInMagic() then
  802. -- tip_str = "补魔状态不能释放技能"
  803. elseif main_role.is_shoe_flying then
  804. tip_str = "传送状态不能释放技能"
  805. -- elseif main_role_buff:hasChenMoBuff() then --沉默只能释放普攻
  806. -- if not SkillManager.ThreeAttackSkillInfo[skill_id] then
  807. -- tip_str = "沉默状态只能释放普攻"
  808. -- end
  809. end
  810. end
  811. if tip_str ~= "" then
  812. if show_tip then
  813. Message.show(tip_str)
  814. end
  815. return false
  816. else
  817. return true
  818. end
  819. end
  820. SkillManager.SKILL_SHORTCUT_GRAY = {}
  821. SkillManager.SKILL_SHORTCUT_GRAY.buff = 0x001
  822. SkillManager.SKILL_SHORTCUT_GRAY.scene = 0x002
  823. SkillManager.SKILL_SHORTCUT_GRAY.manul_forbid = 0x004
  824. SkillManager.SKILL_SHORTCUT_GRAY.horse = 0x008
  825. SkillManager.SKILL_SHORTCUT_GRAY.hun_luan = 0x010
  826. SkillManager.SKILL_SHORTCUT_GRAY.all = SkillManager.SKILL_SHORTCUT_GRAY.buff + SkillManager.SKILL_SHORTCUT_GRAY.scene + SkillManager.SKILL_SHORTCUT_GRAY.manul_forbid + SkillManager.SKILL_SHORTCUT_GRAY.horse
  827. + SkillManager.SKILL_SHORTCUT_GRAY.hun_luan
  828. function SkillManager:SetSkillShortcutGray(flag, gray)
  829. local now_flag = 0
  830. if gray then
  831. now_flag = bit.bor(self.shortcut_gray_flag, flag)
  832. else
  833. now_flag = bit.band(self.shortcut_gray_flag, bit.bnot(flag))
  834. end
  835. -- if now_flag == self.shortcut_gray_flag then
  836. -- print("SetSkillShortcutGraySetSkillShortcutGraySetSkillShortcutGraySetSkillShortcutGray")
  837. -- return
  838. -- end
  839. self.shortcut_gray_flag = now_flag
  840. if self.shortcut_gray_flag > 0 and gray then
  841. SkillManager.getInstance():Fire(SkillManager.SHORT_CUT_SKILL_ACTIVE, false, flag)
  842. elseif self.shortcut_gray_flag == 0 and not gray then
  843. SkillManager.getInstance():Fire(SkillManager.SHORT_CUT_SKILL_ACTIVE, true, flag)
  844. end
  845. end
  846. function SkillManager:IsSkillShortcutGray(index)
  847. --沉默不置灰普攻
  848. if index == 0 and self.shortcut_gray_flag == SkillManager.SKILL_SHORTCUT_GRAY.buff then
  849. return false
  850. end
  851. return self.shortcut_gray_flag > 0
  852. end
  853. function SkillManager:ChangeGodsInfo(god_list)
  854. local temp_state = -1
  855. if RoleManager.Instance.mainRoleInfo.god_id > 0 then
  856. temp_state = 3
  857. else
  858. if god_list and god_list then
  859. local vo = nil
  860. local len = #god_list
  861. local has_go_out = false
  862. if len > 0 then
  863. for i = 1, len do
  864. vo = god_list[i]
  865. if vo.pos > 0 then
  866. has_go_out = true
  867. temp_state = 2
  868. break
  869. end
  870. end
  871. if not has_go_out then
  872. temp_state = 1
  873. end
  874. else
  875. temp_state = 0
  876. end
  877. end
  878. end
  879. self.curr_god_state = temp_state
  880. end
  881. function SkillManager:IsGodFullEnergy()
  882. return self.curr_god_dot > 0 and self.curr_god_dot >= self.max_dot
  883. end
  884. function SkillManager:SetReplaceSkillInfo(info)
  885. self.replaceSkillList[info.skill_id] = info
  886. self.replaceNewSkillList[info.new_skill_id] = info
  887. --变身将神不需要
  888. if self.curr_god_state ~= 3 then
  889. self:Fire(SkillManager.UPDATE_SKILL_LIST)
  890. end
  891. end
  892. function SkillManager:IsReplaceSkillId(skill_id)
  893. return self.replaceNewSkillList[skill_id]
  894. end
  895. function SkillManager:RemoveReplaceSkillInfo(skill_id)
  896. local info = self.replaceNewSkillList[skill_id]
  897. if info then
  898. self.replaceSkillList[info.skill_id] = nil
  899. self.replaceNewSkillList[info.new_skill_id] = nil
  900. self:Fire(SkillManager.UPDATE_SKILL_LIST)
  901. end
  902. end
  903. function SkillManager:SetCanUseHitSkill(bool)
  904. self.can_use_hit_skill = bool
  905. end
  906. function SkillManager:IsCanUseHitSkill()
  907. return self.can_use_hit_skill
  908. end
  909. function SkillManager:AddHideBlackViews(layout_file)
  910. self.hide_black_views_list[layout_file] = true
  911. end
  912. function SkillManager:RemoveHideBlackViews(layout_file)
  913. self.hide_black_views_list[layout_file] = nil
  914. end
  915. function SkillManager:NeedHideSkillBlack()
  916. return TableSize(self.hide_black_views_list) > 0
  917. end
  918. --被动技能id列表
  919. function SkillManager:GetPassiveSkillList()
  920. local t = {}
  921. for k, v in pairs(SkillManager.PassivesSkillTypeList) do
  922. table.insert(t, k)
  923. end
  924. if TableSize(t) >= 2 then
  925. table.sort(t, function (a,b)
  926. return a < b
  927. end)
  928. end
  929. return t
  930. end
  931. --设置幻光技能
  932. function SkillManager:SetDailyLightSkillList(vo)
  933. self.dailyLightSkill = {}
  934. self.otherSkillList = self.otherSkillList or {}
  935. if vo then
  936. self.dailyLightSkill.cur_skill = vo.use_skill_id
  937. self.dailyLightSkill.list = {}
  938. for i,v in ipairs(vo.skill_list) do
  939. local skillVo = self:getSkill(v.skill_id) --SkillVo.New(v.skill_id)
  940. skillVo.level = v.lv
  941. self.dailyLightSkill.list[i] = skillVo
  942. self.otherSkillList[v.skill_id] = skillVo
  943. end
  944. end
  945. -- print("self.dailyLightSkill.list")
  946. -- PrintTable(self.dailyLightSkill.list)
  947. end
  948. --切换幻光技能
  949. function SkillManager:SetSwitchDailyLightSkill(skill_id)
  950. self.dailyLightSkill.cur_skill = skill_id
  951. end
  952. --获取当前激活的幻光技能
  953. function SkillManager:GetCurDailyLightSkill()
  954. local vo
  955. if self.dailyLightSkill.cur_skill and self.dailyLightSkill.list then
  956. for i,v in ipairs(self.dailyLightSkill.list) do
  957. if v.id == self.dailyLightSkill.cur_skill then
  958. vo = v
  959. break
  960. end
  961. end
  962. end
  963. return vo
  964. end
  965. --获取当前使用的幻光技能id
  966. function SkillManager:GetCurrentUseDailyLightSkillId()
  967. if self.dailyLightSkill and self.dailyLightSkill.cur_skill then
  968. return self.dailyLightSkill.cur_skill
  969. end
  970. return 0
  971. end
  972. --获取下一个幻光技能
  973. function SkillManager:GetNextDailyLightSkill()
  974. local skill_id = 0
  975. if self.dailyLightSkill.cur_skill and self.dailyLightSkill.list and #self.dailyLightSkill.list > 1 then
  976. local len = #self.dailyLightSkill.list
  977. local idx = 0
  978. for i,v in ipairs(self.dailyLightSkill.list) do
  979. if v.id == self.dailyLightSkill.cur_skill then
  980. idx = i
  981. break
  982. end
  983. end
  984. if idx == len then
  985. idx = 1
  986. else
  987. idx = idx + 1
  988. end
  989. skill_id = self.dailyLightSkill.list[idx].id
  990. end
  991. return skill_id
  992. end
  993. --是否学习了该幻光技能
  994. function SkillManager:IsLearnDailyLightSkill(skill_id)
  995. if self.dailyLightSkill.list and #self.dailyLightSkill.list > 0 then
  996. for i,v in ipairs(self.dailyLightSkill.list) do
  997. if v.id == skill_id then
  998. return true
  999. end
  1000. end
  1001. end
  1002. return false
  1003. end
  1004. --获取当前方案所有出战技能列表
  1005. function SkillManager:GetCurShortcutList()
  1006. local plan = self.cur_shortcut_plan
  1007. if self.all_plan_skill and self.all_plan_skill[plan] then
  1008. local t = self.all_plan_skill[plan].shortcutList
  1009. for i=1,8 do
  1010. if not t[i] then
  1011. t[i] = {}
  1012. t[i].pos = i
  1013. t[i].id = 0
  1014. end
  1015. end
  1016. return t
  1017. end
  1018. return {}
  1019. end
  1020. --获取当前技能僵直,受到动作倍速影响
  1021. function SkillManager:GetBackSwing( skill_id )
  1022. -- if self.skill_back_swing_list[skill_id] then
  1023. -- return self.skill_back_swing_list[skill_id]
  1024. -- end
  1025. local skill_cfg = self:GetFightSkillMovie(skill_id)
  1026. -- if not skill_cfg then
  1027. -- return 0
  1028. -- end
  1029. local back_swing = skill_cfg.back_swing
  1030. -- if skill_cfg.action_speed_info then
  1031. -- local start_time = skill_cfg.action_speed_info.start_time
  1032. -- local end_time = skill_cfg.action_speed_info.end_time
  1033. -- local action_speed = skill_cfg.action_speed_info.action_speed
  1034. -- local change_time = end_time == 0 and back_swing - start_time or end_time - start_time
  1035. -- local change_speed_time = action_speed * change_time
  1036. -- if change_speed_time > back_swing then
  1037. -- back_swing = back_swing / action_speed
  1038. -- else
  1039. -- back_swing = change_time + (back_swing - change_speed_time)
  1040. -- end
  1041. -- end
  1042. -- self.skill_back_swing_list[skill_id] = back_swing
  1043. return back_swing
  1044. end
  1045. --设置当前技能的多段伤害数据
  1046. function SkillManager:SetMultiHurtInfo( skill_id, pos_x, pos_y)
  1047. local m_skill_vo = self.multi_skill_list[skill_id]
  1048. --检查缓存技能
  1049. if m_skill_vo then
  1050. --非多段技能
  1051. if not m_skill_vo.is_multi_skill then
  1052. return 0
  1053. else
  1054. --多段技能,记录第一段技能的中心点
  1055. if m_skill_vo.index == 1 then
  1056. m_skill_vo.pos_x, m_skill_vo.pos_y = pos_x, pos_y
  1057. end
  1058. --到上限重置
  1059. if m_skill_vo.index >= m_skill_vo.segment then
  1060. m_skill_vo.index = 1
  1061. return 0
  1062. else
  1063. return m_skill_vo.interval
  1064. end
  1065. end
  1066. else
  1067. --检查新技能
  1068. local skill_vo = self:getSkill(skill_id)
  1069. if not skill_vo then
  1070. return 0
  1071. end
  1072. local m_segment, m_interval = skill_vo:getMultiHurtInfo()
  1073. if m_segment and m_segment > 1 and m_interval and m_interval > 0 then
  1074. local temp_vo = {
  1075. is_multi_skill = true,
  1076. skill_id = skill_id,
  1077. index = 1,
  1078. segment = m_segment,
  1079. interval = m_interval,
  1080. pos_x = pos_x,
  1081. pos_y = pos_y,
  1082. }
  1083. self.multi_skill_list[skill_id] = temp_vo
  1084. return m_interval
  1085. else
  1086. self.multi_skill_list[skill_id] = {is_multi_skill = false}
  1087. return 0
  1088. end
  1089. end
  1090. end
  1091. --获取当前技能的多段伤害数据,每次累增多段伤害序列
  1092. function SkillManager:GetMultiHurtVo( skill_id )
  1093. local m_skill_vo = self.multi_skill_list[skill_id]
  1094. if m_skill_vo and m_skill_vo.is_multi_skill then
  1095. m_skill_vo.index = m_skill_vo.index + 1
  1096. return m_skill_vo
  1097. end
  1098. return false
  1099. end
  1100. function SkillManager:ResetMultiHurtInfo( skill_id )
  1101. if skill_id and self.multi_skill_list[skill_id] and self.multi_skill_list[skill_id].index then
  1102. self.multi_skill_list[skill_id].index = 1
  1103. end
  1104. end
  1105. --新手期特殊技能表现
  1106. function SkillManager:PrepareGuideSkill( )
  1107. local career = RoleManager.Instance.mainRoleInfo.career
  1108. local sex = RoleManager.Instance.mainRoleInfo.sex
  1109. local career_str = career.."@"..sex
  1110. local show_skill_list = self.guide_skill_list[career_str] and self.guide_skill_list[career_str].show_list
  1111. local real_skill_list = self.guide_skill_list[career_str] and self.guide_skill_list[career_str].real_list
  1112. if not show_skill_list or not real_skill_list or self.cur_guide_skill_index > #show_skill_list then
  1113. return
  1114. end
  1115. local skill_id = show_skill_list[self.cur_guide_skill_index]
  1116. local real_skill_id = real_skill_list[self.cur_guide_skill_index]
  1117. if skill_id and real_skill_id then
  1118. self:setCurrentSkillId(skill_id)
  1119. self.cur_guide_skill_index = self.cur_guide_skill_index + 1
  1120. return skill_id, real_skill_id
  1121. end
  1122. end
  1123. --是否是上阵的技能
  1124. function SkillManager:IsCurShortcutSkill(skill_id)
  1125. local list = self:GetCurShortcutList()
  1126. if list then
  1127. for i,v in ipairs(list) do
  1128. if skill_id == v.id then
  1129. return true
  1130. end
  1131. end
  1132. end
  1133. return false
  1134. end
  1135. --是否是上阵的技能
  1136. function SkillManager:IsShowSpecialSkill(skill_id)
  1137. return Config.ConfigSkillUI.ShowSpecialSkill[skill_id]
  1138. end