ExecuteSequenceData.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. local ExecuteSequenceData = class('ExecuteSequenceData')
  2. function ExecuteSequenceData:ctor()
  3. self.isExecuting = nil
  4. self.datas = {}
  5. self.timer = nil
  6. end
  7. function ExecuteSequenceData:Dispose()
  8. self.isExecuting = nil
  9. self.datas = nil
  10. if self.timer then
  11. self.timer:Stop()
  12. end
  13. self.timer = nil
  14. end
  15. function ExecuteSequenceData:Reset()
  16. self:Dispose()
  17. self.datas = {}
  18. end
  19. function ExecuteSequenceData:ClearDatas()
  20. self.datas = {}
  21. if self.timer then
  22. self.timer:Stop()
  23. end
  24. self.timer = nil
  25. end
  26. ---添加执行函数
  27. ---@param forceAfterErr boolean 在顺序执行的过程中,发生错误后,是否还需要强制执行
  28. ---@param owner table|nil
  29. ---@param ownerFunc function
  30. function ExecuteSequenceData:AppendFunc(forceAfterErr, owner, ownerFunc, ...)
  31. if not ownerFunc then return end
  32. local data = { type = Enum.ExecuteSequenceType.Func, forceAfterErr = forceAfterErr, owner = owner, ownerFunc = ownerFunc, args = {...} }
  33. self:AppendData(data)
  34. end
  35. function ExecuteSequenceData:InsertNextFunc(forceAfterErr, owner, ownerFunc, ...)
  36. if not ownerFunc then return end
  37. local data = { type = Enum.ExecuteSequenceType.Func, forceAfterErr = forceAfterErr, owner = owner, ownerFunc = ownerFunc, args = {...} }
  38. self:InsertDataNext(data)
  39. end
  40. function ExecuteSequenceData:FindFunc(forceAfterErr, owner, ownerFunc, ...)
  41. if not ownerFunc then return end
  42. if not self.datas then return end
  43. for i = 1, #self.datas do
  44. local data = self.datas[i]
  45. if data.type == Enum.ExecuteSequenceType.Func and data.forceAfterErr == forceAfterErr and data.owner == owner and data.ownerFunc == ownerFunc then
  46. if self:CheckArgsSome(data.args, {...}) then
  47. return i
  48. end
  49. end
  50. end
  51. return 0
  52. end
  53. ---添加执行函数,在监听完成后, 一般来说只在 AppendUIListener或AppendListener 之后立即调用
  54. ---@param forceAfterErr boolean 在顺序执行的过程中,发生错误后,是否还需要强制执行
  55. ---@param owner table|nil
  56. ---@param ownerFunc function
  57. function ExecuteSequenceData:AppendFuncAfterListener(forceAfterErr, owner, ownerFunc, ...)
  58. if not ownerFunc then return end
  59. local data = { type = Enum.ExecuteSequenceType.FuncAfterListener, forceAfterErr = forceAfterErr, owner = owner, ownerFunc = ownerFunc, args = {...} }
  60. self:AppendData(data)
  61. end
  62. function ExecuteSequenceData:InsertNextFuncAfterListener(forceAfterErr, owner, ownerFunc, ...)
  63. if not ownerFunc then return end
  64. local data = { type = Enum.ExecuteSequenceType.FuncAfterListener, forceAfterErr = forceAfterErr, owner = owner, ownerFunc = ownerFunc, args = {...} }
  65. self:InsertDataNext(data)
  66. end
  67. function ExecuteSequenceData:FindFuncAfterListener(forceAfterErr, owner, ownerFunc, ...)
  68. if not ownerFunc then return end
  69. if not self.datas then return end
  70. for i = 1, #self.datas do
  71. local data = self.datas[i]
  72. if data.type == Enum.ExecuteSequenceType.FuncAfterListener and data.forceAfterErr == forceAfterErr and data.owner == owner and data.ownerFunc == ownerFunc then
  73. if self:CheckArgsSome(data.args, {...}) then
  74. return i
  75. end
  76. end
  77. end
  78. return 0
  79. end
  80. ---添加UI消息监听
  81. ---@param id integer UI的配置ID
  82. ---@param eventName UIEventNames 消息类型
  83. ---@param timeOut number|nil 回调时间,当为空时,会一直监听直到界面打开
  84. function ExecuteSequenceData:AppendUIListener(id, eventName, timeOut)
  85. if not id then return end
  86. if not eventName then return end
  87. local data = { type = Enum.ExecuteSequenceType.Listener, id = id, eventName = eventName, duration = timeOut}
  88. self:AppendData(data)
  89. end
  90. function ExecuteSequenceData:InsertNextUIListener(id, eventName, timeOut)
  91. if not id then return end
  92. if not eventName then return end
  93. local data = { type = Enum.ExecuteSequenceType.Listener, id = id, eventName = eventName, duration = timeOut}
  94. self:InsertDataNext(data)
  95. end
  96. function ExecuteSequenceData:FindUIListener(id, eventName, timeOut)
  97. if not id then return end
  98. if not eventName then return end
  99. if not self.datas then return end
  100. for i = 1, #self.datas do
  101. local data = self.datas[i]
  102. if data.type == Enum.ExecuteSequenceType.Listener and data.id == id and data.eventName == eventName and data.duration == timeOut then
  103. return i
  104. end
  105. end
  106. return 0
  107. end
  108. ---添加消息监听
  109. ---@param eventName UIEventNames 消息类型
  110. ---@param timeOut number|nil 回调时间,当为空时,会一直监听直到界面打开
  111. function ExecuteSequenceData:AppendListener(eventName, timeOut)
  112. if not eventName then return end
  113. local data = { type = Enum.ExecuteSequenceType.Listener, eventName = eventName, duration = timeOut}
  114. self:AppendData(data)
  115. end
  116. function ExecuteSequenceData:InsertNextListener(eventName, timeOut)
  117. if not eventName then return end
  118. local data = { type = Enum.ExecuteSequenceType.Listener, eventName = eventName, duration = timeOut}
  119. self:InsertDataNext(data)
  120. end
  121. function ExecuteSequenceData:FindListener(eventName, timeOut)
  122. if not eventName then return end
  123. if not self.datas then return end
  124. for i = 1, #self.datas do
  125. local data = self.datas[i]
  126. if data.type == Enum.ExecuteSequenceType.Listener and data.eventName == eventName and data.duration == timeOut then
  127. return i
  128. end
  129. end
  130. return 0
  131. end
  132. ---添加执行函数
  133. ---@param forceAfterErr boolean 在顺序执行的过程中,发生错误后,是否还需要强制执行
  134. ---@param id integer UI的配置ID
  135. ---@param funcName string 执行的函数名字
  136. function ExecuteSequenceData:AppendUIViewFunc(forceAfterErr, id, funcName, ...)
  137. local data = { type = Enum.ExecuteSequenceType.UIViewFunc, forceAfterErr = forceAfterErr, id = id, funcName = funcName, args = {...} }
  138. self:AppendData(data)
  139. end
  140. function ExecuteSequenceData:InsertNextUIViewFunc(forceAfterErr, id, funcName, ...)
  141. local data = { type = Enum.ExecuteSequenceType.UIViewFunc, forceAfterErr = forceAfterErr, id = id, funcName = funcName, args = {...} }
  142. self:InsertDataNext(data)
  143. end
  144. function ExecuteSequenceData:FindUIViewFunc(forceAfterErr, id, funcName, ...)
  145. if not self.datas then return end
  146. for i = 1, #self.datas do
  147. local data = self.datas[i]
  148. if data.type == Enum.ExecuteSequenceType.UIViewFunc and data.forceAfterErr == forceAfterErr and data.id == id and data.funcName == funcName then
  149. if self:CheckArgsSome(data.args, {...}) then
  150. return i
  151. end
  152. end
  153. end
  154. return 0
  155. end
  156. ---添加执行函数, 在监听完成后, 一般来说只在 AppendUIListener或AppendListener 之后立即调用
  157. ---@param forceAfterErr boolean 在顺序执行的过程中,发生错误后,是否还需要强制执行
  158. ---@param id integer UI的配置ID
  159. ---@param funcName string 执行的函数名字
  160. function ExecuteSequenceData:AppendUIViewFuncAfterListener(forceAfterErr, id, funcName, ...)
  161. local data = { type = Enum.ExecuteSequenceType.UIViewFuncAfterListener, forceAfterErr = forceAfterErr, id = id, funcName = funcName, args = {...} }
  162. self:AppendData(data)
  163. end
  164. function ExecuteSequenceData:InsertNextUIViewFuncAfterListener(forceAfterErr, id, funcName, ...)
  165. local data = { type = Enum.ExecuteSequenceType.UIViewFuncAfterListener, forceAfterErr = forceAfterErr, id = id, funcName = funcName, args = {...} }
  166. self:InsertDataNext(data)
  167. end
  168. function ExecuteSequenceData:FindUIViewFuncAfterListener(forceAfterErr, id, funcName, ...)
  169. if not self.datas then return end
  170. for i = 1, #self.datas do
  171. local data = self.datas[i]
  172. if data.type == Enum.ExecuteSequenceType.UIViewFuncAfterListener and data.forceAfterErr == forceAfterErr and data.id == id and data.funcName == funcName then
  173. if self:CheckArgsSome(data.args, {...}) then
  174. return i
  175. end
  176. end
  177. end
  178. return 0
  179. end
  180. ---添加延迟
  181. ---@param duration number 延迟时间
  182. function ExecuteSequenceData:AppendInterval(duration)
  183. if not duration or duration <= 0 then return end
  184. local data = { type = Enum.ExecuteSequenceType.Interval, duration = duration}
  185. self:AppendData(data)
  186. end
  187. function ExecuteSequenceData:InsertNextInterval(duration)
  188. if not duration or duration <= 0 then return end
  189. local data = { type = Enum.ExecuteSequenceType.Interval, duration = duration}
  190. self:InsertDataNext(data)
  191. end
  192. function ExecuteSequenceData:FindInterval(duration)
  193. if not duration or duration <= 0 then return end
  194. if not self.datas then return end
  195. for i = 1, #self.datas do
  196. local data = self.datas[i]
  197. if data.type == Enum.ExecuteSequenceType.Interval and not data.isFrame and data.duration == duration then
  198. return i
  199. end
  200. end
  201. return 0
  202. end
  203. ---添加延迟帧数
  204. ---@param duration number 延迟时间
  205. function ExecuteSequenceData:AppendFrameInterval(frameCount)
  206. if not frameCount or frameCount <= 0 then return end
  207. local data = { type = Enum.ExecuteSequenceType.Interval, isFrame = true, duration = frameCount}
  208. self:AppendData(data)
  209. end
  210. function ExecuteSequenceData:InsertNextFrameInterval(frameCount)
  211. if not frameCount or frameCount <= 0 then return end
  212. local data = { type = Enum.ExecuteSequenceType.Interval, isFrame = true, duration = frameCount}
  213. self:InsertDataNext(data)
  214. end
  215. function ExecuteSequenceData:FindFrameInterval(frameCount)
  216. if not frameCount or frameCount <= 0 then return end
  217. if not self.datas then return end
  218. for i = 1, #self.datas do
  219. local data = self.datas[i]
  220. if data.type == Enum.ExecuteSequenceType.Interval and data.isFrame and data.duration == frameCount then
  221. return i
  222. end
  223. end
  224. return 0
  225. end
  226. function ExecuteSequenceData:HasDelayMethod()
  227. if not self.datas then return false end
  228. for i = 1, #self.datas do
  229. local data = self.datas[i]
  230. if data.type == Enum.ExecuteSequenceType.Interval or data.type == Enum.ExecuteSequenceType.Listener then
  231. return true
  232. end
  233. end
  234. return false
  235. end
  236. function ExecuteSequenceData:AppendData(data)
  237. self.datas[#self.datas + 1] = data
  238. end
  239. function ExecuteSequenceData:InsertDataNext(data)
  240. table.insert(self.datas, 1, data)
  241. end
  242. function ExecuteSequenceData:CheckArgsSome(args1, args2)
  243. local len1 = #args1
  244. local len2 = #args2
  245. if len1 ~= len2 then return false end
  246. for i = 1, len1 do
  247. if args1[i] ~= args2[i] then
  248. return false
  249. end
  250. end
  251. return true
  252. end
  253. function ExecuteSequenceData:GetCurExecuteData()
  254. return self.datas and self.datas[1] or nil
  255. end
  256. function ExecuteSequenceData:RemoveCurExecuteData()
  257. if self.datas then
  258. table.remove(self.datas, 1)
  259. end
  260. end
  261. function ExecuteSequenceData:GetNextExecuteData()
  262. return self.datas and self.datas[2] or nil
  263. end
  264. function ExecuteSequenceData:RemoveNextExecuteData()
  265. if self.datas then
  266. table.remove(self.datas, 2)
  267. end
  268. end
  269. function ExecuteSequenceData:GetExecuteDataLength()
  270. return self.datas and #self.datas or 0
  271. end
  272. function ExecuteSequenceData:GetExecuteDataByIdx(idx)
  273. return self.datas[idx]
  274. end
  275. function ExecuteSequenceData:GetIsExecuting()
  276. return self.isExecuting
  277. end
  278. function ExecuteSequenceData:SetIsExecuting(state)
  279. self.isExecuting = state
  280. end
  281. function ExecuteSequenceData:StartTimer(func, data)
  282. self:StopTimer()
  283. if data.isFrame then
  284. self.timer = FrameTimer.New(func, data.duration)
  285. else
  286. self.timer = Timer.New(func, data.duration)
  287. end
  288. self.timer:Start()
  289. end
  290. function ExecuteSequenceData:StopTimer()
  291. if self.timer then
  292. self.timer:Stop()
  293. self.timer = nil
  294. end
  295. end
  296. return ExecuteSequenceData