Commit fb3d084dbe61baecc5d20fa5c223d52c9aeb50e1
1 parent
1a0b3c56
月卡赛季卡发送邮件奖励
Showing
9 changed files
with
148 additions
and
70 deletions
Show diff stats
src/GlobalVar.lua
... | ... | @@ -2,6 +2,7 @@ XXTEA_KEY = "699D448D6D24f7F941E9F6E99F823E18" |
2 | 2 | RESET_TIME = 0 |
3 | 3 | |
4 | 4 | START_RESET_TIME_BASE = 1584316800 -- 0时区 |
5 | +DAY_SEC = 86400 | |
5 | 6 | TIME_ZONE = math.floor(os.difftime(START_RESET_TIME_BASE, os.time(os.date("!*t", START_RESET_TIME_BASE))) / 3600) -- 本地时区 |
6 | 7 | |
7 | 8 | START_RESET_TIME = START_RESET_TIME_BASE - TIME_ZONE * 3600 | ... | ... |
src/actions/GmAction.lua
... | ... | @@ -512,12 +512,11 @@ function _M.helpRpc(agent, data) |
512 | 512 | return true |
513 | 513 | end |
514 | 514 | |
515 | -table.insert(helpDes, {"测试", "test", ""}) | |
516 | 515 | function _M.test(role, pms) |
517 | 516 | local id = tonum(pms.pm1, 0) |
518 | 517 | --local hero = require ("actions.HeroAction") |
519 | 518 | --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id})) |
520 | - role.storeData:resetStoreReored(id) | |
519 | + role.storeData:resetStoreReored(21) | |
521 | 520 | return "成功" |
522 | 521 | end |
523 | 522 | ... | ... |
src/actions/HeroAction.lua
... | ... | @@ -1070,10 +1070,11 @@ function _M.repayHeroRpc(agent, data) |
1070 | 1070 | local role = agent.role |
1071 | 1071 | |
1072 | 1072 | local repayHero = role:getProperty("repayHero") |
1073 | - if repayHero < globalCsv.draw_free_count then | |
1073 | + local cnt = globalCsv.draw_times_to_get_ssr or 100 | |
1074 | + if repayHero < cnt then | |
1074 | 1075 | return |
1075 | 1076 | end |
1076 | - local result = repayHero - globalCsv.draw_free_count | |
1077 | + local result = repayHero - cnt | |
1077 | 1078 | |
1078 | 1079 | role:updateProperty({field = "repayHero", value = result}) |
1079 | 1080 | local id = math.randWeight(csvdb["build_giftCsv"], "pool_1") |
... | ... | @@ -1113,7 +1114,7 @@ function _M.unlockPoolRpc(agent, data) |
1113 | 1114 | end |
1114 | 1115 | |
1115 | 1116 | if needCost then |
1116 | - if not role:costDiamond({count = 300, log = {desc = "unlockPool", short1 = type}}) then | |
1117 | + if not role:costDiamond({count = globalCsv.draw_unlock_pool_diamond or 300, log = {desc = "unlockPool", short1 = type}}) then | |
1117 | 1118 | return |
1118 | 1119 | end |
1119 | 1120 | end | ... | ... |
src/actions/StoreAction.lua
... | ... | @@ -371,7 +371,7 @@ function _M.getBattlePassRewardRpc(agent, data) |
371 | 371 | if not config then return end |
372 | 372 | |
373 | 373 | local timeNow = skynet.timex() |
374 | - local battleCardExTs = role.storeData:getProperty("battleCardEx") | |
374 | + local battleCardFlag = role.storeData:getProperty("battleCard") | |
375 | 375 | local battleCardFreeRecord = role.storeData:getProperty("battleFR") |
376 | 376 | local battleCardLimitRecord = role.storeData:getProperty("battleLR") |
377 | 377 | |
... | ... | @@ -383,11 +383,11 @@ function _M.getBattlePassRewardRpc(agent, data) |
383 | 383 | return 1 |
384 | 384 | end |
385 | 385 | |
386 | - if battleCardExTs < timeNow and freeFlag == "1" then | |
386 | + if battleCardFlag == 1 and limitFlag == "1" then | |
387 | 387 | return 1 |
388 | 388 | end |
389 | 389 | |
390 | - if role:getProperty("battlePoint") < config.condition then | |
390 | + if role:getProperty("battlePoint") < config.point then | |
391 | 391 | skynet.error(string.format("user do not have enough battle point, user_id:%d", role:getProperty("id"))) |
392 | 392 | return 1 |
393 | 393 | end |
... | ... | @@ -400,14 +400,14 @@ function _M.getBattlePassRewardRpc(agent, data) |
400 | 400 | role.storeData:updateProperty({field = "battleFR", value = battleCardFreeRecord}) |
401 | 401 | end |
402 | 402 | |
403 | - if battleCardExTs > timeNow and limitFlag == "0" then | |
403 | + if battleCardFlag == 1 and limitFlag == "0" then | |
404 | 404 | if gift ~= "" then |
405 | 405 | gift = gift .. " " |
406 | 406 | end |
407 | 407 | gift = gift .. config.giftLimit |
408 | 408 | |
409 | 409 | battleCardLimitRecord = string.setbit(battleCardLimitRecord, id) |
410 | - role.storeData:updateProperty({field = "battleFR", value = battleCardLimitRecord}) | |
410 | + role.storeData:updateProperty({field = "battleLR", value = battleCardLimitRecord}) | |
411 | 411 | end |
412 | 412 | |
413 | 413 | local reward, _ = role:award(gift, {log = {desc = "battleCard", int1 = id}}) | ... | ... |
src/models/Role.lua
... | ... | @@ -27,6 +27,7 @@ function Role:ctor( properties ) |
27 | 27 | self.activity = nil |
28 | 28 | self.advElChapter = tonum(redisproxy:hget("adv_season", "chapter"), globalCsv.adv_endless_default_chapter) -- 无尽模式记录的赛季对应章节 |
29 | 29 | self.advOverTime = tonum(redisproxy:hget("adv_season", "overTime")) -- 无尽模式关闭时间戳 |
30 | + self.sendMailFlag = false --发送邮件标识 | |
30 | 31 | end |
31 | 32 | |
32 | 33 | Role.schema = { |
... | ... | @@ -147,7 +148,7 @@ Role.schema = { |
147 | 148 | |
148 | 149 | emailSync = {"number", 0}, -- 已经同步到的邮件Id |
149 | 150 | |
150 | - repayHero = {"number", 0}, -- 超级招募 回馈 | |
151 | + repayHero = {"number", 0}, -- 招募次数 (除去友情招募) | |
151 | 152 | floorHero = {"table", {}}, -- 招募保底 -- {[poolId] = count} |
152 | 153 | ssrUp = {"table", {}}, -- ssr up -- {[poolId] = count} |
153 | 154 | newerDraw = {"table", {}}, -- 新手池子 {N, 1} 抽了多少次, 是否出了ssr |
... | ... | @@ -365,7 +366,7 @@ function Role:data() |
365 | 366 | battlePoint = self:getProperty("battlePoint"), |
366 | 367 | |
367 | 368 | rmbC = self:getProperty("rmbC"), |
368 | - -- repayHero = self:getProperty("repayHero"), | |
369 | + repayHero = self:getProperty("repayHero"), | |
369 | 370 | newerDraw = self:getProperty("newerDraw"), |
370 | 371 | floorHero = self:getProperty("floorHero"), |
371 | 372 | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -1343,9 +1343,13 @@ function RolePlugin.bind(Role) |
1343 | 1343 | self:checkNewEvent(now) |
1344 | 1344 | end |
1345 | 1345 | |
1346 | - local function breath(sec) | |
1346 | + local function breath(sec, name) | |
1347 | 1347 | local last_breath = 0 |
1348 | - return function (now) | |
1348 | + return function (now, role) | |
1349 | + if name == "email" and role.sendMailFlag then | |
1350 | + last_breath = now + sec | |
1351 | + return true | |
1352 | + end | |
1349 | 1353 | if now >= last_breath then |
1350 | 1354 | last_breath = now + sec |
1351 | 1355 | return true |
... | ... | @@ -1354,8 +1358,8 @@ function RolePlugin.bind(Role) |
1354 | 1358 | end |
1355 | 1359 | end |
1356 | 1360 | local breathes = { |
1357 | - ["email"] = breath(120), -- email | |
1358 | - ["pvphg"] = breath(300), -- 高级竞技场 奖励满的红点 | |
1361 | + ["email"] = breath(120, "email"), -- email | |
1362 | + ["pvphg"] = breath(300, "pvphg"), -- 高级竞技场 奖励满的红点 | |
1359 | 1363 | } |
1360 | 1364 | function Role:checkNewEvent(now) |
1361 | 1365 | if now - self:getProperty("ltime") < 5 then |
... | ... | @@ -1398,6 +1402,7 @@ function RolePlugin.bind(Role) |
1398 | 1402 | end) |
1399 | 1403 | for index, id in ipairs(emailIds) do |
1400 | 1404 | if tonumber(redret[index]) == 0 then |
1405 | + self.SendMailFlag = false | |
1401 | 1406 | return true |
1402 | 1407 | end |
1403 | 1408 | end |
... | ... | @@ -1420,7 +1425,7 @@ function RolePlugin.bind(Role) |
1420 | 1425 | |
1421 | 1426 | local events = {} |
1422 | 1427 | for name, breath in pairs(breathes) do |
1423 | - if breath(now) and checks[name] then | |
1428 | + if breath(now, self) and checks[name] then | |
1424 | 1429 | local status = checks[name]() |
1425 | 1430 | if status then |
1426 | 1431 | if status == true then |
... | ... | @@ -1576,6 +1581,24 @@ function RolePlugin.bind(Role) |
1576 | 1581 | return reward |
1577 | 1582 | end |
1578 | 1583 | |
1584 | + --直接给玩家发送邮件,立即推送小红点 | |
1585 | + function Role:sendMail(mailId, createTime, reward) | |
1586 | + local tgift = {} | |
1587 | + if type(reward) == "string" then | |
1588 | + for _, one in pairs(reward:toTableArray(true)) do | |
1589 | + tgift[one[1]] = (tgift[one[1]] or 0) + one[2] | |
1590 | + end | |
1591 | + else | |
1592 | + tgift = gift | |
1593 | + end | |
1594 | + local gift = "" | |
1595 | + for k, v in pairs(tgift) do | |
1596 | + gift = gift .. k.."="..v.." " | |
1597 | + end | |
1598 | + redisproxy:insertEmail({roleId = self:getProperty("id"), emailId = mailId, createtime = createTime, attachments = gift}) | |
1599 | + self.sendMailFlag = true | |
1600 | + end | |
1601 | + | |
1579 | 1602 | end |
1580 | 1603 | |
1581 | 1604 | return RolePlugin |
1582 | 1605 | \ No newline at end of file | ... | ... |
src/models/RoleTimeReset.lua
... | ... | @@ -10,6 +10,7 @@ ResetFunc["CrossDay"] = function(self, notify, response, now) |
10 | 10 | self.dailyData:refreshDailyData(notify) |
11 | 11 | self.dinerData:refreshDailyData(notify) |
12 | 12 | self.activity:refreshDailyData(notify) |
13 | + self.storeData:onCrossDay() | |
13 | 14 | |
14 | 15 | self:setProperty("dTask", {}) |
15 | 16 | self:advRandomSupportEffect(not notify) | ... | ... |
src/models/Store.lua
... | ... | @@ -13,11 +13,13 @@ Store.schema = { |
13 | 13 | growFundR = {"string", ""}, -- 成长基金领取记录 |
14 | 14 | monthCardEx = {"number", 0}, -- 月卡过期时间戳 |
15 | 15 | smonthCardEx = {"number", 0}, -- 超级月卡过期时间戳 |
16 | - battleCardEx = {"number", 0}, -- 赛季卡过期时间戳 | |
16 | + battleCard = {"number", 0}, -- 赛季卡 | |
17 | 17 | battleFR = {"string", ""}, -- 免费赛季卡领取记录 |
18 | 18 | battleLR = {"string", ""}, -- 付费赛季卡领取记录 |
19 | 19 | limitTPack = {"table", {}}, -- 限时礼包 {id=expire_ts} |
20 | - privCardEx = {"number", 0} -- 特权卡过期时间戳 | |
20 | + privCardEx = {"number", 0}, -- 特权卡过期时间戳 | |
21 | + getMailT1 = {"number",0}, -- 上次发送月卡福利邮件的时间 | |
22 | + getMailT2 = {"number",0}, -- 上次发送超级月卡福利邮件的时间 | |
21 | 23 | } |
22 | 24 | |
23 | 25 | function Store:updateProperty(params) |
... | ... | @@ -39,46 +41,54 @@ function Store:updateProperty(params) |
39 | 41 | end |
40 | 42 | end |
41 | 43 | |
42 | -function Store:refreshData(notify, refreshType) | |
43 | - local buyRecord = self:getProperty("buyR") | |
44 | - local result = {} | |
45 | - for id, data in pairs(csvdb["shop_normalCsv"]) do | |
46 | - if data.shop == 1 and refreshType == RefreshType.RefreshType_Daily then | |
47 | - buyRecord[id] = nil | |
48 | - end | |
49 | - if data.shop == 2 and refreshType == RefreshType.RefreshType_Weekly then | |
50 | - buyRecord[id] = nil | |
51 | - end | |
52 | - end | |
53 | - self:setProperty("buyR", buyRecord) | |
54 | - if notify then | |
55 | - self:notifyUpdateProperty({field="buyR", value=buyRecord}) | |
56 | - end | |
44 | +function Store:onCrossDay() | |
45 | + self:sendMonthCardEmail() | |
46 | + self:deleteExpireLimitGoods() | |
57 | 47 | end |
58 | 48 | |
59 | -function Store:refreshPvpBuyRecord(notify) | |
60 | - local buyRecord = self:getProperty("buyR") | |
61 | - for id, data in pairs(csvdb["shop_normalCsv"]) do | |
62 | - if data.shop == 3 then | |
63 | - buyRecord[id] = nil | |
64 | - end | |
49 | +-- 删除过期商品 | |
50 | +function Store:deleteExpireLimitGoods() | |
51 | + local timeNow = skynet.timex() | |
52 | + local limitGoodsList = self:getProperty("limitTPack") | |
53 | + for k, v in pairs(limitGoodsList) do | |
54 | + if timeNow > v then | |
55 | + limitGoodsList[k] = nil | |
56 | + end | |
65 | 57 | end |
66 | - self:setProperty("buyR", buyRecord) | |
67 | - if notify then | |
68 | - self:notifyUpdateProperty({field="buyR", value=buyRecord}) | |
69 | - end | |
70 | 58 | end |
71 | 59 | |
72 | 60 | -- 发送月卡邮件 |
73 | 61 | function Store:sendMonthCardEmail() |
74 | - local monthCardEx = self:getProperty("monthCardEx") | |
75 | - local smonthCardEx = self:getProperty("smonthCardEx") | |
76 | 62 | local timeNow = skynet.timex() |
77 | - if monthCardEx < timeNow then | |
78 | - redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 19}) | |
79 | - end | |
80 | - if smonthCardEx < timeNow then | |
81 | - redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 20}) | |
63 | + local tabs = {{ex="monthCardEx", t="getMailT1", mail=201, alert=203}, {ex="smonthCardEx", t="getMailT2", mail=202, alert=204}} | |
64 | + for _, v in ipairs(tabs) do | |
65 | + local ex = self:getProperty(v.ex) | |
66 | + local ts = self:getProperty(v.t) or 0 | |
67 | + local mailId = v.mail | |
68 | + local alertId = v.alert | |
69 | + local alertTs = dayLater(ex) - DAY_SEC | |
70 | + if ex > timeNow then | |
71 | + local cnt = 0 | |
72 | + if ts == 0 then | |
73 | + cnt = 1 | |
74 | + else | |
75 | + local diff = dayLater(timeNow) - dayLater(ts) | |
76 | + diff = diff < 0 and 0 or diff | |
77 | + diff = diff > 31 and 31 or diff | |
78 | + cnt = diff | |
79 | + end | |
80 | + for i = cnt - 1, 0, -1 do | |
81 | + local createTs = timeNow - i * DAY_SEC | |
82 | + self.owner:sendMail(mailId, createTs) | |
83 | + -- 过期头一天发提醒邮件 | |
84 | + if dayLater(createTs) == alertTs then | |
85 | + self.owner:sendMail(alertId, createTs) | |
86 | + end | |
87 | + end | |
88 | + if cnt > 0 then | |
89 | + self:updateProperty({field=v.t, value=timeNow}) | |
90 | + end | |
91 | + end | |
82 | 92 | end |
83 | 93 | end |
84 | 94 | |
... | ... | @@ -100,19 +110,13 @@ function Store:isPrivCardExpire() |
100 | 110 | return ts < timeNow |
101 | 111 | end |
102 | 112 | |
103 | -function Store:isBattleCardExpire() | |
104 | - local timeNow = skynet.timex() | |
105 | - local ts = self:getProperty("battleCardEx") | |
106 | - return ts < timeNow | |
107 | -end | |
108 | - | |
109 | 113 | -- 挂机栏位 特权卡额外个数 |
110 | 114 | function Store:getHangSlotExtraCount() |
111 | 115 | if self:isPrivCardExpire() then |
112 | 116 | return 0 |
113 | 117 | end |
114 | 118 | |
115 | - return 4 | |
119 | + return csvdb.shop_priv_card_hang_slot_cnt or 4 | |
116 | 120 | end |
117 | 121 | |
118 | 122 | -- 探索加速/餐厅加速 特权卡系数 |
... | ... | @@ -120,8 +124,8 @@ function Store:getProduceItemSpeedCoef() |
120 | 124 | if self:isPrivCardExpire() then |
121 | 125 | return 1 |
122 | 126 | end |
123 | - | |
124 | - return 1 + 0.25 | |
127 | + local coef = (globalCsv.shop_priv_card_produce_coef or 25)/ 100 | |
128 | + return 1 + coef | |
125 | 129 | end |
126 | 130 | |
127 | 131 | -- 拆解室栏位 特权卡额外个数 |
... | ... | @@ -130,7 +134,7 @@ function Store:getTimeBoxSlotExtraCount() |
130 | 134 | return 0 |
131 | 135 | end |
132 | 136 | |
133 | - return 3 | |
137 | + return csvdb.shop_priv_time_box_slot_cnt or 3 | |
134 | 138 | end |
135 | 139 | |
136 | 140 | -- 齿轮兑换 特权卡系数 |
... | ... | @@ -139,7 +143,8 @@ function Store:getGearExchangeCoef() |
139 | 143 | return 1 |
140 | 144 | end |
141 | 145 | |
142 | - return 1 + 0.5 | |
146 | + local coef = (globalCsv.shop_priv_card_produce_coef or 50)/ 100 | |
147 | + return 1 + coef | |
143 | 148 | end |
144 | 149 | |
145 | 150 | -- 购买通行证 |
... | ... | @@ -151,12 +156,14 @@ function Store:onBuyCard(type, duration) |
151 | 156 | else |
152 | 157 | self:updateProperty({field = "monthCardEx", value = self:getProperty("monthCardEx") + duration}) |
153 | 158 | end |
159 | + self:sendMonthCardEmail() | |
154 | 160 | elseif type == CardType.SuperMonthCard then |
155 | 161 | if self:isSuperMonthCardExpire() then |
156 | 162 | self:updateProperty({field = "smonthCardEx", value = timeNow + duration}) |
157 | 163 | else |
158 | 164 | self:updateProperty({field = "smonthCardEx", value = self:getProperty("smonthCardEx") + duration}) |
159 | 165 | end |
166 | + self:sendMonthCardEmail() | |
160 | 167 | elseif type == CardType.PrivilegeCard then |
161 | 168 | if self:isPrivCardExpire() then |
162 | 169 | self:updateProperty({field = "privCardEx", value = timeNow + duration}) |
... | ... | @@ -166,14 +173,11 @@ function Store:onBuyCard(type, duration) |
166 | 173 | elseif type == CardType.GrowFund then |
167 | 174 | self:updateProperty({field = "growFund", value = 1}) |
168 | 175 | elseif type == CardType.BattleCard then |
169 | - if self:isBattleCardExpire() then | |
170 | - self:updateProperty({field = "battleCardEx", value = timeNow + duration}) | |
171 | - else | |
172 | - self:updateProperty({field = "battleCardEx", value = self:getProperty("battleCardEx") + duration}) | |
173 | - end | |
176 | + self:updateProperty({field = "battleCard", value = 1}) | |
174 | 177 | end |
175 | 178 | end |
176 | 179 | |
180 | +--检测购买是否超过限制数量 | |
177 | 181 | function Store:checkRechargeRecord(limit, id) |
178 | 182 | local rechargeRecord = self:getProperty("payR") |
179 | 183 | if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then |
... | ... | @@ -194,6 +198,47 @@ function Store:notifyUpdateProperty(field, newValue, oldValue) |
194 | 198 | SendPacket(actionCodes.Store_updateproperty, MsgPack.pack(datas)) |
195 | 199 | end |
196 | 200 | |
201 | +-- 赛季卡重置 需要把未能领取的奖励通过邮件发送 | |
202 | +function Store:onBattleCardReset() | |
203 | + local gift = "" | |
204 | + local function concatGift(data) | |
205 | + if gift == "" then | |
206 | + gift = data | |
207 | + else | |
208 | + gift = gift .. " " .. data | |
209 | + end | |
210 | + end | |
211 | + local battleCardFlag = self:getProperty("battleCard") | |
212 | + local battleCardFreeRecord = self:getProperty("battleFR") | |
213 | + local battleCardLimitRecord = self:getProperty("battleLR") | |
214 | + local battlePoint = self.owner:getProperty("battlePoint") | |
215 | + | |
216 | + for id, config in pairs(csvdb["reward_battlepassCsv"]) do | |
217 | + if config then | |
218 | + local freeFlag = string.char(string.getbit(battleCardFreeRecord, id)) | |
219 | + local limitFlag = string.char(string.getbit(battleCardLimitRecord, id)) | |
220 | + | |
221 | + if battlePoint < config.point then | |
222 | + break | |
223 | + end | |
224 | + if freeFlag == "0" then | |
225 | + concatGift(config.giftFree) | |
226 | + end | |
227 | + if limitFlag == "0" and battleCardFlag == 1 then | |
228 | + concatGift(config.giftLimit) | |
229 | + end | |
230 | + end | |
231 | + end | |
232 | + self.owner:sendMail(210, nil, gift) | |
233 | + -- 计算剩余奖励 | |
234 | + self:updateProperty({field = "battleCard", value=0}) | |
235 | + self:updateProperty({field = "battleCardR", value=""}) | |
236 | + self:updateProperty({field = "battleFR", value=""}) | |
237 | + self:updateProperty({field = "battleLR", value=""}) | |
238 | + self.owner:updateProperty({field = "battlePoint", value=0}) | |
239 | +end | |
240 | + | |
241 | +-- 重置购买记录 | |
197 | 242 | function Store:resetStoreReored(resetId) |
198 | 243 | local payRecord = self:getProperty("payR") or {} |
199 | 244 | local buyRecord = self:getProperty("buyR") or {} |
... | ... | @@ -202,6 +247,12 @@ function Store:resetStoreReored(resetId) |
202 | 247 | if config then |
203 | 248 | if config.resetTime == resetId then |
204 | 249 | payRecord[k] = nil |
250 | + --通行证商店 | |
251 | + if config.shop == 2 then | |
252 | + if config.type == CardType.BattleCard then | |
253 | + self:onBattleCardReset() | |
254 | + end | |
255 | + end | |
205 | 256 | end |
206 | 257 | end |
207 | 258 | end |
... | ... | @@ -225,8 +276,9 @@ function Store:data() |
225 | 276 | growFundR = self:getProperty("growFundR"), |
226 | 277 | monthCardEx = self:getProperty("monthCardEx"), |
227 | 278 | smonthCardEx = self:getProperty("smonthCardEx"), |
228 | - battleCardEx = self:getProperty("battleCardEx"), | |
229 | - battleCardR = self:getProperty("battleCardR"), | |
279 | + battleCard = self:getProperty("battleCard"), | |
280 | + battleFR = self:getProperty("battleFR"), | |
281 | + battleLR = self:getProperty("battleLR"), | |
230 | 282 | limitTPack = self:getProperty("limitTPack"), |
231 | 283 | privCardEx = self:getProperty("privCardEx"), |
232 | 284 | } | ... | ... |