Timer.lua 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  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. register_timer = {
  50. monitor = 60000, --
  51. offlineCheck = 10000, -- 离线校验
  52. saveChar = 1000, -- 用户存db
  53. onZhengDian = 15000,
  54. humanRefresh = 10000, -- 角色心跳刷新
  55. middleHeartbeat = 3000,
  56. dayCheck = 100, -- 天检测
  57. unionOfflineCheck = 1000, -- 公会会长离线时间检查
  58. paomaHerartbeat = 10000, -- 跑马灯心跳
  59. tenSecond = 10000, -- 10秒1次通用
  60. oneMin = 60000, -- 60秒1次通用
  61. reportOnline = 300000, -- 在线时长上报心跳
  62. fcm = 60000, -- 防沉迷
  63. jjcGodWar = 2000, -- 众神之战
  64. jjcLadder = 2000, -- 天梯争霸
  65. valley = 2000, -- 荣耀峡谷
  66. later = 1000, -- 1秒1次 专门为了一些大数据量的处理延后处理用
  67. }
  68. LATER_DAYA = LATER_DAYA or {} -- {ts,func,param1, param2, param3, param4}
  69. function monitor()
  70. print(_G.collectgarbage("count"))
  71. local humanCnt = ObjHuman.getOnlineCnt()
  72. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), humanCnt)
  73. Monitor.output()
  74. end
  75. function tenSecond()
  76. QQApi.onTimer()
  77. end
  78. function oneMin()
  79. MiddleConnect.onTimer()
  80. ZhanbuLogic.checkRecover()
  81. end
  82. function offlineCheck()
  83. _G.collectgarbage("step", 100000)
  84. ObjHuman.humanOfflineCheck()
  85. end
  86. function saveChar()
  87. ObjHuman.saveCharDB()
  88. end
  89. function humanRefresh()
  90. ObjHuman.refresh()
  91. end
  92. function doZhengDian(hour)
  93. -- 整点的时候刷新逻辑用的内存较多 这里gc一把
  94. _G.collectgarbage("step", 100000)
  95. if hour == 0 then
  96. YjTreasureLogic.onZero()
  97. CycleActivityLogic.onZero()
  98. YunYingLogic.onZero()
  99. for _, human in pairs(ObjHuman.onlineUuid) do
  100. ObjHuman.updateDaily(human)
  101. YunYingLogic.onZeroHuman(human)
  102. DailyTaskLogic.onLogin(human)
  103. end
  104. UnionLogic.onHour()
  105. LianyuLogic.onZero()
  106. SharePlatformLogic.onZero()
  107. WarReportMiddle.onZero()
  108. BillboardLogic.onZero()
  109. ChatRecord.CHAT_RECORD_REPETITION = {}
  110. HeroGrowUp.actLoop()
  111. LostTempleLogic.onZero()
  112. VoucherShopLogic.VoucherShop_OnZero()
  113. MainDianLogic.MaiDian_OnTime()
  114. ServerCommerceMiddle.CommerceMiddle_OnZero()
  115. commonOperate.onZero()
  116. end
  117. --if hour == 21 then
  118. -- if _G.is_middle ~= true then
  119. -- JjcLogic.onHour(hour)
  120. -- end
  121. --end
  122. JjcLogic.onHour(hour)
  123. JjcNewLadderLogic.onHour(hour)
  124. if hour == 2 then
  125. local weekDay = Util.getWeekDay()
  126. if weekDay == 2 then
  127. -- 每周一凌晨2點 斷開鏈接 并且重新取一下php的跨服信息 重新連新跨服
  128. MiddleConnect.autoResetMiddle()
  129. end
  130. end
  131. YunYingLogic.onHour(hour)
  132. UnionWarDBLogic.onHour(hour)
  133. AbsActLogic.onHour(hour)
  134. MoZhuMiddleLogic.onHour(hour)
  135. _G.collectgarbage("step", 100000)
  136. end
  137. lastUpDateTime = lastUpDateTime or nil
  138. function onZhengDian()
  139. if lastUpDateTime and (now - lastUpDateTime) < 180000 or 120000 < now % (1000 * 60 * 60) then
  140. return
  141. end
  142. lastUpDateTime = now
  143. local hour = os.date("%H", math.floor(now / 1000)) + 0
  144. print("onZhengDian", hour)
  145. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc befor')
  146. _G.collectgarbage("collect")
  147. Log.write(Log.LOGID_MONITOR, _G.collectgarbage("count"), 'gc after')
  148. doZhengDian(hour)
  149. end
  150. function dayCheck()
  151. local call = 1
  152. local now = os.time()
  153. local resetTime = CommonDB.getResetTime()
  154. if resetTime == 0 then
  155. CommonDB.setResetTime(now)
  156. return
  157. end
  158. if call == 1 then
  159. local sameDay = Util.isSameDay(resetTime, now)
  160. call = sameDay == nil and 0 or 1
  161. end
  162. if call == 0 then
  163. CommonDB.setResetTime(now)
  164. DrillLogic.dayCheck()
  165. end
  166. end
  167. function middleHeartbeat()
  168. MiddleHeartBeat.heartbeat()
  169. end
  170. function unionOfflineCheck()
  171. UnionLogic.onTimer()
  172. end
  173. function paomaHerartbeat()
  174. ChatPaoMaLogic.onTimer()
  175. end
  176. function reportOnline()
  177. ReportOnline.onTimer()
  178. end
  179. function fcm()
  180. FcmLogic.onTimer()
  181. end
  182. function jjcGodWar()
  183. JjcGodWarLogic.onTimer()
  184. end
  185. function jjcLadder()
  186. JjcLadderLogic.onTimer()
  187. end
  188. function valley()
  189. ValleyLogic.onTimer()
  190. end
  191. function later()
  192. if LATER_DAYA[1] == nil then
  193. return
  194. end
  195. local tempData = LATER_DAYA[1]
  196. local now = os.time()
  197. local ts = tempData.ts
  198. if ts <= now then
  199. table.remove(LATER_DAYA, 1)
  200. tempData.func(tempData.param1, tempData.param2, tempData.param3, tempData.param4)
  201. end
  202. end
  203. last_exe_time = last_exe_time or {}
  204. function handlerTime(msec)
  205. now = msec + d
  206. if not register_timer[last_exe_func] then
  207. last_exe_func = nil
  208. end
  209. local tmp = last_exe_func
  210. while true do
  211. local k, v = next(register_timer, last_exe_func)
  212. if not k then
  213. k, v = next(register_timer)
  214. end
  215. if not k then
  216. return
  217. end
  218. last_exe_func = k
  219. local last_time = last_exe_time[k]
  220. if last_time then
  221. if last_time + v <= now then
  222. last_exe_time[k] = now
  223. Monitor.handleTimer(_ENV[k], now - last_time, k)
  224. break
  225. end
  226. else
  227. last_exe_time[k] = now
  228. break
  229. end
  230. if k == tmp then
  231. return
  232. end
  233. end
  234. end
  235. local function cmpLater(a, b)
  236. return a.ts < b.ts
  237. end
  238. function addLater(laterSec, func, param1, param2, param3, param4)
  239. local tempData = {}
  240. tempData.ts = os.time() + laterSec
  241. tempData.func = func
  242. tempData.param1 = param1
  243. tempData.param2 = param2
  244. tempData.param3 = param3
  245. tempData.param4 = param4
  246. table.insert(LATER_DAYA, tempData)
  247. table.sort(LATER_DAYA, cmpLater)
  248. end