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 | 259 | PvpCR = 1, |
| 260 | 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 | 276 | \ No newline at end of file | ... | ... |
src/ProtocolCode.lua
src/RedisKeys.lua
src/actions/StoreAction.lua
| ... | ... | @@ -254,4 +254,52 @@ function _M.dinerBuyRpc(agent , data) |
| 254 | 254 | return true |
| 255 | 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 | 305 | return _M |
| 258 | 306 | \ No newline at end of file | ... | ... |
src/models/Daily.lua
| ... | ... | @@ -63,8 +63,8 @@ function Daily:refreshDailyData(notify) |
| 63 | 63 | -- 每日折扣搞一下 |
| 64 | 64 | local dailySDD = {} |
| 65 | 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 | 68 | table.insert(sddPool, id) |
| 69 | 69 | end |
| 70 | 70 | end | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -11,6 +11,7 @@ function RolePlugin.bind(Role) |
| 11 | 11 | self:loadHeros() |
| 12 | 12 | self:loadDiner() |
| 13 | 13 | self:loadActivity() |
| 14 | + self:loadStoreInfo() | |
| 14 | 15 | end |
| 15 | 16 | |
| 16 | 17 | function Role:reloadWhenLogin() |
| ... | ... | @@ -529,6 +530,18 @@ function RolePlugin.bind(Role) |
| 529 | 530 | -- 放role 里面了 |
| 530 | 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 | 545 | function Role:addEquip(equipType, equipLv, count, pms) |
| 533 | 546 | pms = pms or {} |
| 534 | 547 | if count ~= count then return end |
| ... | ... | @@ -1511,8 +1524,13 @@ function RolePlugin.bind(Role) |
| 1511 | 1524 | return |
| 1512 | 1525 | end |
| 1513 | 1526 | |
| 1527 | + if not role.storeData:checkRechargeRecord(rechargeData.limit, id) then | |
| 1528 | + return 1 | |
| 1529 | + end | |
| 1530 | + | |
| 1514 | 1531 | local diamondCount = 0 |
| 1515 | - if rechargeData.type == 0 then -- 钻石 | |
| 1532 | + local reward = {} | |
| 1533 | + if rechargeData.shop == 1 then -- 钻石 | |
| 1516 | 1534 | local rechargeF = self:getProperty("rechargeF") |
| 1517 | 1535 | diamondCount = rechargeData.diamond + rechargeData.diamondExtra |
| 1518 | 1536 | if not rechargeF[id] then |
| ... | ... | @@ -1521,11 +1539,15 @@ function RolePlugin.bind(Role) |
| 1521 | 1539 | self:updateProperty({field = "rechargeF", value = rechargeF}) |
| 1522 | 1540 | end |
| 1523 | 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 | 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 | 1548 | return |
| 1528 | 1549 | else |
| 1550 | + skynet.error("invalid recharge shop type " .. id) | |
| 1529 | 1551 | return |
| 1530 | 1552 | end |
| 1531 | 1553 | |
| ... | ... | @@ -1535,7 +1557,7 @@ function RolePlugin.bind(Role) |
| 1535 | 1557 | |
| 1536 | 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 | 1561 | end |
| 1540 | 1562 | |
| 1541 | 1563 | end | ... | ... |
| ... | ... | @@ -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 | 115 | \ No newline at end of file | ... | ... |