From ea40710fd057ce3ba3958f41a54b745552d95996 Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Mon, 27 Jul 2020 17:24:18 +0800 Subject: [PATCH] 活动 --- src/GlobalVar.lua | 2 +- src/ProtocolCode.lua | 1 + src/actions/ActivityAction.lua | 31 +++++++++++++++++++++++++++++-- src/actions/RoleAction.lua | 8 ++++++-- src/adv/Adv.lua | 17 +++++++++++++---- src/models/Activity.lua | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ src/models/RoleTask.lua | 2 +- src/models/RoleTimeReset.lua | 11 +++++++++-- 8 files changed, 187 insertions(+), 24 deletions(-) diff --git a/src/GlobalVar.lua b/src/GlobalVar.lua index e4c4168..b1fff91 100644 --- a/src/GlobalVar.lua +++ b/src/GlobalVar.lua @@ -1,5 +1,5 @@ XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18" -RESET_TIME = 4 +RESET_TIME = 0 START_RESET_TIME_BASE = 1584316800 -- 0时区 TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", START_RESET_TIME_BASE))) / 3600) -- 本地时区 diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index 840bc87..c19a44b 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -193,6 +193,7 @@ actionCodes = { Activity_sudokuRpc = 650, Activity_signRpc = 651, Activity_sudokuRewardRpc = 652, + Activity_actSignRpc = 653, } rpcResponseBegin = 10000 diff --git a/src/actions/ActivityAction.lua b/src/actions/ActivityAction.lua index f498603..71362fb 100644 --- a/src/actions/ActivityAction.lua +++ b/src/actions/ActivityAction.lua @@ -125,14 +125,41 @@ function _M.signRpc(agent, data) end signs[curDay] = yearMonth - local raward = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}}) + local reward = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}}) role:changeUpdates({{type = "sign", field = curDay, value = yearMonth}}) - SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(raward)) + SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(reward)) return true end +function _M.actSignRpc(agent, data) + local role = agent.role + if not role.activity:isOpen("Sign") then return end + + local curData = role.activity:getActData("Sign") + local reward = {} + for day, csvData in ipairs(csvdb["new_signlnCsv"]) do + if day <= (curData[0] or 0) then + if not curData[day] then + curData[day] = -1 + -- 奖励 + for itemId, count in pairs(csvData.reward:toNumMap()) do + reward[itemId] = (reward[itemId] or 0) + count + end + end + else + break + end + end + if next(reward) then + self.activity:updateActData("Sign", curData) + reward = role:award(reward, {log = "actSign"}) + end + SendPacket(actionCodes.Activity_actSignRpc, MsgPack.pack(reward)) + return true +end + return _M \ No newline at end of file diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index 8d1bc47..005f48c 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -121,10 +121,14 @@ function _M.loginRpc( agent, data ) role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 -- 跨天登陆事件 - role:updateTimeReset(now) + local resetMode = role:updateTimeReset(now) + if not resetMode["CrossDay"] then -- 没有跨天 + self.activity:checkActivityStatus(now, false, false) + end + redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) - for _, name in ipairs({"dailyData", "dinerData"}) do + for _, name in ipairs({"dailyData", "dinerData", "activity"}) do response[name] = role[name]:data() end diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 3920dc7..df3a4c2 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -776,8 +776,10 @@ function Adv:over(success, rewardRatio, overType) end reward = self.owner:award(reward, {log = {desc = "advOver", int1 = self.chapterId}}) + local backAdvCount if not self:isEndless() then - self.owner:changeAdvCount(self.level - chapterData.limitlevel) + backAdvCount = chapterData.limitlevel - self.level + self.owner:changeAdvCount(-backAdvCount) end if success then @@ -819,6 +821,16 @@ function Adv:over(success, rewardRatio, overType) advAFWear = {}, }) self:backEnd(success, score, scoreInfo, reward, overType, scoreReward, chapterId) + self:pushBackEvent(AdvBackEventType.End, { + success = success, + score = score, + scoreInfo = scoreInfo, + reward = reward, + type = overType, + scoreAward = scoreAward, + chapterId = chapterId, + backAdvCount = backAdvCount, + }) end function Adv:exit() @@ -1925,9 +1937,6 @@ function Adv:backNext() self:pushBackEvent(AdvBackEventType.Next, {}) end -function Adv:backEnd(success, score, scoreInfo, reward, overType, scoreAward, chapterId) - self:pushBackEvent(AdvBackEventType.End, {success = success, score = score, scoreInfo = scoreInfo, reward = reward, type = overType, scoreAward = scoreAward, chapterId = chapterId}) -end function Adv:backBlockChange(roomId, blockId, itemChangeType) self:pushBackEvent(AdvBackEventType.BlockChange, {roomId = roomId, blockId = blockId, itemChangeType = itemChangeType}) diff --git a/src/models/Activity.lua b/src/models/Activity.lua index 3f223e7..70e227b 100644 --- a/src/models/Activity.lua +++ b/src/models/Activity.lua @@ -2,7 +2,7 @@ local Activity = class("Activity", require("shared.ModelBase")) Activity.ActivityType = { - DoubleDrop = 1, -- 双倍掉落 + Sign = 1, -- 签到 } @@ -10,7 +10,7 @@ local function checkActivityType(activityType) if type(activityType) == "string" then activityType = Activity.ActivityType[activityType] end - return activityType + return activityType or 0 end @@ -22,13 +22,13 @@ end Activity.schema = { - ctime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time} - _1 = {"table", {}}, + ctime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time} + act1 = {"table", {}}, -- {0 = day, 1= -1, 2 = -1} == 签到活动 } function Activity:data() return { - _1 = self:getProperty("_1"), + act1 = self:getProperty("act1"), } end @@ -54,26 +54,141 @@ function Activity:updateProperty(params) end +function Activity:isOpenRaw(activityType, now) + activityType = checkActivityType(activityType) + local actData = csvdb["activity_ctrlCsv"][activityType] + if not actData then return end + + if actData.time == "" then -- 关闭 + return false + end + + local st = 0 + local et = 0 + local now = skynet.timex() + + if actData.ttype == 0 then -- 时间开放 + local openTimes = actData.time:toArray(false, "=") + if openTimes[1] ~= "0" then + st = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME)) + end + if openTimes[2] ~= "0" then + et = toUnixtime(openTimes[2]..string_format("%02x", RESET_TIME)) + end + elseif actData.ttype == 1 then -- 周期开放 + local openTimes = actData.time:toArray(true, "=") + local resetTime = toUnixtime(tostring(openTimes[1]) .. string_format("%02x", RESET_TIME)) + local r = math.floor((now - resetTime) / (openTimes[3] * 86400)) + st = resetTime + r * (openTimes[3] * 86400) + et = st + openTimes[2] * 86400 + else + return + end + + if now >= st and (et == 0 or now < et) then + return true, st + end + return false +end + +-- 缓存开放 function Activity:isOpen(activityType) activityType = checkActivityType(activityType) + return self._isOpen[activityType] +end + +function Activity:getActData(actType) + actType = checkActivityType(actType) + return self:getProperty("act" .. actType) +end +function Activity:updateActData(actType, data, notNotify) + actType = checkActivityType(actType) + self:updateProperty({field = "act" .. actType, value = data, notNotify = notNotify}) end + -- 跨天刷新 --登录刷新 -function Activity:checkActivityStatus(ltime, now, notify) - +function Activity:checkActivityStatus(now, isCrossDay, notify) + self._isOpen = {} + local ctime = self:getProperty("ctime") + local change = false + for actType, actData in paris(csvdb["activity_ctrlCsv"]) do + local isOpen, startTime = self:isOpenRaw(actType, now) + self._isOpen[actType] = isOpen + + if isOpen then + if ctime[actType] and ctime[actType] == startTime then -- 还是之前的状态 开放中 + else -- 重置 + ctime[actType] = startTime + self:closeActivity(actType, notify, true) + self:initActivity(actType, isCrossDay, notify) + change = true + end + else + if ctime[actType] then + self:closeActivity(actType, notify) + ctime[actType] = nil + change = true + end + end + end + if change then + self:setProperty("ctime", ctime) + end end -local checkActivityFunc = {} +local activityFunc = {} -checkActivityFunc[Activity.ActivityType.DoubleDrop] = function(self, notNotify, activityType, ...) +activityFunc[Activity.ActivityType.Sign] = { + -- ["check"] = function(self, actType, notify) -- 检查 + -- end, + ["init"] = function(self, actType, isCrossDay, notify) + if not isCrossDay then + activityFunc[Activity.ActivityType.Sign]["crossDay"](self, actType, notify) + end + end, + -- ["close"] = function(self, actType, notify) + -- end, + ["crossDay"] = function(self, actType, notify) + local curData = self:getActData(actType) + curData[0] = (curData[0] or 0) + 1 + local actData = csvdb["new_signlnCsv"] + if curData[0] > #actData then return end -- 满了就忽略了 + + -- 没满更新一下 + self:updateActData(actType, curData, not notify) + end, +} +function Activity:initActivity(actType, isCrossDay, notify) + if activityFunc[actType] and activityFunc[actType]['close'] then + activityFunc[actType]["init"](self, actType, isCrossDay, notify) + end +end + +function Activity:closeActivity(actType, notify, notUpdateAct) + if activityFunc[actType] and activityFunc[actType]['close'] then + activityFunc[actType]["close"](self, actType, notify) + end + self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct) +end + +function Activity:refreshDailyData(notify) + for actType, status in pairs(self._isOpen) do + if status then + if activityFunc[actType] and activityFunc[actType]['crossDay'] then + activityFunc[actType]["crossDay"](self, actType, notify) + end + end + end end -function Activity:checkActivityEnter(notNotify, activityType, ...) +function Activity:checkActivity(notNotify, activityType, ...) if not activityType then return end - if checkActivityFunc[activityType] then - checkActivityFunc[activityType](self, notNotify, activityType, ...) + if not self:isOpen(activityType) then return end + if activityFunc[activityType] and activityFunc[activityType]['check'] then + activityFunc[activityType]["check"](self, activityType, not notNotify, ...) end end diff --git a/src/models/RoleTask.lua b/src/models/RoleTask.lua index 51a406c..55558ec 100644 --- a/src/models/RoleTask.lua +++ b/src/models/RoleTask.lua @@ -526,7 +526,7 @@ function RoleTask.bind(Role) end function Role:checkActivityTask(notNotify, activityType, ...) - self.activity:checkActivityEnter(notNotify, activityType, ...) + self.activity:checkActivity(notNotify, activityType, ...) end end diff --git a/src/models/RoleTimeReset.lua b/src/models/RoleTimeReset.lua index 24e6626..953b81a 100644 --- a/src/models/RoleTimeReset.lua +++ b/src/models/RoleTimeReset.lua @@ -4,9 +4,12 @@ RoleTimeReset.bind = function (Role) -- 重置内容 对应 GlobalVar TimeReset local ResetFunc = {} -ResetFunc["CrossDay"] = function(self, notify, response) +ResetFunc["CrossDay"] = function(self, notify, response, now) + self.activity:checkActivityStatus(now, true, notify) + self.dailyData:refreshDailyData(notify) self.dinerData:refreshDailyData(notify) + self.activity:refreshDailyData(notify) self:setProperty("dTask", {}) self:advRandomSupportEffect(not notify) @@ -55,10 +58,13 @@ function Role:updateTimeReset(now, notify) end if not next(needResetId) then return end + local resetMode = {} + local response = {} for funcName, resetId in pairs(TimeReset) do if needResetId[resetId] and ResetFunc[funcName] then - ResetFunc[funcName](self, notify, response) + ResetFunc[funcName](self, notify, response, now) + resetMode[funcName] = true end end @@ -71,6 +77,7 @@ function Role:updateTimeReset(now, notify) if notify then self:notifyUpdateProperties(response) end + return resetMode end -- 持续时间取 min(interval, duration) duration 填 0 默认使用 interval 作为持续时间 -- libgit2 0.21.2