Store.lua 7.14 KB
-- 商店数据

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: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
            end
        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
        end
    end
    self:updateProperty({field = "buyR", value = buyRecord})
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