-- 商店数据 local Store = class("Store", require("shared.ModelBase")) function Store:ctor(properties) Store.super.ctor(self, properties) end function Store:onLoad() local monEx = self:getProperty("monthCardEx") local smonEx = self:getProperty("smonthCardEx") local monId = self:getProperty("monthCardId") local smonId = self:getProperty("smonthCardId") local timeNow = skynet.timex() local flag = false if monEx > timeNow and monId == 0 then self:updateProperty({field = "monthCardId", value = 101}) self:updateProperty({field = "getMailT1", value = 0}) flag = true end if smonEx > timeNow and smonId == 0 then self:updateProperty({field = "smonthCardId", value = 102}) self:updateProperty({field = "getMailT2", value = 0}) flag = true end if flag then self:sendMonthCardEmail() end end ActGoodsType = { paySignIn = 1, -- 付费签到 } Store.schema = { buyR = {"table", {}}, -- 购买商品记录 {id=count} payR = {"table", {}}, -- 充值记录 {id=count} growFund = {"number", 0}, -- 成长基金 growFundR = {"string", ""}, -- 成长基金领取记录 monthCardEx = {"number", 0}, -- 月卡过期时间戳 monthCardId = {"number", 0}, -- 月卡id smonthCardEx = {"number", 0}, -- 超级月卡过期时间戳 smonthCardId = {"number", 0}, -- 超级月卡id battleCard = {"number", 0}, -- 赛季卡 battleFR = {"string", ""}, -- 免费赛季卡领取记录 battleLR = {"string", ""}, -- 付费赛季卡领取记录 limitTPack = {"table", {}}, -- 限时礼包 {id={expire_ts, trigger_type}} privCardEx = {"number", 0}, -- 特权卡过期时间戳 getMailT1 = {"number",0}, -- 上次发送月卡福利邮件的时间 getMailT2 = {"number",0}, -- 上次发送超级月卡福利邮件的时间 --packTrigger = {"table", {}}, -- 礼包触发记录 {关卡难度1={id, 通关关卡数,升级数,爬塔层数}, ...} -- 活动商品购买记录 actGoodsFlag = {"table", {}}, -- ActGoodsType 1购买,0未购买 bpInfo = {"table", {}}, -- battle pass 探索指令 1={flag=0 为1表示买了,br=""付费领取记录, fr=""免费领取记录},2,3,4 totalRR = {"string", ""}, -- 累计充值奖励领取记录 } 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:onCrossDay() self:sendMonthCardEmail() self:deleteExpireLimitGoods() --self:checkPaySignReward() end -- 删除过期商品 function Store:deleteExpireLimitGoods() local timeNow = skynet.timex() local limitGoodsList = self:getProperty("limitTPack") for k, v in pairs(limitGoodsList) do if timeNow > v[1] then limitGoodsList[k] = nil end end self:updateProperty({field = "limitTPack", value = limitGoodsList, notNotify = true}) end -- 发送月卡邮件 function Store:sendMonthCardEmail() local timeNow = skynet.timex() local tabs = {{ex="monthCardEx", t="getMailT1", id= self:getProperty("monthCardId")}, {ex="smonthCardEx", t="getMailT2", id=self:getProperty("smonthCardId")}} for _, v in ipairs(tabs) do local ex = self:getProperty(v.ex) local ts = self:getProperty(v.t) or 0 local cfg = csvdb["shop_cardCsv"][v.id] or {} local mailId = cfg.email local alertId = cfg.email_2 local alertTs = dayLater(ex) - DAY_SEC if ex > timeNow then local cnt = 0 if ts == 0 then cnt = 1 else local diff = math.floor((dayLater(timeNow) - dayLater(ts))/DAY_SEC) diff = diff < 0 and 0 or diff diff = diff > 31 and 31 or diff cnt = diff end for i = cnt - 1, 0, -1 do local createTs = timeNow - i * DAY_SEC self.owner:sendMail(mailId, createTs) -- 过期头一天发提醒邮件 if dayLater(createTs) == alertTs then self.owner:sendMail(alertId, createTs) end end if cnt > 0 then self:updateProperty({field=v.t, value=timeNow}) end end 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:getHangSlotExtraCount() if self:isPrivCardExpire() then return 0 end return globalCsv.shop_priv_card_hang_slot_cnt or 4 end -- 探索加速/餐厅加速 特权卡系数 function Store:getProduceItemSpeedCoef() if self:isPrivCardExpire() then return 1 end local coef = (globalCsv.shop_priv_card_produce_coef or 25)/ 100 return 1 + coef end -- 拆解室栏位 特权卡额外个数 function Store:getTimeBoxSlotExtraCount() if self:isPrivCardExpire() then return 0 end return globalCsv.shop_priv_time_box_slot_cnt or 3 end -- 齿轮兑换 特权卡系数 function Store:getGearExchangeCoef() if self:isPrivCardExpire() then return 1 end local coef = (globalCsv.shop_priv_exchange_gear_coef or 50)/ 100 return 1 + coef end -- 奖励关卡 特权卡额外数量 function Store:getBonusExtraFightCount() if self:isPrivCardExpire() then return 0 end local cnt = globalCsv.bonus_extra_fight_count or 1 return cnt end -- 挂机道具掉落系数 特权卡挂机掉落系数 function Store:getHangDropCoef() if self:isPrivCardExpire() then return 1, 1 end return (1 + globalCsv.hang_drop_exp_coef) or 1, (1 + globalCsv.hang_drop_item_coef) or 1 end function Store:getCurMonthCardLvl(isSuper) local id = 0 if isSuper then id = self:getProperty("smonthCardId") or 0 else id = self:getProperty("monthCardId") or 0 end local cfg = csvdb["shop_cardCsv"][id] if not cfg then return 0 end return cfg.level or 0 end -- 购买通行证 function Store:onBuyCard(type, duration, id, actid) local timeNow = skynet.timex() if type == CardType.NormalMonthCard then if self:isMonthCardExpire() then self:updateProperty({field = "monthCardId", value = id}) self:updateProperty({field = "monthCardEx", value = timeNow + duration}) else self:updateProperty({field = "monthCardEx", value = self:getProperty("monthCardEx") + duration}) end self:sendMonthCardEmail() elseif type == CardType.NormalMonthCardLevelUp then if self:isMonthCardExpire() then skynet.error(string.format("month card expired, can not level up,%d,%d",self.owner:getProperty("id"), id)) else local cfg = csvdb["shop_cardCsv"][id] if not cfg then return end local dif = cfg.level - self:getCurMonthCardLvl(false) if dif > 1 and dif < 0 then return end self:updateProperty({field = "monthCardId", value = id}) self:updateProperty({field = "monthCardEx", value = self:getProperty("monthCardEx") + duration}) end self:sendMonthCardEmail() elseif type == CardType.SuperMonthCard then if self:isSuperMonthCardExpire() then self:updateProperty({field = "smonthCardId", value = id}) self:updateProperty({field = "smonthCardEx", value = timeNow + duration}) else self:updateProperty({field = "smonthCardEx", value = self:getProperty("smonthCardEx") + duration}) end self:sendMonthCardEmail() elseif type == CardType.SuperMonthCardLevelUp then if self:isSuperMonthCardExpire() then skynet.error(string.format("super month card expired, can not level up,%d,%d",self.owner:getProperty("id"), id)) else local cfg = csvdb["shop_cardCsv"][id] if not cfg then return end local dif = cfg.level - self:getCurMonthCardLvl(true) if dif > 1 and dif < 0 then return end self:updateProperty({field = "smonthCardId", value = id}) self:updateProperty({field = "smonthCardEx", value = self:getProperty("smonthCardEx") + duration}) end self:sendMonthCardEmail() 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 self:updateProperty({field = "battleCard", value = 1}) elseif type == CardType.PaySignCard then self:onBuyPaySignCard(duration) elseif type == CardType.BattlePassCard then local index = id - 400 -- 401:初级 402:中级 403:高级 404:终极 local bpInfo = self:getProperty("bpInfo") or {} local info = bpInfo[index] or {} info["flag"] = 1 bpInfo[index] = info self:updateProperty({field = "bpInfo", value = bpInfo}) elseif type == CardType.ActBattleCommandCard then if not self.owner.activity:isOpenById(actid, "ActShopGoods") then return end local actCfg = csvdb["activity_ctrlCsv"][actid] if not actCfg then return end local actData = self.owner.activity:getActData("BattleCommand") or {} actData["unlock"] = 1 if actCfg.condition ~= 0 then actData["lvl"] = (actData["lvl"] or 0) + actCfg.condition end self.owner.activity:updateActData("BattleCommand", actData) end end --检测购买是否超过限制数量 function Store:checkRechargeRecord(limit, id) local rechargeRecord = self:getProperty("payR") or {} if limit ~= 0 and limit <= (rechargeRecord[id] or 0) then skynet.error(string.format("[recharge] 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:onBattleCardReset() local gift = {} local function concatGift(data) for key, v in pairs(data:toNumMap()) do gift[key] = (gift[key] or 0) + v end end local battleCardFlag = self:getProperty("battleCard") local battleCardFreeRecord = self:getProperty("battleFR") local battleCardLimitRecord = self:getProperty("battleLR") local battlePoint = self.owner:getProperty("battlePoint") for id, config in pairs(csvdb["reward_battlepassCsv"]) do if config then local freeFlag = string.char(string.getbit(battleCardFreeRecord, id)) local limitFlag = string.char(string.getbit(battleCardLimitRecord, id)) if battlePoint < config.point then break end if freeFlag == "0" then concatGift(config.giftFree) end if limitFlag == "0" and battleCardFlag == 1 then concatGift(config.giftLimit) end end end self.owner:sendMail(MailId.BattleCardAward, nil, gift) -- 计算剩余奖励 self:updateProperty({field = "battleCard", value=0}) self:updateProperty({field = "battleFR", value=""}) self:updateProperty({field = "battleLR", value=""}) self.owner:updateProperty({field = "battlePoint", value=0}) end -- 重置购买记录 function Store:resetStoreReored(resetId) local payRecord = self:getProperty("payR") or {} local buyRecord = self:getProperty("buyR") or {} for k, v in pairs(payRecord) do local config = csvdb["shop_rechargeCsv"][k] if config then if config.resetTime == resetId then payRecord[k] = nil --通行证商店 if config.shop == 2 then if config.type == CardType.BattleCard then self:onBattleCardReset() end end end else payRecord[k] = nil end end self:updateProperty({field = "payR", value = payRecord}) for k, v in pairs(buyRecord) do local config = csvdb["shop_normalCsv"][k] if config then if config.resetTime == resetId then buyRecord[k] = nil end else buyRecord[k] = nil end end self:updateProperty({field = "buyR", value = buyRecord}) end --触发限时礼包 function Store:OnTriggerLimitTimePack(eventType, param) local limitPack = self:getProperty("limitTPack") --local payRecord = self:getProperty("payR") local timeNow = skynet.timex() --local find = false -- 有未过期的限时礼包不再推送 --for k, v in pairs(limitPack) do -- if v > timeNow and not payRecord[k] then -- find = true -- break -- end --end --if find == true then -- return --end --local hangPass = self.owner:getProperty("hangPass") --local triggerRecord = self:getProperty("packTrigger") --local result = {} --local maxDiff = 0 -- 取满足限时礼包关卡要求的对应数据 --for diff, maxCarbonId in pairs(hangPass) do -- for id, cfg in pairs(csvdb["shop_packCsv"]) do -- local range = cfg.showRange:toArray(true, "=") -- local beginRange = range[1] or 0 -- local endRange = range[2] or 0 -- if maxCarbonId > beginRange and maxCarbonId <= endRange and cfg.type == eventType then -- result[diff] = cfg -- maxDiff = math.max(maxDiff, diff) -- break -- end -- end --end local config = nil for id, cfg in pairs(csvdb["shop_packCsv"]) do if cfg.type == eventType and cfg.condition == param then config = cfg end end if config ~= nil then local rechargeCfg = csvdb["shop_rechargeCsv"][config.packId] if rechargeCfg then limitPack[rechargeCfg.id] = {timeNow + rechargeCfg.time, config.id} self.owner:log("push_gift", { gift_id = rechargeCfg.id, --礼包ID gift_name = rechargeCfg.title, --礼包名称 }) -- 每日抽卡限时礼包 触发重置 if eventType == TriggerEventType.DrawHeroCnt then local payR = self:getProperty("payR") if payR[rechargeCfg.id] then payR[rechargeCfg.id] = nil self:updateProperty({field = "payR", value = payR}) end end self:updateProperty({field = "limitTPack", value = limitPack}) end end --if next(result) then -- self:updateProperty({field = "packTrigger", value = triggerRecord}) --end end function GetActGoodsIndex(goodsType) return ActGoodsType[goodsType] or 0 end function Store:SetActGoodsFlag(goodsType, flag) local actGoodsFlag = self:getProperty("actGoodsFlag") or {} local goodsIndex = GetActGoodsIndex(goodsType) if goodsIndex == 0 then print("get act goods index fail :paySignIn") return end actGoodsFlag[goodsIndex] = flag self:updateProperty({field = "actGoodsFlag", value = actGoodsFlag}) end -- 购买付费签到 按开服时间算奖励 function Store:onBuyPaySignCard(dur) local curTs = skynet.timex() curTs = getServerOpenTs() self:SetActGoodsFlag("paySignIn", curTs) local actData = self.owner.activity:getActData("PaySignIn") actData[0] = 1 self.owner.activity:updateActData("PaySignIn", actData) --local actGoodsFlag = self:getProperty("actGoodsFlag") or {} --local goodsIndex = GetActGoodsIndex("paySignIn") --if goodsIndex == 0 then -- print("get act goods index fail :paySignIn") -- return --end --actGoodsFlag[goodsIndex] = 1 --self:updateProperty({field = "actGoodsFlag", value = actGoodsFlag}) -- 发钱 --local change --local reward, curData = self.owner.activity:getPaySignReward() --if next(reward) then -- self.owner.activity:updateActData("PaySignIn", curData) -- reward, change = self.owner:award(reward, {log = {desc = "actPaySign"}}) --end --self.owner:log("activity", { -- activity_id = 0, -- 活动ID(或活动指定任务的ID) -- activity_type = self.owner.activity.ActivityType.PaySignIn, -- 活动类型,见活动类型枚举表 -- activity_reward = reward, -- 活动奖励,json格式记录,{'itemid1':123,'itemid2':456,………...} --}) --SendPacket(actionCodes.Activity_actPaySignRewardNtf, MsgPack.pack(self.owner:packReward(reward, change))) end function Store:checkPaySignReward() local reward, curData = self.owner.activity:getPaySignReward() if next(reward) then self.owner.activity:updateActData("PaySignIn", curData) self.owner:sendMail(MailId.PaySignAward, nil, reward) end end -- 临时用 登录触发限时礼包 时间点以后 function Store:OnTriggerLimitTimePackAfterTs(eventType, param) local limitPack = self:getProperty("limitTPack") local timeNow = skynet.timex() local config = nil for id, cfg in pairs(csvdb["shop_packCsv"]) do local ts = toUnixtime(""..cfg.condition) if cfg.type == eventType and ts < param then config = cfg if config ~= nil then local rechargeCfg = csvdb["shop_rechargeCsv"][config.packId] if rechargeCfg then if not limitPack[rechargeCfg.id] then limitPack[rechargeCfg.id] = {timeNow + rechargeCfg.time, config.id} self.owner:log("push_gift", { gift_id = rechargeCfg.id, --礼包ID gift_name = rechargeCfg.title, --礼包名称 }) self:updateProperty({field = "limitTPack", value = limitPack, notNotify = false}) end end end end end end function Store:data() self:OnTriggerLimitTimePackAfterTs(TriggerEventType.AfterTs, skynet.timex()) 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"), battleCard = self:getProperty("battleCard"), battleFR = self:getProperty("battleFR"), battleLR = self:getProperty("battleLR"), limitTPack = self:getProperty("limitTPack"), privCardEx = self:getProperty("privCardEx"), --packTrigger = self:getProperty("packTrigger"), actGoodsFlag = self:getProperty("actGoodsFlag"), bpInfo = self:getProperty("bpInfo"), totalRR = self:getProperty("totalRR"), monthCardId = self:getProperty("monthCardId"), smonthCardId = self:getProperty("smonthCardId"), } end return Store