--- 充值挡位功能 --- 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 cfgId = cfg_recharge_gear["id"] local type = tonumber(cfg_recharge_gear["type"]) local nowSec = getbaseinfo("nowsec") local career = getbaseinfo(actor, "getbasecareer") local reward_var = "" if type == RechargeStall.RechargeStallType.TYPE_1 then --起始时间,结束时间 是否是第一轮 local startDayTime, endDayTime, firstGroup = this.recordTimes(actor) local rechargeTime = RechargeStall.rechargeTime(stallData, cfgId) --职业 if rechargeTime < startDayTime or endDayTime < rechargeTime then -- 拥有首充额外奖励 reward_var = cfg_recharge_gear['firstreward'] if firstGroup == false then reward_var = cfg_recharge_gear['resetreward'] end end elseif type == RechargeStall.RechargeStallType.TYPE_2 then local isShowFirst, reward = this.checkRechargeType2(stallData, cfg_recharge_gear, nowSec) if isShowFirst then reward_var = reward end end string.putIntIntMap4Career(outRewards, career, reward_var, "#", "|") stallData:rechargeTime(cfgId, nowSec) stallData:save(actor) info(actor, "充值挡位", actor, cfgId, "奖励", outRewards, "额外的奖励", reward_var) 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), "没有配置充值档位") local type = tonumber(recharges[1]["type"]) stallData = stallData or RechargeStall.get(actor) local stallList = {} local endTime = 0 if type == RechargeStall.RechargeStallType.TYPE_1 then --起始时间,结束时间 是否是第一轮 local startDayTime, endDayTime, firstGroup = this.recordTimes(actor) endTime = endDayTime 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 elseif type == RechargeStall.RechargeStallType.TYPE_2 then local nowSec = getbaseinfo("nowsec") for _, cfg in ipairs(recharges) do local info = {} local cfgId = cfg["id"] info.rechargeId = tonumber(cfgId) local isShowFirst, reward_var = this.checkRechargeType2(stallData, cfg, nowSec) info.isShowFirst = isShowFirst info.isRewardFirst = RechargeStall.rechargeTime(stallData, cfgId) == 0 table.insert(stallList, info) end end --this:print("充值档位回包内容", rechargeStallInfo) local data = {} data["list"] = stallList data["endDayTime"] = endTime 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 ---校验2类型充值档位逻辑 function this.checkRechargeType2(self, cfg, now) local cfgId = cfg["id"] local resetTime = tonumber(cfg["resettime"]) local rechargeTime = RechargeStall.rechargeTime(self, cfgId) if rechargeTime == 0 then return true, cfg["firstreward"] --表示尚未首充过 else local day = TimeUtil.diffDays(now, rechargeTime) + 1 --print("测试22 ", day , rechargeTime, now, cfgId, resetTime) if day > resetTime then return true, cfg["resetreward"] else return false, nil end end end RechargeStall.RechargeStallType = { TYPE_1 = 1, -- 周期重置逻辑 TYPE_2 = 2, -- 个人购买后重置,循环重置后奖励字段 } --TODO 一定要放到文件最后 EventListerTable.registerType("充值挡位", _rechargeType(), _playerDbKey()) -- 注册事件 RechargeEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.rechargeEvent) -- 注册请求消息监听 RechargeMessageEventListerTable:eventLister(_rechargeType(), "充值挡位", RechargeStall.reqAction) -- todo放到最后 return RechargeStall