-- 商店数据 local Store = class("Store", require("shared.ModelBase")) function Store:ctor(properties) Store.super.ctor(self, properties) end Store.schema = { buyR = {"table", {}}, -- 购买商品记录 {id=count} payR = {"table", {}}, -- 充值记录 {id=count} growFund = {"number", 0}, -- 成长基金 growFundR = {"string", ""}, -- 成长基金领取记录 monthCardEx = {"number", 0}, -- 月卡过期时间戳 smonthCardEx = {"number", 0}, -- 超级月卡过期时间戳 battleCardEx = {"number", 0}, -- 赛季卡过期时间戳 battleFR = {"string", ""}, -- 免费赛季卡领取记录 battleLR = {"string", ""}, -- 付费赛季卡领取记录 limitTPack = {"table", {}}, -- 限时礼包 {id=expire_ts} privCardEx = {"number", 0} -- 特权卡过期时间戳 } function Store:updateProperty(params) params = params or {} if not self.schema[params.field] then return end local oldValue = self:getProperty(params.field) if params.value then self:setProperty(params.field, params.value) elseif params.delta then self:incrProperty(params.field, params.delta) else return end local newValue = self:getProperty(params.field) if not params.notNotify then self:notifyUpdateProperty(params.field, newValue, oldValue) end end function Store:refreshData(notify, refreshType) local buyRecord = self:getProperty("buyR") local result = {} for id, data in pairs(csvdb["shop_normalCsv"]) do if data.shop == 1 and refreshType == RefreshType.RefreshType_Daily then buyRecord[id] = nil end if data.shop == 2 and refreshType == RefreshType.RefreshType_Weekly then buyRecord[id] = nil end end self:setProperty("buyR", buyRecord) if notify then self:notifyUpdateProperty({field="buyR", value=buyRecord}) end end function Store:refreshPvpBuyRecord(notify) local buyRecord = self:getProperty("buyR") for id, data in pairs(csvdb["shop_normalCsv"]) do if data.shop == 3 then buyRecord[id] = nil end end self:setProperty("buyR", buyRecord) if notify then self:notifyUpdateProperty({field="buyR", value=buyRecord}) end end -- 发送月卡邮件 function Store:sendMonthCardEmail() local monthCardEx = self:getProperty("monthCardEx") local smonthCardEx = self:getProperty("smonthCardEx") local timeNow = skynet.timex() if monthCardEx < timeNow then redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 19}) end if smonthCardEx < timeNow then redisproxy:insertEmail({roleId = self.owner:getProperty("id"), emailId = 20}) end end function Store:isMonthCardExpire() local timeNow = skynet.timex() local ts = self:getProperty("monthCardEx") return ts < timeNow end function Store:isSuperMonthCardExpire() local timeNow = skynet.timex() local ts = self:getProperty("smonthCardEx") return ts < timeNow end function Store:isPrivCardExpire() local timeNow = skynet.timex() local ts = self:getProperty("privCardEx") return ts < timeNow end function Store:isBattleCardExpire() local timeNow = skynet.timex() local ts = self:getProperty("battleCardEx") return ts < timeNow end -- 挂机栏位 特权卡额外个数 function Store:getHangSlotExtraCount() if self:isPrivCardExpire() then return 0 end return 4 end -- 探索加速/餐厅加速 特权卡系数 function Store:getProduceItemSpeedCoef() if self:isPrivCardExpire() then return 1 end return 1 + 0.25 end -- 拆解室栏位 特权卡额外个数 function Store:getTimeBoxSlotExtraCount() if self:isPrivCardExpire() then return 0 end return 3 end -- 齿轮兑换 特权卡系数 function Store:getGearExchangeCoef() if self:isPrivCardExpire() then return 1 end return 1 + 0.5 end -- 购买通行证 function Store:onBuyCard(type, duration) local timeNow = skynet.timex() if type == CardType.NormalMonthCard then if self:isMonthCardExpire() then self:updateProperty({field = "monthCardEx", value = timeNow + duration}) else self:updateProperty({field = "monthCardEx", value = self:getProperty("monthCardEx") + duration}) end elseif type == CardType.SuperMonthCard then if self:isSuperMonthCardExpire() then self:updateProperty({field = "smonthCardEx", value = timeNow + duration}) else self:updateProperty({field = "smonthCardEx", value = self:getProperty("smonthCardEx") + duration}) end elseif type == CardType.PrivilegeCard then if self:isPrivCardExpire() then self:updateProperty({field = "privCardEx", value = timeNow + duration}) else self:updateProperty({field = "privCardEx", value = self:getProperty("privCardEx") + duration}) end elseif type == CardType.GrowFund then self:updateProperty({field = "growFund", value = 1}) elseif type == CardType.BattleCard then if self:isBattleCardExpire() then self:updateProperty({field = "battleCardEx", value = timeNow + duration}) else self:updateProperty({field = "battleCardEx", value = self:getProperty("battleCardEx") + duration}) end end end function Store:checkRechargeRecord(limit, id) local rechargeRecord = self:getProperty("payR") if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then skynet.error(string.format("recharge id:%d count over limit, user id:%d", id, self.owner:getProperty("id"))) return false end rechargeRecord[id] = (rechargeRecord[id] or 0) + 1 self:updateProperty({field = "payR", value = rechargeRecord}) return true end function Store:notifyUpdateProperty(field, newValue, oldValue) local datas = { key = field, newValue = newValue, oldValue = oldValue, } SendPacket(actionCodes.Store_updateproperty, MsgPack.pack(datas)) end function Store:data() return { buyR = self:getProperty("buyR"), payR = self:getProperty("payR"), growFund = self:getProperty("growFund"), growFundR = self:getProperty("growFundR"), monthCardEx = self:getProperty("monthCardEx"), smonthCardEx = self:getProperty("smonthCardEx"), battleCardEx = self:getProperty("battleCardEx"), battleCardR = self:getProperty("battleCardR"), limitTPack = self:getProperty("limitTPack"), privCardEx = self:getProperty("privCardEx"), } end return Store