local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local json =require "json" local redisKeyUrl = require "RedisKeyUrl" local LuxuryCard = oo.class() LuxuryCard.MaxBuyDayNum = 180 --最大购买天数 function LuxuryCard:Init() end --检查是否过期 function LuxuryCard:CheckOutOfTime( nowTime , player ) local luxuryCard = player.gameData.luxuryCard if nowTime >= luxuryCard.expireTime then --豪华月卡已经过期 luxuryCard.isActivate = false --如果使用了自定义头像则重置为默认头像 if player.gameData.personal.headId == 0 then player.gameData.personal.headId = 1 end end end --豪华月卡 显示信息 function LuxuryCard:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SLuxuryCardShow", c2sData.data )) local data = {} local luxuryCard = player.gameData.luxuryCard if not luxuryCard.isActivate then s2cData.code = errorInfo.ErrorCode.NoActivateLuxuryCard else local todayGain = player.gameData.todayGain local monthGain = player.gameData.monthGain data.isActivate = luxuryCard.isActivate if luxuryCard.isActivate then data.day = skynet.server.common:GetTimeGap(luxuryCard.expireTime) else data.day = 0 end data.isGainDaliyReward = todayGain.isGetLuxuryCardDaliyReward data.isGainMonthReward = monthGain.isGetLuxuryCardMonthReward data.luxuryCardID = self:GetCurMonthId( player ) log.debug(string.format("豪华月卡 玩家 %s 是否激活 %s 当日是否领取 %s 当月是否领取 %s ", player.userId , luxuryCard.isActivate , todayGain.isGetLuxuryCardDaliyReward , monthGain.isGetLuxuryCardMonthReward)) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_LuxuryCardShow") s2cData.data = assert(pb.encode("S2CLuxuryCardShow", data)) end --豪华月卡 获得每日奖励 function LuxuryCard:GetDaliyReward( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SLuxuryCardGetDaliyReward", c2sData.data )) local data = {} local luxuryCard = player.gameData.luxuryCard local todayGain = player.gameData.todayGain if not luxuryCard.isActivate then s2cData.code = errorInfo.ErrorCode.NoActivateLuxuryCard elseif todayGain.isGetLuxuryCardDaliyReward then s2cData.code = errorInfo.ErrorCode.AlreadyGet else todayGain.isGetLuxuryCardDaliyReward = true --获取配置中的每日奖励 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local rewardId = cfgSValue.luxuryCardDailyReward --发放奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_125") player:GiveReward( rewardId , eventId , 1) data.rewardId = rewardId log.debug(string.format("豪华月卡 玩家 %s 是获得每日奖励 %d", player.userId , rewardId)) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_LuxuryCardGetDaliyReward") s2cData.data = assert(pb.encode("S2CLuxuryCardGetDaliyReward", data)) end --豪华月卡 获得每月奖励 function LuxuryCard:GetMonthReward( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SLuxuryCardGetMonthReward", c2sData.data )) local data = {} local luxuryCard = player.gameData.luxuryCard local monthGain = player.gameData.monthGain if not luxuryCard.isActivate then s2cData.code = errorInfo.ErrorCode.NoActivateLuxuryCard elseif monthGain.isGetLuxuryCardMonthReward then s2cData.code = errorInfo.ErrorCode.AlreadyGet else monthGain.isGetLuxuryCardMonthReward = true --获取配置中的每月奖励 local rewardId = self:GetCurMonthReward( player ) --发放奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_125") player:GiveReward( rewardId , eventId , 1) data.rewardId = rewardId log.debug(string.format("豪华月卡 玩家 %s 是获得每月奖励 %d", player.userId , rewardId)) end s2cData.cmd = pb.enum("MsgType","CMD_S2C_LuxuryCardGetMonthReward") s2cData.data = assert(pb.encode("S2CLuxuryCardGetMonthReward", data)) end --购买 function LuxuryCard:Buy( player, c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SLuxuryMonthCardBuy", c2sData.data )) local data = {} if not self:IsReBuy( player ) then s2cData.code=errorInfo.ErrorCode.LuxuryCardOver180Days else local luxuryCard = player.gameData.luxuryCard local nowTime = skynet.GetTime() luxuryCard.isActivate = true luxuryCard.buyTime = nowTime --发放豪华月卡购买奖励 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local eventId = pb.enum("EnumMoneyChangeEventID","EventID_126") player:GiveReward(cfgSValue.luxuryCardReward , eventId , 1) --如果购买时,当前时间大于过期时间,表示玩家未激活,则用现在时间来计算过期时间,否则用过期时间加30天来计算 if nowTime >= luxuryCard.expireTime then luxuryCard.expireTime = skynet.server.common:GetTimeAfterSomeDayHMS( nowTime , 30 ) self:CardBenefit(player) else luxuryCard.expireTime = skynet.server.common:GetTimeAfterSomeDayHMS( luxuryCard.expireTime , 30 ) end data.buyStatus = luxuryCard.isActivate data.day = skynet.server.common:GetTimeGap(luxuryCard.expireTime) data.isGainDaliyReward = player.gameData.todayGain.isGetLuxuryCardDaliyReward data.isGainMonthReward = player.gameData.monthGain.isGetLuxuryCardMonthReward end s2cData.cmd = pb.enum("MsgType","CMD_S2C_LuxuryMonthCardBuy") s2cData.data = assert(pb.encode("S2CLuxuryMonthCardBuy", data)) end --上传自定义头像 function LuxuryCard:UploadDIYHead( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SLuxuryCardDIYHeadUpload",c2sData.data)) local data = {} data.DIYHeadInfo = {} if not self:IsActivate( player) then s2cData.code = errorInfo.ErrorCode.NoActivateLuxuryCard else local myPartnerId = player.gameData.partner.id --保存自定义头像信息,并将头像id设置为0代表启用自定义头像 player.gameData.personal.diyHeadInfo = c2sData.data.DIYHeadInfo player.gameData.personal.headId = 0 skynet.server.personal:SetDetail( myPartnerId , "headId" , player.gameData.personal.headId , "DIYHeadInfo" , json:encode(player.gameData.personal.diyHeadInfo)) data.DIYHeadInfo = c2sData.data.DIYHeadInfo end s2cData.cmd = pb.enum("MsgType","CMD_S2C_LuxuryCardDIYHeadUpload") s2cData.data = assert(pb.encode("S2CLuxuryCardDIYHeadUpload", data)) end --主动推送豪华月卡信息 function LuxuryCard:SendLuxuryCardInfoToUser(player) local data = {} local luxuryCard = player.gameData.luxuryCard if luxuryCard then local todayGain = player.gameData.todayGain local monthGain = player.gameData.monthGain data.isActivate = luxuryCard.isActivate if luxuryCard.isActivate then data.day = skynet.server.common:GetTimeGap(luxuryCard.expireTime) else data.day = 0 end data.isGainDaliyReward = todayGain.isGetLuxuryCardDaliyReward data.isGainMonthReward = monthGain.isGetLuxuryCardMonthReward data.luxuryCardID = self:GetCurMonthId( player ) end skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_LuxuryCardShow" , data ) end --获取当前月的奖励ID function LuxuryCard:GetCurMonthReward( player ) local curYear , curMonth , curDay = skynet.server.common:GetYearMonthDay() local cfgAllLuxuryCard = skynet.server.gameConfig:GetPlayerAllCfg( player , "LuxuryCard") for k, v in pairs( cfgAllLuxuryCard ) do if curYear == v.month[1] and curMonth == v.month[2] then return v.rewardId end end return 0 end --获取当前月的奖励ID function LuxuryCard:GetCurMonthId( player ) local curYear , curMonth , curDay = skynet.server.common:GetYearMonthDay() local cfgAllLuxuryCard = skynet.server.gameConfig:GetPlayerAllCfg( player , "LuxuryCard") for k, v in pairs( cfgAllLuxuryCard ) do if curYear == v.month[1] and curMonth == v.month[2] then return v.id end end return 0 end --豪华月卡开通权益 需要特殊处理的权益在此处处理 function LuxuryCard:CardBenefit( player ) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") --造型间权益 将当前剪刀数乘权益系数 local styleShop = player.gameData.shop[ dataType.ShopType_Style ] if styleShop then styleShop.energy.energy = styleShop.energy.energy * cfgSValue.luxuryCardScissorsModulus if styleShop.energy.energy ~= skynet.server.styleShop:GetMaxRestoreEnergy( player ) then styleShop.energy.nextRefillTime = skynet.GetTime() + skynet.server.styleShop:GetMaxCDTime( player ) end end end --是否能续费 function LuxuryCard:IsReBuy( player ) local luxuryCard = player.gameData.luxuryCard local nowTime = skynet.GetTime() --计算剩余秒数 local leftTime = luxuryCard.expireTime - nowTime if leftTime < 0 then log.debug(string.format("豪华月卡 玩家 %s 可以购买 剩余天数 %d", player.userId , 0 )) return true end --计算剩余天数 local leftDayNum = math.floor( leftTime / dataType.OneDaySec ) if leftDayNum <= self.MaxBuyDayNum then log.debug(string.format("豪华月卡 玩家 %s 可以购买 剩余天数 %d", player.userId , leftDayNum )) return true end log.debug(string.format("豪华月卡 玩家 %s 无法购买 剩余天数 %d", player.userId , leftDayNum )) return false end --是否激活 function LuxuryCard:IsActivate( player) return player.gameData.luxuryCard.isActivate end skynet.server.luxuryCard = LuxuryCard return LuxuryCard