TimeLimitGift.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  1. ---
  2. --- Created by zhouzhipeng.
  3. --- DateTime: 2024/11/07 15:13
  4. --- Desc:限时礼包
  5. ---
  6. TimeLimitGift = {}
  7. TimeLimitGift.__index = TimeLimitGift
  8. local this = {}
  9. local function _playerDbKey()
  10. return "T$time_limit_gift_data"
  11. end
  12. TimeLimitGiftTypes = {
  13. -- 使用常规条件
  14. CONDITION = 1,
  15. -- 100级后,强化一次,再次强化不满足条件时弹出 100级后第2次强化不满足条件时弹出
  16. SPECIAL2 = 2,
  17. -- 领取某所以限时礼包后弹出, condition配置 礼包id
  18. SPECIAL3 = 3,
  19. -- 购买该礼包后,指定礼包不会再出现,4#礼包id 需要记录该礼包是否购买 5类型 用该类型是否购买作为条件
  20. SPECIAL4 = 4,
  21. -- 出现后顶替掉其他礼包,礼包id 用4类型已记录的判断该礼包是否出现
  22. SPECIAL5 = 5
  23. }
  24. function TimeLimitGift.get(actor)
  25. local obj = getplaydef(actor, _playerDbKey())
  26. return setmetatable(obj or {}, TimeLimitGift)
  27. end
  28. function TimeLimitGift:save(actor)
  29. setplaydef(actor, _playerDbKey(), self)
  30. end
  31. function TimeLimitGift:getTimeLimitGiftInfo()
  32. if not self.timeLimitGiftInfo then
  33. self.timeLimitGiftInfo = {}
  34. end
  35. return self.timeLimitGiftInfo
  36. end
  37. --- 获取特殊2条件 强化消耗不足次数
  38. function TimeLimitGift:getSpecial2Count()
  39. if not self.special2Count then
  40. self.special2Count = 0
  41. end
  42. return self.special2Count
  43. end
  44. function TimeLimitGift:setSpecial2Count(count)
  45. if not self.special2Count then
  46. self.special2Count = 0
  47. end
  48. self.special2Count = count
  49. end
  50. --- 获取特殊4条件 是否买过某礼包
  51. function TimeLimitGift:getSpecial4ById(id)
  52. if not self.special4 then
  53. self.special4 = {}
  54. end
  55. return self.special4[id] or false
  56. end
  57. function TimeLimitGift:setSpecial4(id, isAllBuy)
  58. if not self.special4 then
  59. self.special4 = {}
  60. end
  61. self.special4[id] = isAllBuy
  62. end
  63. --- 登录触发
  64. function TimeLimitGift.login(play)
  65. TimeLimitGift.checkTimeLimitGiftTime(play)
  66. TimeLimitGift.triggerTimeLimitGift(play, true)
  67. this.sendAllTimeLimitGift(play)
  68. end
  69. --- 升级触发
  70. function TimeLimitGift.levelUp(play, level)
  71. TimeLimitGift.triggerTimeLimitGift(play, false)
  72. end
  73. --- 请求购买限时礼包
  74. function TimeLimitGift.reqBuyTimeLimitGift(actor, msgData)
  75. local cfgId = tonumber(msgData["id"])
  76. local timeLimitGiftCfg = ConfigDataManager.getById("cfg_timelLimitGift_gift", cfgId)
  77. local timeLimitGiftData = TimeLimitGift.get(actor)
  78. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  79. local group = timeLimitGiftCfg.group
  80. local info = timeLimitGiftInfo[group]
  81. if not info then
  82. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包不能够买 id", cfgId, "记录已开启的内容", timeLimitGiftInfo)
  83. tipinfo(actor, "限时礼包未解锁:" .. cfgId)
  84. return
  85. end
  86. local preGift = timeLimitGiftCfg.pregift
  87. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), " 限时礼包购买前检查", preGift, "记录已购买的内容", info)
  88. -- 校验是否购买了前置礼包
  89. if not string.isNullOrEmpty(preGift) and not table.contains(info.timeLimitGift, tonumber(preGift)) then
  90. TimeLimitGift.print(
  91. "购买限时礼包 actor:" .. actor:toString(),
  92. "限时前置礼包未购买 id",
  93. cfgId,
  94. "前置礼包id",
  95. preGift,
  96. "记录已购买的内容",
  97. info
  98. )
  99. tipinfo(actor, "限时前置礼包未购买:" .. preGift)
  100. return
  101. end
  102. -- 是否已购买当前礼包
  103. if table.contains(info.timeLimitGift, cfgId) then
  104. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "该限时礼包已经购买过 id", cfgId, "记录已购买的内容", info)
  105. tipinfo(actor, "该限时礼包已经购买过")
  106. return
  107. end
  108. local cost = string.split(timeLimitGiftCfg.cost, "#")
  109. if not table.isNullOrEmpty(cost) then
  110. local itemCfgId = tonumber(cost[1])
  111. local count = tonumber(cost[2])
  112. local checkResult = Bag.checkItem(actor, itemCfgId, count)
  113. if not checkResult then
  114. --背包道具不足
  115. noticeTip.noticeinfo(actor, StringIdConst.TEXT346)
  116. return
  117. end
  118. removeitemfrombag(actor, itemCfgId, count, 0, 9999, "限时礼包")
  119. end
  120. table.insert(info.timeLimitGift, cfgId)
  121. if not string.isNullOrEmpty(timeLimitGiftCfg.addtime) then
  122. local addTime = tonumber(timeLimitGiftCfg.addtime)
  123. -- 增加持续时间
  124. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "限时礼包购买后增加时间", addTime)
  125. info.endTime = info.endTime + addTime
  126. end
  127. TimeLimitGift.print(
  128. "购买限时礼包 actor:" .. actor:toString(),
  129. " timeLimitGiftInfo",
  130. timeLimitGiftInfo,
  131. "info",
  132. info,
  133. cfgId
  134. )
  135. timeLimitGiftData:save(actor)
  136. local reward_item = string.toIntIntMap(timeLimitGiftCfg.gift, "#", "|")
  137. Bag.addItemMapToBag(actor, reward_item, 0, 9999, "限时礼包")
  138. sendluamsg(actor, LuaMessageIdToClient.COMMON_REWARD_PANEL, reward_item)
  139. local cfgIds = {}
  140. table.insert(cfgIds, group)
  141. this.sendTimeLimitGift(actor, cfgIds, false)
  142. TimeLimitGift.checkSpecial3Condition(actor, group, info.timeLimitGift)
  143. TimeLimitGift.checkSpecial4Condition(actor, group, info.timeLimitGift)
  144. TimeLimitGift.print("购买限时礼包 actor:" .. actor:toString(), "购买限时礼包 结束", cfgIds, timeLimitGiftData)
  145. end
  146. --- 触发限时礼包
  147. function TimeLimitGift.triggerTimeLimitGift(actor, isLogin)
  148. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包", isLogin)
  149. local timeLimitGiftData = TimeLimitGift.get(actor)
  150. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  151. --local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.CONDITION)
  152. local timeLimitGiftAllCfg = ConfigDataManager.getTable("cfg_timelLimitGift_all")
  153. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  154. return
  155. end
  156. local cfgIds = {}
  157. local nowMillis = getbaseinfo(actor, "now")
  158. for _, cfg in pairs(timeLimitGiftAllCfg) do
  159. --local var = timeLimitGiftInfo[cfg.id] or {endTime = 0, timeLimitGift = {}}
  160. local info = timeLimitGiftInfo[cfg.id] or {}
  161. local endTime = info.endTime or 0
  162. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "配置数据", cfg, "结束时间:", endTime)
  163. if endTime ~= 0 then
  164. goto continue
  165. end
  166. local giftType = tonumber(cfg.type)
  167. if giftType == TimeLimitGiftTypes.SPECIAL2 or giftType == TimeLimitGiftTypes.SPECIAL3 then
  168. goto continue
  169. end
  170. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断", cfg.condition)
  171. if not ConditionManager.Check(actor, cfg.condition) then
  172. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件不满足", cfg.condition)
  173. goto continue
  174. end
  175. if giftType == TimeLimitGiftTypes.SPECIAL5 then
  176. local isAllBuy = timeLimitGiftData:getSpecial4ById(cfg.param)
  177. if isAllBuy then
  178. -- 已买关联礼包 该礼包不开启
  179. goto continue
  180. else
  181. -- 关闭关联礼包 cfg.param 设置关闭时间
  182. local info1 = timeLimitGiftInfo[cfg.param]
  183. if info1 then
  184. info1.endTime = nowMillis - (10 * 60 * 1000)
  185. table.insert(cfgIds, cfg.param)
  186. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "关闭该组礼包", cfg.param)
  187. end
  188. end
  189. end
  190. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "条件判断 条件满足", cfg.condition, cfg.id)
  191. table.insert(cfgIds, cfg.id)
  192. local time = nowMillis + tonumber(cfg.timelimit)
  193. timeLimitGiftInfo[cfg.id] = {endTime = time, isSendMail = false, timeLimitGift = {}}
  194. ::continue::
  195. end
  196. if table.count(cfgIds) > 0 then
  197. timeLimitGiftData:save(actor)
  198. end
  199. --不是登录,并且有新数据发送
  200. if not isLogin and table.count(cfgIds) > 0 then
  201. this.sendTimeLimitGift(actor, cfgIds, true)
  202. end
  203. TimeLimitGift.print("触发限时礼包 actor:" .. actor:toString(), "触发限时礼包 结束", cfgIds)
  204. end
  205. function this.sendAllTimeLimitGift(actor)
  206. local timeLimitGiftData = TimeLimitGift.get(actor)
  207. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  208. if table.isNullOrEmpty(timeLimitGiftInfo) then
  209. this.sendAllGiftMsg(actor, {})
  210. return
  211. end
  212. local nowMillis = getbaseinfo(actor, "now")
  213. local data = {}
  214. for cfgId, info in pairs(timeLimitGiftInfo) do
  215. if nowMillis < info.endTime then
  216. local res = {
  217. group = cfgId,
  218. endTime = info.endTime,
  219. timeLimitGiftInfo = info.timeLimitGift
  220. }
  221. table.insert(data, res)
  222. end
  223. end
  224. this.sendAllGiftMsg(actor, data)
  225. end
  226. function this.sendAllGiftMsg(actor, data)
  227. sendluamsg(actor, LuaMessageIdToClient.RES_ALL_TIME_LIMIT_GIFT, data)
  228. TimeLimitGift.print("发送所有限时礼包数据", actor, data)
  229. end
  230. function this.sendGiftMsg(actor, data)
  231. sendluamsg(actor, LuaMessageIdToClient.RES_TIME_LIMIT_GIFT, data)
  232. end
  233. function this.sendTimeLimitGift(actor, cfgIds, isNew)
  234. local timeLimitGiftData = TimeLimitGift.get(actor)
  235. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  236. for _, cfgId in pairs(cfgIds) do
  237. local info = timeLimitGiftInfo[cfgId]
  238. local res = {
  239. group = cfgId,
  240. endTime = info.endTime,
  241. timeLimitGiftInfo = info.timeLimitGift,
  242. isNew = isNew
  243. }
  244. this.sendGiftMsg(actor, res)
  245. end
  246. end
  247. --- 检查显示礼包结束时间
  248. function TimeLimitGift.checkTimeLimitGiftTime(actor)
  249. local timeLimitGiftData = TimeLimitGift.get(actor)
  250. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  251. local nowMillis = getbaseinfo(actor, "now")
  252. local isSave = false
  253. for cfgId, info in pairs(timeLimitGiftInfo) do
  254. -- 倒计时已结束,并且未发送过邮箱
  255. if nowMillis > info.endTime and not info.isSendMail then
  256. TimeLimitGift.print("检查显示礼包结束时间 actor:" .. actor:toString(), "发送邮箱", cfgId, info)
  257. -- 获取下一级礼包
  258. local timeLimitGift = info.timeLimitGift
  259. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId)
  260. local buyCount = table.count(timeLimitGift)
  261. if table.isNullOrEmpty(timeLimitGift) or buyCount >= table.count(cfgs) then
  262. -- 没有购买过礼包 与 礼包已购买完
  263. -- 暂时不处理 第一个礼包一般需要购买
  264. else
  265. -- 只能按照顺序购买,下一个礼包等于购买礼包的数量加1
  266. local giftCfgs =
  267. ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", cfgId, "sort", buyCount + 1)
  268. TimeLimitGift.print(
  269. "检查显示礼包结束时间 actor:" .. actor:toString(),
  270. "查询配置",
  271. cfgId,
  272. buyCount + 1,
  273. "返回的配置",
  274. giftCfgs
  275. )
  276. if table.isNullOrEmpty(giftCfgs) then
  277. TimeLimitGift.print("没有配置礼包", actor:toString(), cfgId, buyCount + 1, "查询的数据", giftCfgs)
  278. goto continue
  279. end
  280. local giftCfg = giftCfgs[1]
  281. if string.isNullOrEmpty(giftCfg.cost) then
  282. local mail = giftCfg.mail
  283. local reward_item = string.toIntIntMap(giftCfg.gift, "#", "|")
  284. sendconfigmailbyrid(actor, actor:toString(), tonumber(mail), reward_item)
  285. TimeLimitGift.print(
  286. "检查显示礼包结束时间 actor:" .. actor:toString(),
  287. "邮件补发成功 补发礼包id",
  288. giftCfg.id,
  289. "道具信息",
  290. reward_item,
  291. "邮件id",
  292. mail
  293. )
  294. end
  295. end
  296. info.isSendMail = true
  297. isSave = true
  298. end
  299. ::continue::
  300. end
  301. if isSave then
  302. timeLimitGiftData:save(actor)
  303. end
  304. end
  305. function TimeLimitGift.checkSpecial2Count(actor)
  306. local level = getbaseinfo(actor, "level")
  307. if level < 100 then
  308. return
  309. end
  310. local timeLimitGiftData = TimeLimitGift.get(actor)
  311. local count = timeLimitGiftData:getSpecial2Count()
  312. if count == 0 then
  313. count = 1
  314. timeLimitGiftData:setSpecial2Count(count)
  315. timeLimitGiftData:save(actor)
  316. end
  317. end
  318. --- 触发 特殊条件2
  319. function TimeLimitGift.checkSpecial2Condition(actor)
  320. local level = getbaseinfo(actor, "level")
  321. if level < 100 then
  322. return
  323. end
  324. local timeLimitGiftData = TimeLimitGift.get(actor)
  325. local count = timeLimitGiftData:getSpecial2Count()
  326. if count > 0 then
  327. -- 条件2
  328. --1.等于大于100
  329. --2.先满足等级大于100级 强化过消耗材料 不管成功与失败 及为满足
  330. --3.前面两个要求满足后,第一次弹消耗条件不满足,触发该礼包
  331. TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "触发次数", count)
  332. local timeLimitGiftAllCfg =
  333. ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL2)
  334. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  335. return
  336. end
  337. local cfgIds = {}
  338. local nowMillis = getbaseinfo(actor, "now")
  339. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  340. for _, cfg in pairs(timeLimitGiftAllCfg) do
  341. local cfgId = cfg.id
  342. local info = timeLimitGiftInfo[cfgId] or {}
  343. local endTime = info.endTime or 0
  344. if endTime > 0 then
  345. -- 已开启
  346. goto continue
  347. end
  348. table.insert(cfgIds, cfg.id)
  349. local time = nowMillis + tonumber(cfg.timelimit)
  350. TimeLimitGift.print("触发 特殊条件2 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
  351. timeLimitGiftInfo[cfg.id] = {endTime = time, isSendMail = false, timeLimitGift = {}}
  352. -- 开启礼包
  353. ::continue::
  354. end
  355. if table.count(cfgIds) > 0 then
  356. timeLimitGiftData:save(actor)
  357. this.sendTimeLimitGift(actor, cfgIds, true)
  358. end
  359. end
  360. end
  361. --- 触发 特殊条件3
  362. function TimeLimitGift.checkSpecial3Condition(actor, group, timeLimitGift)
  363. local timeLimitGiftAllCfg =
  364. ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL3)
  365. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  366. return
  367. end
  368. local cfgIds = {}
  369. local nowMillis = getbaseinfo(actor, "now")
  370. local timeLimitGiftData = TimeLimitGift.get(actor)
  371. local timeLimitGiftInfo = timeLimitGiftData:getTimeLimitGiftInfo()
  372. for _, cfg in pairs(timeLimitGiftAllCfg) do
  373. local id = cfg.id
  374. local param = cfg.param
  375. if group ~= param then
  376. goto continue
  377. end
  378. local info = timeLimitGiftInfo[id] or {}
  379. local endTime = info.endTime or 0
  380. if endTime > 0 then
  381. -- 已开启
  382. goto continue
  383. end
  384. local count = table.count(timeLimitGift)
  385. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", param)
  386. if count < table.count(cfgs) then
  387. goto continue
  388. end
  389. table.insert(cfgIds, cfg.id)
  390. local time = nowMillis + tonumber(cfg.timelimit)
  391. TimeLimitGift.print("触发 特殊条件3 actor:" .. actor:toString(), "开启礼包 礼包id", cfg.id, "礼包结束时间", time)
  392. timeLimitGiftInfo[cfg.id] = {endTime = time, isSendMail = false, timeLimitGift = {}}
  393. ::continue::
  394. end
  395. if table.count(cfgIds) > 0 then
  396. timeLimitGiftData:save(actor)
  397. this.sendTimeLimitGift(actor, cfgIds, true)
  398. end
  399. end
  400. --- 触发 特殊条件4 记录该组礼包是否购买完,购买完记录未true
  401. function TimeLimitGift.checkSpecial4Condition(actor, group, timeLimitGift)
  402. local timeLimitGiftAllCfg =
  403. ConfigDataManager.getTable("cfg_timelLimitGift_all", "type", TimeLimitGiftTypes.SPECIAL4)
  404. if table.isNullOrEmpty(timeLimitGiftAllCfg) then
  405. return
  406. end
  407. local timeLimitGiftData = TimeLimitGift.get(actor)
  408. local isSave = false
  409. for _, cfg in pairs(timeLimitGiftAllCfg) do
  410. --local param = cfg.param
  411. local id = cfg.id
  412. if group ~= id then
  413. goto continue
  414. end
  415. -- 已购买该礼包 group 为 4的礼包不能被条件通过
  416. local count = table.count(timeLimitGift)
  417. local cfgs = ConfigDataManager.getTable("cfg_timelLimitGift_gift", "group", group)
  418. if count < table.count(cfgs) then
  419. goto continue
  420. end
  421. timeLimitGiftData:setSpecial4(id, true)
  422. isSave = true
  423. TimeLimitGift.print("触发 特殊条件4 actor:" .. actor:toString(), "该group礼包已全部购买 触发条件4 group:", group)
  424. ::continue::
  425. end
  426. if isSave then
  427. timeLimitGiftData:save(actor)
  428. end
  429. end
  430. function timelimitgifttest(actor, type, id)
  431. gameDebug.print(actor, "限时礼包礼包", id)
  432. --TimeLimitGift.login(actor)
  433. --TimeLimitGift.triggerTimeLimitGift(actor, false)
  434. TimeLimitGift.reqBuyTimeLimitGift(actor, {id = id})
  435. TimeLimitGift.print("限时礼包gm测试内容")
  436. end
  437. --- 打印日志
  438. local isPrintLog = true
  439. function TimeLimitGift.print(...)
  440. if isPrintLog then
  441. return
  442. end
  443. gameDebug.print(...)
  444. end
  445. -- 注册登录事件
  446. LoginEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.login)
  447. -- 注册等级提升事件
  448. LevelUpEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)
  449. --注册凌晨刷新事件
  450. ZeroEventListerTable:eventLister("0", "限时礼包", TimeLimitGift.levelUp)