AbsActLogic.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. local Config = require("Config")
  2. local AbsActExcel = require("excel.absAct")
  3. local Lang = require("common.Lang")
  4. local Util = require("common.Util")
  5. local Msg = require("core.Msg")
  6. local AbsActDefine = require("absAct.AbsActDefine")
  7. local PremiumGiftLogic = require("absAct.PremiumGiftLogic")
  8. local ObjHuman = require("core.ObjHuman")
  9. local Broadcast = require("broadcast.Broadcast")
  10. local MangHeLogic = require("absAct.MangHeLogic")
  11. local MailExcel = require("excel.mail")
  12. local MailManager = require("mail.MailManager")
  13. local HeroUpLogic = require("absAct.HeroUpLogic")
  14. local CommonDB = require("common.CommonDB")
  15. local DropExchangeLogic = require("absAct.DropExchangeLogic")
  16. local PerpleHeroLogic = require("absAct.PerpleHeroLogic")
  17. local HeroLogLogic = require("absAct.HeroLogLogic")
  18. local AbsJifenDrawLogic = require("absAct.AbsJifenDrawLogic")
  19. local HeroLoginPickLogic = require("absAct.HeroLoginPickLogic")
  20. local AbsZhanbuLunpanLogic = require("absAct.AbsZhanbuLunpanLogic")
  21. local DrawCardLogic = require("drawCard.DrawCardLogic")
  22. local LimitPerpleHeroLogic = require("present.LimitPerpleHeroLogic")
  23. local RechargeBackLogic = require("absAct.RechargeBackLogic")
  24. local Abs365CardLogic = require("absAct.Abs365CardLogic")
  25. local AbsWeeklyCardLogic = require("absAct.AbsWeeklyCardLogic")
  26. local AbsSurpriseChest = require("absAct.AbsSurpriseChest")
  27. local SpecialCustomLogic = require("absAct.SpecialCustomLogic")
  28. local SevenDayLogic = require("absAct.SevenDayLogic")
  29. local DrumBlastingLogic = require("absAct.DrumBlastingLogic")
  30. local HeroComeLogic = require("absAct.HeroComeLogic")
  31. local WishGiftLogic = require("absAct.WishGiftLogic")
  32. local EveryDayPrayLogic = require("absAct.EveryDayPrayLogic")
  33. local ExclusiveTaskLogic = require("absAct.ExclusiveTaskLogic")
  34. local AbsActBillboardMiddleLogic = require("absAct.AbsActBillboardMiddleLogic")
  35. local AbsActBillboardLogic = require("absAct.AbsActBillboardLogic")
  36. local SingleReachLogic = require("absAct.SingleReachLogic")
  37. local TotalReachLogic = require("absAct.TotalReachLogic")
  38. local UseDiamondLogic = require("absAct.UseDiamondLogic")
  39. local WishCupLogic = require("absAct.WishCupLogic")
  40. local SeckillGiftLogic = require("absAct.SeckillGiftLogic")
  41. local AbsOpenServerTotalConsume = require("absAct.AbsOpenServerTotalConsume")
  42. local AbsReachRankLogic = require("absAct.AbsReachRankLogic")
  43. local AbsReachRankDB = require("absAct.AbsReachRankDB")
  44. local FestivalSevenDayCardLogic = require("absAct.FestivalSevenDayCardLogic")
  45. local DailyFixedTaskLogic = require("absAct.DailyFixedTaskLogic")
  46. local AbsSignGiftLogic = require("absAct.AbsSignGiftLogic")
  47. local NewHeroLogic = require("absAct.NewHeroLogic")
  48. local LotteryByDiamondLogic = require("absAct.LotteryByDiamondLogic")
  49. local DuoBaoQiBingLogic = require("absAct.DuoBaoQiBingLogic")
  50. local AbsLoginRewardLogic = require("absAct.AbsLoginRewardLogic")
  51. local AbsDiscountStoreLogic = require("absAct.AbsDiscountStoreLogic")
  52. local AbsLotteryCardLogic = require("absAct.AbsLotteryCardLogic")
  53. ABS_ACT_TYPE_LIST = nil
  54. function initAfterHot()
  55. ABS_ACT_TYPE_LIST = {}
  56. local now = os.time()
  57. local len = 0
  58. for k, config in pairs(AbsActExcel.absActivity) do
  59. config.realStartTime = config.realStartTime or 0
  60. config.realEndTime = config.realEndTime or 0
  61. if next(config.startDate) and next(config.endDate) then
  62. config.startDate.hour = 0
  63. config.startDate.min = 0
  64. config.startDate.sec = 0
  65. config.endDate.hour = 0
  66. config.endDate.min = 0
  67. config.endDate.sec = 0
  68. config.realStartTime = os.time(config.startDate)
  69. config.realEndTime = os.time(config.endDate)
  70. end
  71. ABS_ACT_TYPE_LIST[config.type] = ABS_ACT_TYPE_LIST[config.type] or {}
  72. ABS_ACT_TYPE_LIST[config.type][#ABS_ACT_TYPE_LIST[config.type] + 1] = k
  73. end
  74. end
  75. function onLogin(human)
  76. local sendLisg = {}
  77. local absActConfig = AbsActExcel.absActivity
  78. -- 清除过期活动
  79. for id in pairs(human.db.absAct) do
  80. checkAbsActClean(human,id)
  81. end
  82. -- 是否有新增活动
  83. for k,v in pairs(absActConfig) do
  84. local ok,realEndTime = isStarted(human,k)
  85. if ok and human.db.absAct[k] then
  86. --- 同步结束时间
  87. local nowTime = os.time()
  88. local finishTime = human.db.absAct[k].finish or nowTime
  89. if finishTime >= nowTime and finishTime ~= realEndTime then
  90. human.db.absAct[k].finish = realEndTime
  91. end
  92. end
  93. if ok and not human.db.absAct[k] then
  94. human.db.absAct[k] = {}
  95. local f = load("return require(\"" .. v.moduleFn .. "\")")()
  96. if f and f.genAbsActData then
  97. human.db.absAct[k] = f.genAbsActData(v)
  98. end
  99. human.db.absAct[k].finish = realEndTime -- 记录活动结束时间
  100. end
  101. end
  102. -- 登录奖励重置
  103. for k, config in pairs(AbsActExcel.absLogin) do
  104. local state,id = isStartedByType(human, config.absType)
  105. if state and id then
  106. if not human.db.absAct[id] then
  107. human.db.absAct[id] = {}
  108. end
  109. -- 每日登录领取
  110. if config.type == AbsActDefine.ABS_LOGIN_REWARD_TYPE_2 then
  111. local lastTime = human.db.absAct[id].loginDayGetTime or 0
  112. if not Util.isSameDay(lastTime) then
  113. human.db.absAct[id].loginDayGetTime = os.time()
  114. sendLisg[#sendLisg + 1] = k
  115. end
  116. end
  117. end
  118. end
  119. if #sendLisg > 0 then
  120. for _, id in ipairs(sendLisg) do
  121. local config = AbsActExcel.absLogin[id]
  122. if config.mailID > 0 then
  123. local mailConfig = MailExcel.mail[config.mailID]
  124. local title = mailConfig.title
  125. local senderName = mailConfig.senderName
  126. local content = mailConfig.content
  127. MailManager.add(MailManager.SYSTEM, human.db._id, title, content, config.item, senderName)
  128. end
  129. end
  130. end
  131. end
  132. local function transTime(cfg)
  133. local realEndTime = 0
  134. local realStartTime = 0
  135. local state = false
  136. if next(cfg.startDate) and next(cfg.endDate) then
  137. cfg.startDate.hour = 0
  138. cfg.startDate.min = 0
  139. cfg.startDate.sec = 0
  140. cfg.endDate.hour = 0
  141. cfg.endDate.min = 0
  142. cfg.endDate.sec = 0
  143. realStartTime = os.time(cfg.startDate)
  144. realEndTime = os.time(cfg.endDate)
  145. state = true
  146. end
  147. return state, realEndTime, realStartTime
  148. end
  149. -- 判断活动是否开启
  150. function isStarted(human, id)
  151. local config = AbsActExcel.absActivity[id]
  152. if not config then return end
  153. local _,realEndTime,realStartTime = transTime(config)
  154. local now = os.time()
  155. if now < realStartTime or now >= realEndTime then
  156. return
  157. end
  158. return true, realEndTime, realStartTime
  159. end
  160. -- 判断活动是否开启
  161. function isStartedByType(human, type)
  162. if not ABS_ACT_TYPE_LIST[type] then return end
  163. for k, v in ipairs(ABS_ACT_TYPE_LIST[type]) do
  164. local config = AbsActExcel.absActivity[v]
  165. local ok , realEndTime,realStartTime = isStarted(human,v)
  166. if config and ok then
  167. return true, v, realEndTime, realStartTime
  168. end
  169. end
  170. end
  171. -- 根据actID 获取 Id
  172. function getIDByActID(human, actID)
  173. for id, v in pairs(AbsActExcel.absActivity) do
  174. if v.actId == actID and isStarted(human, id) then
  175. return id
  176. end
  177. end
  178. end
  179. function checkAbsActClean(human, id)
  180. local config = AbsActExcel.absActivity[id]
  181. -- 活动没有配置 清楚对应数据
  182. if not config then
  183. print("[checkAbsActClean] 活动没有配置 清除对应数据 id = \n", id)
  184. human.db.absAct[id] = nil
  185. return
  186. end
  187. -- 不清理数据活动直接返回
  188. if AbsActDefine.ABS_ACT_NOCLEARID[config.type] == 1 then
  189. print("[checkAbsActClean] abs活动不清理活动数据直接返回 id = \n", id)
  190. return
  191. end
  192. local _,realEndTime = transTime(config)
  193. local now = os.time()
  194. --临时处理积分兑换 下版本删掉
  195. if human.db.absAct[id] and not human.db.absAct[id].finish then
  196. if config.type == AbsActDefine.ABS_ACT_TYPE_7 then
  197. human.db.absAct[id] = nil
  198. else
  199. human.db.absAct[id].finish = realEndTime
  200. end
  201. end
  202. if human.db.absAct[id] and now >= human.db.absAct[id].finish then
  203. -- 累计达标中的 累计充值到期 需要发送邮件
  204. if config.type == AbsActDefine.ABS_ACT_TYPE_71 then
  205. --TotalReachLogic.clean(human,id)
  206. end
  207. --限时周卡,铂金周卡活动设定是即使活动结束也要让玩家领完奖励,所以这里活动结束后暂时不清除数据,在对应模块中做清除数据操作
  208. --古玉充能活动,活动后不清除数据
  209. if config.type ~= AbsActDefine.ABS_ACT_TYPE_12 and config.type ~= AbsActDefine.ABS_ACT_TYPE_28
  210. and config.type ~= AbsActDefine.ABS_ACT_TYPE_29 then
  211. print("[checkAbsActClean] 清除数据 id = "..id)
  212. human.db.absAct[id] = nil
  213. end
  214. end
  215. end
  216. -- 活动详情查询
  217. function actDetailQuery(human, id)
  218. -- 判断传入ID是否合法
  219. local config = AbsActExcel.absActivity[id]
  220. if config == nil then
  221. return
  222. end
  223. -- 判断活动是否开启
  224. local startFlag = isStarted(human, id)
  225. if startFlag == nil then
  226. checkAbsActClean(human, id)
  227. return Broadcast.sendErr(human, Lang.ACT_NOT_START)
  228. end
  229. if config.type == AbsActDefine.ABS_ACT_TYPE_1 then-- 超值礼包
  230. PremiumGiftLogic.getAndSendMsg(human, id, config.actId)
  231. elseif config.type == AbsActDefine.ABS_ACT_TYPE_2 then-- 盲盒
  232. MangHeLogic.query(human, id, config.actId)
  233. elseif config.type == AbsActDefine.ABS_ACT_TYPE_6 then
  234. DropExchangeLogic.query(human, id, true)
  235. elseif config.type == AbsActDefine.ABS_ACT_TYPE_4 then
  236. PerpleHeroLogic.getAndSendMsg(human,id)
  237. elseif config.type == AbsActDefine.ABS_ACT_TYPE_5 then
  238. HeroLogLogic.getAndSendMsg(human,id)
  239. elseif config.type == AbsActDefine.ABS_ACT_TYPE_7 then
  240. AbsJifenDrawLogic.getAndSendMsg(human, id, config)
  241. elseif config.type == AbsActDefine.ABS_ACT_TYPE_8 then
  242. HeroLoginPickLogic.query(human, id)
  243. elseif config.type == AbsActDefine.ABS_ACT_TYPE_9 then
  244. AbsZhanbuLunpanLogic.getAndSendMsg(human, id)
  245. elseif config.type == AbsActDefine.ABS_ACT_TYPE_10 then
  246. RechargeBackLogic.query(human, id)
  247. elseif config.type == AbsActDefine.ABS_ACT_TYPE_12 then
  248. AbsWeeklyCardLogic.getAndSendMsg(human, id, config)
  249. elseif config.type == AbsActDefine.ABS_ACT_TYPE_13 then
  250. Abs365CardLogic.getAndSendMsg(human, id, config)
  251. elseif config.type == AbsActDefine.ABS_ACT_TYPE_14 then
  252. AbsSurpriseChest.getAndSendMsg(human, id, config)
  253. elseif config.type == AbsActDefine.ABS_ACT_TYPE_18 then
  254. SevenDayLogic.getAndSendMsg(human, id, config.actID)
  255. elseif config.type == AbsActDefine.ABS_ACT_TYPE_16 then
  256. DrumBlastingLogic.getAndSendMsg(human, id, config.actID)
  257. elseif config.type == AbsActDefine.ABS_ACT_TYPE_17 then
  258. SpecialCustomLogic.getAndSendMsg(human, id, config.actID)
  259. elseif config.type == AbsActDefine.ABS_ACT_TYPE_19 then
  260. HeroComeLogic.getAndSendMsg(human, id, config.actId)
  261. elseif config.type == AbsActDefine.ABS_ACT_TYPE_20 then
  262. WishGiftLogic.getAndSendMsg(human, id, config.actId)
  263. elseif config.type == AbsActDefine.ABS_ACT_TYPE_21 then
  264. EveryDayPrayLogic.getAndSendMsg(human, id, config.actId)
  265. elseif config.type == AbsActDefine.ABS_ACT_TYPE_22 then
  266. ExclusiveTaskLogic.getAndSendMsg(human, id, config.actId)
  267. elseif config.type == AbsActDefine.ABS_ACT_TYPE_26 then
  268. AbsReachRankLogic.getAndSendMsg(human, id)
  269. elseif config.type == AbsActDefine.ABS_ACT_TYPE_46 then
  270. AbsOpenServerTotalConsume.getAndSendMsg(human, id, config.actId)
  271. elseif config.type == AbsActDefine.ABS_ACT_TYPE_72 then
  272. SingleReachLogic.getAndSendMsg(human, id)
  273. elseif config.type == AbsActDefine.ABS_ACT_TYPE_71 then
  274. TotalReachLogic.getAndSendMsg(human, id)
  275. elseif config.type == AbsActDefine.ABS_ACT_TYPE_73 then
  276. AbsActBillboardLogic.getAndSendMsg(human, id)
  277. elseif config.type == AbsActDefine.ABS_ACT_TYPE_23 then
  278. SeckillGiftLogic.getAndSendMsg(human, id)
  279. elseif config.type == AbsActDefine.ABS_ACT_TYPE_24 then
  280. UseDiamondLogic.getAndSendMsg(human, id)
  281. elseif config.type == AbsActDefine.ABS_ACT_TYPE_25 then
  282. WishCupLogic.getAndSendMsg(human, id)
  283. elseif config.type == AbsActDefine.ABS_ACT_TYPE_27 then
  284. DailyFixedTaskLogic.getAndSendMsg(human, id)
  285. elseif config.type == AbsActDefine.ABS_ACT_TYPE_28 then
  286. FestivalSevenDayCardLogic.getAndSendMsg(human, id)
  287. elseif config.type == AbsActDefine.ABS_ACT_TYPE_29 then
  288. LotteryByDiamondLogic.Query(human, id)
  289. elseif config.type == AbsActDefine.ABS_ACT_TYPE_30 then
  290. AbsSignGiftLogic.getAndSendMsg(human, id)
  291. elseif config.type == AbsActDefine.ABS_ACT_TYPE_31 then
  292. DailyFixedTaskLogic.getAndSendMsg(human, id)
  293. elseif config.type == AbsActDefine.ABS_ACT_TYPE_32 then
  294. DuoBaoQiBingLogic.Query(human, id)
  295. elseif config.type == AbsActDefine.ABS_ACT_TYPE_33 then
  296. FestivalSevenDayCardLogic.getAndSendMsg(human, id)
  297. elseif config.type == AbsActDefine.ABS_ACT_TYPE_35 then
  298. NewHeroLogic.getAndSendMsg(human, id)
  299. elseif config.type == AbsActDefine.ABS_ACT_TYPE_75 then
  300. AbsLoginRewardLogic.Query(human, id)
  301. elseif config.type == AbsActDefine.ABS_ACT_TYPE_76 then
  302. AbsDiscountStoreLogic.Query(human, id)
  303. elseif config.type == AbsActDefine.ABS_ACT_TYPE_78 then
  304. AbsLotteryCardLogic.Query(human, id)
  305. end
  306. end
  307. -- 活动抽卡
  308. function getLuckDraw(human,luckDraw,randomIndex,isAct,op)
  309. if isAct == AbsActDefine.OA_ACT_TYPE_501 then
  310. return LimitPerpleHeroLogic.getLuckDraw(human, op)
  311. end
  312. if not randomIndex then
  313. return
  314. end
  315. if isAct == AbsActDefine.ABS_ACT_TYPE_3 then
  316. -- 判断活动是否存在
  317. local state,actID = isStartedByType(human, AbsActDefine.ABS_ACT_TYPE_3)
  318. -- 根据单抽十连抽判断是否中签
  319. if state then
  320. checkAbsActClean(human, actID)
  321. local actConfig = HeroUpLogic.getConfigByActID(actID)
  322. local randomNum = math.random(1,10000)
  323. if op == DrawCardLogic.DRAWCARD_OP_1 then
  324. if randomNum <= actConfig.singlePer then
  325. luckDraw = true
  326. end
  327. elseif op == DrawCardLogic.DRAWCARD_OP_2 then
  328. if randomNum <= actConfig.tenPer and randomIndex then
  329. luckDraw = true
  330. end
  331. end
  332. end
  333. if luckDraw then
  334. local actConfig = HeroUpLogic.getConfigByActID(actID)
  335. return actConfig.heroId
  336. end
  337. elseif isAct == AbsActDefine.ABS_ACT_TYPE_4 then
  338. -- 判断活动是否存在
  339. local state,actID = isStartedByType(human, AbsActDefine.ABS_ACT_TYPE_4)
  340. if state then
  341. checkAbsActClean(human, actID)
  342. local actConfig = PerpleHeroLogic.getConfigByActID(actID)
  343. local randomNum = math.random(1,10000)
  344. if randomNum <= actConfig.rate then
  345. luckDraw = true
  346. end
  347. local noTargetHeroCnt = human.db.absAct[actID].noTargetHeroCnt or 0
  348. if op == DrawCardLogic.DRAWCARD_OP_2 then
  349. noTargetHeroCnt = noTargetHeroCnt + 10
  350. else
  351. noTargetHeroCnt = noTargetHeroCnt + 1
  352. end
  353. human.db.absAct[actID].noTargetHeroCnt = noTargetHeroCnt
  354. if not luckDraw and noTargetHeroCnt >= actConfig.cnt then
  355. luckDraw = true
  356. end
  357. if luckDraw then
  358. if human.db.absAct[actID] then
  359. human.db.absAct[actID].noTargetHeroCnt = 0
  360. end
  361. return human.db.absAct[actID].perpleHero
  362. end
  363. end
  364. elseif isAct == AbsActDefine.ABS_ACT_TYPE_19 then
  365. -- 判断活动是否存在
  366. local state,actID = isStartedByType(human, AbsActDefine.ABS_ACT_TYPE_19)
  367. if state then
  368. checkAbsActClean(human, actID)
  369. local actConfig = HeroComeLogic.getConfigByActID(actID)
  370. local randomNum = math.random(1,10000)
  371. if randomNum <= actConfig.rate then
  372. luckDraw = true
  373. end
  374. local noTargetHeroCnt = human.db.absAct[actID].noTargetHeroCnt or 0
  375. if op == DrawCardLogic.DRAWCARD_OP_2 then
  376. noTargetHeroCnt = noTargetHeroCnt + 10
  377. else
  378. noTargetHeroCnt = noTargetHeroCnt + 1
  379. end
  380. human.db.absAct[actID].noTargetHeroCnt = noTargetHeroCnt
  381. if not luckDraw and noTargetHeroCnt >= actConfig.cnt then
  382. luckDraw = true
  383. end
  384. if luckDraw then
  385. if human.db.absAct[actID] then
  386. human.db.absAct[actID].noTargetHeroCnt = 0
  387. end
  388. return human.db.absAct[actID].perpleHero
  389. end
  390. end
  391. end
  392. end
  393. function onHour(hour)
  394. if hour == 23 then
  395. AbsActBillboardLogic.sendBillboardReward()
  396. end
  397. if hour == 1 then
  398. AbsActBillboardLogic.cleanBillBoardDB()
  399. end
  400. end
  401. function updateBillBoard(humanDb)
  402. if not humanDb.absAct then return end
  403. local now = os.time()
  404. for k, data in pairs(humanDb.absAct) do
  405. local config = AbsActExcel.absActivity[k]
  406. if config and config.type == AbsActDefine.ABS_ACT_TYPE_26 then
  407. AbsReachRankDB.loadBoardData(data, k, humanDb._id, now)
  408. end
  409. end
  410. end
  411. function updateBillBoardRank()
  412. AbsReachRankDB.loadBoardRank()
  413. end