RechargeStall.lua 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. --- 充值挡位功能
  2. --- Generated by EmmyLua(https://github.com/EmmyLua)
  3. --- Created by 無心道(15388152619).
  4. --- DateTime: 2024/11/4 19:16
  5. RechargeStall = {}
  6. RechargeStall.__index = RechargeStall
  7. local this = {}
  8. local function _rechargeType()
  9. return "1"
  10. end
  11. local function _playerDbKey()
  12. return "T$recharge_stall_first_data"
  13. end
  14. function RechargeStall.get(actor)
  15. local obj = getplaydef(actor, _playerDbKey())
  16. return setmetatable(obj or {}, RechargeStall)
  17. end
  18. function RechargeStall:save(actor)
  19. setplaydef(actor, _playerDbKey(), self);
  20. end
  21. ---获取某一个挡位信息
  22. function RechargeStall:stallData(cfgId)
  23. local var = self[cfgId]
  24. if not var then
  25. var = {}
  26. self[cfgId] = var;
  27. end
  28. return var
  29. end
  30. ---获取当前挡位充值次数
  31. function RechargeStall:rechargeTime(cfgId, nowSec)
  32. local data = self:stallData(cfgId)
  33. if nowSec then
  34. data.rtime = nowSec
  35. end
  36. return data.rtime or 0
  37. end
  38. ---充值事件触发
  39. function RechargeStall.rechargeEvent(actor, cfg_recharge, count, amount, ext, outRewards)
  40. local stallId = cfg_recharge.parameter
  41. local cfg_recharge_gear = ConfigDataManager.getById("cfg_recharge_gear", stallId)
  42. gameDebug.assertTrue(table.notNullOrEmpty(cfg_recharge_gear), "没有配置充值档位", stallId)
  43. local stallData = RechargeStall.get(actor)
  44. local cfgId = cfg_recharge_gear["id"]
  45. local type = tonumber(cfg_recharge_gear["type"])
  46. local nowSec = getbaseinfo("nowsec")
  47. local career = getbaseinfo(actor, "getbasecareer")
  48. local reward_var = ""
  49. if type == RechargeStall.RechargeStallType.TYPE_1 then
  50. --起始时间,结束时间 是否是第一轮
  51. local startDayTime, endDayTime, firstGroup = this.recordTimes(actor)
  52. local rechargeTime = RechargeStall.rechargeTime(stallData, cfgId)
  53. --职业
  54. if rechargeTime < startDayTime or endDayTime < rechargeTime then
  55. -- 拥有首充额外奖励
  56. reward_var = cfg_recharge_gear['firstreward']
  57. if firstGroup == false then
  58. reward_var = cfg_recharge_gear['resetreward']
  59. end
  60. end
  61. elseif type == RechargeStall.RechargeStallType.TYPE_2 then
  62. local isShowFirst, reward = this.checkRechargeType2(stallData, cfg_recharge_gear, nowSec)
  63. if isShowFirst then
  64. reward_var = reward
  65. end
  66. end
  67. string.putIntIntMap4Career(outRewards, career, reward_var, "#", "|")
  68. stallData:rechargeTime(cfgId, nowSec)
  69. stallData:save(actor)
  70. info(actor, "充值挡位", actor, cfgId, "奖励", outRewards, "额外的奖励", reward_var)
  71. RechargeStall.sendPanel(actor, stallData)
  72. end
  73. function RechargeStall.reqAction(actor, type, action, reqParameter)
  74. if action == "panel" then
  75. local stallData = RechargeStall.get(actor)
  76. RechargeStall.sendPanel(actor, stallData)
  77. end
  78. end
  79. --- 请求充值档位信息
  80. ---@param reqParameter table 请求参数
  81. function RechargeStall.sendPanel(actor, stallData)
  82. local recharges = ConfigDataManager.getTable("cfg_recharge_gear")
  83. gameDebug.assertTrue(table.notNullOrEmpty(recharges), "没有配置充值档位")
  84. local type = tonumber(recharges[1]["type"])
  85. stallData = stallData or RechargeStall.get(actor)
  86. local stallList = {}
  87. local endTime = 0
  88. if type == RechargeStall.RechargeStallType.TYPE_1 then
  89. --起始时间,结束时间 是否是第一轮
  90. local startDayTime, endDayTime, firstGroup = this.recordTimes(actor)
  91. endTime = endDayTime
  92. for _, cfg in ipairs(recharges) do
  93. local info = {}
  94. local cfgId = cfg["id"]
  95. info.rechargeId = tonumber(cfgId)
  96. local rechargeTime = RechargeStall.rechargeTime(stallData, cfgId)
  97. if string.isNullOrEmpty(cfg["firstreward"]) then
  98. info.isShowFirst = false --没有配置首充奖励所以不需要展示
  99. info.isRewardFirst = false --没有配置首充奖励所以不需要展示
  100. else
  101. info.isShowFirst = rechargeTime < startDayTime or endDayTime < rechargeTime --true 表示要展示首充奖励
  102. info.isRewardFirst = firstGroup -- true 表示开服时间第一个周期内
  103. end
  104. table.insert(stallList, info)
  105. end
  106. elseif type == RechargeStall.RechargeStallType.TYPE_2 then
  107. local nowSec = getbaseinfo("nowsec")
  108. for _, cfg in ipairs(recharges) do
  109. local info = {}
  110. local cfgId = cfg["id"]
  111. info.rechargeId = tonumber(cfgId)
  112. local isShowFirst, reward_var = this.checkRechargeType2(stallData, cfg, nowSec)
  113. info.isShowFirst = isShowFirst
  114. info.isRewardFirst = RechargeStall.rechargeTime(stallData, cfgId) == 0
  115. table.insert(stallList, info)
  116. end
  117. end
  118. --this:print("充值档位回包内容", rechargeStallInfo)
  119. local data = {}
  120. data["list"] = stallList
  121. data["endDayTime"] = endTime
  122. Recharge.resAction(actor, _rechargeType(), "panel", data)
  123. end
  124. -- 获取当前获取的开启和结束时间
  125. function this.recordTimes(actor)
  126. local recharges = ConfigDataManager.getTable("cfg_recharge_gear")
  127. local nowSec = getbaseinfo("nowsec")
  128. -- 开服天数
  129. local serverOpenDays = getbaseinfo(actor, "serveropendays")
  130. --通过开服时间计算当前最大购买次数
  131. local resetDay = tonumber(recharges[1]["resettime"])
  132. local maxFirstCount = math.ceil(serverOpenDays / resetDay)
  133. --计算到本轮结束还有多少天
  134. local endDay = maxFirstCount * resetDay - serverOpenDays + 1;
  135. local nowStartSec = TimeUtil.creteTimeDayStart4Sec(nowSec)
  136. --计算出结束时间
  137. local endDayTime = TimeUtil.addDay(nowStartSec, endDay) - 1
  138. --往前推计算出开始时间
  139. local startDayTime = TimeUtil.creteTimeDayStart4Sec(TimeUtil.addDay(endDayTime, -(resetDay - 1)))
  140. --获取开始时间那一天的00:00:00
  141. startDayTime = TimeUtil.creteTimeDayStart4Sec(startDayTime)
  142. print("充值首充判定", TimeUtil.timeFormat(startDayTime), TimeUtil.timeFormat(nowSec), TimeUtil.timeFormat(endDayTime),
  143. "openday", serverOpenDays, maxFirstCount,
  144. endDay, endDay
  145. )
  146. return startDayTime, endDayTime, serverOpenDays <= resetDay
  147. end
  148. ---校验2类型充值档位逻辑
  149. function this.checkRechargeType2(self, cfg, now)
  150. local cfgId = cfg["id"]
  151. local resetTime = tonumber(cfg["resettime"])
  152. local rechargeTime = RechargeStall.rechargeTime(self, cfgId)
  153. if rechargeTime == 0 then
  154. return true, cfg["firstreward"] --表示尚未首充过
  155. else
  156. local day = TimeUtil.diffDays(now, rechargeTime) + 1
  157. --print("测试22 ", day , rechargeTime, now, cfgId, resetTime)
  158. if day > resetTime then
  159. return true, cfg["resetreward"]
  160. else
  161. return false, nil
  162. end
  163. end
  164. end
  165. RechargeStall.RechargeStallType = {
  166. TYPE_1 = 1, -- 周期重置逻辑
  167. TYPE_2 = 2, -- 个人购买后重置,循环重置后奖励字段
  168. }
  169. --TODO 一定要放到文件最后
  170. EventListerTable.registerType("充值挡位", _rechargeType(), _playerDbKey())
  171. -- 注册事件
  172. RechargeEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.rechargeEvent)
  173. -- 注册请求消息监听
  174. RechargeMessageEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.reqAction)
  175. -- todo放到最后
  176. return RechargeStall