Timer.lua 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. now = now or 0 --当前时间
  2. d = d or 0 --真实时间的偏移值
  3. local Config = require("Config")
  4. local Log = require("common.Log")
  5. local Monitor = require("core.Monitor")
  6. local ObjHuman = require("core.ObjHuman")
  7. local JjcLogic = require("jjc.JjcLogic")
  8. local FundLogic = require("present.FundLogic")
  9. local LoginSignLogic = require("loginSign.LoginSignLogic")
  10. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  11. local MiddleHeartBeat = require("middle.MiddleHeartBeat")
  12. local MiddleConnect = require("middle.MiddleConnect")
  13. local DrillLogic = require("drill.DrillLogic")
  14. local UnionWarMiddleLogic = require("union.UnionWarMiddleLogic")
  15. local UnionWarLogic = require("union.UnionWarLogic")
  16. local Util = require("common.Util")
  17. local UnionDBLogic = require("union.UnionDBLogic")
  18. local UnionLogic = require("union.UnionLogic")
  19. local BattleLogic = require("battle.BattleLogic")
  20. local CommonDB = require("common.CommonDB")
  21. local UnionWarDBLogic = require("union.UnionWarDBLogic")
  22. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  23. local QQApi = require("platform.QQApi")
  24. local ReportOnline = require("platform.ReportOnline")
  25. local LianyuLogic = require("lianyu.LianyuLogic")
  26. local YunYingLogic = require("yunying.YunYingLogic")
  27. local FcmLogic = require("fcm.FcmLogic")
  28. local SharePlatformLogic = require("present.SharePlatformLogic")
  29. local JjcGodWarLogic = require("jjcGodWar.JjcGodWarLogic")
  30. local JjcLadderLogic = require("jjcLadder.JjcLadderLogic")
  31. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  32. local ValleyLogic = require("valley.ValleyLogic")
  33. local YjTreasureLogic = require("yjTreasure.YjTreasureLogic")
  34. local UnionWarLogic = require("union.UnionWarLogic")
  35. local WarReportMiddle = require("warReport.WarReportMiddle")
  36. local ZhanbuLogic = require("zhanbu.ZhanbuLogic")
  37. local BillboardLogic = require("billboard.BillboardLogic")
  38. local ChatRecord = require("chat.ChatRecord")
  39. local HeroGrowUp = require("absAct.HeroGrowUp")
  40. local AbsActLogic = require("absAct.AbsActLogic")
  41. local MoZhuMiddleLogic = require("mozhu.MoZhuMiddleLogic")
  42. local LostTempleLogic = require("lostTemple.lostTempleLogic")
  43. local MainDianLogic = require("MaiDian.MaiDianLogic")
  44. local VoucherShopLogic = require("voucher.VoucherShopLogic")
  45. local ServerCommerceMiddle = require("serverCommerce.ServerCommerceMiddle")
  46. local JjcNewLadderLogic = require("jjcnewladder.jjcNewLadderLogic")
  47. local CycleActivityLogic = require("yunying.CycleActivity")
  48. local commonOperate = require("core.commonOperate")
  49. local GodsAreaCS = require("godsArea.GodsAreaCS")
  50. local AreaBattleCS = require("areaBattle.AreaBattleCS")
  51. local AnotherWorldBattleCS = require("anotherWorldBattle.AnotherWorldBattleCS")
  52. register_timer = {
  53. monitor = 60000, --
  54. offlineCheck = 10000, -- 离线校验
  55. saveChar = 1000, -- 用户存db
  56. onZhengDian = 15000,
  57. humanRefresh = 10000, -- 角色心跳刷新
  58. middleHeartbeat = 3000,
  59. dayCheck = 100, -- 天检测
  60. unionOfflineCheck = 1000, -- 公会会长离线时间检查
  61. paomaHerartbeat = 10000, -- 跑马灯心跳
  62. tenSecond = 10000, -- 10秒1次通用
  63. oneMin = 60000, -- 60秒1次通用
  64. reportOnline = 300000, -- 在线时长上报心跳
  65. fcm = 60000, -- 防沉迷
  66. jjcGodWar = 2000, -- 众神之战
  67. jjcLadder = 2000, -- 天梯争霸
  68. valley = 2000, -- 荣耀峡谷
  69. later = 1000, -- 1秒1次 专门为了一些大数据量的处理延后处理用
  70. }
  71. LATER_DAYA = LATER_DAYA or {} -- {ts,func,param1, param2, param3, param4}
  72. function monitor()
  73. print(_G.collectgarbage("count"))
  74. local humanCnt = ObjHuman.getOnlineCnt()
  75. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), humanCnt)
  76. Monitor.output()
  77. end
  78. function tenSecond()
  79. QQApi.onTimer()
  80. end
  81. function oneMin()
  82. MiddleConnect.onTimer()
  83. ZhanbuLogic.checkRecover()
  84. AreaBattleCS.oneMin()
  85. AnotherWorldBattleCS.oneMin()
  86. end
  87. function offlineCheck()
  88. _G.collectgarbage("step", 100000)
  89. ObjHuman.humanOfflineCheck()
  90. end
  91. function saveChar()
  92. ObjHuman.saveCharDB()
  93. end
  94. function humanRefresh()
  95. ObjHuman.refresh()
  96. end
  97. function doZhengDian(hour)
  98. -- 整点的时候刷新逻辑用的内存较多 这里gc一把
  99. _G.collectgarbage("step", 100000)
  100. if hour == 0 then
  101. YjTreasureLogic.onZero()
  102. CycleActivityLogic.onZero()
  103. YunYingLogic.onZero()
  104. for _, human in pairs(ObjHuman.onlineUuid) do
  105. ObjHuman.updateDaily(human)
  106. YunYingLogic.onZeroHuman(human)
  107. DailyTaskLogic.onLogin(human)
  108. end
  109. UnionLogic.onHour()
  110. LianyuLogic.onZero()
  111. SharePlatformLogic.onZero()
  112. WarReportMiddle.onZero()
  113. BillboardLogic.onZero()
  114. ChatRecord.CHAT_RECORD_REPETITION = {}
  115. HeroGrowUp.actLoop()
  116. LostTempleLogic.onZero()
  117. VoucherShopLogic.VoucherShop_OnZero()
  118. MainDianLogic.MaiDian_OnTime()
  119. ServerCommerceMiddle.CommerceMiddle_OnZero()
  120. commonOperate.onZero()
  121. end
  122. GodsAreaCS.onHour(hour)
  123. AreaBattleCS.onHour(hour)
  124. AnotherWorldBattleCS.onHour(hour)
  125. --if hour == 21 then
  126. -- if _G.is_middle ~= true then
  127. -- JjcLogic.onHour(hour)
  128. -- end
  129. --end
  130. JjcLogic.onHour(hour)
  131. JjcNewLadderLogic.onHour(hour)
  132. if hour == 2 then
  133. local weekDay = Util.getWeekDay()
  134. if weekDay == 2 then
  135. -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
  136. MiddleConnect.autoResetMiddle()
  137. end
  138. end
  139. YunYingLogic.onHour(hour)
  140. UnionWarDBLogic.onHour(hour)
  141. AbsActLogic.onHour(hour)
  142. MoZhuMiddleLogic.onHour(hour)
  143. -- 晚上11点检查美团2楼玩家每日固定奖励领取情况
  144. if hour == 23 then
  145. local ZhuanpanLogic = require("zhuanpan.ZhuanpanLogic")
  146. ZhuanpanLogic.checkMtFrom2floorDailyReward()
  147. end
  148. _G.collectgarbage("step", 100000)
  149. end
  150. lastUpDateTime = lastUpDateTime or nil
  151. function onZhengDian()
  152. if lastUpDateTime and (now - lastUpDateTime) < 180000 or 120000 < now % (1000 * 60 * 60) then
  153. return
  154. end
  155. lastUpDateTime = now
  156. local hour = os.date("%H", math.floor(now / 1000)) + 0
  157. print("onZhengDian", hour)
  158. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc befor')
  159. _G.collectgarbage("collect")
  160. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc after')
  161. doZhengDian(hour)
  162. end
  163. function dayCheck()
  164. local call = 1
  165. local now = os.time()
  166. local resetTime = CommonDB.getResetTime()
  167. if resetTime == 0 then
  168. CommonDB.setResetTime(now)
  169. return
  170. end
  171. if call == 1 then
  172. local sameDay = Util.isSameDay(resetTime, now)
  173. call = sameDay == nil and 0 or 1
  174. end
  175. if call == 0 then
  176. CommonDB.setResetTime(now)
  177. DrillLogic.dayCheck()
  178. end
  179. end
  180. function middleHeartbeat()
  181. MiddleHeartBeat.heartbeat()
  182. end
  183. function unionOfflineCheck()
  184. UnionLogic.onTimer()
  185. end
  186. function paomaHerartbeat()
  187. ChatPaoMaLogic.onTimer()
  188. end
  189. function reportOnline()
  190. ReportOnline.onTimer()
  191. end
  192. function fcm()
  193. FcmLogic.onTimer()
  194. end
  195. function jjcGodWar()
  196. JjcGodWarLogic.onTimer()
  197. end
  198. function jjcLadder()
  199. JjcLadderLogic.onTimer()
  200. end
  201. function valley()
  202. ValleyLogic.onTimer()
  203. end
  204. function later()
  205. if LATER_DAYA[1] == nil then
  206. return
  207. end
  208. local tempData = LATER_DAYA[1]
  209. local now = os.time()
  210. local ts = tempData.ts
  211. if ts <= now then
  212. table.remove(LATER_DAYA, 1)
  213. tempData.func(tempData.param1, tempData.param2, tempData.param3, tempData.param4)
  214. end
  215. end
  216. last_exe_time = last_exe_time or {}
  217. function handlerTime(msec)
  218. now = msec + d
  219. if not register_timer[last_exe_func] then
  220. last_exe_func = nil
  221. end
  222. local tmp = last_exe_func
  223. while true do
  224. local k, v = next(register_timer, last_exe_func)
  225. if not k then
  226. k, v = next(register_timer)
  227. end
  228. if not k then
  229. return
  230. end
  231. last_exe_func = k
  232. local last_time = last_exe_time[k]
  233. if last_time then
  234. if last_time + v <= now then
  235. last_exe_time[k] = now
  236. Monitor.handleTimer(_ENV[k], now - last_time, k)
  237. break
  238. end
  239. else
  240. last_exe_time[k] = now
  241. break
  242. end
  243. if k == tmp then
  244. return
  245. end
  246. end
  247. end
  248. local function cmpLater(a, b)
  249. return a.ts < b.ts
  250. end
  251. function addLater(laterSec, func, param1, param2, param3, param4)
  252. local tempData = {}
  253. tempData.ts = os.time() + laterSec
  254. tempData.func = func
  255. tempData.param1 = param1
  256. tempData.param2 = param2
  257. tempData.param3 = param3
  258. tempData.param4 = param4
  259. table.insert(LATER_DAYA, tempData)
  260. table.sort(LATER_DAYA, cmpLater)
  261. end