| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337 |
- -- 循环累计充值活动, 开服第8天开始, 每7天一轮, 活动循环开
- -- 为保证合服后玩家不受影响, 将活动时间, 充值等数据绑在玩家身上
- --db
- --[[
- human.db.cycleRechargeData =
- {
- startTime = nil, 本轮开启时间
- totalRecharge = 0, 本轮累计充值
- receiveList = {}, 已经领取列表
- }
- ]]--
- local Msg = require("core.Msg")
- local Grid = require("bag.Grid")
- local BagLogic = require("bag.BagLogic")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local CommonDB = require("common.CommonDB")
- local Util = require("common.Util")
- local cycleRechargeCfg = require("excel.cycleRecharge").cycleRecharge
- local MailManager = require("mail.MailManager")
- local MailExcel = require("excel.mail")
- local YunYingLogic = require("yunying.YunYingLogic")
- -- 开服第8天开始
- local OPEN_DAYS = 8
- -- 每轮活动持续天数
- local DURATION_DAYS = 7
- local DAY_SECS = 86400
- -- 邮件ID
- local MAILID = 7019
- -- 日志标识
- local LOGTAG = "ActCycleRechargeLogic"
- --活动ID
- local ACTID = 3314
- local function initActData(human)
- human.db.cycleRechargeData = {}
- end
- local function getActData(human)
- return human.db.cycleRechargeData
- end
- local function updateActStartTime(human, ti)
- local cycleRechargeData = getActData(human)
- cycleRechargeData.startTime = ti
- end
- local function updateActReceiveList(human, newReceiveList)
- local cycleRechargeData = getActData(human)
- cycleRechargeData.receiveList = cycleRechargeData.receiveList or {}
- for k in pairs(newReceiveList) do
- cycleRechargeData.receiveList[k] = '1'
- end
- end
- local function updateActTotalRecharge(human, money)
- local cycleRechargeData = getActData(human)
- cycleRechargeData.totalRecharge = (cycleRechargeData.totalRecharge or 0) + money
- end
- local function isRecharge(human)
- return (human.db.topupAcount and human.db.topupAcount > 0) and true or false
- end
- -- 开服时间
- local function getOpenServerTime()
- return CommonDB.getServerOpenTime()
- end
- -- 计算角色的活动首次开启时间
- local function calcRoleFirstOpenTime()
- local openServerTime = getOpenServerTime()
- local dayStartTime = Util.getDayStartTime(os.time())
- local actFirstOpenTime = Util.getDayStartTime(openServerTime + (OPEN_DAYS - 1) * DAY_SECS)
- if dayStartTime < actFirstOpenTime then
- return
- end
- -- -- 当天与活动首次开启时间的天数差
- -- local days_passed = math.floor((dayStartTime - actFirstOpenTime) / DAY_SECS)
- -- -- 当前属于第几轮
- -- local crurrent_round = math.floor(days_passed / DURATION_DAYS) + 1
- -- -- 本轮的开启时间
- -- local crurrent_round_openTime = actFirstOpenTime + (crurrent_round - 1) * DURATION_DAYS * DAY_SECS
- -- return crurrent_round_openTime
- return dayStartTime
- end
- -- 获取可领档位的索引
- local function getAwardIdx(human)
- local cycleRechargeData = getActData(human)
- local totalRecharge = cycleRechargeData.totalRecharge
- if not totalRecharge or totalRecharge <= 0 then
- return
- end
- local idxList = {}
- local receiveList = cycleRechargeData.receiveList or {}
- for k,v in ipairs(cycleRechargeCfg) do
- if totalRecharge >= v.moneyCond and not receiveList[k] then
- idxList[k] = 1
- end
- end
- if not next(idxList) then
- return
- end
- return idxList
- end
- -- 可领取的奖励
- local function getAwardList(human)
- local idxList = getAwardIdx(human)
- if not idxList then
- return
- end
- local len = 0
- local awardList, receiveList = {}, {}
- for idx in pairs(idxList) do
- local singleCfg = cycleRechargeCfg[idx]
- for _,item in ipairs(singleCfg.awardList) do
- len = len + 1
- awardList[len] = item
- receiveList[idx] = 1
- end
- end
- return awardList, receiveList
- end
- -- 如果还有奖励未领取,通过邮件发送
- local function sendAwardByEmail(human)
- local awardList, receiveList = getAwardList(human)
- if awardList and #awardList > 0 then
- updateActReceiveList(human, receiveList)
- local mailCfg = MailExcel.mail[MAILID]
- MailManager.add(MailManager.SYSTEM, human.db._id, mailCfg.title, mailCfg.content, awardList, mailCfg.senderName)
- end
- end
- -- 检查红点
- local function redDotCheck(human, noCheckRed)
- -- YunYingLogic.updateIcon(YYInfo[ACTID], human, noCheckRed)
- YunYingLogic.sendGroupUpdate(YYInfo[ACTID], human, ACTID)
- end
- -- 跨天
- function updateDaily(human)
- local cycleRechargeData = getActData(human)
- if not cycleRechargeData then
- local firstOpenTime = calcRoleFirstOpenTime()
- if not firstOpenTime then
- return
- end
- initActData(human)
- updateActStartTime(human, firstOpenTime)
- -- redDotCheck(human, true)
- if isRecharge(human) then
- -- 推送数据,更新界面
- Query(human)
- end
- else
- local now = os.time()
- if now >= (cycleRechargeData.startTime + DURATION_DAYS * DAY_SECS) then
- --检查是否有未领取的奖励
- sendAwardByEmail(human)
- -- 重置数据
- initActData(human)
- -- 更新新一轮开启时间
- local dayStartTime = Util.getDayStartTime(now)
- updateActStartTime(human, dayStartTime)
- if isRecharge(human) then
- -- 推送数据,更新界面
- Query(human)
- -- 红点更新
- redDotCheck(human, true)
- end
- end
- end
- end
- function isOpen(human)
- local bl = isRecharge(human)
- local cycleRechargeData = getActData(human)
- if not cycleRechargeData or not bl then
- return false
- end
- return true
- end
- function isRed(human, YYInfo, funcConfig)
- if getAwardIdx(human) then
- return true
- end
- return false
- end
- --充值
- function onCharge(human, price, funcID, buyID)
- local cycleRechargeData = getActData(human)
- if not cycleRechargeData then
- return
- end
- updateActTotalRecharge(human, price)
- redDotCheck(human)
- end
- function Query(human)
- local bl = isRecharge(human)
- local cycleRechargeData = getActData(human)
- if not cycleRechargeData or not bl then
- return
- end
- local startTag = 1
- local len = 0
- local msgMaxLen = 5
- local cfgCnt = #cycleRechargeCfg
- local msgRet = Msg.gc.GC_CYCLERECHARGE_QUERY
- msgRet.startTime = cycleRechargeData.startTime
- msgRet.endTime = cycleRechargeData.startTime + DURATION_DAYS * DAY_SECS
- msgRet.totalRecharge = cycleRechargeData.totalRecharge or 0
- local msgAwardList = msgRet.awardList
- local receiveList = cycleRechargeData.receiveList or {}
- for k, v in ipairs(cycleRechargeCfg) do
- len = len + 1
- msgAwardList[0] = msgMaxLen
- msgAwardList[len].idx = k
- msgAwardList[len].moneyCond = v.moneyCond
- msgAwardList[len].state = 0
- if receiveList[k] then
- msgAwardList[len].state = 2
- else
- if cycleRechargeData.totalRecharge and cycleRechargeData.totalRecharge >= v.moneyCond then
- msgAwardList[len].state = 1
- end
- end
- for i, itemInfo in ipairs(v.awardList) do
- msgAwardList[len].itemList[0] = i
- Grid.makeItem( msgAwardList[len].itemList[i], itemInfo[1], itemInfo[2])
- end
- if len >= msgMaxLen then
- msgRet.startTag = startTag
- msgRet.endTag = 0
- if cfgCnt - len <= 0 then
- msgRet.endTag = 1
- return Msg.send(msgRet, human.fd)
- end
- Msg.send(msgRet, human.fd)
- len = 0
- startTag = 0
- cfgCnt = cfgCnt - msgMaxLen
- end
- end
- msgRet.startTag = startTag
- msgRet.endTag = 1
- Msg.send(msgRet, human.fd)
- end
- function GetAward(human)
- local cycleRechargeData = getActData(human)
- if not cycleRechargeData then
- return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
- end
- if not cycleRechargeData.totalRecharge or cycleRechargeData.totalRecharge <= 0 then
- return Broadcast.sendErr(human, Lang.COMMON_RECHARGE_NOT_ENOUGH)
- end
- local awardList, receiveList = getAwardList(human)
- if not awardList or not next(awardList) then
- return Broadcast.sendErr(human, Lang.SHARE_GROUP_GET_ERR_CNT)
- end
- updateActReceiveList(human, receiveList)
- BagLogic.addItemList(human, awardList, LOGTAG)
- Query(human)
- redDotCheck(human, true)
- end
|