Commit c582511001d8cafdfd79b0fb7901a6e5fbf59b98
1 parent
77b54f12
新增用户商城相关数据
Showing
7 changed files
with
206 additions
and
6 deletions
Show diff stats
src/GlobalVar.lua
@@ -259,3 +259,17 @@ RedPointTags = { | @@ -259,3 +259,17 @@ RedPointTags = { | ||
259 | PvpCR = 1, | 259 | PvpCR = 1, |
260 | PvpHR = 2, | 260 | PvpHR = 2, |
261 | } | 261 | } |
262 | + | ||
263 | +RefreshType = { | ||
264 | + RefreshType_Daily = 1, -- 日刷新 | ||
265 | + RefreshType_Weekly = 2, -- 周刷新 | ||
266 | + RefreshType_Monthly = 3, -- 月刷新 | ||
267 | +} | ||
268 | + | ||
269 | +CardType = { | ||
270 | + NormalMonthCard = 1, --普通月卡 | ||
271 | + SuperMonthCard = 2, --超级月卡 | ||
272 | + PrivilegeCard = 3, --特权卡 | ||
273 | + GrowFund = 4, --成长助力 | ||
274 | + BattleCard = 5, --赛季卡 | ||
275 | +} | ||
262 | \ No newline at end of file | 276 | \ No newline at end of file |
src/ProtocolCode.lua
@@ -183,6 +183,7 @@ actionCodes = { | @@ -183,6 +183,7 @@ actionCodes = { | ||
183 | Store_ayncPurchaseRpc = 555, | 183 | Store_ayncPurchaseRpc = 555, |
184 | Store_myCardRechargeRpc = 556, | 184 | Store_myCardRechargeRpc = 556, |
185 | Store_iosRechargeRpc = 557, | 185 | Store_iosRechargeRpc = 557, |
186 | + Store_shopBuyRpc = 558, | ||
186 | 187 | ||
187 | 188 | ||
188 | Email_listRpc = 600, | 189 | Email_listRpc = 600, |
src/RedisKeys.lua
@@ -11,6 +11,7 @@ R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id | @@ -11,6 +11,7 @@ R_RUNEIDS = "role:%d:runeIds" -- 玩家拥有符文自增id | ||
11 | R_RUNE = "role:%d:rune:%d" -- 符文详细信息 | 11 | R_RUNE = "role:%d:rune:%d" -- 符文详细信息 |
12 | R_EMAIL = "role:%d:emailIds" --邮件列表 | 12 | R_EMAIL = "role:%d:emailIds" --邮件列表 |
13 | R_EMAIL_ITEM = "email:%d:%d" --邮件 | 13 | R_EMAIL_ITEM = "email:%d:%d" --邮件 |
14 | +R_STORE = "role:%d:store" -- 商店 | ||
14 | 15 | ||
15 | 16 | ||
16 | -- rank | 17 | -- rank |
src/actions/StoreAction.lua
@@ -254,4 +254,52 @@ function _M.dinerBuyRpc(agent , data) | @@ -254,4 +254,52 @@ function _M.dinerBuyRpc(agent , data) | ||
254 | return true | 254 | return true |
255 | end | 255 | end |
256 | 256 | ||
257 | +function _M.shopBuyRpc(agent , data) | ||
258 | + local role = agent.role | ||
259 | + local msg = MsgPack.unpack(data) | ||
260 | + local id = msg.id | ||
261 | + local count = msg.count or 1 | ||
262 | + | ||
263 | + local dataSet = csvdb["shop_normalCsv"][id] | ||
264 | + if not dataSet then return end | ||
265 | + | ||
266 | + local buyRecord = role.storeData:getProperty("Store_buyRecord") | ||
267 | + if math.illegalNum(count, 1, (dataSet.limit == 0 and math.huge or dataSet.limit - (buyRecord[id] or 0))) then return 1 end | ||
268 | + | ||
269 | + local cost = {[dataSet.icon] = dataSet.cost * count} | ||
270 | + | ||
271 | + local desc = "unknown" | ||
272 | + if dataSet.shop == 1 then -- 普通商店 | ||
273 | + desc = "dailyShop" | ||
274 | + local dailySDD = role.dailyData:getProperty("dailySDD") | ||
275 | + if dailySDD[id] then -- 折扣 | ||
276 | + cost = math.ceil(dataSet.cost * (1 - dataSet.disount / 100)) | ||
277 | + end | ||
278 | + elseif dataSet.shop == 2 then -- 美食商店 | ||
279 | + desc = "dinerShop" | ||
280 | + elseif dataSet.shop == 3 then -- 竞技场商店 | ||
281 | + desc = "pvpShop" | ||
282 | + end | ||
283 | + | ||
284 | + if not role:checkItemEnough(cost) then return end | ||
285 | + | ||
286 | + if dataSet.limit ~= 0 then | ||
287 | + buyRecord[id] = (buyRecord[id] or 0) + count | ||
288 | + role.storeData:updateProperty({field = "Store_buyRecord", value = buyRecord}) | ||
289 | + end | ||
290 | + | ||
291 | + role:costItems(cost, {log = {desc = desc, int1 = id, int2 = count}}) | ||
292 | + | ||
293 | + local gift = {} | ||
294 | + for _id, _count in pairs(dataSet.gift:toNumMap()) do | ||
295 | + gift[_id] = _count * count | ||
296 | + end | ||
297 | + local reward = role:award(gift, {log = {desc = desc, int1 = id, int2 = count}}) | ||
298 | + | ||
299 | + role:log("role_action", {desc = desc, int1 = id, int2 = count}) | ||
300 | + | ||
301 | + SendPacket(actionCodes.Store_shopBuyRpc, MsgPack.pack({reward = reward})) | ||
302 | + return true | ||
303 | +end | ||
304 | + | ||
257 | return _M | 305 | return _M |
258 | \ No newline at end of file | 306 | \ No newline at end of file |
src/models/Daily.lua
@@ -63,8 +63,8 @@ function Daily:refreshDailyData(notify) | @@ -63,8 +63,8 @@ function Daily:refreshDailyData(notify) | ||
63 | -- 每日折扣搞一下 | 63 | -- 每日折扣搞一下 |
64 | local dailySDD = {} | 64 | local dailySDD = {} |
65 | local sddPool = {} | 65 | local sddPool = {} |
66 | - for id, data in pairs(csvdb["shop_diamondCsv"]) do | ||
67 | - if data.disount ~= 0 then | 66 | + for id, data in pairs(csvdb["shop_normalCsv"]) do |
67 | + if data.shop == 1 and data.disount ~= 0 then | ||
68 | table.insert(sddPool, id) | 68 | table.insert(sddPool, id) |
69 | end | 69 | end |
70 | end | 70 | end |
src/models/RolePlugin.lua
@@ -11,6 +11,7 @@ function RolePlugin.bind(Role) | @@ -11,6 +11,7 @@ function RolePlugin.bind(Role) | ||
11 | self:loadHeros() | 11 | self:loadHeros() |
12 | self:loadDiner() | 12 | self:loadDiner() |
13 | self:loadActivity() | 13 | self:loadActivity() |
14 | + self:loadStoreInfo() | ||
14 | end | 15 | end |
15 | 16 | ||
16 | function Role:reloadWhenLogin() | 17 | function Role:reloadWhenLogin() |
@@ -529,6 +530,18 @@ function RolePlugin.bind(Role) | @@ -529,6 +530,18 @@ function RolePlugin.bind(Role) | ||
529 | -- 放role 里面了 | 530 | -- 放role 里面了 |
530 | end | 531 | end |
531 | 532 | ||
533 | + function Role:loadStoreInfo() | ||
534 | + local roleId = self:getProperty("id") | ||
535 | + local dataKey = string.format(R_STORE, roleId) | ||
536 | + self.storeData = require("models.Store").new({key = dataKey}) | ||
537 | + self.storeData.owner = self | ||
538 | + if not redisproxy:exists(dataKey) then | ||
539 | + self.storeData:create() | ||
540 | + else | ||
541 | + self.storeData:load() | ||
542 | + end | ||
543 | + end | ||
544 | + | ||
532 | function Role:addEquip(equipType, equipLv, count, pms) | 545 | function Role:addEquip(equipType, equipLv, count, pms) |
533 | pms = pms or {} | 546 | pms = pms or {} |
534 | if count ~= count then return end | 547 | if count ~= count then return end |
@@ -1511,8 +1524,13 @@ function RolePlugin.bind(Role) | @@ -1511,8 +1524,13 @@ function RolePlugin.bind(Role) | ||
1511 | return | 1524 | return |
1512 | end | 1525 | end |
1513 | 1526 | ||
1527 | + if not role.storeData:checkRechargeRecord(rechargeData.limit, id) then | ||
1528 | + return 1 | ||
1529 | + end | ||
1530 | + | ||
1514 | local diamondCount = 0 | 1531 | local diamondCount = 0 |
1515 | - if rechargeData.type == 0 then -- 钻石 | 1532 | + local reward = {} |
1533 | + if rechargeData.shop == 1 then -- 钻石 | ||
1516 | local rechargeF = self:getProperty("rechargeF") | 1534 | local rechargeF = self:getProperty("rechargeF") |
1517 | diamondCount = rechargeData.diamond + rechargeData.diamondExtra | 1535 | diamondCount = rechargeData.diamond + rechargeData.diamondExtra |
1518 | if not rechargeF[id] then | 1536 | if not rechargeF[id] then |
@@ -1521,11 +1539,15 @@ function RolePlugin.bind(Role) | @@ -1521,11 +1539,15 @@ function RolePlugin.bind(Role) | ||
1521 | self:updateProperty({field = "rechargeF", value = rechargeF}) | 1539 | self:updateProperty({field = "rechargeF", value = rechargeF}) |
1522 | end | 1540 | end |
1523 | self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) | 1541 | self:gainDiamond({count = diamondCount, isRecharge = true, log = {desc = "recharge", int1 = id}}) |
1524 | - elseif rechargeData.type == 1 then --月卡 | 1542 | + elseif rechargeData.shop == 1 then --通行证商店 |
1543 | + reward = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) | ||
1544 | + self.storeData:onBuyCard(rechargeData.type, rechargeData.time) | ||
1525 | return | 1545 | return |
1526 | - elseif rechargeData.type == 2 then -- 赛季通行证 | 1546 | + elseif rechargeData.shop == 2 then -- 礼包商店 |
1547 | + reward = self:award(rechargeData.itemFirst, {log = {desc = "recharge", int1 = id}}) | ||
1527 | return | 1548 | return |
1528 | else | 1549 | else |
1550 | + skynet.error("invalid recharge shop type " .. id) | ||
1529 | return | 1551 | return |
1530 | end | 1552 | end |
1531 | 1553 | ||
@@ -1535,7 +1557,7 @@ function RolePlugin.bind(Role) | @@ -1535,7 +1557,7 @@ function RolePlugin.bind(Role) | ||
1535 | 1557 | ||
1536 | self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) | 1558 | self:log("role_action", {desc = "recharge", int1 = id, int2 = rmb, key1 = params.transactionId, key2 = params.order, long1 = params.pay_time}) |
1537 | 1559 | ||
1538 | - return diamondCount | 1560 | + return diamondCount, reward |
1539 | end | 1561 | end |
1540 | 1562 | ||
1541 | end | 1563 | end |
@@ -0,0 +1,114 @@ | @@ -0,0 +1,114 @@ | ||
1 | +-- 商店数据 | ||
2 | + | ||
3 | +local Store = class("Store", require("shared.ModelBase")) | ||
4 | + | ||
5 | +function Store:ctor(properties) | ||
6 | + Store.super.ctor(self, properties) | ||
7 | +end | ||
8 | + | ||
9 | +Store.schema = { | ||
10 | + Store_buyRecord = {"table", {}}, -- 购买商品记录 {id=count} | ||
11 | + Store_rechargeRecord = {"table", {}}, -- 充值记录 {id=count} | ||
12 | + Store_growFund = {"number", 0}, -- 成长基金 | ||
13 | + Store_growFundRecord = {"table", {}}, -- 成长基金领取记录 | ||
14 | + Store_monthCardExTs = {"number", 0}, -- 月卡过期时间戳 | ||
15 | + Store_smonthCardExTs = {"number", 0}, -- 超级月卡过期时间戳 | ||
16 | + Store_battleCardExTs = {"number", 0}, -- 赛季卡过期时间戳 | ||
17 | + Store_battleCardRecord = {"table", {}}, -- 赛季卡领取记录 | ||
18 | +} | ||
19 | + | ||
20 | +function Store:updateProperty(params) | ||
21 | + local type, default = table.unpack(self.schema[params.field]) | ||
22 | + | ||
23 | + if params.delta then | ||
24 | + self:incrProperty(params.field, params.delta) | ||
25 | + if not params.notNotify then | ||
26 | + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) | ||
27 | + end | ||
28 | + return true | ||
29 | + end | ||
30 | + if params.value then | ||
31 | + self:setProperty(params.field, params.value) | ||
32 | + if not params.notNotify then | ||
33 | + self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) | ||
34 | + end | ||
35 | + return true | ||
36 | + end | ||
37 | + return false | ||
38 | +end | ||
39 | + | ||
40 | +function Store:refreshData(notify, refreshType) | ||
41 | + local buyRecord = self:getProperty("Store_buyRecord") | ||
42 | + local result = {} | ||
43 | + for id, data in pairs(csvdb["shop_normalCsv"]) do | ||
44 | + if data.shop == 1 and refreshType == RefreshType.RefreshType_Daily then | ||
45 | + buyRecord[id] = nil | ||
46 | + end | ||
47 | + if data.shop == 2 and refreshType == RefreshType.RefreshType_Weekly then | ||
48 | + buyRecord[id] = nil | ||
49 | + end | ||
50 | + end | ||
51 | + self:setProperty("Store_buyRecord", buyRecord) | ||
52 | + if notify then | ||
53 | + --self.owner:notifyUpdateProperties(self:data()) | ||
54 | + self:notifyUpdateProperty({field="Store_buyRecord", value=buyRecord}) | ||
55 | + end | ||
56 | +end | ||
57 | + | ||
58 | +function Store:refreshPvpBuyRecord(notify) | ||
59 | + local buyRecord = self:getProperty("Store_buyRecord") | ||
60 | + for id, data in pairs(csvdb["shop_normalCsv"]) do | ||
61 | + if data.shop == 3 then | ||
62 | + buyRecord[id] = nil | ||
63 | + end | ||
64 | + end | ||
65 | + self:setProperty("Store_buyRecord", buyRecord) | ||
66 | + if notify then | ||
67 | + self:notifyUpdateProperty({field="Store_buyRecord", value=buyRecord}) | ||
68 | + end | ||
69 | +end | ||
70 | + | ||
71 | +-- 发送月卡邮件 | ||
72 | +function Store:sendMonthCardEmail() | ||
73 | +end | ||
74 | + | ||
75 | +-- 购买通行证 | ||
76 | +function onBuyCard(type, duration) | ||
77 | + local timeNow = skynet.timex() | ||
78 | + if rechargeData.type == CardType.NormalMonthCard then | ||
79 | + self:updateProperty({field = "Store_monthCardExTs", value = timeNow + duration}) | ||
80 | + elseif rechargeData.type == CardType.SuperMonthCard then | ||
81 | + self:updateProperty({field = "Store_smonthCardExTs", value = timeNow + duration}) | ||
82 | + elseif rechargeData.type == CardType.PrivilegeCard then | ||
83 | + elseif rechargeData.type == CardType.GrowFund then | ||
84 | + self:updateProperty({field = "Store_growFundRecord", 1}) | ||
85 | + elseif rechargeData.type == CardType.BattleCard then | ||
86 | + self:updateProperty({field = "Store_battleCardRecord", 1}) | ||
87 | + end | ||
88 | +end | ||
89 | + | ||
90 | +function checkRechargeRecord(limit, id) | ||
91 | + local rechargeRecord = self:getProperty("Store_rechargeRecord") | ||
92 | + if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then | ||
93 | + skynet.error(string.format("recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) | ||
94 | + return false | ||
95 | + end | ||
96 | + rechargeRecord[id] = rechargeRecord[id] + 1 | ||
97 | + self:updateProperty({field = "Store_rechargeRecord", value = rechargeRecord[id]}) | ||
98 | + return true | ||
99 | +end | ||
100 | + | ||
101 | +function Store:data() | ||
102 | + return { | ||
103 | + Store_buyRecord = self:getProperty("Store_buyRecord"), | ||
104 | + Store_rechargeRecord = self:getProperty("Store_rechargeRecord"), | ||
105 | + Store_growFund = self:getProperty("Store_growFund"), | ||
106 | + Store_growFundRecord = self:getProperty("Store_growFundRecord"), | ||
107 | + Store_monthCardExTs = self:getProperty("Store_monthCardExTs"), | ||
108 | + Store_smonthCardExTs = self:getProperty("Store_smonthCardExTs"), | ||
109 | + Store_battleCardExTs = self:getProperty("Store_battleCardExTs"), | ||
110 | + Store_battleCardRecord = self:getProperty("Store_battleCardRecord"), | ||
111 | + } | ||
112 | +end | ||
113 | + | ||
114 | +return Store | ||
0 | \ No newline at end of file | 115 | \ No newline at end of file |