| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384 |
- --在线奖励活动
- --db
- --[=[
- human.db.OnlineRewardData = {
- haveTime = nil, --活动获得时间, 即首充时间
- dailyData = { --每日数据,key为当前时间距离 haveTime 的天数
- [1] = {
- [1] = nil, --记录当天某个档位奖励的领取情况, key 为档位,有记录表示已经领取了(不可领取和可领取两种状态不存db)
- [2] = nil,
- },
- [2] = {
- [1] = nil,
- [2] = nil,
- },
- }
- }
- ]=]--
- local Msg = require("core.Msg")
- local Grid = require("bag.Grid")
- local Util = require("common.Util")
- local BagLogic = require("bag.BagLogic")
- local Broadcast = require("broadcast.Broadcast")
- local Lang = require("common.Lang")
- local onlineAardCfg = require("excel.onlineAward").onlineAward
- local YunYingLogic = require("yunying.YunYingLogic")
- local PanelDefine = require("broadcast.PanelDefine")
- local Timer = require("core.Timer")
- --分钟转秒
- local TIMEBASE = 60
- --一天的秒数
- local DAYSEC = 86400
- --本活动日志标识
- local LOGTYPE = "OnlineAwardLogic"
- --是否在线
- IsOnline = false
- --活动ID
- local ACTID = 18001
- --检查活动获得时间, 如果没有初始化则初始化
- local function checkHaveTime(human)
- local OnlineRewardData = human.db.OnlineRewardData
- if not OnlineRewardData or not OnlineRewardData.haveTime then
- human.db.OnlineRewardData = human.db.OnlineRewardData or {}
- human.db.OnlineRewardData.haveTime = os.time()
- end
- end
- --计算当天到目前为止的总在线时长
- local function calcTotalOnlineTime(human)
- local lastOnlineTime = human.db.onlineTimeDay or 0
- local loginTime = human.db.lastLoginTime
- --可能存在玩家在线跨天情况,需要判断登录时间与当前时间是否属于同一天,如果不是, 那么在此活动中,当天的登录时间应该为当天0点
- local now = os.time()
- if not Util.isSameDay(loginTime) then
- loginTime = Util.getDayStartTime(now)
- end
- local totalOnlineTime = now - loginTime + lastOnlineTime
- return totalOnlineTime
- end
- --获取当前时间距离startTime相差多少天
- local function getDiffDay(startTime)
- local passDay = Util.diffDay(startTime) + 1
- return passDay
- end
- --是否获得该活动
- local function isHaveAct(human)
- local topupAcount = human.db.topupAcount
- if topupAcount and topupAcount > 0 then
- return true
- end
- return false
- end
- --是否结束
- local function isOver(human)
- local OnlineRewardData = human.db.OnlineRewardData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- local targetCfg = onlineAardCfg[targetDay]
- --配置错误或者已经超过配置里的天数了都不显示
- if not targetCfg then
- return true
- end
- return false
- end
- --计算下一个未获得奖励需要的在线时间
- local function calcLeftTime(human)
- local OnlineRewardData = human.db.OnlineRewardData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- local targetCfg = onlineAardCfg[targetDay]
- if not targetCfg then
- return
- end
- local leftTime = 0
- local totalNeedTime = 0
- local timeCfg = targetCfg.onlineTimeVec
- local totalOnlineTime = calcTotalOnlineTime(human)
- for _, needTime in ipairs(timeCfg) do
- totalNeedTime = totalNeedTime + needTime * TIMEBASE
- if totalNeedTime > totalOnlineTime then
- leftTime = totalNeedTime - totalOnlineTime
- break
- end
- end
- return leftTime
- end
- --返回可领取奖励的index Vec
- local function getCanReceiveAwardVec(human, isRed)
- local OnlineRewardData = human.db.OnlineRewardData
- local dailyData = OnlineRewardData.dailyData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- local targetCfg = onlineAardCfg[targetDay]
- local todayRecordData = dailyData and dailyData[targetDay]
- if not targetCfg then
- if not isRed then
- Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- return
- end
- --充值金额是否符合
- local topupAcountDaily = human.db.topupAcountDaily
- if not topupAcountDaily or topupAcountDaily < targetCfg.needRecharge then
- if not isRed then
- Broadcast.sendErr(human, Lang.COMMON_DAY_RECHARGE_NOT_ENOUGH)
- end
- return
- end
- local totalNeedTime = 0
- local cfgOnlineTimeVec = targetCfg.onlineTimeVec
- local totalOnlineTime = calcTotalOnlineTime(human)
- local len = 0
- local awardIdxVec = {}
- for idx, needTime in ipairs(cfgOnlineTimeVec) do
- totalNeedTime = totalNeedTime + needTime * TIMEBASE
- if totalOnlineTime >= totalNeedTime and (not todayRecordData or not todayRecordData[idx]) then
- len = len + 1
- awardIdxVec[len] = idx
- end
- end
- if len == 0 then
- return
- end
- return awardIdxVec
- end
- --定时器任务
- local function timeFunc(human)
- if not IsOnline then
- return
- end
- local leftTime = calcLeftTime(human)
- if leftTime and leftTime > 0 then
- local now = os.time()
- local todayStartTi = Util.getDayStartTime(now)
- local nextDayStartTi = todayStartTi + DAYSEC
- --只有需要挂机时间 + 当前时间 < 下一天0点, 那么才加定时器
- if leftTime + now < nextDayStartTi then
- Timer.addLater(leftTime, function ()
- Query(human)
- --红点更新
- YunYingLogic.updateIcon(YYInfo[ACTID], human, true)
- timeFunc(human)
- end)
- end
- end
- end
- --红点判断
- function isRed(human, YYInfo, funcConfig)
- if not isHaveAct(human) then
- return false
- end
- if not getCanReceiveAwardVec(human, true) then
- return false
- end
- return true
- end
- --是否开启(外部调用)
- function isOpen(human)
- if not isHaveAct(human) then
- return false
- end
- if isOver(human) then
- return false
- end
- return true
- end
- --登录
- function onLogin(human, actID)
- if not isHaveAct(human) then
- return
- end
- IsOnline = true
- checkHaveTime(human)
- timeFunc(human)
- end
- --下线
- function onLogout(human, funcID, parameter, parameter2)
- IsOnline = false
- end
- --跨天
- function updateDaily(human, funcID)
- checkHaveTime(human)
- end
- --新跨天函数,这里用新的跨天函数是因为ObjHuman.lua中 重置每日在线时间代码会晚于运营活动中的 updateDaily()执行
- --这个活动中,会用到每日在线时间,所以需要重新定义一个跨天函数,在重置每日在线时间后再执行
- function NewUpdateDaily(human)
- if not isHaveAct(human) then
- return
- end
- if IsOnline then
- if isOver(human) then
- YunYingLogic.updateIcon(YYInfo[ACTID], human, true)
- return
- end
- --针对玩家在线跨天情况,下发一次最新数据
- Query(human)
- timeFunc(human)
- end
- end
- --充值
- function onCharge(human, price)
- local OnlineRewardData = human.db.OnlineRewardData
- if not OnlineRewardData or not OnlineRewardData.haveTime then
- checkHaveTime(human)
- timeFunc(human)
- YunYingLogic.updateIcon(YYInfo[ACTID], human, true)
- end
- OnlineRewardData = human.db.OnlineRewardData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- local targetCfg = onlineAardCfg[targetDay]
- local topupAcountDaily = human.db.topupAcountDaily
- if topupAcountDaily and topupAcountDaily >= targetCfg.needRecharge then
- Query(human)
- end
- return true
- end
- --查询
- function Query(human)
- if not isHaveAct(human) then
- return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
- end
- local OnlineRewardData = human.db.OnlineRewardData
- local dailyData = OnlineRewardData.dailyData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- local targetCfg = onlineAardCfg[targetDay]
- local todayData = dailyData and dailyData[targetDay]
- if not targetCfg then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- local timeCfg = targetCfg.onlineTimeVec
- local awardCfg = targetCfg.awardVec
- if #timeCfg ~= #awardCfg then
- return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
- end
- local len = 0
- local totalNeedTime = 0
- local totalOnlineTime = calcTotalOnlineTime(human)
- local msgRet = Msg.gc.GC_ONLINEAWARD_QUERY
- msgRet.leftTime = 0
- msgRet.needRecharge = targetCfg.needRecharge
- msgRet.isReach = 0
- local topupAcountDaily = human.db.topupAcountDaily
- if topupAcountDaily and topupAcountDaily >= targetCfg.needRecharge then
- msgRet.isReach = 1
- end
- local msgAwardVec = msgRet.awardVec
- msgAwardVec[0] = 0
- for idx, needTime in ipairs(timeCfg) do
- len = len + 1
- msgAwardVec[len].state = 0
- Grid.makeItem(msgAwardVec[len].itemInfo, awardCfg[idx][1], awardCfg[idx][2])
- totalNeedTime = totalNeedTime + needTime * TIMEBASE
- if totalOnlineTime >= totalNeedTime then
- msgAwardVec[len].state = 1
- if todayData and todayData[idx] then
- msgAwardVec[len].state = 2
- end
- else
- if msgRet.leftTime == 0 then
- msgRet.leftTime = totalNeedTime - totalOnlineTime
- end
- end
- end
- msgAwardVec[0] = len
- Msg.send(msgRet, human.fd)
- end
- --领奖
- function ClaimAward(human)
- if not isHaveAct(human) then
- return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
- end
- local awardIdxVec = getCanReceiveAwardVec(human)
- if not awardIdxVec then
- return
- end
- local OnlineRewardData = human.db.OnlineRewardData
- local targetDay = getDiffDay(OnlineRewardData.haveTime)
- OnlineRewardData.dailyData = OnlineRewardData.dailyData or {}
- OnlineRewardData.dailyData[targetDay] = OnlineRewardData.dailyData[targetDay] or {}
- local todayRecoedData = OnlineRewardData.dailyData[targetDay]
- local len = 0
- local awardVec = {}
- local targetCfg = onlineAardCfg[targetDay]
- local awardCfg = targetCfg.awardVec
- for _, idx in ipairs(awardIdxVec) do
- len = len + 1
- awardVec[len] = {awardCfg[idx][1], awardCfg[idx][2]}
- todayRecoedData[idx] = true
- end
- BagLogic.addItemList(human, awardVec, LOGTYPE)
- --下发数据更新
- Query(human)
- --红点更新
- YunYingLogic.updateIcon(YYInfo[ACTID], human, true)
- end
|