Commit ea40710fd057ce3ba3958f41a54b745552d95996
1 parent
823ab846
活动
Showing
8 changed files
with
187 additions
and
24 deletions
Show diff stats
src/GlobalVar.lua
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 |
src/adv/Adv.lua
@@ -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("Activity", require("shared.ModelBase")) | @@ -2,7 +2,7 @@ local Activity = class("Activity", require("shared.ModelBase")) | ||
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 作为持续时间 |