Commit ea40710fd057ce3ba3958f41a54b745552d95996

Authored by zhouhaihai
1 parent 823ab846

活动

1 XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18" 1 XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18"
2 -RESET_TIME = 4 2 +RESET_TIME = 0
3 3
4 START_RESET_TIME_BASE = 1584316800 -- 0时区 4 START_RESET_TIME_BASE = 1584316800 -- 0时区
5 TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", START_RESET_TIME_BASE))) / 3600) -- 本地时区 5 TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", START_RESET_TIME_BASE))) / 3600) -- 本地时区
src/ProtocolCode.lua
@@ -193,6 +193,7 @@ actionCodes = { @@ -193,6 +193,7 @@ actionCodes = {
193 Activity_sudokuRpc = 650, 193 Activity_sudokuRpc = 650,
194 Activity_signRpc = 651, 194 Activity_signRpc = 651,
195 Activity_sudokuRewardRpc = 652, 195 Activity_sudokuRewardRpc = 652,
  196 + Activity_actSignRpc = 653,
196 } 197 }
197 198
198 rpcResponseBegin = 10000 199 rpcResponseBegin = 10000
src/actions/ActivityAction.lua
@@ -125,14 +125,41 @@ function _M.signRpc(agent, data) @@ -125,14 +125,41 @@ function _M.signRpc(agent, data)
125 end 125 end
126 signs[curDay] = yearMonth 126 signs[curDay] = yearMonth
127 127
128 - local raward = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}}) 128 + local reward = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}})
129 role:changeUpdates({{type = "sign", field = curDay, value = yearMonth}}) 129 role:changeUpdates({{type = "sign", field = curDay, value = yearMonth}})
130 130
131 - SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(raward)) 131 + SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(reward))
132 return true 132 return true
133 end 133 end
134 134
135 135
  136 +function _M.actSignRpc(agent, data)
  137 + local role = agent.role
  138 + if not role.activity:isOpen("Sign") then return end
  139 +
  140 + local curData = role.activity:getActData("Sign")
  141 + local reward = {}
  142 + for day, csvData in ipairs(csvdb["new_signlnCsv"]) do
  143 + if day <= (curData[0] or 0) then
  144 + if not curData[day] then
  145 + curData[day] = -1
  146 + -- 奖励
  147 + for itemId, count in pairs(csvData.reward:toNumMap()) do
  148 + reward[itemId] = (reward[itemId] or 0) + count
  149 + end
  150 + end
  151 + else
  152 + break
  153 + end
  154 + end
  155 + if next(reward) then
  156 + self.activity:updateActData("Sign", curData)
  157 + reward = role:award(reward, {log = "actSign"})
  158 + end
  159 + SendPacket(actionCodes.Activity_actSignRpc, MsgPack.pack(reward))
  160 + return true
  161 +end
  162 +
136 163
137 164
138 return _M 165 return _M
139 \ No newline at end of file 166 \ No newline at end of file
src/actions/RoleAction.lua
@@ -121,10 +121,14 @@ function _M.loginRpc( agent, data ) @@ -121,10 +121,14 @@ function _M.loginRpc( agent, data )
121 role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查 121 role:advEndlessSeasonCheck(true) -- 冒险赛季更新检查
122 122
123 -- 跨天登陆事件 123 -- 跨天登陆事件
124 - role:updateTimeReset(now) 124 + local resetMode = role:updateTimeReset(now)
  125 + if not resetMode["CrossDay"] then -- 没有跨天
  126 + self.activity:checkActivityStatus(now, false, false)
  127 + end
  128 +
125 redisproxy:zadd(FRIEND_RECOMMEND, now, roleId) 129 redisproxy:zadd(FRIEND_RECOMMEND, now, roleId)
126 130
127 - for _, name in ipairs({"dailyData", "dinerData"}) do 131 + for _, name in ipairs({"dailyData", "dinerData", "activity"}) do
128 response[name] = role[name]:data() 132 response[name] = role[name]:data()
129 end 133 end
130 134
@@ -776,8 +776,10 @@ function Adv:over(success, rewardRatio, overType) @@ -776,8 +776,10 @@ function Adv:over(success, rewardRatio, overType)
776 end 776 end
777 reward = self.owner:award(reward, {log = {desc = "advOver", int1 = self.chapterId}}) 777 reward = self.owner:award(reward, {log = {desc = "advOver", int1 = self.chapterId}})
778 778
  779 + local backAdvCount
779 if not self:isEndless() then 780 if not self:isEndless() then
780 - self.owner:changeAdvCount(self.level - chapterData.limitlevel) 781 + backAdvCount = chapterData.limitlevel - self.level
  782 + self.owner:changeAdvCount(-backAdvCount)
781 end 783 end
782 784
783 if success then 785 if success then
@@ -819,6 +821,16 @@ function Adv:over(success, rewardRatio, overType) @@ -819,6 +821,16 @@ function Adv:over(success, rewardRatio, overType)
819 advAFWear = {}, 821 advAFWear = {},
820 }) 822 })
821 self:backEnd(success, score, scoreInfo, reward, overType, scoreReward, chapterId) 823 self:backEnd(success, score, scoreInfo, reward, overType, scoreReward, chapterId)
  824 + self:pushBackEvent(AdvBackEventType.End, {
  825 + success = success,
  826 + score = score,
  827 + scoreInfo = scoreInfo,
  828 + reward = reward,
  829 + type = overType,
  830 + scoreAward = scoreAward,
  831 + chapterId = chapterId,
  832 + backAdvCount = backAdvCount,
  833 + })
822 end 834 end
823 835
824 function Adv:exit() 836 function Adv:exit()
@@ -1925,9 +1937,6 @@ function Adv:backNext() @@ -1925,9 +1937,6 @@ function Adv:backNext()
1925 self:pushBackEvent(AdvBackEventType.Next, {}) 1937 self:pushBackEvent(AdvBackEventType.Next, {})
1926 end 1938 end
1927 1939
1928 -function Adv:backEnd(success, score, scoreInfo, reward, overType, scoreAward, chapterId)  
1929 - self:pushBackEvent(AdvBackEventType.End, {success = success, score = score, scoreInfo = scoreInfo, reward = reward, type = overType, scoreAward = scoreAward, chapterId = chapterId})  
1930 -end  
1931 1940
1932 function Adv:backBlockChange(roomId, blockId, itemChangeType) 1941 function Adv:backBlockChange(roomId, blockId, itemChangeType)
1933 self:pushBackEvent(AdvBackEventType.BlockChange, {roomId = roomId, blockId = blockId, itemChangeType = itemChangeType}) 1942 self:pushBackEvent(AdvBackEventType.BlockChange, {roomId = roomId, blockId = blockId, itemChangeType = itemChangeType})
src/models/Activity.lua
@@ -2,7 +2,7 @@ local Activity = class(&quot;Activity&quot;, require(&quot;shared.ModelBase&quot;)) @@ -2,7 +2,7 @@ local Activity = class(&quot;Activity&quot;, require(&quot;shared.ModelBase&quot;))
2 2
3 3
4 Activity.ActivityType = { 4 Activity.ActivityType = {
5 - DoubleDrop = 1, -- 双倍掉落 5 + Sign = 1, -- 签到
6 } 6 }
7 7
8 8
@@ -10,7 +10,7 @@ local function checkActivityType(activityType) @@ -10,7 +10,7 @@ local function checkActivityType(activityType)
10 if type(activityType) == "string" then 10 if type(activityType) == "string" then
11 activityType = Activity.ActivityType[activityType] 11 activityType = Activity.ActivityType[activityType]
12 end 12 end
13 - return activityType 13 + return activityType or 0
14 end 14 end
15 15
16 16
@@ -22,13 +22,13 @@ end @@ -22,13 +22,13 @@ end
22 22
23 23
24 Activity.schema = { 24 Activity.schema = {
25 - ctime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time}  
26 - _1 = {"table", {}}, 25 + ctime = {"table", {}}, -- 最近检查某项活动的开始时间 {id = time}
  26 + act1 = {"table", {}}, -- {0 = day, 1= -1, 2 = -1} == 签到活动
27 } 27 }
28 28
29 function Activity:data() 29 function Activity:data()
30 return { 30 return {
31 - _1 = self:getProperty("_1"), 31 + act1 = self:getProperty("act1"),
32 } 32 }
33 end 33 end
34 34
@@ -54,26 +54,141 @@ function Activity:updateProperty(params) @@ -54,26 +54,141 @@ function Activity:updateProperty(params)
54 end 54 end
55 55
56 56
  57 +function Activity:isOpenRaw(activityType, now)
  58 + activityType = checkActivityType(activityType)
  59 + local actData = csvdb["activity_ctrlCsv"][activityType]
  60 + if not actData then return end
  61 +
  62 + if actData.time == "" then -- 关闭
  63 + return false
  64 + end
  65 +
  66 + local st = 0
  67 + local et = 0
  68 + local now = skynet.timex()
  69 +
  70 + if actData.ttype == 0 then -- 时间开放
  71 + local openTimes = actData.time:toArray(false, "=")
  72 + if openTimes[1] ~= "0" then
  73 + st = toUnixtime(openTimes[1]..string_format("%02x", RESET_TIME))
  74 + end
  75 + if openTimes[2] ~= "0" then
  76 + et = toUnixtime(openTimes[2]..string_format("%02x", RESET_TIME))
  77 + end
  78 + elseif actData.ttype == 1 then -- 周期开放
  79 + local openTimes = actData.time:toArray(true, "=")
  80 + local resetTime = toUnixtime(tostring(openTimes[1]) .. string_format("%02x", RESET_TIME))
  81 + local r = math.floor((now - resetTime) / (openTimes[3] * 86400))
  82 + st = resetTime + r * (openTimes[3] * 86400)
  83 + et = st + openTimes[2] * 86400
  84 + else
  85 + return
  86 + end
  87 +
  88 + if now >= st and (et == 0 or now < et) then
  89 + return true, st
  90 + end
  91 + return false
  92 +end
  93 +
  94 +-- 缓存开放
57 function Activity:isOpen(activityType) 95 function Activity:isOpen(activityType)
58 activityType = checkActivityType(activityType) 96 activityType = checkActivityType(activityType)
  97 + return self._isOpen[activityType]
  98 +end
  99 +
  100 +function Activity:getActData(actType)
  101 + actType = checkActivityType(actType)
  102 + return self:getProperty("act" .. actType)
  103 +end
59 104
  105 +function Activity:updateActData(actType, data, notNotify)
  106 + actType = checkActivityType(actType)
  107 + self:updateProperty({field = "act" .. actType, value = data, notNotify = notNotify})
60 end 108 end
61 109
  110 +
62 -- 跨天刷新 --登录刷新 111 -- 跨天刷新 --登录刷新
63 -function Activity:checkActivityStatus(ltime, now, notify)  
64 - 112 +function Activity:checkActivityStatus(now, isCrossDay, notify)
  113 + self._isOpen = {}
  114 + local ctime = self:getProperty("ctime")
  115 + local change = false
  116 + for actType, actData in paris(csvdb["activity_ctrlCsv"]) do
  117 + local isOpen, startTime = self:isOpenRaw(actType, now)
  118 + self._isOpen[actType] = isOpen
  119 +
  120 + if isOpen then
  121 + if ctime[actType] and ctime[actType] == startTime then -- 还是之前的状态 开放中
  122 + else -- 重置
  123 + ctime[actType] = startTime
  124 + self:closeActivity(actType, notify, true)
  125 + self:initActivity(actType, isCrossDay, notify)
  126 + change = true
  127 + end
  128 + else
  129 + if ctime[actType] then
  130 + self:closeActivity(actType, notify)
  131 + ctime[actType] = nil
  132 + change = true
  133 + end
  134 + end
  135 + end
  136 + if change then
  137 + self:setProperty("ctime", ctime)
  138 + end
65 end 139 end
66 140
67 -local checkActivityFunc = {} 141 +local activityFunc = {}
68 142
69 -checkActivityFunc[Activity.ActivityType.DoubleDrop] = function(self, notNotify, activityType, ...) 143 +activityFunc[Activity.ActivityType.Sign] = {
  144 + -- ["check"] = function(self, actType, notify) -- 检查
  145 + -- end,
  146 + ["init"] = function(self, actType, isCrossDay, notify)
  147 + if not isCrossDay then
  148 + activityFunc[Activity.ActivityType.Sign]["crossDay"](self, actType, notify)
  149 + end
  150 + end,
  151 + -- ["close"] = function(self, actType, notify)
  152 + -- end,
  153 + ["crossDay"] = function(self, actType, notify)
  154 + local curData = self:getActData(actType)
  155 + curData[0] = (curData[0] or 0) + 1
  156 + local actData = csvdb["new_signlnCsv"]
  157 + if curData[0] > #actData then return end -- 满了就忽略了
  158 +
  159 + -- 没满更新一下
  160 + self:updateActData(actType, curData, not notify)
  161 + end,
  162 +}
70 163
  164 +function Activity:initActivity(actType, isCrossDay, notify)
  165 + if activityFunc[actType] and activityFunc[actType]['close'] then
  166 + activityFunc[actType]["init"](self, actType, isCrossDay, notify)
  167 + end
  168 +end
  169 +
  170 +function Activity:closeActivity(actType, notify, notUpdateAct)
  171 + if activityFunc[actType] and activityFunc[actType]['close'] then
  172 + activityFunc[actType]["close"](self, actType, notify)
  173 + end
  174 + self:updateActData(actType, Activity.schema["act" .. actType][2], not notify or notUpdateAct)
  175 +end
  176 +
  177 +function Activity:refreshDailyData(notify)
  178 + for actType, status in pairs(self._isOpen) do
  179 + if status then
  180 + if activityFunc[actType] and activityFunc[actType]['crossDay'] then
  181 + activityFunc[actType]["crossDay"](self, actType, notify)
  182 + end
  183 + end
  184 + end
71 end 185 end
72 186
73 -function Activity:checkActivityEnter(notNotify, activityType, ...) 187 +function Activity:checkActivity(notNotify, activityType, ...)
74 if not activityType then return end 188 if not activityType then return end
75 - if checkActivityFunc[activityType] then  
76 - checkActivityFunc[activityType](self, notNotify, activityType, ...) 189 + if not self:isOpen(activityType) then return end
  190 + if activityFunc[activityType] and activityFunc[activityType]['check'] then
  191 + activityFunc[activityType]["check"](self, activityType, not notNotify, ...)
77 end 192 end
78 end 193 end
79 194
src/models/RoleTask.lua
@@ -526,7 +526,7 @@ function RoleTask.bind(Role) @@ -526,7 +526,7 @@ function RoleTask.bind(Role)
526 end 526 end
527 527
528 function Role:checkActivityTask(notNotify, activityType, ...) 528 function Role:checkActivityTask(notNotify, activityType, ...)
529 - self.activity:checkActivityEnter(notNotify, activityType, ...) 529 + self.activity:checkActivity(notNotify, activityType, ...)
530 end 530 end
531 531
532 end 532 end
src/models/RoleTimeReset.lua
@@ -4,9 +4,12 @@ RoleTimeReset.bind = function (Role) @@ -4,9 +4,12 @@ RoleTimeReset.bind = function (Role)
4 4
5 -- 重置内容 对应 GlobalVar TimeReset 5 -- 重置内容 对应 GlobalVar TimeReset
6 local ResetFunc = {} 6 local ResetFunc = {}
7 -ResetFunc["CrossDay"] = function(self, notify, response) 7 +ResetFunc["CrossDay"] = function(self, notify, response, now)
  8 + self.activity:checkActivityStatus(now, true, notify)
  9 +
8 self.dailyData:refreshDailyData(notify) 10 self.dailyData:refreshDailyData(notify)
9 self.dinerData:refreshDailyData(notify) 11 self.dinerData:refreshDailyData(notify)
  12 + self.activity:refreshDailyData(notify)
10 13
11 self:setProperty("dTask", {}) 14 self:setProperty("dTask", {})
12 self:advRandomSupportEffect(not notify) 15 self:advRandomSupportEffect(not notify)
@@ -55,10 +58,13 @@ function Role:updateTimeReset(now, notify) @@ -55,10 +58,13 @@ function Role:updateTimeReset(now, notify)
55 end 58 end
56 if not next(needResetId) then return end 59 if not next(needResetId) then return end
57 60
  61 + local resetMode = {}
  62 +
58 local response = {} 63 local response = {}
59 for funcName, resetId in pairs(TimeReset) do 64 for funcName, resetId in pairs(TimeReset) do
60 if needResetId[resetId] and ResetFunc[funcName] then 65 if needResetId[resetId] and ResetFunc[funcName] then
61 - ResetFunc[funcName](self, notify, response) 66 + ResetFunc[funcName](self, notify, response, now)
  67 + resetMode[funcName] = true
62 end 68 end
63 end 69 end
64 70
@@ -71,6 +77,7 @@ function Role:updateTimeReset(now, notify) @@ -71,6 +77,7 @@ function Role:updateTimeReset(now, notify)
71 if notify then 77 if notify then
72 self:notifyUpdateProperties(response) 78 self:notifyUpdateProperties(response)
73 end 79 end
  80 + return resetMode
74 end 81 end
75 82
76 -- 持续时间取 min(interval, duration) duration 填 0 默认使用 interval 作为持续时间 83 -- 持续时间取 min(interval, duration) duration 填 0 默认使用 interval 作为持续时间