| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344 |
- local Msg = require("core.Msg")
- local Util = require("common.Util")
- local ObjHuman = require("core.ObjHuman")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local Grid = require("bag.Grid")
- local BagLogic = require("bag.BagLogic")
- local AbsActLogic = require("absAct.AbsActLogic")
- local AbsActDefine = require("absAct.AbsActDefine")
- local MailManager = require("mail.MailManager")
- local MailExcel = require("excel.mail")
- local AbsActExcel = require("excel.absAct")
- local ItemExcel = require("excel.item").item
- local ItemDefine = require("bag.ItemDefine")
- local YunYingLogic = require("yunying.YunYingLogic")
- local PanelDefine = require("broadcast.PanelDefine")
- --[[
- absAct.xlxs-surpriseChest
- 新英雄来袭-惊喜宝箱
- 1.每天凌晨0点解锁一个宝箱,每个宝箱都会有单独对应的任务
- 2.完成任务可以领取奖励;未完成任务,跨天后可以花元宝补领奖励
- DB:
- human.db.absAct[id] = {
- curDay = xxx, -- 当前是哪一天
- days = {
- [day] = {
- state = xxx, -- 天数 = 状态(0未解锁,1已解锁(不能领),2可领,3已领取,4可补领,5已补领)
- cnt = xxx,
- },
- ...
- }
- }
- local:
- getActID() -- 获取活动id
- getSChestDBAndConfig() -- 获取DB和配置
- getInitDB() -- 初始DB数据
- getCurSChestInfo() -- 取当天配置信息
- updateSend() -- 更新活动状态
- getReward() -- 获得奖励
- everyReqTriggerTask() -- 每次活动请求时触发任务
- wrapSurpriseChestNet() -- 包装惊喜宝箱协议数据
- public:
- getAndSendMsg() -- 发送活动数据
- isRed() -- 红点提醒
- isActive() -- 激活状态
- isOpen() -- 活动开启
- getLeftTime() -- 得到活动剩余时间
- get() -- 领取任务完成奖励
- buGet() -- 领取补领奖励
- updateDaily() -- 每日更新
- finishTaskCB() -- 完成任务回调
- --]]
- STATE_0 = 0 -- 未解锁
- STATE_1 = 1 -- 已解锁(不能领)
- STATE_2 = 2 -- 可领
- STATE_3 = 3 -- 已领取
- STATE_4 = 4 -- 可补领
- STATE_5 = 5 -- 已补领
- TASK_1 = 1 -- 活跃度达到X点活跃值
- TASK_2 = 2 -- 冠军联赛挑战X次
- TASK_3 = 3 -- 在线时长达到X分钟
- TASK_4 = 4 -- 接取任意悬赏任务X次
- TASK_5 = 5 -- 占卜消耗X个占卜币
- TASK_6 = 6 -- 挑战X次公会boss
- TASK_7 = 7 -- 参与女巫森林X次
- local S_CHEST_CONFIG = {} -- actID = {sChestInfo,...}
- local function getSChestDBAndConfig(human, id)
- local actDB = human.db.absAct[id]
- if not actDB then return end -- 判断活动是否存在
- local absActConfig = AbsActExcel.absActivity[id]
- if not absActConfig then return end -- 判断活动配置是否存在
- local actId = absActConfig.actId -- 活动里面的子活动id
- if not S_CHEST_CONFIG[actId] then -- 未缓存配置信息
- S_CHEST_CONFIG[actId] = {}
- local len = 0
- for _,sChestInfo in pairs(AbsActExcel.surpriseChest) do
- if actId == sChestInfo.actId then
- len = len + 1
- S_CHEST_CONFIG[actId][len] = sChestInfo
- end
- end
- end
- return actDB,id,actId,S_CHEST_CONFIG[actId] -- 活动DB,活动id,子活动id,子活动配置
- end
- local function getInitDB(human, funcID, isUpdateDaily)
- local state = AbsActLogic.isStarted(human, funcID)
- if not state then return end
- local actDB,id,actId,sChestConfig = getSChestDBAndConfig(human, funcID)
- if not actDB then return end
- -- 初始活动DB数据
- local absConfig = AbsActExcel.absActivity[funcID]
- if not actDB.curDay or isUpdateDaily then -- 若没初始 或者 跨天更新
- actDB.curDay = Util.diffDay(absConfig.realStartTime) + 1 -- DB当前任务是哪一天
- end
-
- actDB.days = actDB.days or {} -- DB所有天的数据
-
- -- DB初始各天数据
- for _,sChestInfo in ipairs(sChestConfig) do
- actDB.days[sChestInfo.day] = actDB.days[sChestInfo.day] or {}
- if sChestInfo.day == actDB.curDay then -- 当天
- if (actDB.days[sChestInfo.day].state or 0) == STATE_0 then -- 若为未解锁状态
- actDB.days[sChestInfo.day].state = STATE_1 -- 改为已解锁状态
- end
- elseif sChestInfo.day < actDB.curDay then -- 之前的天数
- if (actDB.days[sChestInfo.day].state or 0) < STATE_3 then -- 若小于已领取状态
- actDB.days[sChestInfo.day].state = STATE_4 -- 改为可补领状态
- end
- else -- 后面天数,改为未解锁
- actDB.days[sChestInfo.day].state = STATE_0
- end
- actDB.days[sChestInfo.day].cnt = actDB.days[sChestInfo.day].cnt or 0 -- 任务完成数,默认为0
- if sChestInfo.day == actDB.curDay then -- 当前天
- if actDB.days[sChestInfo.day].cnt >= sChestInfo.maxCnt then -- 任务完成次数够
- if (actDB.days[sChestInfo.day].state or 0) ~= STATE_3 then -- 不等于领取状态
- actDB.days[sChestInfo.day].state = STATE_2 -- 修改可领取状态
- end
- end
- end
- end
- return actDB,id,actId,sChestConfig
- end
- local function getCurSChestInfo(human, actDB, sChestConfig)
- -- 取得当天的配置信息
- local curSChestInfo
- for _,sChestInfo in ipairs(sChestConfig) do
- if sChestInfo.day == actDB.curDay then
- curSChestInfo = sChestInfo
- break
- end
- end
- return curSChestInfo
- end
- local function updateSend(human, day, actDB)
- local msgRet = Msg.gc.GC_ABS_SURPRISE_CHEST_UPDATE
- msgRet.day = day
- msgRet.cnt = actDB.days[day].cnt
- msgRet.state = actDB.days[day].state
- Msg.send(msgRet, human.fd)
- end
- local function getReward(human, funcID, day, isBuGet)
- local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
- if not actDB then return end
- local sChestInfo
- for _,tempInfo in ipairs(sChestConfig) do
- if day == tempInfo.day then
- sChestInfo = tempInfo
- break
- end
- end
- if not sChestInfo then return end
- if isBuGet then -- 补领
- if actDB.days[day].state ~= STATE_4 then return end -- 不是可补领状态
- if not ObjHuman.checkRMB(human, sChestInfo.yuanbao) then -- 补领需判断需要的钻石是否足够
- return
- end
- actDB.days[day].state = STATE_5 -- 改变为已补领状态
- ObjHuman.decZuanshi(human, -sChestInfo.yuanbao, "abs_surpriseChest_buyGet") -- 扣钻石
- BagLogic.addItemList(human, sChestInfo.items, "abs_surpriseChest_buyGet") -- 添加补领道具
- else -- 完成任务的领取
- if actDB.days[day].state ~= STATE_2 then return end -- 不是可领状态
- actDB.days[day].state = STATE_3 -- 改变为已领取状态
- BagLogic.addItemList(human, sChestInfo.items, "abs_surpriseChest_get") -- 添加完成任务道具
- end
- Broadcast.sendErr(human, Lang.ABS_SURPRISE_CHEST_GET_SUCESS)
- updateSend(human, day, actDB) -- 信息改变,推道前端更新
- YunYingLogic.sendBanner(human)
- YunYingLogic.updateIcon(YYInfo[funcID], human)
- YunYingLogic.sendGroupUpdate(YYInfo[funcID], human, PanelDefine.PANEL_ID_5015)
- end
- local function everyReqTriggerTask(human, funcID)
- -- 在线时长达到X分钟这个任务,每次请求活动时,算一下在线时间
- local time = math.max(os.time() - human.db.lastLoginTime, 0)
- local onlineTime = (human.db.onlineTimeDay or 0) + time
- finishTaskCB(human, funcID, TASK_3, math.floor(onlineTime / 60), true)
- if human.db.dailyTask and human.db.dailyTask.nowHuoYue then
- finishTaskCB(human, funcID, TASK_1, human.db.dailyTask.nowHuoYue, true)
- end
- end
- local function wrapSurpriseChestNet(net, sChestInfo, actDB)
- net.day = sChestInfo.day
- net.cnt = actDB.days[sChestInfo.day].cnt
- net.state = actDB.days[sChestInfo.day].state
- net.maxCnt = sChestInfo.maxCnt
- net.panelID = sChestInfo.panelID
- net.yuanbao = sChestInfo.yuanbao
- net.desc = sChestInfo.desc
- local len = 0
- for _, itemCf in ipairs(sChestInfo.items) do
- len = len + 1
- Grid.makeItem(net.items[len], itemCf[1], itemCf[2])
- end
- net.items[0] = len
- end
- function getAndSendMsg(human, funcID)
- local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
- if not actDB then return end
- everyReqTriggerTask(human, funcID)
- local msgRet = Msg.gc.GC_ABS_SURPRISE_CHEST_QUERY
- msgRet.actId = funcID
- msgRet.day = actDB.curDay
- local len = 0
- for _,sChestInfo in ipairs(sChestConfig) do
- len = len + 1
- wrapSurpriseChestNet(msgRet.dayChests[len], sChestInfo, actDB)
- end
- msgRet.dayChests[0] = len
- Msg.send(msgRet, human.fd)
- end
- function isRed(human, YYInfo, absActConfig)
- local actDB = getInitDB(human, absActConfig.funcID)
- if not actDB then return end
- for _,sChestDayDB in ipairs(actDB.days) do
- if sChestDayDB.state == STATE_2 then return true end -- 只要有一个可领状态则有红点
- end
- end
- function isActive(human, YYInfo, funcConfig)
- return not isOpen(human, YYInfo, funcConfig)
- end
- function isOpen(human, YYInfo, funcConfig)
- return AbsActLogic.isStarted(human, funcConfig.funcID)
- end
- function getLeftTime(human, YInfo, funcConfig)
- local ret, endTime, startTime = AbsActLogic.isStarted(human, funcConfig.funcID)
- if ret == true then
- return endTime - os.time()
- else
- return 0
- end
- end
- function get(human, actId, day)
- getReward(human, actId, day)
- end
- function buGet(human, actId, day)
- getReward(human, actId, day, true)
- end
- function updateDaily(human, funcID)
- getInitDB(human, funcID, true)
- end
- -- 登出
- function onLogout(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_3, math.floor(human.db.onlineTimeDay / 60), true)
- end
- -- 悬赏任务
- function onBarTaskgetDo(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_4, 1)
- end
- -- 副本
- function onCopyFight(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_7, parameter)
- end
- -- 每日任务
- function onDailyTask(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_1, human.db.dailyTask.nowHuoYue, true)
- end
- -- 竞技场
- function onJjcFight(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_2, 1)
- end
- -- 公会副本
- function onUnionEctypeFight(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_6, parameter)
- end
- -- 占卜
- function onZhanBuBuyCard(human, funcID, parameter)
- finishTaskCB(human, funcID, TASK_5, parameter)
- end
- -- 任务完成
- function finishTaskCB(human, funcID, type, cnt, isRelpace)
- local actDB,id,actId,sChestConfig = getInitDB(human, funcID)
- if not actDB then return end
- local curSChestDayDB = actDB.days[actDB.curDay]
- if not curSChestDayDB then return end -- 没有当前天数DB数据(没有当前天数的任务)
- if curSChestDayDB.state ~= STATE_1 then return end -- 不是解锁状态,不能完成任务
- local curSChestInfo = getCurSChestInfo(human, actDB, sChestConfig)
- if not curSChestInfo then return end -- 没有当天配置信息
- if curSChestInfo.type ~= type then return end -- 当天的任务类型不一致
- if isRelpace then -- 若是直接替换值
- curSChestDayDB.cnt = cnt -- 设置任务完成次数
- else
- curSChestDayDB.cnt = curSChestDayDB.cnt + cnt -- 设置任务完成次数
- end
- if curSChestDayDB.cnt < 0 then
- curSChestDayDB.cnt = 0
- end
-
- if curSChestDayDB.cnt >= curSChestInfo.maxCnt then -- 任务完成次数够
- curSChestDayDB.state = STATE_2 -- 修改可领取状态
- curSChestDayDB.cnt = curSChestInfo.maxCnt -- 修改为最大完成次数
- YunYingLogic.sendBanner(human)
- end
- --updateSend(human, actDB.curDay, actDB) -- 更新推送当天DB数据
- end
|