ExecuteSequenceMgr.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. --[[
  2. 顺序执行设定代码
  3. ]]
  4. local ExecuteSequenceMgr = class('ExecuteSequenceMgr')
  5. local executeSequenceDatas = nil
  6. local executeSequenceDataNum = nil
  7. function ExecuteSequenceMgr:ctor()
  8. executeSequenceDatas = {}
  9. executeSequenceDataNum = 0
  10. self:RegisterEvent()
  11. end
  12. function ExecuteSequenceMgr:Destroy()
  13. self:UnRegisterEvent()
  14. if executeSequenceDatas and executeSequenceDataNum then
  15. for i = 1, executeSequenceDataNum do
  16. executeSequenceDatas[i]:Dispose()
  17. end
  18. end
  19. executeSequenceDatas = nil
  20. executeSequenceDataNum = nil
  21. end
  22. function ExecuteSequenceMgr:RegisterEvent()
  23. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_FILLCONTENT_COMPELETED, self, self._UIOpenCompleted)
  24. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self._UICloseCompleted)
  25. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self._UIViewOpenAnimEnd)
  26. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self._UIViewCloseAnimEnd)
  27. ManagerContainer.LuaEventMgr:RegisterEvent(UIEventNames.STORY_DATA_CHANGED, self, self._OnStoryDataChanged)
  28. end
  29. function ExecuteSequenceMgr:UnRegisterEvent()
  30. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_FILLCONTENT_COMPELETED, self, self._UIOpenCompleted)
  31. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_CLOSE_COMPELETED, self, self._UICloseCompleted)
  32. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_IN_END_NTF, self, self._UIViewOpenAnimEnd)
  33. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.UI_PAGE_OUT_END_NTF, self, self._UIViewCloseAnimEnd)
  34. ManagerContainer.LuaEventMgr:UnregisterEvent(UIEventNames.STORY_DATA_CHANGED, self, self._OnStoryDataChanged)
  35. end
  36. function ExecuteSequenceMgr:SkipToStep(executeSequenceData, stepId)
  37. if not executeSequenceData then return end
  38. if not executeSequenceData:GetIsExecuting() then return end
  39. local len = executeSequenceData:GetExecuteDataLength()
  40. if stepId < len then len = stepId end
  41. executeSequenceData:StopTimer()
  42. for i = 1, len - 1 do
  43. executeSequenceData:RemoveCurExecuteData()
  44. end
  45. self:_Execute(executeSequenceData)
  46. end
  47. function ExecuteSequenceMgr:Execute(executeSequenceData)
  48. if not executeSequenceData then return end
  49. executeSequenceDataNum = executeSequenceDataNum + 1
  50. executeSequenceDatas[executeSequenceDataNum] = executeSequenceData
  51. if executeSequenceData:GetIsExecuting() then return end
  52. executeSequenceData:SetIsExecuting(true)
  53. self:_Execute(executeSequenceData)
  54. end
  55. function ExecuteSequenceMgr:Exit(executeSequenceData)
  56. if not executeSequenceData then return end
  57. if not executeSequenceData:GetIsExecuting() then return end
  58. self:_Exit(executeSequenceData)
  59. end
  60. function ExecuteSequenceMgr:_Execute(executeSequenceData)
  61. local data = executeSequenceData:GetCurExecuteData()
  62. local isError = true
  63. while data do
  64. local type = data.type
  65. if type == Enum.ExecuteSequenceType.Func then
  66. executeSequenceData:RemoveCurExecuteData()
  67. if self:_ExecuteFunc(data) then
  68. data = executeSequenceData:GetCurExecuteData()
  69. else
  70. break
  71. end
  72. elseif type == Enum.ExecuteSequenceType.Listener then
  73. self:_ExecuteListenerTimeOut(executeSequenceData, data)
  74. if not self:_ExecuteAfterListener(executeSequenceData) then
  75. isError = false
  76. end
  77. break
  78. elseif type == Enum.ExecuteSequenceType.UIViewFunc then
  79. executeSequenceData:RemoveCurExecuteData()
  80. if self:_ExecuteUIViewFunc(data) then
  81. data = executeSequenceData:GetCurExecuteData()
  82. else
  83. break
  84. end
  85. elseif type == Enum.ExecuteSequenceType.Interval then
  86. self:_ExecuteInterval(executeSequenceData, data)
  87. isError = false
  88. break
  89. elseif type == Enum.ExecuteSequenceType.FuncAfterListener or type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
  90. LogError("execute error, " .. tostring(type) .. ' Can\'t execute this')
  91. break
  92. else
  93. LogError("execute error, unkown type " .. tostring(type))
  94. break
  95. end
  96. end
  97. if isError then
  98. self:_Exit(executeSequenceData)
  99. end
  100. end
  101. function ExecuteSequenceMgr:_ExecuteAfterListener(executeSequenceData)
  102. local data = executeSequenceData:GetNextExecuteData()
  103. local isError = false
  104. while data do
  105. local type = data.type
  106. if type == Enum.ExecuteSequenceType.FuncAfterListener then
  107. executeSequenceData:RemoveNextExecuteData()
  108. if self:_ExecuteFunc(data) then
  109. data = executeSequenceData:GetNextExecuteData()
  110. else
  111. isError = true
  112. break
  113. end
  114. elseif type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
  115. executeSequenceData:RemoveNextExecuteData()
  116. if self:_ExecuteUIViewFunc(data) then
  117. data = executeSequenceData:GetNextExecuteData()
  118. else
  119. isError = true
  120. break
  121. end
  122. else
  123. break
  124. end
  125. end
  126. return isError
  127. end
  128. function ExecuteSequenceMgr:_Exit(executeSequenceData)
  129. if not executeSequenceData then return end
  130. executeSequenceData:SetIsExecuting(false)
  131. for i = 1, executeSequenceData:GetExecuteDataLength() do
  132. local data = executeSequenceData:GetExecuteDataByIdx(i)
  133. if data.forceAfterErr then
  134. local type = data.type
  135. if type == Enum.ExecuteSequenceType.Func or type == Enum.ExecuteSequenceType.FuncAfterListener then
  136. self:_ExecuteFunc(data)
  137. -- elseif data.type == ExecuteSequenceType.Listener then
  138. elseif type == Enum.ExecuteSequenceType.UIViewFunc or type == Enum.ExecuteSequenceType.UIViewFuncAfterListener then
  139. self:_ExecuteUIViewFunc(data)
  140. -- elseif data.type == ExecuteSequenceType.Interval then
  141. end
  142. end
  143. end
  144. for i = executeSequenceDataNum, 1, -1 do
  145. if executeSequenceDatas[i] == executeSequenceData then
  146. table.remove(executeSequenceDatas, i)
  147. executeSequenceDataNum = executeSequenceDataNum - 1
  148. end
  149. end
  150. executeSequenceData:Dispose()
  151. end
  152. function ExecuteSequenceMgr:_UIOpenCompleted(owner)
  153. for i = 1, executeSequenceDataNum do
  154. self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_FILLCONTENT_COMPELETED, owner.uiData.id)
  155. end
  156. end
  157. function ExecuteSequenceMgr:_UICloseCompleted(owner)
  158. for i = 1, executeSequenceDataNum do
  159. self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_CLOSE_COMPELETED, owner.uiData.id)
  160. end
  161. end
  162. function ExecuteSequenceMgr:_UIViewOpenAnimEnd(id)
  163. for i = 1, executeSequenceDataNum do
  164. self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_PAGE_IN_END_NTF, id)
  165. end
  166. end
  167. function ExecuteSequenceMgr:_UIViewCloseAnimEnd(id)
  168. for i = 1, executeSequenceDataNum do
  169. self:_ExecuteUIListener(executeSequenceDatas[i], UIEventNames.UI_PAGE_OUT_END_NTF, id)
  170. end
  171. end
  172. function ExecuteSequenceMgr:_OnStoryDataChanged()
  173. for i = 1, executeSequenceDataNum do
  174. self:_ExecuteListener(executeSequenceDatas[i], UIEventNames.STORY_DATA_CHANGED)
  175. end
  176. end
  177. function ExecuteSequenceMgr:_ExecuteFunc(data)
  178. local ok, err
  179. if data.ownerFunc then
  180. if data.owner then
  181. ok, err = RO_XPCALL(data.ownerFunc, debug.traceback, data.owner, unpack(data.args))
  182. else
  183. ok, err = RO_XPCALL(data.ownerFunc, debug.traceback, unpack(data.args))
  184. end
  185. end
  186. if not ok then
  187. if data.args and #data.args > 0 then
  188. local argStr = 'args ('
  189. for i = 1, #data.args do
  190. if i == 1 then
  191. argStr = argStr .. tostring(data.args[i])
  192. else
  193. argStr = argStr .. ',' .. tostring(data.args[i])
  194. end
  195. end
  196. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteFunc error ! ' .. argStr .. ')' .. ' ' .. tostring(err))
  197. else
  198. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteFunc error ! ' .. tostring(err))
  199. end
  200. end
  201. return ok
  202. end
  203. function ExecuteSequenceMgr:_ExecuteUIListener(executeSequenceData, eventName, id)
  204. if not executeSequenceData then return end
  205. local data = executeSequenceData:GetCurExecuteData()
  206. if not data then return end
  207. if data.type == Enum.ExecuteSequenceType.Listener and data.eventName == eventName and data.id == id then
  208. self:_ExecuteListenerComplete(executeSequenceData)
  209. end
  210. end
  211. function ExecuteSequenceMgr:_ExecuteListener(executeSequenceData, eventName)
  212. if not executeSequenceData then return end
  213. local data = executeSequenceData:GetCurExecuteData()
  214. if not data then return end
  215. if data.type == Enum.ExecuteSequenceType.Listener and data.eventName == eventName then
  216. self:_ExecuteListenerComplete(executeSequenceData)
  217. end
  218. end
  219. function ExecuteSequenceMgr:_ExecuteListenerComplete(executeSequenceData)
  220. executeSequenceData:StopTimer()
  221. executeSequenceData:RemoveCurExecuteData()
  222. self:_Execute(executeSequenceData)
  223. end
  224. function ExecuteSequenceMgr:_ExecuteListenerTimeOut(executeSequenceData, data)
  225. if data.duration then
  226. executeSequenceData:StartTimer(function()
  227. self:_Exit(executeSequenceData)
  228. end, data)
  229. end
  230. return true
  231. end
  232. function ExecuteSequenceMgr:_ExecuteUIViewFunc(data)
  233. local uibase = ManagerContainer.LuaUIMgr:GetPage(data.id)
  234. if not uibase then
  235. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find UIBase ' .. tostring(data.id))
  236. return false
  237. end
  238. local luaTable = uibase.MLuaTable
  239. if not luaTable then
  240. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find UIBase\'s luatable ' .. tostring(data.id))
  241. return false
  242. end
  243. local func = luaTable[data.funcName]
  244. if type(func) ~= 'function' then
  245. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc error, not find ' .. tostring(data.funcName) .. 'is not exist or not function in UIBase\'s luatable' .. tostring(data.id))
  246. return false
  247. end
  248. local ok, err = RO_XPCALL(func, debug.traceback, luaTable, unpack(data.args))
  249. if not ok then
  250. if data.args and #data.args > 0 then
  251. local argStr = 'args ('
  252. for i = 1, #data.args do
  253. if i == 1 then
  254. argStr = argStr .. tostring(data.args[i])
  255. else
  256. argStr = argStr .. ',' .. tostring(data.args[i])
  257. end
  258. end
  259. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc fun error ! ' .. argStr .. ')' .. ' ' .. tostring(err))
  260. else
  261. LogError('[Wboy] ExecuteSequenceMgr:_ExecuteUIViewFunc fun error ! ' .. tostring(err))
  262. end
  263. return false
  264. end
  265. return ok
  266. end
  267. function ExecuteSequenceMgr:_ExecuteInterval(executeSequenceData, data)
  268. if data.duration then
  269. executeSequenceData:StartTimer(function()
  270. self:_ExecuteIntervalComplete(executeSequenceData)
  271. end, data)
  272. else
  273. self:_ExecuteIntervalComplete(executeSequenceData)
  274. end
  275. return true
  276. end
  277. function ExecuteSequenceMgr:_ExecuteIntervalComplete(executeSequenceData)
  278. executeSequenceData:StopTimer()
  279. executeSequenceData:RemoveCurExecuteData()
  280. self:_Execute(executeSequenceData)
  281. end
  282. return ExecuteSequenceMgr