HeroSkillRPCtr.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. local HeroSkillRPCtr = class("HeroSkillRPCtr")
  2. local CACHE_SKILL_KEY_NAME = "Cache_Skill_Key"
  3. function HeroSkillRPCtr:ctor()
  4. self.cacheSkillCanUnlockMap = nil
  5. local className = self:getClassName()
  6. ManagerContainer.LuaEventMgr:RegisterUIEvent(className, UIEventNames.HERO_JOB_CHANGE_SUCCESS, self, self.OnHeroLvChanged)
  7. ManagerContainer.LuaEventMgr:RegisterUIEvent(className, UIEventNames.HERO_LV_CHANGED, self, self.OnHeroLvChanged)
  8. ManagerContainer.LuaEventMgr:RegisterUIEvent(className, UIEventNames.EID_PARTER_ADD, self, self.OnParterAdd)
  9. ManagerContainer.LuaEventMgr:RegisterUIEvent(className, UIEventNames.EID_SKILL_CHANGED, self, self.OnSkillChanged)
  10. end
  11. function HeroSkillRPCtr:Dispose()
  12. local className = self:getClassName()
  13. ManagerContainer.LuaEventMgr:Unregister(className)
  14. self:WriteCacheSkillUnlockData()
  15. self.cacheSkillCanUnlockMap = nil
  16. end
  17. function HeroSkillRPCtr:OnHeroLvChanged(heroId)
  18. self:HeroSkillUnlockNotify(heroId)
  19. end
  20. function HeroSkillRPCtr:OnParterAdd(addPartnerMap)
  21. local isChanged = false
  22. local isCacheChanged = false
  23. for heroId,_ in pairs(addPartnerMap) do
  24. local childChanged, childCacheChanged = self:HeroSkillUnlockNotify(heroId, true, true)
  25. isChanged = isChanged or childChanged
  26. isCacheChanged = isCacheChanged or childCacheChanged
  27. end
  28. if isCacheChanged then
  29. self:WriteCacheSkillUnlockData()
  30. end
  31. if isChanged then
  32. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_NOTICE, Enum.RedPointEnum.SkillUnlockRP)
  33. end
  34. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.NewSkill, self:GetAllSkillUnlockRPStatus())
  35. end
  36. function HeroSkillRPCtr:OnSkillChanged(heroId)
  37. self:HeroSkillUnlockNotify(heroId)
  38. end
  39. function HeroSkillRPCtr:SkillUnlockNotify(ignoreSendMsg, ignoreSaveCache)
  40. if self.cacheSkillCanUnlockMap == nil then
  41. self:ReadCacheSkillUnlockData()
  42. end
  43. local isChanged = false
  44. local isCacheChanged = false
  45. local heroId = ManagerContainer.DataMgr.UserData:GetId()
  46. local childChanged, childCacheChanged = self:HeroSkillUnlockNotify(heroId, true, true)
  47. isChanged = isChanged or childChanged
  48. isCacheChanged = isCacheChanged or childCacheChanged
  49. local partnerDatas = ManagerContainer.DataMgr.PartnerData:GetPartnerDatas()
  50. for _,v in pairs(partnerDatas) do
  51. if v.owned then
  52. childChanged, childCacheChanged = self:HeroSkillUnlockNotify(v.id, true, true)
  53. isChanged = isChanged or childChanged
  54. isCacheChanged = isCacheChanged or childCacheChanged
  55. end
  56. end
  57. if isCacheChanged and not ignoreSaveCache then
  58. self:WriteCacheSkillUnlockData()
  59. end
  60. if isChanged and not ignoreSendMsg then
  61. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_NOTICE, Enum.RedPointEnum.SkillUnlockRP)
  62. end
  63. if not ignoreSendMsg then
  64. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.NewSkill, self:GetAllSkillUnlockRPStatus())
  65. end
  66. end
  67. function HeroSkillRPCtr:HeroSkillUnlockNotify(heroId, ignoreSendMsg, ignoreSaveCache)
  68. local isChanged = false
  69. local isCacheChanged = false
  70. local skillData = ManagerContainer.DataMgr.UserData:GetSkillData(heroId)
  71. if skillData then
  72. local isLeaderHero = ManagerContainer.DataMgr.UserData:IsLeaderHero(heroId)
  73. local cfgId, curJobCfgData
  74. if isLeaderHero then
  75. cfgId = ManagerContainer.DataMgr.UserData:GetJobCfgId()
  76. curJobCfgData = ManagerContainer.CfgMgr:GetJobDataById(cfgId)
  77. else
  78. cfgId = ManagerContainer.DataMgr.PartnerData:GetHeroCfgId(heroId)
  79. curJobCfgData = ManagerContainer.CfgMgr:GetPartnerDataById(cfgId)
  80. end
  81. if curJobCfgData then
  82. local jobs
  83. if isLeaderHero then
  84. jobs = ManagerContainer.CfgMgr:GetLastJobs(cfgId)
  85. else
  86. jobs = ManagerContainer.CfgMgr:GetParterLastJobs(cfgId)
  87. end
  88. if jobs then
  89. table.insert(jobs, curJobCfgData)
  90. local heroLv = ManagerContainer.DataMgr.UserData:GetHeroLv(heroId)
  91. if not self.cacheSkillCanUnlockMap then
  92. self.cacheSkillCanUnlockMap = {}
  93. end
  94. local cacheMap = self.cacheSkillCanUnlockMap[heroId]
  95. if not cacheMap then
  96. cacheMap = {}
  97. self.cacheSkillCanUnlockMap[heroId] = cacheMap
  98. isCacheChanged = true
  99. end
  100. for i = 1, #jobs do
  101. local job = jobs[i]
  102. local ls
  103. if isLeaderHero then
  104. ls = ManagerContainer.CfgMgr:GetSkillTreeByFeature(job.JobType, job.JobBranch, job.JobStage)
  105. else
  106. ls = ManagerContainer.CfgMgr:GetParterSkillTreeByFeature(job.JobType, job.ParterId)
  107. end
  108. if ls then
  109. for j = 1, #ls do
  110. local skillTreeCfgData = ls[j]
  111. local skillData = ManagerContainer.DataMgr.UserData:GetSkillData(heroId)
  112. local skillMap = skillData:GetUnlockSkillMap()
  113. if skillMap and skillTreeCfgData and skillTreeCfgData.SuperSkill then
  114. for i = 1, #skillTreeCfgData.SuperSkill do
  115. if skillMap[skillTreeCfgData.SuperSkill[i][2]] then
  116. skillTreeCfgData = CommonUtil.GetSkillTreeCfgData(heroId,skillTreeCfgData.SuperSkill[i][2])
  117. break
  118. end
  119. end
  120. end
  121. if skillTreeCfgData then
  122. local skillId = skillTreeCfgData.SkillId
  123. local skillIdKey = tostring(skillId)
  124. if skillData:GetIsUnlock(skillId) then
  125. local cacheValue = cacheMap[skillIdKey]
  126. if cacheValue then
  127. isChanged = true
  128. isCacheChanged = true
  129. cacheMap[skillIdKey] = nil
  130. elseif cacheValue ~= nil then
  131. isCacheChanged = true
  132. cacheMap[skillIdKey] = nil
  133. end
  134. else
  135. local cacheValue = cacheMap[skillIdKey]
  136. if cacheValue == nil then
  137. local isRedPoint = true
  138. local openLevel = skillTreeCfgData.OpenLevel
  139. if openLevel and openLevel > 0 then
  140. isRedPoint = (heroLv >= openLevel)
  141. end
  142. if isRedPoint then
  143. isChanged = true
  144. isCacheChanged = true
  145. cacheMap[skillIdKey] = isRedPoint
  146. end
  147. elseif cacheValue then
  148. local isRedPoint = true
  149. local openLevel = skillTreeCfgData.OpenLevel
  150. if openLevel and openLevel > 0 then
  151. isRedPoint = (heroLv >= openLevel)
  152. end
  153. if not isRedPoint then
  154. isChanged = true
  155. isCacheChanged = true
  156. cacheMap[skillIdKey] = isRedPoint
  157. end
  158. end
  159. end
  160. end
  161. end
  162. end
  163. end
  164. end
  165. end
  166. end
  167. if isCacheChanged and not ignoreSaveCache then
  168. self:WriteCacheSkillUnlockData()
  169. end
  170. if isChanged and not ignoreSendMsg then
  171. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_NOTICE, Enum.RedPointEnum.SkillUnlockRP)
  172. end
  173. if not ignoreSendMsg then
  174. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.NewSkill, self:GetAllSkillUnlockRPStatus())
  175. end
  176. return isChanged, isCacheChanged
  177. end
  178. function HeroSkillRPCtr:CancelSkillUnlockNotify(heroId, skillId, ignoreSendMsg, ignoreSaveCache)
  179. local isChanged = false
  180. local isCacheChanged = false
  181. local cacheMap = self.cacheSkillCanUnlockMap and self.cacheSkillCanUnlockMap[heroId] or nil
  182. if cacheMap then
  183. local skillIdKey = tostring(skillId)
  184. local cacheValue = cacheMap[skillIdKey]
  185. if cacheValue then
  186. isChanged = true
  187. isCacheChanged = true
  188. cacheMap[skillIdKey] = false
  189. end
  190. end
  191. if isCacheChanged and not ignoreSaveCache then
  192. self:WriteCacheSkillUnlockData()
  193. end
  194. if isChanged and not ignoreSendMsg then
  195. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_NOTICE, Enum.RedPointEnum.SkillUnlockRP)
  196. end
  197. if not ignoreSendMsg then
  198. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.RED_POINT_MGR_NOTICE, Enum.RPNotifyType.NewSkill, self:GetAllSkillUnlockRPStatus())
  199. end
  200. return isChanged, isCacheChanged
  201. end
  202. function HeroSkillRPCtr:GetAllSkillUnlockRPStatus()
  203. if self.cacheSkillCanUnlockMap then
  204. for _, cacheMap in pairs(self.cacheSkillCanUnlockMap) do
  205. for _,v in pairs(cacheMap) do
  206. if v then
  207. return Enum.RedPointEnum.SkillUnlockRP
  208. end
  209. end
  210. end
  211. end
  212. return Enum.RedPointEnum.None
  213. end
  214. function HeroSkillRPCtr:GetHeroSkillUnlockRPStatus(heroId)
  215. if self.cacheSkillCanUnlockMap then
  216. local cacheMap = self.cacheSkillCanUnlockMap[heroId]
  217. if cacheMap then
  218. for _,v in pairs(cacheMap) do
  219. if v then
  220. return Enum.RedPointEnum.SkillUnlockRP
  221. end
  222. end
  223. end
  224. end
  225. return Enum.RedPointEnum.None
  226. end
  227. function HeroSkillRPCtr:GetSkillUnlockRPStatus(heroId, skillId)
  228. if self.cacheSkillCanUnlockMap then
  229. local cacheMap = self.cacheSkillCanUnlockMap[heroId]
  230. if cacheMap then
  231. local skillIdKey = tostring(skillId)
  232. local cacheValue = cacheMap[skillIdKey]
  233. if cacheValue then
  234. return Enum.RedPointEnum.SkillUnlockRP
  235. end
  236. end
  237. end
  238. return Enum.RedPointEnum.None
  239. end
  240. function HeroSkillRPCtr:ReadCacheSkillUnlockData()
  241. local cacheStr = ManagerContainer.PlayerPrefsMgr:GetString(CACHE_SKILL_KEY_NAME, '')
  242. local cacheSkillCanUnlockMap = JSON:decode(cacheStr)
  243. if not cacheSkillCanUnlockMap then
  244. cacheSkillCanUnlockMap = {}
  245. end
  246. self.cacheSkillCanUnlockMap = cacheSkillCanUnlockMap
  247. end
  248. function HeroSkillRPCtr:WriteCacheSkillUnlockData()
  249. if self.cacheSkillCanUnlockMap then
  250. local valueStr = JSON:encode(self.cacheSkillCanUnlockMap)
  251. ManagerContainer.PlayerPrefsMgr:SetString(CACHE_SKILL_KEY_NAME, valueStr)
  252. end
  253. end
  254. return HeroSkillRPCtr