--- 充值挡位功能 --- Generated by EmmyLua(https://github.com/EmmyLua) --- Created by 無心道(15388152619). --- DateTime: 2024/11/4 19:16 RechargeStall = {} RechargeStall.__index = RechargeStall local this = {} local function _rechargeType() return "1" end local function _playerDbKey() return "T$recharge_stall_first_data" end function RechargeStall.get(actor) local obj = getplaydef(actor, _playerDbKey()) return setmetatable(obj or {}, RechargeStall) end function RechargeStall:save(actor) setplaydef(actor, _playerDbKey(), self); end ---获取某一个挡位信息 function RechargeStall:stallData(cfgId) local var = self[cfgId] if not var then var = {} self[cfgId] = var; end return var end ---获取当前挡位充值次数 function RechargeStall:rechargeTime(cfgId, nowSec) local data = self:stallData(cfgId) if nowSec then data.rtime = nowSec end return data.rtime or 0 end ---充值事件触发 function RechargeStall.rechargeEvent(actor, cfg_recharge, count, amount, ext, outRewards) local stallId = cfg_recharge.parameter local cfg_recharge_gear = ConfigDataManager.getById("cfg_recharge_gear", stallId) gameDebug.assertTrue(table.notNullOrEmpty(cfg_recharge_gear), "没有配置充值档位", stallId) local stallData = RechargeStall.get(actor) --起始时间,结束时间 是否是第一轮 local startDayTime, endDayTime, firstGroup = this.recordTimes(actor) local cfgId = cfg_recharge_gear["id"] local rechargeTime = RechargeStall.rechargeTime(stallData, cfgId) --职业 if rechargeTime < startDayTime or endDayTime < rechargeTime then local career = getbaseinfo(actor, "getbasecareer") -- 拥有首充额外奖励 local reward_var = cfg_recharge_gear['firstreward'] if firstGroup == false then reward_var = cfg_recharge_gear['resetreward'] end string.putIntIntMap4Career(outRewards, career, reward_var, "#", "|") local nowSec = getbaseinfo("nowsec") stallData:rechargeTime(cfgId, nowSec) stallData:save(actor) end info(actor, "充值挡位", actor, cfgId, "奖励", outRewards) RechargeStall.sendPanel(actor, stallData) end function RechargeStall.reqAction(actor, type, action, reqParameter) if action == "panel" then local stallData = RechargeStall.get(actor) RechargeStall.sendPanel(actor, stallData) end end --- 请求充值档位信息 ---@param reqParameter table 请求参数 function RechargeStall.sendPanel(actor, stallData) local recharges = ConfigDataManager.getTable("cfg_recharge_gear") gameDebug.assertTrue(table.notNullOrEmpty(recharges), "没有配置充值档位") stallData = stallData or RechargeStall.get(actor) --起始时间,结束时间 是否是第一轮 local startDayTime, endDayTime, firstGroup = this.recordTimes(actor) local stallList = {} for _, cfg in ipairs(recharges) do local info = {} local cfgId = cfg["id"] info.rechargeId = tonumber(cfgId) local rechargeTime = RechargeStall.rechargeTime(stallData, cfgId) if string.isNullOrEmpty(cfg["firstreward"]) then info.isShowFirst = false --没有配置首充奖励所以不需要展示 info.isRewardFirst = false --没有配置首充奖励所以不需要展示 else info.isShowFirst = rechargeTime < startDayTime or endDayTime < rechargeTime --true 表示要展示首充奖励 info.isRewardFirst = firstGroup -- true 表示开服时间第一个周期内 end table.insert(stallList, info) end --this:print("充值档位回包内容", rechargeStallInfo) local data = {} data["list"] = stallList data["endDayTime"] = endDayTime Recharge.resAction(actor, _rechargeType(), "panel", data) end -- 获取当前获取的开启和结束时间 function this.recordTimes(actor) local recharges = ConfigDataManager.getTable("cfg_recharge_gear") local nowSec = getbaseinfo("nowsec") -- 开服天数 local serverOpenDays = getbaseinfo(actor, "serveropendays") --通过开服时间计算当前最大购买次数 local resetDay = tonumber(recharges[1]["resettime"]) local maxFirstCount = math.ceil(serverOpenDays / resetDay) --计算到本轮结束还有多少天 local endDay = maxFirstCount * resetDay - serverOpenDays + 1; local nowStartSec = TimeUtil.creteTimeDayStart4Sec(nowSec) --计算出结束时间 local endDayTime = TimeUtil.addDay(nowStartSec, endDay) - 1 --往前推计算出开始时间 local startDayTime = TimeUtil.creteTimeDayStart4Sec(TimeUtil.addDay(endDayTime, -(resetDay - 1))) --获取开始时间那一天的00:00:00 startDayTime = TimeUtil.creteTimeDayStart4Sec(startDayTime) print("充值首充判定", TimeUtil.timeFormat(startDayTime), TimeUtil.timeFormat(nowSec), TimeUtil.timeFormat(endDayTime), "openday", serverOpenDays, maxFirstCount, endDay, endDay ) return startDayTime, endDayTime, serverOpenDays <= resetDay end --TODO 一定要放到文件最后 EventListerTable.registerType("充值挡位", _rechargeType(), _playerDbKey()) -- 注册事件 RechargeEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.rechargeEvent) -- 注册请求消息监听 RechargeMessageEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.reqAction) -- todo放到最后 return RechargeStall