HomeServer/Server/AllServer/GameServer/LuxuryCard.lua
2024-11-20 15:41:37 +08:00

259 lines
10 KiB
Lua
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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