624 lines
19 KiB
Lua
624 lines
19 KiB
Lua
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 activity = require "Activity"
|
||
local json =require "json"
|
||
local dataType = require "DataType"
|
||
local ActivitySignPack = oo.class()
|
||
|
||
ActivitySignPack.ActivityType = dataType.ActivityType_SignPack
|
||
|
||
--构造函数
|
||
function ActivitySignPack:Init()
|
||
|
||
end
|
||
|
||
-- 每次登录需要进行修改的数据
|
||
function ActivitySignPack:LoginInitData(player)
|
||
|
||
--判断模块是否开启
|
||
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivitySignPack ) then
|
||
log.debug("限时签到模块未开启")
|
||
return
|
||
end
|
||
|
||
--活动结束
|
||
if self:CheckDataAndGetActivity(player) == nil then
|
||
|
||
--查询是否有补发需求
|
||
self:Reissue(player,0)
|
||
log.debug("限时签到活动已结束")
|
||
return
|
||
end
|
||
|
||
-- 处理红点
|
||
skynet.server.msgTips:Reset(player, 109)
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
--查询是否有补发需求{针对跨活动的情况}
|
||
self:Reissue(player,id)
|
||
log.debug("限时签到活动进行中")
|
||
end
|
||
|
||
--处理活动结束后补发奖励,id:活动id,全部检查传0
|
||
function ActivitySignPack:Reissue(player,id)
|
||
|
||
if player.gameData.SignPackMap == nil or not next(player.gameData.SignPackMap) then
|
||
return
|
||
end
|
||
|
||
local cfgActivitys = skynet.server.gameConfig:GetPlayerAllCfg(player, "Activity")
|
||
if cfgActivitys == nil then
|
||
return
|
||
end
|
||
|
||
--循环已经参加过的签到活动
|
||
for key, signPack in pairs(player.gameData.SignPackMap) do
|
||
if id ~= 0 and key == id then
|
||
log.debug("限时签到奖励补发,id ~= 0 and key == id")
|
||
break
|
||
end
|
||
|
||
--未参与过活动
|
||
if signPack == nil then
|
||
|
||
log.debug("限时签到奖励补发,signPack == nil")
|
||
break
|
||
end
|
||
|
||
local cfgActivity = nil
|
||
|
||
--获取配置
|
||
for _, cfgTemp in ipairs(cfgActivitys) do
|
||
if cfgTemp.id == key then
|
||
cfgActivity = cfgTemp
|
||
break
|
||
end
|
||
end
|
||
|
||
--是否存在活动
|
||
if cfgActivity == nil then
|
||
|
||
log.debug("限时签到奖励补发,cfgActivity == nil")
|
||
break
|
||
end
|
||
|
||
local startTime = skynet.server.common:GetTime(cfgActivity.startTime)
|
||
local endTime = skynet.server.common:GetTime(cfgActivity.endTime)
|
||
|
||
--未开始的活动,或者正在进行中的活动
|
||
if startTime > skynet.GetTime() or endTime > skynet.GetTime()then
|
||
|
||
log.debug("限时签到奖励补发,startTime >skynet.GetTime() or endTime<skynet.GetTime()")
|
||
break
|
||
end
|
||
|
||
--获取签到配置
|
||
local cfgSignPack = self:GetSignPackConfig(player,cfgActivity.activityId)
|
||
|
||
if cfgSignPack == nil then
|
||
|
||
log.debug("限时签到奖励补发,cfgSignPack == nil")
|
||
break
|
||
end
|
||
|
||
--判断是否全部领取,避免后续循环
|
||
if #cfgSignPack.normalReward == #signPack.normalRewardIds
|
||
and #cfgSignPack.payReward == #signPack.specialRewardIds then
|
||
|
||
log.debug("限时签到奖励补发,#cfgSignPack.normalReward == #signPack.normalRewardIds and #cfgSignPack.payReward == #signPack.specialRewardIds")
|
||
break
|
||
end
|
||
|
||
--当前活动登录天数
|
||
local curDay = math.ceil((signPack.LoginDate - skynet.server.common:GetTime(cfgActivity.startTime))/dataType.OneDaySec)
|
||
|
||
--邮件奖励
|
||
local award = {}
|
||
|
||
--普通奖励
|
||
for _, normalReward in ipairs(cfgSignPack.normalReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(normalReward, "_")
|
||
local day=tonumber(arr[1])
|
||
local rewardid=tonumber(arr[2])
|
||
|
||
--判断是否已领取
|
||
for _, signDay in ipairs( signPack.normalRewardIds) do
|
||
if signDay==day then
|
||
|
||
log.debug("限时签到奖励补发,signDay==day")
|
||
goto coroutine
|
||
end
|
||
end
|
||
|
||
--是否可以领取
|
||
if curDay < day and not signPack.isBuySpecialReward then
|
||
|
||
log.debug("限时签到奖励补发,curDay < day and not signPack.isBuySpecialReward")
|
||
break
|
||
end
|
||
|
||
--以邮件形式发奖
|
||
local reward = skynet.server.playerLand:GetRewardInfo(player , rewardid)--对应的奖励信息
|
||
for _ ,v1 in pairs( reward ) do
|
||
table.insert(award , v1 )
|
||
end
|
||
|
||
--添加领取信息
|
||
table.insert(player.gameData.SignPackMap[key].normalRewardIds,day)
|
||
|
||
--跳出循环
|
||
::coroutine::
|
||
|
||
end
|
||
|
||
--是否购专属礼包
|
||
if signPack.isBuySpecialReward then
|
||
|
||
--专属奖励
|
||
for _, payReward in ipairs(cfgSignPack.payReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(payReward, "_")
|
||
local day=tonumber(arr[1])
|
||
local rewardid=tonumber(arr[2])
|
||
|
||
--判断是否已领取
|
||
for _, signDay in ipairs(signPack.specialRewardIds) do
|
||
if signDay==day then
|
||
|
||
log.debug("限时签到奖励补发,signDay==day2")
|
||
goto coroutine
|
||
end
|
||
end
|
||
|
||
--以邮件形式发奖
|
||
local reward = skynet.server.playerLand:GetRewardInfo(player , rewardid)--对应的奖励信息
|
||
for _ ,v1 in pairs( reward ) do
|
||
table.insert(award , v1 )
|
||
end
|
||
|
||
--添加领取信息
|
||
table.insert(player.gameData.SignPackMap[key].specialRewardIds,day)
|
||
|
||
--跳出循环
|
||
::coroutine::
|
||
|
||
end
|
||
end
|
||
|
||
--是否需要补发奖励
|
||
if next(award) then
|
||
skynet.server.mail:AddNewMail( player , skynet.server.mail.MailType_Award,"签到奖励补发", "本次限时签到活动已经结束,小蜗们忘记领取的签到奖励已经通过邮件发放咯,请小蜗们及时领取~", award, true)
|
||
log.debug(string.format("玩家 %d 限时签到奖励补发", player.userId ))
|
||
end
|
||
end
|
||
end
|
||
|
||
--初始玩家数据,返回活动信息,
|
||
function ActivitySignPack:CheckDataAndGetActivity(player)
|
||
|
||
--默认空活动
|
||
local cfgSignPack = nil
|
||
|
||
if player==nil then
|
||
log.debug("限时签到CheckDataAndGetActivity, player is nil")
|
||
return cfgSignPack
|
||
end
|
||
|
||
--判断等级是否开启
|
||
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivitySignPack) then
|
||
log.debug("限时签到等级不足")
|
||
return cfgSignPack
|
||
end
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
--没有开启的活动
|
||
if activityId == 0 then
|
||
log.debug("限时签到未开启-未获取到有效的活动1")
|
||
return cfgSignPack
|
||
end
|
||
|
||
--初始化
|
||
if player.gameData.SignPackMap==nil then
|
||
player.gameData.SignPackMap={}
|
||
end
|
||
|
||
--获取活动配置
|
||
cfgSignPack=self:GetSignPackConfig(player,activityId)
|
||
|
||
--未获取到有效的活动
|
||
if cfgSignPack == nil then
|
||
log.debug("限时签到未开启-未获取到有效的活动2")
|
||
return cfgSignPack
|
||
end
|
||
|
||
--如果玩家已经存在活动不需要检查
|
||
if player.gameData.SignPackMap[id] then
|
||
|
||
player.gameData.SignPackMap[id].LoginDate = skynet.GetTime() --更新登录时间 补发奖励用
|
||
|
||
--删除过期活动,减少数据产生
|
||
local removeKeyList = {}
|
||
for exceedId, _ in pairs(player.gameData.SignPackMap) do
|
||
if exceedId ~= id then
|
||
table.insert(removeKeyList, exceedId)
|
||
end
|
||
end
|
||
if next(removeKeyList) then
|
||
for _, removeKey in ipairs(removeKeyList) do
|
||
player.gameData.SignPackMap[removeKey]=nil
|
||
end
|
||
end
|
||
|
||
return cfgSignPack
|
||
end
|
||
|
||
--存在活动初始化玩家数据
|
||
local playerActivitySignPack = {}
|
||
playerActivitySignPack.activityId = cfgSignPack.activityId
|
||
playerActivitySignPack.normalRewardIds = {} --普通奖励领取列表
|
||
playerActivitySignPack.specialRewardIds = {} --专属奖励领取列表
|
||
playerActivitySignPack.isBuySpecialReward = false --是否购买专属奖励
|
||
playerActivitySignPack.LoginDate = skynet.GetTime() --登录天数
|
||
|
||
--更新缓存
|
||
player.gameData.SignPackMap[id] = playerActivitySignPack
|
||
|
||
return cfgSignPack
|
||
|
||
end
|
||
|
||
--可领取奖励列表
|
||
function ActivitySignPack:GetConDrawReward(player)
|
||
|
||
--可领取奖励
|
||
local conNormalRewardIds={}
|
||
local conSpecialRewardIds={}
|
||
|
||
--不存在开启的活动
|
||
local cfgSignPack=self:CheckDataAndGetActivity(player)
|
||
|
||
--活动未开启
|
||
if cfgSignPack == nil then
|
||
log.debug("限时签到未开启-未获取到有效的活动")
|
||
return conNormalRewardIds,conSpecialRewardIds
|
||
end
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
--获取当前活动开启天数
|
||
local thenDay = self:GetActivityDay(player,id)
|
||
|
||
--循环普通奖励
|
||
for _, normalRewardItemStr in ipairs(cfgSignPack.normalReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(normalRewardItemStr, "_")
|
||
local day=tonumber(arr[1])
|
||
local rewardId = tonumber(arr[2])
|
||
|
||
--空奖励 进入下一个循环
|
||
if rewardId == 0 then
|
||
goto coroutine
|
||
end
|
||
|
||
--判断天数
|
||
if day > thenDay then
|
||
goto coroutine
|
||
end
|
||
|
||
--检查配置
|
||
if #arr ~= 2 then
|
||
log.debug(string.format("限时签到配置错误 normalRewardItemStr%d",normalRewardItemStr))
|
||
goto coroutine
|
||
end
|
||
|
||
local isCon = false
|
||
|
||
--循环判断是否领取
|
||
for _, value in ipairs(player.gameData.SignPackMap[id].normalRewardIds) do
|
||
if value == day then
|
||
isCon = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if not isCon then
|
||
table.insert(conNormalRewardIds,day)
|
||
end
|
||
|
||
::coroutine::
|
||
end
|
||
|
||
--专属奖励
|
||
if player.gameData.SignPackMap[id].isBuySpecialReward then
|
||
|
||
--循环专属奖励
|
||
for _, specialRewardItemStr in ipairs(cfgSignPack.payReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(specialRewardItemStr, "_")
|
||
local day=tonumber(arr[1])
|
||
|
||
local rewardId = tonumber(arr[2])
|
||
|
||
--空奖励 直接进入下一个循环
|
||
if rewardId == 0 then
|
||
goto coroutine
|
||
end
|
||
|
||
--判断天数
|
||
if day > thenDay then
|
||
goto coroutine
|
||
end
|
||
|
||
--检查配置
|
||
if #arr ~= 2 then
|
||
log.debug(string.format("限时签到配置错误 specialRewardItemStr%d",specialRewardItemStr))
|
||
goto coroutine
|
||
end
|
||
|
||
local isCon = false
|
||
|
||
--循环判断是否领取
|
||
for _, value in ipairs(player.gameData.SignPackMap[id].specialRewardIds) do
|
||
if value == day then
|
||
isCon = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if not isCon then
|
||
table.insert(conSpecialRewardIds,day)
|
||
end
|
||
|
||
::coroutine::
|
||
end
|
||
end
|
||
|
||
return conNormalRewardIds,conSpecialRewardIds
|
||
end
|
||
|
||
--获取签到当天天数 theActivityid 当前活动id
|
||
function ActivitySignPack:GetActivityDay(player,theActivityid)
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
if activityId == 0 or theActivityid ~= id then
|
||
return 0
|
||
end
|
||
|
||
local startTimeDate = os.date("*t", startTime)
|
||
|
||
--由于活动开启时间是10点,这里统计时间设置成0点
|
||
local startTimeTemp=os.time({ year = startTimeDate.year, month = startTimeDate.month, day=startTimeDate.day, hour=0, min=0, sec=0 })
|
||
|
||
--计算当前是哪天
|
||
local day =math.ceil((skynet.GetTime()-startTimeTemp)/dataType.OneDaySec)
|
||
|
||
log.debug(string.format("获取限时签到天数 day:%d",day))
|
||
|
||
return day
|
||
end
|
||
|
||
--获取配置信息
|
||
function ActivitySignPack:GetSignPackConfig(player,activityId)
|
||
|
||
local cfSignPack=nil
|
||
|
||
--获取该活动的默认初始关卡
|
||
local cfSignPacks=skynet.server.gameConfig:GetPlayerAllCfg(player, "SignPack")
|
||
if cfSignPacks==nil then
|
||
|
||
log.debug("cfSignPacks is nil")
|
||
return cfSignPack
|
||
end
|
||
|
||
for index, value in pairs(cfSignPacks) do
|
||
if value.id==activityId then
|
||
cfSignPack=value
|
||
break
|
||
end
|
||
end
|
||
|
||
return cfSignPack
|
||
end
|
||
|
||
--是否付费签到
|
||
function ActivitySignPack:ChangeStore(player,storeId)
|
||
|
||
--检查显示是否开启
|
||
local cfgSignPack=self:CheckDataAndGetActivity(player)
|
||
|
||
if cfgSignPack == nil then
|
||
return
|
||
end
|
||
|
||
-- 活动不匹配
|
||
if cfgSignPack.packId ~= storeId then
|
||
return
|
||
end
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
--设置已付费
|
||
player.gameData.SignPackMap[id].isBuySpecialReward = true
|
||
|
||
-- 处理红点
|
||
local conNormalRewardIds,conSpecialRewardIds =self:GetConDrawReward(player)
|
||
if next(conNormalRewardIds) or next(conSpecialRewardIds) then
|
||
skynet.server.msgTips:Add(player,109)
|
||
end
|
||
|
||
end
|
||
|
||
--获取限时签到信息
|
||
function ActivitySignPack:Show( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SignPackShow", c2sData.data ))
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2S_ActivitySignPackShow")
|
||
local data = {}
|
||
|
||
--检查并且获取活动信息
|
||
local cfgSignPack=self:CheckDataAndGetActivity(player)
|
||
|
||
if cfgSignPack == nil then
|
||
s2cData.code = errorInfo.ErrorCode.ActivityClosed
|
||
return
|
||
end
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
local startDate=os.date("%Y-%m-%d",startTime)
|
||
local startTimeStamp=os.time({year=string.sub(startDate,1,4), month=string.sub(startDate,6,7), day=string.sub(startDate,9,10)})
|
||
local nowDate=os.date("%Y-%m-%d",skynet.GetTime())
|
||
local nowTimeStamp=os.time({year=string.sub(nowDate,1,4), month=string.sub(nowDate,6,7), day=string.sub(nowDate,9,10)})
|
||
|
||
data.openDay=math.floor((nowTimeStamp - startTimeStamp) / (24 * 60 * 60))+1
|
||
data.normalRewardIds=player.gameData.SignPackMap[id].normalRewardIds
|
||
data.specialRewardIds=player.gameData.SignPackMap[id].specialRewardIds
|
||
data.isBuySpecialReward=player.gameData.SignPackMap[id].isBuySpecialReward
|
||
|
||
--返回信息
|
||
s2cData.data = assert(pb.encode("S2SignPackShow", data))
|
||
end
|
||
|
||
--领取签到奖励(客户端)
|
||
function ActivitySignPack:DrawReward( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SignPackDrawReward", c2sData.data ))
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2S_ActivitySignPackDrawReward")
|
||
|
||
--参数 奖励类型 1 普通奖励 2 专属奖励
|
||
local rewardType = c2sData.data.rewardType
|
||
local day = c2sData.data.day
|
||
local data = {}
|
||
data.rewardType = rewardType
|
||
data.day = day
|
||
|
||
--获取可领取的奖励
|
||
local normalRewardIds,specialRewardIds=self:GetConDrawReward(player)
|
||
|
||
if rewardType == 1 and not next(normalRewardIds) then
|
||
s2cData.code = errorInfo.ErrorCode.NotGet
|
||
return
|
||
end
|
||
|
||
if rewardType == 2 and not next(specialRewardIds) then
|
||
s2cData.code = errorInfo.ErrorCode.NotGet
|
||
return
|
||
end
|
||
|
||
--获取开启的活动
|
||
local activityId, startTime, endTime, id = activity:GetActivityInfo(player, ActivitySignPack.ActivityType)
|
||
|
||
--获取活动配置
|
||
local cfgSignPack=self:GetSignPackConfig(player,activityId)
|
||
|
||
--是否可领取
|
||
local isConGet = false
|
||
local rewardId = tonumber(0)
|
||
|
||
--普通奖励
|
||
if rewardType == 1 then
|
||
|
||
--判断是否已经领取
|
||
for _, value in ipairs(player.gameData.SignPackMap[id].normalRewardIds) do
|
||
if value == day then
|
||
s2cData.code = errorInfo.ErrorCode.NotGet
|
||
return
|
||
end
|
||
end
|
||
|
||
--判断是否包含可领取奖励
|
||
for _, normalRewardId in ipairs(normalRewardIds) do
|
||
if normalRewardId == day then
|
||
isConGet = true
|
||
break
|
||
end
|
||
end
|
||
|
||
--查找奖励
|
||
for _, normalRewardItemStr in ipairs(cfgSignPack.normalReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(normalRewardItemStr, "_")
|
||
if day == tonumber(arr[1]) then
|
||
rewardId = tonumber(arr[2])
|
||
break
|
||
end
|
||
end
|
||
|
||
--发奖
|
||
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_123")
|
||
player:GiveReward(rewardId ,eventId,1)
|
||
|
||
--添加奖励
|
||
if isConGet then
|
||
table.insert(player.gameData.SignPackMap[id].normalRewardIds,day)
|
||
end
|
||
elseif rewardType == 2 then--专属奖励
|
||
|
||
--判断是否已经领取
|
||
for _, value in ipairs(player.gameData.SignPackMap[id].specialRewardIds) do
|
||
if value == day then
|
||
s2cData.code = errorInfo.ErrorCode.NotGet
|
||
return
|
||
end
|
||
end
|
||
|
||
--判断是否包含可领取奖励
|
||
for _, specialRewardId in ipairs(specialRewardIds) do
|
||
if specialRewardId == day then
|
||
isConGet = true
|
||
break
|
||
end
|
||
end
|
||
|
||
--查找奖励
|
||
for _, payRewardItemStr in ipairs(cfgSignPack.payReward) do
|
||
|
||
--解析配置
|
||
local arr = skynet.server.common:Split(payRewardItemStr, "_")
|
||
if day == tonumber(arr[1]) then
|
||
rewardId = tonumber(arr[2])
|
||
break
|
||
end
|
||
end
|
||
|
||
--发奖
|
||
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_123")
|
||
player:GiveReward(rewardId ,eventId,1)
|
||
|
||
--添加奖励
|
||
if isConGet then
|
||
table.insert(player.gameData.SignPackMap[id].specialRewardIds,day)
|
||
end
|
||
else
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
return
|
||
end
|
||
|
||
-- 处理红点
|
||
local conNormalRewardIds,conSpecialRewardIds=self:GetConDrawReward(player)
|
||
if not next(conNormalRewardIds) and not next(conSpecialRewardIds) then
|
||
skynet.server.msgTips:ReduceAll(player, 109)
|
||
end
|
||
|
||
--返回信息
|
||
s2cData.data = assert(pb.encode("S2SignPackDrawReward", data))
|
||
end
|
||
|
||
skynet.server.activitySignPack = ActivitySignPack
|
||
return ActivitySignPack |