CycleActivity.lua 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. --------------------------------
  2. -- 文件名 : CycleActivity.lua
  3. -- 文件说明 : 循环活动管理器
  4. -- 创建时间 : 2025/06/13
  5. -- 创建人 : FC
  6. --------------------------------
  7. local Util = require("common.Util")
  8. local YunYingConf = require("excel.yunying")
  9. local Timer = require("core.Timer")
  10. local AbsActExcel = require("excel.absAct")
  11. local AbsActLogic = require("absAct.AbsActLogic")
  12. local Objhuman = require("core.ObjHuman")
  13. local YunYingLogic = require("yunying.YunYingLogic")
  14. local CYCLEACTIVITYDAY = 7 -- 持续天数
  15. -- 计算结束时间
  16. local function CycleActivity_CalEndTime()
  17. local nNowTime = os.time()
  18. local nEndTime = Util.getDayStartTime(nNowTime) + (CYCLEACTIVITYDAY * 24 * 60 *60) - 1
  19. -- local tEndDate = os.date("*t",nEndTime)
  20. -- tEndDate.hour = 0
  21. -- tEndDate.min = 0
  22. -- tEndDate.sec = 0
  23. -- nEndTime = os.time(tEndDate)
  24. return nEndTime
  25. end
  26. -- 创建数据
  27. local function CycleActivity_CreateDB(human)
  28. human.db.cycleactivity =
  29. {
  30. nActivityID = 0,
  31. nEndTime = 0,
  32. nBeginTime = 0,
  33. bReset = false,
  34. }
  35. local tConfig = YunYingConf.cycleactivity[1]
  36. if not tConfig or not tConfig.activityid then
  37. print("[CycleActivity_CreateDB] 不存在对应的配置数据!!!!")
  38. return
  39. end
  40. local nBeginID = tConfig.activityid[1]
  41. local nEndTime = CycleActivity_CalEndTime()
  42. human.db.cycleactivity.nBeginTime = os.time()
  43. human.db.cycleactivity.nActivityID = nBeginID
  44. human.db.cycleactivity.nEndTime = nEndTime
  45. end
  46. -- 检查是否需要创建DB
  47. local function CycleActivity_CheckCreate(human)
  48. if not human.db.cycleactivity then
  49. CycleActivity_CreateDB(human)
  50. end
  51. end
  52. -- 获取当前记录的活动ID
  53. local function CycleActivity_GetActivityID(human)
  54. return human.db.cycleactivity.nActivityID
  55. end
  56. -- 设置当前记录的活动ID
  57. local function CycleActivity_SetActivityID(human, nActivityID)
  58. human.db.cycleactivity.nActivityID = nActivityID
  59. end
  60. -- 获取当前记录的结束时间
  61. local function CycleActivity_GetEndTime(human)
  62. return human.db.cycleactivity.nEndTime
  63. end
  64. -- 设置当前记录的结束时间
  65. local function CycleActivity_SetEndTime(human, nEndTime)
  66. human.db.cycleactivity.nEndTime = nEndTime
  67. end
  68. -- 获取当前记录的开始时间
  69. local function CycleActivity_GetBeginTime(human)
  70. return human.db.cycleactivity.nBeginTime
  71. end
  72. -- 设置当前记录的开始时间
  73. local function CycleActivity_SetBeginTime(human, nBeginTime)
  74. human.db.cycleactivity.nBeginTime = nBeginTime
  75. end
  76. -- 获取当前是否重置数据
  77. local function CycleActivity_GetReset(human)
  78. return human.db.cycleactivity.bReset
  79. end
  80. -- 设置当前是否重置数据
  81. local function CycleActivity_SetReset(human, nValue)
  82. human.db.cycleactivity.bReset = nValue
  83. end
  84. -- 获取下一轮活动ID
  85. local function CycleActivity_GetNextActivityID(human)
  86. local nNowActivityID = CycleActivity_GetActivityID(human)
  87. local tConfig = YunYingConf.cycleactivity[1]
  88. if not tConfig then
  89. print("[CycleActivity_GetNextActivityID] 没有对应的配置")
  90. return -1
  91. end
  92. local nChoseID
  93. local nLen = #tConfig.activityid
  94. for nID, v in ipairs(tConfig.activityid) do
  95. if v == nNowActivityID then
  96. if nID == nLen then
  97. nChoseID = 1
  98. else
  99. nChoseID = nID + 1
  100. end
  101. break
  102. end
  103. end
  104. local nChoseActivityID = tConfig.activityid[nChoseID]
  105. return nChoseActivityID
  106. end
  107. -- 判断是否还在活动中
  108. local function CycleActivity_IsRunByYunYingID(human, nYunYingID)
  109. local nNowID = CycleActivity_GetActivityID(human)
  110. --print("[CycleActivity_IsRunByYunYingID] 开始判断是否在活动时间内 name = "..human.db.name.." nYunYingID = "..nYunYingID.." nNowID = "..nNowID)
  111. if nNowID ~= nYunYingID then
  112. -- print("[CycleActivity_IsRunByYunYingID] 当前ID不相同直接返回")
  113. return false
  114. end
  115. local nEndTime = CycleActivity_GetEndTime(human)
  116. local nNowTime = os.time()
  117. --print("[CycleActivity_IsRunByYunYingID] 当前时间判断 nEndTime = "..nEndTime.." nNowTime = "..nNowTime)
  118. return nEndTime > nNowTime
  119. end
  120. -- 判断是否在活动中
  121. local function CycleActivity_IsRunByAbsID(huamn, nAbsID)
  122. local tConfig = YunYingConf.cycleactivity[1]
  123. for _, v in ipairs(tConfig.activityid) do
  124. local tYunYingConf = YunYingConf.config[v]
  125. if tYunYingConf then
  126. for _, nCofAbsID in ipairs(tYunYingConf.funcs) do
  127. if nCofAbsID == nAbsID then
  128. --print("[CycleActivity_IsRunByAbsID] 找到对应的运营活动ID v = "..v.." nCofAbsID = "..nCofAbsID)
  129. return CycleActivity_IsRunByYunYingID(huamn, v)
  130. end
  131. end
  132. end
  133. end
  134. return false
  135. end
  136. -- 进入下一轮活动
  137. local function CycleActivity_EnterNext(human)
  138. local nNowID = CycleActivity_GetActivityID(human)
  139. local bRun = CycleActivity_IsRunByYunYingID(human, nNowID)
  140. if true == bRun then
  141. print("[CycleActivity_EnterNext] 当前活动还在进行中无法进入下一轮")
  142. return false
  143. end
  144. local nNextID = CycleActivity_GetNextActivityID(human)
  145. if -1 >= nNextID then
  146. print("[CycleActivity_EnterNext] 获取不到下一轮的活动ID")
  147. return false
  148. end
  149. local nEndTime = CycleActivity_CalEndTime()
  150. local nBeginTime = os.time()
  151. CycleActivity_SetActivityID(human, nNextID)
  152. CycleActivity_SetEndTime(human, nEndTime)
  153. CycleActivity_SetBeginTime(human, nBeginTime)
  154. CycleActivity_SetReset(human, false)
  155. return true
  156. end
  157. -- 重置ABS活动DB数据
  158. local function CycleActivity_ResetAbsID(human)
  159. local nNowID = CycleActivity_GetActivityID(human)
  160. local nEndTime = CycleActivity_GetEndTime(human)
  161. local tConfig = YunYingConf.config[nNowID]
  162. if not tConfig then
  163. print("[CycleActivity_ResetAbsID] 不存在对应的配置 nNowID = "..nNowID)
  164. return
  165. end
  166. -- print("[CycleActivity_ResetAbsID] 进入重置活动流程 nNowID = "..nNowID.." nEndTime = "..nEndTime)
  167. for _, nAbsID in ipairs(tConfig.funcs) do
  168. local tAbsConf = AbsActExcel.absActivity[nAbsID]
  169. if tAbsConf then
  170. local bClearDB = AbsActLogic.getIsClearDB(nAbsID)
  171. -- print("[CycleActivity_ResetAbsID] 正式重置 nAbsID = "..nAbsID.." bClearDB = "..(bClearDB == true and 1 or 0))
  172. if true == bClearDB then
  173. human.db.absAct[nAbsID] = {}
  174. human.db.absAct[nAbsID].finish = nEndTime -- 记录活动结束时间
  175. -- print("[CycleActivity_ResetAbsID] 清理活动数据成功 nAbsID = "..nAbsID)
  176. end
  177. end
  178. end
  179. end
  180. ---------------------------------- 外部调用 -------------------------------
  181. -- abs活动是否开始
  182. function isStarted(human, nAbsID)
  183. CycleActivity_CheckCreate(human)
  184. local realEndTime = 0
  185. local realStartTime = 0
  186. local state = false
  187. state = CycleActivity_IsRunByAbsID(human, nAbsID)
  188. if true == state then
  189. realStartTime = CycleActivity_GetBeginTime(human)
  190. realEndTime = CycleActivity_GetEndTime(human)
  191. -- print("[CycleActivity_isStarted] 当前活动开启中 时间打印 realStartTime = "..realStartTime.." realEndTime = "..realEndTime.." nAbsID = "..nAbsID)
  192. end
  193. return state, realEndTime, realStartTime
  194. end
  195. -- 玩家登录
  196. function onLogin(human)
  197. CycleActivity_CheckCreate(human)
  198. local nEndTime = CycleActivity_GetEndTime(human)
  199. local nNowTime = os.time()
  200. -- print("[CycleActivity_onLogin] 当前玩家登录 时间打印 nEndTime = "..nEndTime.." name = "..human.db.name)
  201. if nNowTime >= nEndTime then
  202. local bRet = CycleActivity_EnterNext(human)
  203. if false == bRet then
  204. print("[CycleActivity_onLogin] 玩家登录 进入下一轮活动失败 name = "..human.db._id)
  205. return
  206. end
  207. -- print("[CycleActivity_onLogin] 玩家进入下一个活动成功")
  208. end
  209. local bReset = CycleActivity_GetReset(human)
  210. if false == bReset then
  211. -- print("[CycleActivity_onLogin] 开始重置数据 name = "..human.db.name)
  212. CycleActivity_ResetAbsID(human)
  213. CycleActivity_SetReset(human, true)
  214. end
  215. -- print("[CycleActivity_onLogin] 打印数据")
  216. --table.print_lua_table(human.db.cycleactivity)
  217. end
  218. -- 定时
  219. function onZero()
  220. print("[CycleActivity_onZero] 0点定时刷新开始")
  221. for _, human in pairs(Objhuman.onlineUuid) do
  222. if human then
  223. -- print("[CycleActivity_onZero] 0点开始重置玩家数据 name = "..human.db.name)
  224. onLogin(human)
  225. YunYingLogic.sendIcons(human)
  226. YunYingLogic.sendBanner(human)
  227. -- print("[CycleActivity_onZero] 0点重置玩家数据结束 name = "..human.db.name)
  228. end
  229. end
  230. end
  231. -- GM函数, 进入下一个循环活动
  232. function GM_EnterNext(human)
  233. -- local nNowID = CycleActivity_GetActivityID(human)
  234. -- local bRun = CycleActivity_IsRunByYunYingID(human, nNowID)
  235. -- if true == bRun then
  236. -- print("[CycleActivity_EnterNext] 当前活动还在进行中无法进入下一轮")
  237. -- return false
  238. -- end
  239. local nNextID = CycleActivity_GetNextActivityID(human)
  240. if -1 >= nNextID then
  241. print("[CycleActivity_EnterNext] 获取不到下一轮的活动ID")
  242. return false
  243. end
  244. local nEndTime = CycleActivity_CalEndTime()
  245. local nBeginTime = os.time()
  246. CycleActivity_SetActivityID(human, nNextID)
  247. CycleActivity_SetEndTime(human, nEndTime)
  248. CycleActivity_SetBeginTime(human, nBeginTime)
  249. CycleActivity_SetReset(human, false)
  250. local bReset = CycleActivity_GetReset(human)
  251. if false == bReset then
  252. -- print("[CycleActivity_onLogin] 开始重置数据 name = "..human.db.name)
  253. CycleActivity_ResetAbsID(human)
  254. CycleActivity_SetReset(human, true)
  255. end
  256. YunYingLogic.sendIcons(human)
  257. YunYingLogic.sendBanner(human)
  258. end