ForceGuideMgr.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. local ForceGuideMgr = class("ForceGuideMgr")
  2. local needGuide = true
  3. function ForceGuideMgr:ctor()
  4. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_FORCE_GUIDE_TRIGGER, self, self.ForceGuideTrigger)
  5. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self.UIPageInEnd)
  6. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self.UIPageOutEnd)
  7. --k groupId , v {ids = {id,id,id}, records = {true, false, false}}
  8. self.forceGuideTasks = {}
  9. self.forceGuideState = false
  10. self.curGroupId = nil
  11. self.curGuideIdx = nil
  12. self.curGuideId = nil
  13. end
  14. function ForceGuideMgr:InitForceGuideData()
  15. local cfgDatas = ManagerContainer.CfgMgr:GetForceGuideDatas()
  16. for i = 1, #cfgDatas do
  17. local data = cfgDatas[i]
  18. if self.forceGuideGroups[data.Group] == nil then
  19. self.forceGuideGroups[data.Group] = {}
  20. self.forceGuideGroups[data.Group].ids = {}
  21. self.forceGuideGroups[data.Group].records = {}
  22. end
  23. self.forceGuideGroups[data.Group].ids[#self.forceGuideGroups[data.Group].ids + 1] = data.Id
  24. self.forceGuideGroups[data.Group].records[#self.forceGuideGroups[data.Group].records + 1] = false
  25. end
  26. end
  27. function ForceGuideMgr:InitMgrData()
  28. self.forceGuideGroups = {}
  29. self:Reset()
  30. self:InitForceGuideData()
  31. end
  32. function ForceGuideMgr:InitDataRecords(data)
  33. for k,v in pairs(data) do
  34. local id = v
  35. local cfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(id)
  36. if self.forceGuideGroups[cfgData.Group] then
  37. local result, idx = CommonUtil.EleInTable(id, self.forceGuideGroups[cfgData.Group].ids)
  38. if idx then
  39. self.forceGuideGroups[cfgData.Group].records[idx] = true
  40. end
  41. end
  42. end
  43. end
  44. function ForceGuideMgr:LoggedinCheckForceGuide()
  45. if not ManagerContainer.FSMMgr:IsBattleState() then
  46. return false
  47. end
  48. local datas = ManagerContainer.DataMgr.ForceGuideData:GetForceGuideDatas()
  49. local maxK = 1
  50. local maxV = 0
  51. if datas then
  52. for k,v in pairs(datas) do
  53. if k > maxK then
  54. maxK = k
  55. maxV = v
  56. end
  57. end
  58. end
  59. local data = self.forceGuideGroups[maxK]
  60. if data == nil then
  61. return false
  62. end
  63. local dontGuide = data.records[#data.records]
  64. if dontGuide == false and not ManagerContainer.StoryMgr:IsStorying() and not ManagerContainer.StoryMgr:HasPreStoryChapter() then
  65. for k,v in pairs(data.records) do
  66. data.records[k] = false
  67. end
  68. self:AddForceGuideDontCheck(maxK)
  69. end
  70. return not dontGuide
  71. end
  72. function ForceGuideMgr:ForceGuideTrigger(type, param, needCheck)
  73. local forceGuideGroup = 0
  74. if type == Enum.ForceGuideTriggerEnum.BattleWin then
  75. local curLevel = ManagerContainer.LuaBattleMgr:GetCurLevelUniqueId()
  76. local levelData = ManagerContainer.CfgMgr:GetLevelDataById(curLevel)
  77. if levelData == nil then
  78. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  79. return
  80. end
  81. forceGuideGroup = levelData.ForceGuideGroup
  82. elseif type == Enum.ForceGuideTriggerEnum.Story then
  83. local newFuncData = ManagerContainer.CfgMgr:GetStoryDataById(param)
  84. if newFuncData == nil then
  85. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  86. return
  87. end
  88. forceGuideGroup = newFuncData.ForceGuideGroup
  89. elseif type == Enum.ForceGuideTriggerEnum.FuncOpen then
  90. local storyData = ManagerContainer.CfgMgr:GetUIFuncUnLockCfgDataById(param)
  91. if storyData == nil then
  92. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  93. return
  94. end
  95. forceGuideGroup = storyData.ForceGuideGroup
  96. elseif type == Enum.ForceGuideTriggerEnum.FGGroupId then
  97. forceGuideGroup = tonumber(param)
  98. end
  99. --self.delayTimer = FrameTimer.New(function()
  100. if forceGuideGroup > 0 then
  101. if needCheck == nil or needCheck == true then
  102. self:AddForceGuideNeedCheck(forceGuideGroup)
  103. elseif needCheck == false then
  104. self:AddForceGuideDontCheck(forceGuideGroup)
  105. end
  106. else
  107. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  108. end
  109. --end, 1)
  110. --self.delayTimer:Start()
  111. end
  112. function ForceGuideMgr:AddForceGuideNeedCheck(groupId)
  113. if not needGuide then return end
  114. if self:CheckRecord(groupId) then
  115. self:AddForceGuide(groupId)
  116. self:StartForceGuideTask(true)
  117. end
  118. end
  119. function ForceGuideMgr:AddForceGuideDontCheck(groupId)
  120. if not needGuide then return end
  121. self:AddForceGuide(groupId)
  122. self:StartForceGuideTask(false)
  123. end
  124. function ForceGuideMgr:CheckRecord(groupId)
  125. local datas = ManagerContainer.DataMgr.ForceGuideData:GetForceGuideDatas()
  126. local maxK = 0
  127. for k,v in pairs(datas) do
  128. if k > maxK then
  129. maxK = k
  130. end
  131. end
  132. if groupId < maxK then
  133. return false
  134. elseif groupId == maxK then
  135. local groupDatas = ManagerContainer.CfgMgr:GetForceGuideGroupDatasById(groupId)
  136. for k1,v1 in pairs(groupDatas) do
  137. if datas[maxK] < v1.Id then
  138. return true
  139. end
  140. end
  141. else
  142. return true
  143. end
  144. end
  145. function ForceGuideMgr:AddForceGuide(groupId)
  146. if self.forceGuideGroups[groupId] == nil then
  147. LogHRWarning(groupId.." isnt exist in ForceGuideCfg")
  148. return
  149. end
  150. if self.forceGuideGroups[groupId].ids == nil or self.forceGuideGroups[groupId].records == nil then
  151. LogHRWarning(groupId.." data error")
  152. return
  153. end
  154. if not CommonUtil.EleInTable(groupId, self.forceGuideTasks) then
  155. self.forceGuideTasks[#self.forceGuideTasks + 1] = groupId
  156. end
  157. end
  158. function ForceGuideMgr:StartForceGuideTask(needCheck)
  159. if self.forceGuideState then return end
  160. if #self.forceGuideTasks == 0 then return end
  161. self.needCheck = needCheck
  162. self.curGroupId = self.forceGuideTasks[1]
  163. self.curGuideIdx = 0
  164. for i = 1, #self.forceGuideGroups[self.curGroupId].records do
  165. local v = self.forceGuideGroups[self.curGroupId].records[i]
  166. if (self.needCheck and not v) or not self.needCheck then
  167. self.curGuideIdx = i
  168. self.curGuideId = self.forceGuideGroups[self.curGroupId].ids[self.curGuideIdx]
  169. self.forceGuideState = true
  170. self:ForceGuideSDKReport(self.curGroupId, 0)
  171. --多步引导 引导第一步 首次就保存
  172. if #self.forceGuideGroups[self.curGroupId].records > 1 then
  173. if not ManagerContainer.DataMgr.ForceGuideData:GetForceGuideRecordByGroupId(self.curGroupId, self.curGuideId) then
  174. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPULSORY_GUIDANCE_REQ, {story_id = self.curGroupId, status = self.curGuideId})
  175. end
  176. end
  177. ManagerContainer.LuaUIMgr:OpenInputMask(Enum.UISibling[Enum.UIType.Story] - 1)
  178. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIBattle)
  179. ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIForceGuide, self.curGuideId)
  180. return
  181. end
  182. end
  183. end
  184. function ForceGuideMgr:StartNextForceGuideTask(id)
  185. if id == Enum.UIPageName.UIErrorTips then return end
  186. if self.forceGuideState then return end
  187. if #self.forceGuideTasks == 0 then return end
  188. if not self.curGuideIdx then return end
  189. self.curGroupId = self.forceGuideTasks[1]
  190. for i = 1, #self.forceGuideGroups[self.curGroupId].records do
  191. local v = self.forceGuideGroups[self.curGroupId].records[i]
  192. if i > self.curGuideIdx and ((self.needCheck and not v) or not self.needCheck) then
  193. self.curGuideIdx = i
  194. self.curGuideId = self.forceGuideGroups[self.curGroupId].ids[self.curGuideIdx]
  195. local cfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(self.curGuideId)
  196. if cfgData == nil then
  197. --LogHRWarning(id .." forceGuide over error")
  198. self:ForceGuideOver(true)
  199. return
  200. end
  201. if cfgData.UIId == id or ManagerContainer.LuaUIMgr:GetPage(cfgData.UIId) then
  202. self.forceGuideState = true
  203. --ManagerContainer.LuaUIMgr:Open(Enum.UIPageName.UIForceGuide, self.curGuideId)
  204. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_DISPLAY, self.curGuideId)
  205. end
  206. return
  207. end
  208. end
  209. end
  210. function ForceGuideMgr:GetCurGuideUIId()
  211. local cfgData = ManagerContainer.CfgMgr:GetPartnerDataById(self.curGuideId)
  212. if cfgData == nil then
  213. --LogHRWarning(id .." forceGuide over error")
  214. self:ForceGuideOver(true)
  215. return
  216. end
  217. return cfgData.UIId
  218. end
  219. function ForceGuideMgr:GetCurGuideId()
  220. return self.curGuideId
  221. end
  222. function ForceGuideMgr:CurForceGuideOver()
  223. self.forceGuideState = false
  224. if self.curGroupId == nil or self.curGuideId == nil then
  225. --LogHRWarning(" forceGuide over error")
  226. self:ForceGuideOver(true)
  227. return false
  228. end
  229. local cfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(self.curGuideId)
  230. if cfgData == nil then
  231. --LogHRWarning(" forceGuide over error")
  232. return false
  233. end
  234. if not ManagerContainer.DataMgr.ForceGuideData:GetForceGuideRecordByGroupId(self.curGroupId, self.curGuideId) then
  235. ManagerContainer.DataMgr.ForceGuideData:RefreshForceGuideData(self.curGroupId, self.curGuideId)
  236. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPULSORY_GUIDANCE_REQ, {story_id = self.curGroupId, status = self.curGuideId})
  237. end
  238. self.forceGuideGroups[self.curGroupId].records[self.curGuideIdx] = true
  239. if self.curGuideIdx == #self.forceGuideGroups[self.curGroupId].records then
  240. table.remove(self.forceGuideTasks, 1)
  241. if #self.forceGuideTasks == 0 then
  242. LogHRWarning(self.curGroupId .." group forceGuide over")
  243. self:ForceGuideOver()
  244. return false
  245. end
  246. end
  247. return true
  248. end
  249. function ForceGuideMgr:NeedManualOpenInEnd()
  250. if self.curGuideIdx then
  251. if self.curGuideIdx < #self.forceGuideGroups[self.curGroupId].records then
  252. local id = self.forceGuideGroups[self.curGroupId].ids[self.curGuideIdx]
  253. local nextId = self.forceGuideGroups[self.curGroupId].ids[self.curGuideIdx + 1]
  254. local curCfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(id)
  255. local nextCfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(nextId)
  256. local curUIId = curCfgData.UIId
  257. local nextUIId = nextCfgData.UIId
  258. local curUIData = ManagerContainer.CfgMgr:GetUIData(curUIId)
  259. local nextUIData = ManagerContainer.CfgMgr:GetUIData(nextUIId)
  260. if not curUIData or not nextUIData then
  261. return false
  262. end
  263. if curCfgData.UIId == nextCfgData.UIId then
  264. return true
  265. end
  266. if curUIData.type > 2 and nextUIData.type == 0 then
  267. return true
  268. end
  269. local uiBase = ManagerContainer.LuaUIMgr:GetPage(nextCfgData.UIId)
  270. if uiBase and uiBase.Inited and not uiBase.IsPageAnimation then
  271. return true
  272. end
  273. return false
  274. end
  275. end
  276. return false
  277. end
  278. function ForceGuideMgr:SetHasMaskOpenCompeleted(result)
  279. self.hasMaskOpenCompeleted = result
  280. end
  281. function ForceGuideMgr:MaskOpenAnimCompeleted()
  282. if not self.hasMaskOpenCompeleted then
  283. if self.forceGuideState then
  284. --当前强制引导节点结束
  285. self:CurForceGuideOver()
  286. if ManagerContainer.ForceGuideMgr:NeedManualOpenInEnd() then
  287. local id = self.forceGuideGroups[self.curGroupId].ids[self.curGuideIdx]
  288. local curCfgData = ManagerContainer.CfgMgr:GetForceGuideDataById(id)
  289. self:UIPageInEnd(curCfgData.UIId)
  290. end
  291. end
  292. else
  293. self.hasMaskOpenCompeleted = false
  294. end
  295. end
  296. function ForceGuideMgr:UIPageInEnd(id)
  297. if not self.forceGuideState then
  298. --继续同个组内的下一个强制引导节点
  299. self.delayTimer1 = FrameTimer.New(function()
  300. self:StartNextForceGuideTask(id)
  301. end, 1)
  302. self.delayTimer1:Start()
  303. end
  304. end
  305. function ForceGuideMgr:UIPageOutEnd(id)
  306. end
  307. function ForceGuideMgr:ForceGuideOver(isError)
  308. if self.curGuideId == nil then
  309. self:Reset()
  310. ManagerContainer.LuaUIMgr:CloseInputMask()
  311. return
  312. end
  313. if isError then
  314. LogHRWarning(self.curGroupId .." forceGuide end error")
  315. self:ForceGuideSDKReport(self.curGroupId, -1)
  316. local endId = self.forceGuideGroups[self.curGroupId].ids[#self.forceGuideGroups[self.curGroupId].ids]
  317. if not ManagerContainer.DataMgr.ForceGuideData:GetForceGuideRecordByGroupId(self.curGroupId, endId) then
  318. ManagerContainer.NetManager:SendMessage(ProtoMsgId.CS_COMPULSORY_GUIDANCE_REQ, {story_id = self.curGroupId, status = endId})
  319. end
  320. end
  321. table.remove(self.forceGuideTasks, 1)
  322. self:ForceGuideSDKReport(self.curGroupId, 1)
  323. self:Reset()
  324. ManagerContainer.LuaUIMgr:CloseInputMask()
  325. ManagerContainer.LuaUIMgr:ClosePage(Enum.UIPageName.UIForceGuide)
  326. ManagerContainer.LuaEventMgr:Dispatch(UIEventNames.UI_FORCE_GUIDE_OVER)
  327. end
  328. function ForceGuideMgr:ForceOver()
  329. self:Reset()
  330. ManagerContainer.LuaUIMgr:CloseInputMask()
  331. end
  332. function ForceGuideMgr:GuideBossBattle()
  333. if not ManagerContainer.FSMMgr:IsBattleState() then
  334. return false
  335. end
  336. local datas = ManagerContainer.DataMgr.ForceGuideData:GetForceGuideDatas()
  337. local maxK = 0
  338. local maxV = 0
  339. for k,v in pairs(datas) do
  340. if k > maxK then
  341. maxK = k
  342. maxV = v
  343. end
  344. end
  345. if maxK > 0 then
  346. return false
  347. end
  348. self:AddForceGuideDontCheck(1)
  349. return true
  350. end
  351. function ForceGuideMgr:Reset()
  352. self.forceGuideState = false
  353. self.curGroupId = nil
  354. self.curGuideIdx = nil
  355. self.curGuideId = nil
  356. self.needCheck = nil
  357. if self.delayTimer1 then
  358. self.delayTimer1:Stop()
  359. end
  360. self.delayTimer1 = nil
  361. end
  362. function ForceGuideMgr:Dispose()
  363. if self.delayTimer then
  364. self.delayTimer:Stop()
  365. end
  366. self.delayTimer = nil
  367. self.forceGuideGroups = {}
  368. self:Reset()
  369. ManagerContainer.LuaUIMgr:CloseInputMask()
  370. end
  371. function ForceGuideMgr:Destroy()
  372. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_FORCE_GUIDE_TRIGGER, self, self.ForceGuideTrigger)
  373. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self.UIPageOutEnd)
  374. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self.UIPageOutEnd)
  375. self:Dispose()
  376. self.forceGuideTasks = nil
  377. end
  378. function ForceGuideMgr:ForceGuideSDKReport(groupId, state)
  379. ManagerContainer.DataMgr.UserData:SyncRoleDataToSDK()
  380. local tutorialId = tostring(groupId)
  381. local tutorialName = tostring(groupId)
  382. local curTime = ManagerContainer.LuaTimerMgr:GetTimeSecond()
  383. local lv = ManagerContainer.DataMgr.UserData:GetRoleLv()
  384. if state ~= 0 then
  385. local delta = curTime - (self.beginTime or 0)
  386. SDKMgr.Instance:ReportTutorial(tutorialId, tutorialName, 0, 0, 0, lv, delta, state)
  387. else
  388. self.beginTime = curTime
  389. local beginTimeStamp = int64.new(tostring(curTime * 1000))
  390. SDKMgr.Instance:ReportTutorial(tutorialId, tutorialName, 0, 0, beginTimeStamp, lv, 0, state)
  391. end
  392. end
  393. return ForceGuideMgr