1307 lines
61 KiB
Lua
1307 lines
61 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 sqlUrl = require "SqlUrl"
|
||
local db = require "DB"
|
||
local json =require "json"
|
||
local redisKeyUrl = require "RedisKeyUrl"
|
||
local serverId = tonumber(skynet.getenv "serverId")
|
||
local ActivityDecoWeek = oo.class()
|
||
|
||
ActivityDecoWeek.ActivityType = dataType.ActivityType_DecoWeek
|
||
|
||
ActivityDecoWeek.ActivityStatus_No = 0 --无状态
|
||
ActivityDecoWeek.ActivityStatus_Join = 1 --参赛阶段
|
||
ActivityDecoWeek.ActivityStatus_Vote = 2 --评选阶段
|
||
ActivityDecoWeek.ActivityStatus_Balance = 3 --结算阶段
|
||
|
||
ActivityDecoWeek.DesignType_Human = 1 --设计类型人类
|
||
ActivityDecoWeek.DesignType_AI = 2 --设计类型AI
|
||
|
||
ActivityDecoWeek.ActivityMaxDesignCount = 5 --每期最多设计5次
|
||
ActivityDecoWeek.StartCoinId = 20 --星芒币ID
|
||
ActivityDecoWeek.HotDesignMaxCount = 50
|
||
ActivityDecoWeek.RefreshDecoWeekDesignInterval = 600 --刷新装修周设计间隔时间 300
|
||
ActivityDecoWeek.RefreshDesignMaxCount = 100 --刷新设计最大数量
|
||
--[[
|
||
参赛阶段:每周五晚18:00:00 至 每周日晚23:59:59
|
||
评选阶段:每周一0:00:00 至 每周五下午15:59:59
|
||
结算阶段:每周五下午16:00:00 至 17:59:59
|
||
|
||
• 保底刷新机制:
|
||
◦ 需要确保所有投稿作品刷新至任意用户的次数平均
|
||
◦ 没有达到平均次数的作品会优先被推荐给参与投票用户,NPC作品刷新次数不计入
|
||
◦ 到结算时没有达到平均推荐次数的作品则按“平均推荐次数-当前推荐次数”取整的值,在当前热度值基础上补偿对应的数额
|
||
]]
|
||
|
||
function ActivityDecoWeek:Init()
|
||
self.highScoreDesigns = {} --当前服高分设计
|
||
skynet.server.timer:Add( dataType.Timer_SyncActivityDecoWeekDesignList , self.RefreshDecoWeekDesignInterval , self["SyncHotDesignList"] , self )
|
||
end
|
||
|
||
--同步热门设计数据
|
||
function ActivityDecoWeek:SyncHotDesignList()
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
local designCount = skynet.server.redis:zcard( redisKey ) --获取设计数量
|
||
|
||
if 0 == designCount then
|
||
--如果没有设计信息就用NPC数据
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
designCount = skynet.server.redis:zcard( redisKey )
|
||
end
|
||
|
||
--获取设计详情
|
||
local function GetDesignDetail( queryData )
|
||
local listDesigns = {}
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
for partnerId , score in pairs( queryData ) do
|
||
table.insert( listDesigns , { partnerId = partnerId , score = score })
|
||
end
|
||
return listDesigns
|
||
end
|
||
|
||
local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue" )
|
||
local hotRange = math.ceil(cfgSValue.heatWeeklyContestWork * designCount)
|
||
if hotRange > 500 then
|
||
--超过500只给500
|
||
hotRange = 500
|
||
end
|
||
|
||
local queryData = skynet.server.redis:zrevrange( redisKey , 0 , hotRange , "withscores" ) --每次获取50个高分数据
|
||
self.highScoreDesigns = GetDesignDetail( queryData )
|
||
end
|
||
|
||
--检查是否有新数据
|
||
function ActivityDecoWeek:LoginInitData( player )
|
||
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityDecoWeek ) then
|
||
return
|
||
end
|
||
|
||
if not player.gameData.activity[ self.ActivityType ] then
|
||
player.gameData.activity[ self.ActivityType ] = {}
|
||
end
|
||
|
||
local activityThemeId,activityStatus,stageStartTime = self:GetCurActivityInfo()
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
|
||
--投票券清空逻辑(活动id对不上时、周赛阶段不为投票阶段时)
|
||
if activity.themeId ~= nil then
|
||
if activity.themeId ~= activityThemeId or ( activity.themeId == activityThemeId and activityStatus ~= self.ActivityStatus_Vote ) then
|
||
--当前周赛id和玩家数据周赛id不一致时 清空投票券
|
||
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) > 0 then
|
||
skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 30, skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30))
|
||
--防止周一零点周赛服时间延迟导致的清空周一免费投票券
|
||
if skynet.server.common:GetDayInWeek() == 1 and player.gameData.todayGain.weeklyDesignFreeVote then
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, 5)
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
|
||
--新解锁功能没有主题ID 或者 当前活动ID不一致才初始化数据
|
||
if not activity.themeId or activity.themeId ~= activityThemeId then
|
||
local isLastThemeId = activity.themeId or 0 --上一期参加过的主题ID
|
||
local isLastSubmitDesign = activity.isSubmitDesign or false --上一期是否已经提交过设计
|
||
|
||
activity.themeId = activityThemeId --当前活动的ID
|
||
activity.isSubmitDesign = false --是否提交过方案
|
||
activity.weekVoteCount = 0 --本周投票数量
|
||
activity.joinThemes = {} --参加过的主题
|
||
activity.designFileName = "" --设计的文件名
|
||
|
||
activity.rewardIds = {} --已经领取的奖励ID
|
||
activity.nowShowVoteInfos = {} --当前正在显示的投票信息
|
||
activity.historyShowHotDesigns = {} --历史显示的投票信息
|
||
activity.historyShowVotes = {} --已经显示投票的玩家
|
||
activity.historyVotes = {} --已经投票的玩家
|
||
activity.designCount = 0 --主题装修周设计数量
|
||
activity.openShowCount = 0 --打开界面次数
|
||
activity.getAllWeekReward = false --本周已经获取全部投票累计度奖励
|
||
|
||
activity.totalReward = {}
|
||
activity.tierReward = {}
|
||
|
||
local myParentId = player.gameData.partner.id
|
||
|
||
skynet.server.personal:SetDetail( myParentId ,
|
||
"decoWeekOpenShowCount" , 0 , --打开界面次数
|
||
"decoWeekDesignTime" , 0 ,
|
||
"decoWeekDesignUrl" , "" ,
|
||
"decoWeekDesignOssUrl" , "" ,
|
||
"decoWeekLastThemeId" , isLastThemeId , --上一期参加过的主题ID
|
||
"decoWeekIsLastSubmitDesign" , isLastSubmitDesign , --上一期是否已经提交过设计
|
||
"decoWeekRankRange" , 0 , --排行榜范围
|
||
"decoWeekRewardId" , 0 , --奖励ID
|
||
"decoWeekRewardStatus" , dataType.DecoWeekRewardStatus_No ) --奖励状态
|
||
|
||
--player:InitTestAccount( false )
|
||
end
|
||
|
||
self:CheckMsgTips( player , activityThemeId , activityStatus)
|
||
end
|
||
|
||
--主题装修周显示
|
||
function ActivityDecoWeek:Show( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekShow", c2sData.data ))
|
||
local data = {}
|
||
|
||
--更新活动主题ID 和 活动状态
|
||
local activityThemeId,activityStatus,stageStartTime,stageEndTime = self:GetCurActivityInfo()
|
||
if self.ActivityStatus_No == activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
--检查是否有新数据
|
||
self:LoginInitData( player )
|
||
|
||
local myParentId = player.gameData.partner.id
|
||
local todayGain = player.gameData.todayGain
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
|
||
--增加周赛交互次数
|
||
skynet.server.personal:AccDetail( myParentId ,"decoWeekOpenShowCount", 1 )
|
||
|
||
data.themeId = activityThemeId
|
||
data.activityStatus = activityStatus
|
||
data.stageStartTime = stageStartTime
|
||
data.stageEndTime = stageEndTime
|
||
data.isSubmitDesign = activity.isSubmitDesign
|
||
data.todayVoteCount = todayGain.weekDesignVoteCount
|
||
data.weekVoteCount = activity.weekVoteCount
|
||
data.todayBuyVoteCount = todayGain.weeklyDesignBuyVoteCount
|
||
|
||
if activity.isSubmitDesign then
|
||
data.myDesignInfo = self:GetDesignInfo( myParentId , activityThemeId , activityStatus , stageStartTime , stageEndTime ) --我提交过设计,就发送下我的投票信息
|
||
else
|
||
data.myDesignInfo = {}
|
||
end
|
||
|
||
data.hotDesignInfo = self:GetHotVoteInfo( activityThemeId , activityStatus , stageStartTime , stageEndTime , activity.historyShowHotDesigns ) or {}
|
||
data.rewardIds = activity.rewardIds
|
||
data.surplusDesignCount = self.ActivityMaxDesignCount - activity.designCount
|
||
--检查是否有未领取的上期结算奖励
|
||
local mulDetail = skynet.server.personal:GetMulDetail( myParentId , "decoWeekLastRankRange" ,"decoWeekLastRewardId","decoWeekLastRewardCanGet")
|
||
local rankRange = mulDetail[1] or 0
|
||
local rewardId = mulDetail[2] or 0
|
||
local rewardCanGet = mulDetail[3] or false
|
||
if rewardCanGet then
|
||
data.haveWeekReward = true
|
||
data.rankRange = rankRange * 100
|
||
data.rewardId = rewardId
|
||
local lastFinalReward = player:RewardShow( rewardId )
|
||
activity.lastFinalReward = {}
|
||
activity.lastFinalReward = lastFinalReward
|
||
data.lastTierRewardsInfo = activity.lastFinalReward
|
||
else
|
||
data.haveWeekReward = false
|
||
data.rankRange = rankRange * 100
|
||
data.rewardId = rewardId
|
||
data.lastTierRewardsInfo = activity.lastFinalReward
|
||
end
|
||
--投票累计奖励展示
|
||
data.rewardsInfo = {}
|
||
if activity.totalReward == nil or next(activity.totalReward) == nil then
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContest" , activityThemeId )
|
||
local voteReward = cfgOneWeekly.voteReward
|
||
for k, v in pairs( voteReward ) do
|
||
local rewardInfo = skynet.server.common:Split( v ,"_" )
|
||
rewardInfo[1] = tonumber(rewardInfo[1])
|
||
rewardInfo[2] = tonumber(rewardInfo[2])
|
||
local rewardResult = {}
|
||
rewardResult.rewardId = rewardInfo[1]
|
||
rewardResult.rewardsInfo = {}
|
||
local finalReward = player:RewardShow( rewardInfo[2] )
|
||
if finalReward ~= nil or next(finalReward) ~= nil then
|
||
rewardResult.rewardsInfo = finalReward
|
||
end
|
||
table.insert(data.rewardsInfo,rewardResult)
|
||
end
|
||
activity.totalReward = {}
|
||
activity.totalReward = data.rewardsInfo
|
||
else
|
||
data.rewardsInfo = activity.totalReward
|
||
end
|
||
--排名奖励展示
|
||
data.tierRewardsInfo = {}
|
||
if activity.tierReward == nil or next(activity.tierReward) == nil then
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContest" , activityThemeId )
|
||
local rankReward = cfgOneWeekly.rankReward
|
||
for k, v in pairs( rankReward ) do
|
||
local rewardId = tonumber(v)
|
||
local rewardResult = {}
|
||
rewardResult.rewardId = tonumber(cfgOneWeekly.rankRange[k]) * 100
|
||
rewardResult.rewardsInfo = {}
|
||
local finalReward = player:RewardShow( rewardId )
|
||
if finalReward ~= nil or next(finalReward) ~= nil then
|
||
rewardResult.rewardsInfo = finalReward
|
||
end
|
||
table.insert(data.tierRewardsInfo,rewardResult)
|
||
end
|
||
activity.tierReward = {}
|
||
activity.tierReward = data.tierRewardsInfo
|
||
else
|
||
data.tierRewardsInfo = activity.tierReward
|
||
end
|
||
end
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekShow")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekShow", data))
|
||
end
|
||
|
||
--主动领取结算奖励
|
||
function ActivityDecoWeek:GetWeekReward( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekGetWeekReward", c2sData.data ))
|
||
local data = {}
|
||
data.finalRewardInfo = {}
|
||
--获取玩家当前待领取的奖励id
|
||
local myParentId = player.gameData.partner.id
|
||
local detail = skynet.server.personal:GetMulDetail( myParentId , "decoWeekLastRewardId" ,"decoWeekLastRewardCanGet")
|
||
local rewardId = detail[1] or 0
|
||
local rewardCanGet = detail[2] or false
|
||
--如果未领取状态则发对应奖励,并更新状态
|
||
if rewardId ~= 0 and rewardCanGet then
|
||
--发奖逻辑
|
||
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_143")
|
||
local _,finalReward = player:GiveReward( rewardId , eventId )
|
||
if finalReward ~= nil and next(finalReward) ~= nil then
|
||
data.finalRewardInfo = finalReward
|
||
end
|
||
--发完奖励更新奖励领取状态
|
||
skynet.server.personal:SetDetail( myParentId , "decoWeekLastRewardCanGet" , false )
|
||
--处理离线消息
|
||
local redisKey = string.format( redisKeyUrl.GameServerPersonalOfflineMsgList , myParentId )
|
||
local allOfflineMsg = skynet.server.redis:lrange( redisKey , 0 , -1)
|
||
local curThemeId,activityStatus = self:GetCurActivityInfo()
|
||
for k, jsonData in pairs( allOfflineMsg ) do
|
||
local msgData = json:decode( jsonData )
|
||
local data = msgData.data
|
||
if dataType.OfflineMsgType_ActivityDecoRankId == msgData.type then
|
||
local activityThemeId = data.activityThemeId or 0
|
||
if activityThemeId ~= nil and activityThemeId ~= 0 and activityThemeId ~= "" and self.ActivityStatus_Balance ~= activityStatus and activityThemeId == curThemeId - 1 then
|
||
skynet.server.redis:lrem(redisKey,1,jsonData)
|
||
break
|
||
elseif activityThemeId ~= nil and activityThemeId ~= 0 and activityThemeId ~= "" and self.ActivityStatus_Balance == activityStatus and activityThemeId == curThemeId then
|
||
skynet.server.redis:lrem(redisKey,1,jsonData)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
data.isSuc = true
|
||
data.rewardId = rewardId
|
||
else
|
||
data.isSuc = false
|
||
data.rewardId = 0
|
||
end
|
||
|
||
--清除红点
|
||
skynet.server.msgTips:ReduceAll( player , 122 )
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekGetWeekReward")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekGetWeekReward", data))
|
||
end
|
||
|
||
--主题装修周设计投稿
|
||
function ActivityDecoWeek:DesignSubmit( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekDesignSubmit", c2sData.data ))
|
||
local data = {}
|
||
|
||
local extensionName = c2sData.data.extensionName
|
||
local binaryData = c2sData.data.binaryData
|
||
local todayGain = player.gameData.todayGain
|
||
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
|
||
local activityThemeId , activityStatus, stageStartTime , stageEndTime = self:GetCurActivityInfo()
|
||
if activity.designCount >= self.ActivityMaxDesignCount then --每期最多上传5次
|
||
s2cData.code = errorInfo.ErrorCode.MaxLimit
|
||
elseif "jpg" ~= string.lower(extensionName) then
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
elseif self.ActivityStatus_Join ~= activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
elseif skynet.server.bag:GetGoodsStat( player , dataType.GoodsType_Furniture ) < cfgSValue.weeklyContestCondition then
|
||
s2cData.code = errorInfo.ErrorCode.FurnitureNotEnoughNoDesign
|
||
else
|
||
local myPartnerId = player.gameData.partner.id
|
||
|
||
if not activity.isSubmitDesign then
|
||
--本期第一次提交设计
|
||
activity.isSubmitDesign = true
|
||
table.insert( activity.joinThemes , activity.themeId )
|
||
else
|
||
--删除原来的设计图片
|
||
self:RemoveDesignFile( activityThemeId ,activity.designFileName)
|
||
skynet.server.msgTips:ReduceAll(player , 96)
|
||
end
|
||
|
||
--默认增加10曝光次数
|
||
local redisKey = redisKeyUrl.GameServerActivityDecoWeekNeedExpouseCountZSet
|
||
skynet.server.redis:zadd( redisKey , 10 , myPartnerId )
|
||
|
||
--平均曝光次数为0
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekAveExpouseCountZSet
|
||
skynet.server.redis:zadd( redisKey , 0 , myPartnerId )
|
||
|
||
--生成32位随机ID 自己的PartnerID(12位) + 20位随机码
|
||
activity.designFileName = string.format("%s_%d" , myPartnerId , activityThemeId )--myPartnerId..skynet.server.common:RandID(20)
|
||
|
||
--保存图片
|
||
local saveUrl,designOssUrl = self:SaveDesignFile( activityThemeId , activity.designFileName , binaryData )
|
||
|
||
--设置相关信息
|
||
activity.designCount = activity.designCount + 1
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
skynet.server.redis:zadd( redisKey , 0 , myPartnerId )
|
||
|
||
skynet.server.personal:SetDetail( myPartnerId , "decoWeekDesignTime" , skynet.GetTime() , "decoWeekDesignUrl" , saveUrl , "decoWeekDesignOssUrl" , designOssUrl )
|
||
skynet.server.redisCache:UpdatePersonalDetail( myPartnerId )
|
||
|
||
data.myDesignInfo = self:GetDesignInfo( myPartnerId , activityThemeId , activityStatus , stageStartTime , stageEndTime)
|
||
data.surplusDesignCount = self.ActivityMaxDesignCount - activity.designCount
|
||
log.debug(string.format("玩家 %d 装修周赛 提交设计 文件名 %s Url %s", player.userId , activity.designFileName , saveUrl))
|
||
end
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekDesignSubmit")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekDesignSubmit", data))
|
||
end
|
||
|
||
--主题装修周星芒商城显示
|
||
function ActivityDecoWeek:StoreShow( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekStoreShow", c2sData.data ))
|
||
local data = {}
|
||
data.shopInfos = {}
|
||
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
if self.ActivityStatus_No == activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
--获取当期星芒商城
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContest" , activityThemeId )
|
||
local contestShopContent = cfgOneWeekly.contestShopContent
|
||
for k1, v1 in pairs( contestShopContent ) do
|
||
--获取商城里的售卖信息
|
||
local cfgOneContestShop = skynet.server.gameConfig:GetCurCfg( "WeeklyContestShop" , v1 )
|
||
local furnitureStuff = cfgOneContestShop.furnitureStuff
|
||
local decorationStuff = cfgOneContestShop.decorationStuff
|
||
local sellGoods = {}
|
||
for k2, v2 in pairs( furnitureStuff ) do
|
||
--遍历该套装下的所有家具
|
||
local buyCount = 0
|
||
if player:IsBuyGoods( dataType.GoodsType_Furniture , v2 ) then
|
||
buyCount = 1
|
||
end
|
||
table.insert( sellGoods , { id = v2 , buyCount = buyCount , type = dataType.GoodsType_Furniture })
|
||
end
|
||
|
||
for k2, v2 in pairs( decorationStuff ) do
|
||
--遍历该套装下的所有装修
|
||
local buyCount = 0
|
||
if player:IsBuyGoods( dataType.GoodsType_Decorate , v2 ) then
|
||
buyCount = 1
|
||
end
|
||
table.insert( sellGoods , { id = v2 , buyCount = buyCount , type = dataType.GoodsType_Decorate })
|
||
end
|
||
table.insert( data.shopInfos , { suitId = v1 , sellGoods = sellGoods })
|
||
end
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekStoreShow")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekStoreShow", data))
|
||
end
|
||
|
||
--主题装修周星芒商城购买
|
||
function ActivityDecoWeek:StoreBuy( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekStoreBuy", c2sData.data ))
|
||
local data = {}
|
||
data.buyGoods = {}
|
||
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
local buySuitId = c2sData.data.buySuitId
|
||
local buyGoods = c2sData.data.buyGoods
|
||
local goodsId = buyGoods.id
|
||
local goodsCount = buyGoods.buyCount
|
||
local goodsType = buyGoods.type
|
||
|
||
if buySuitId <= 0 or goodsId <= 0 and goodsCount <= 0 and goodsType <= 0 then
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
elseif self.ActivityStatus_No == activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContestShop" , buySuitId )
|
||
if not cfgOneWeekly then
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
else
|
||
local stuff = {}
|
||
local startCoin = 0
|
||
|
||
if dataType.GoodsType_Furniture == goodsType then
|
||
stuff = cfgOneWeekly.furnitureStuff
|
||
startCoin = cfgOneWeekly.furnitureStarCoin
|
||
elseif dataType.GoodsType_Decorate == goodsType then
|
||
stuff = cfgOneWeekly.decorationStuff
|
||
startCoin = cfgOneWeekly.decorationStarCoin
|
||
end
|
||
|
||
--根据配置获取当前期售卖的东西
|
||
for k, v in pairs( stuff ) do
|
||
if goodsId == v then
|
||
if not skynet.server.bag:RemoveGoods( player , dataType.GoodsType_Prop , self.StartCoinId , startCoin[ k ] * goodsCount ) then
|
||
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
|
||
else
|
||
--正常发货
|
||
skynet.server.bag:AddGoods(player, goodsType , goodsId, goodsCount )
|
||
data.buySuitId = buySuitId
|
||
data.buyGoods = { id = goodsId , buyCount = goodsCount , type = goodsType }
|
||
end
|
||
break
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekStoreBuy")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekStoreBuy", data))
|
||
end
|
||
|
||
--主题装修周往期热门设计展示
|
||
function ActivityDecoWeek:HotDesignShow( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekHotDesignShow", c2sData.data ))
|
||
local data = {}
|
||
data.designInfos = {}
|
||
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
if self.ActivityStatus_No == activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
local redisKey = redisKeyUrl.GameServerActivityDecoWeekTopDesignList
|
||
local queryData = skynet.server.redis:lrange( redisKey , 0 , -1 )
|
||
for k, v in pairs( queryData ) do
|
||
table.insert( data.designInfos , json:decode( v ) )
|
||
end
|
||
end
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekHotDesignShow")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekHotDesignShow", data))
|
||
end
|
||
|
||
--主题装修周投票展示
|
||
function ActivityDecoWeek:VoteShow( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekVoteShow", c2sData.data ))
|
||
local data = {}
|
||
data.voteInfos = {}
|
||
|
||
local activityThemeId,activityStatus,stageStartTime,stageEndTime = self:GetCurActivityInfo()
|
||
if self.ActivityStatus_Vote ~= activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
activity.nowShowVoteInfos = {}
|
||
local randLowIndex = math.random( 1 , 2 ) --随机索引1,2为高价值
|
||
local voteInfo = nil
|
||
for i = 1, 2, 1 do
|
||
if randLowIndex == i then
|
||
voteInfo = self:GetNextVoteInfo( player , activityThemeId , activityStatus , stageStartTime , stageEndTime , true )
|
||
else
|
||
voteInfo = self:GetNextVoteInfo( player , activityThemeId , activityStatus , stageStartTime , stageEndTime , false )
|
||
end
|
||
|
||
if voteInfo then
|
||
table.insert( data.voteInfos , voteInfo )
|
||
end
|
||
end
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekVoteShow")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekVoteShow", data))
|
||
end
|
||
|
||
--主题装修周购买投票券
|
||
function ActivityDecoWeek:BuyVote( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekBuyVote", c2sData.data ))
|
||
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
||
local todayGain = player.gameData.todayGain
|
||
local data = {}
|
||
--获取当前背包中投票券数量如果已经达到储存上限则不可继续购买
|
||
local voteCount = skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30);
|
||
if voteCount >= cfgSValue.weeklyContestVoteMax then
|
||
s2cData.code = errorInfo.ErrorCode.MaxLimit
|
||
else
|
||
local buyCount = todayGain.weeklyDesignBuyVoteCount
|
||
local curDiscount = 1
|
||
local weeklyContestVoteBuyDiscount = cfgSValue.weeklyContestVoteBuyDiscount
|
||
--计算当前折扣
|
||
for k , v in pairs(weeklyContestVoteBuyDiscount) do
|
||
local arr = skynet.server.common:Split(v , "_")
|
||
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
|
||
if buyCount < arr[1] then
|
||
curDiscount = arr[2]
|
||
break
|
||
end
|
||
end
|
||
local price = cfgSValue.weeklyContestVoteCost * curDiscount
|
||
-- 消耗玩家蜗壳币
|
||
local eventId = pb.enum("EnumMoneyChangeEventID", "EventID_131")
|
||
local isSuc = player:MoneyChange(pb.enum("EnumGoodsType", "VoluteCoin"), -price, eventId)
|
||
--成功购买
|
||
if isSuc then
|
||
todayGain.weeklyDesignBuyVoteCount = todayGain.weeklyDesignBuyVoteCount + 1
|
||
buyCount = todayGain.weeklyDesignBuyVoteCount
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, 1)
|
||
local weeklyContestBuyVoteReward = cfgSValue.weeklyContestBuyVoteReward
|
||
--判断是否需要发放购买的额外奖励
|
||
for k , v in pairs(weeklyContestBuyVoteReward) do
|
||
local arr = skynet.server.common:Split(v , "_")
|
||
arr[1],arr[2] = tonumber(arr[1]),tonumber(arr[2])
|
||
if buyCount <= arr[1] then
|
||
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_132")
|
||
player:GiveReward(arr[2] , eventId , 1)
|
||
data.rewardId = arr[2]
|
||
break
|
||
end
|
||
end
|
||
else
|
||
s2cData.code = errorInfo.ErrorCode.VoluteNotEnough
|
||
end
|
||
data.isSuc = isSuc
|
||
data.todayBuyVoteCount = buyCount
|
||
end
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekBuyVote")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekBuyVote", data))
|
||
end
|
||
|
||
|
||
--主题装修周投票
|
||
function ActivityDecoWeek:Vote( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekVote", c2sData.data ))
|
||
local data = {}
|
||
local myParentId = player.gameData.partner.id
|
||
local byPartnerId = c2sData.data.partnerId --被投票者
|
||
local todayGain = player.gameData.todayGain
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
||
local activityThemeId,activityStatus,stageStartTime,stageEndTime = self:GetCurActivityInfo()
|
||
|
||
if "" == byPartnerId or #byPartnerId > 12 or byPartnerId == myParentId then
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
elseif skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) <= 0 then --检查投票券数量
|
||
s2cData.code = errorInfo.ErrorCode.NoEnoughProp
|
||
elseif self.ActivityStatus_Vote ~= activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
elseif not self:IsExistSignPlayer( activityThemeId , byPartnerId , activity.nowShowVoteInfos ) then --检查玩家是否本期设计过
|
||
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
||
else
|
||
local addScore = 1 --需要增加分数
|
||
local redisKey = ""
|
||
if self:IsNpc( byPartnerId) then
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
else
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
|
||
--投票介入
|
||
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
||
local tmpRedisKey = redisKeyUrl.GameServerActivityDecoWeekHumanVoteAdjustScoreZSet
|
||
skynet.server.redis:zincrby( tmpRedisKey , 1 , byPartnerId )
|
||
local adjustScore = tonumber(skynet.server.redis:zscore( tmpRedisKey , byPartnerId )) or 0 --获取被投票者的最新调整分数
|
||
if adjustScore >= cfgSValue.weeklyContestVoteReward[1] then
|
||
--调整分数满足,就多给玩家一些投票数量
|
||
addScore =addScore + cfgSValue.weeklyContestVoteReward[2]
|
||
skynet.server.redis:zrem( tmpRedisKey , byPartnerId )
|
||
end
|
||
end
|
||
|
||
--成功投票加1分
|
||
todayGain.weekDesignVoteCount = todayGain.weekDesignVoteCount + 1
|
||
activity.weekVoteCount = activity.weekVoteCount + 1
|
||
--如果进入调节阶段则不统计投票
|
||
if not self:IsVoteAdjust(activityStatus,stageEndTime) then
|
||
skynet.server.redis:zincrby( redisKey , addScore , byPartnerId )
|
||
end
|
||
skynet.server.taskListEvent:Modify( player , 116 , 1)
|
||
--统计所有投票分数,不包括NPC
|
||
if not self:IsNpc( byPartnerId) then
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekInfoHash )
|
||
skynet.server.redis:hincrby( redisKey , "allVoteScore" , addScore )
|
||
end
|
||
|
||
table.insert( activity.historyVotes , byPartnerId )
|
||
|
||
data.todayVoteCount = todayGain.weekDesignVoteCount
|
||
data.weekVoteCount = activity.weekVoteCount
|
||
|
||
activity.nowShowVoteInfos = {}
|
||
data.voteInfos = {}
|
||
local randLowIndex = math.random( 1 , 2 ) --随机索引1和2为高价值
|
||
local voteInfo = nil
|
||
for i = 1, 2, 1 do
|
||
if randLowIndex == i then
|
||
voteInfo = self:GetNextVoteInfo( player , activityThemeId , activityStatus , stageStartTime , stageEndTime , true )
|
||
else
|
||
voteInfo = self:GetNextVoteInfo( player , activityThemeId , activityStatus , stageStartTime , stageEndTime , false )
|
||
end
|
||
|
||
if voteInfo then
|
||
table.insert( data.voteInfos , voteInfo )
|
||
end
|
||
end
|
||
--测试用,记得注释掉
|
||
--skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 30, 7)
|
||
--消耗一张投票券
|
||
skynet.server.bag:RemoveGoods(player, dataType.GoodsType_Prop, 30, 1)
|
||
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) == 0 or activity.getAllWeekReward then
|
||
skynet.server.msgTips:ReduceAll(player , 98)
|
||
end
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekVote")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekVote", data))
|
||
end
|
||
|
||
--主题装修周往期热门设计展示
|
||
function ActivityDecoWeek:VoteRewardGet( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekVoteRewardGet", c2sData.data ))
|
||
local data = {}
|
||
local rewardId = c2sData.data.rewardId
|
||
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
if self.ActivityStatus_No == activityStatus then
|
||
s2cData.code = errorInfo.ErrorCode.InvaildOpForCurActivityStatus
|
||
else
|
||
local isGain = false
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
for k, v in pairs( activity.rewardIds ) do
|
||
if rewardId == v then
|
||
--已经领取过该奖励
|
||
isGain = true
|
||
break
|
||
end
|
||
end
|
||
|
||
if isGain then
|
||
s2cData.code = errorInfo.ErrorCode.AlreadyGet
|
||
else
|
||
--未领取过该奖励
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContest" , activityThemeId )
|
||
local voteReward = cfgOneWeekly.voteReward
|
||
for k, v in pairs( voteReward ) do
|
||
local rewardInfo = skynet.server.common:Split( v ,"_" )
|
||
rewardInfo[1] = tonumber(rewardInfo[1])
|
||
rewardInfo[2] = tonumber(rewardInfo[2])
|
||
if rewardId == rewardInfo[1] and rewardId <= activity.weekVoteCount then
|
||
data.finalRewardInfo = {}
|
||
data.gainRewardId = rewardInfo[2]
|
||
isGain = true
|
||
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_103")
|
||
local _,finalReward = player:GiveReward( rewardInfo[2] , eventId )
|
||
if finalReward ~= nil and next(finalReward) ~= nil then
|
||
data.finalRewardInfo = finalReward
|
||
end
|
||
table.insert( activity.rewardIds ,rewardInfo[1] )
|
||
skynet.server.msgTips:ReduceAll(player , 97)
|
||
log.debug(string.format("玩家 %d 装修周赛 奖励ID %d 福利ID %d", player.userId , rewardInfo[1] , rewardInfo[2]))
|
||
break
|
||
end
|
||
end
|
||
|
||
if not isGain then
|
||
--未找到该奖励的ID
|
||
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
||
end
|
||
end
|
||
data.rewardIds = activity.rewardIds
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekVoteRewardGet")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekVoteRewardGet", data))
|
||
end
|
||
|
||
--主题装修周个人投稿展示
|
||
function ActivityDecoWeek:MyDesignShow( player , c2sData , s2cData )
|
||
c2sData.data = assert(pb.decode("C2SActivityDecoWeekMyDesignShow", c2sData.data ))
|
||
local myParentId = player.gameData.partner.id
|
||
local data = {}
|
||
data.myDesignInfo = {}
|
||
|
||
local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue" )
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
for i = 1, 100, 1 do
|
||
local info = {}
|
||
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , i )
|
||
if skynet.server.redis:exists( redisKey) then
|
||
info.score = skynet.server.redis:zscore( redisKey , myParentId ) or 0
|
||
info.score = info.score * cfgSValue.weeklyContestHeatValue
|
||
info.themeId = i
|
||
table.insert( data.myDesignInfo , info)
|
||
end
|
||
|
||
if i >= activityThemeId then
|
||
break
|
||
end
|
||
end
|
||
|
||
s2cData.cmd = pb.enum("MsgType","CMD_S2C_ActivityDecoWeekMyDesignShow")
|
||
s2cData.data = assert(pb.encode("S2CActivityDecoWeekMyDesignShow", data))
|
||
end
|
||
|
||
--获取当前活动信息
|
||
function ActivityDecoWeek:GetCurActivityInfo()
|
||
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekInfoHash )
|
||
local activityInfo = skynet.server.redis:hmget( redisKey , "activityThemeId" , "activityStatus", "stageStartTime" , "stageEndTime" )
|
||
activityInfo = redisKeyUrl:CovertValue(activityInfo)
|
||
local activityThemeId = activityInfo[1] or 0
|
||
local activityStatus = activityInfo[2] or 0
|
||
local stageStartTime = activityInfo[3] or 0
|
||
local stageEndTime = activityInfo[4] or 0
|
||
return tonumber(activityThemeId) , tonumber(activityStatus) , tonumber(stageStartTime) , tonumber(stageEndTime)
|
||
end
|
||
|
||
--获取主题装修周设计信息
|
||
function ActivityDecoWeek:GetDesignInfo( myParentId , activityThemeId , activityStatus , stageStartTime , stageEndTime)
|
||
local data = {}
|
||
local redisKey = nil
|
||
if self:IsNpc( myParentId) then
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
local designTime = skynet.server.personal:GetCurDetail( myParentId , "decoWeekDesignTime")
|
||
if 0 == designTime then
|
||
--NPC没有设计时间
|
||
if self.ActivityStatus_Join == activityStatus then
|
||
--在设计阶段被人刷出来了,就给NPC随机个时间,范围从阶段开始到目前
|
||
local diffTime = skynet.GetTime() - stageStartTime
|
||
if diffTime <= 0 then
|
||
diffTime = math.random(1 , 36000)
|
||
end
|
||
skynet.server.personal:SetDetail( myParentId ,"decoWeekDesignTime", stageStartTime + math.random(1 , diffTime))
|
||
end
|
||
end
|
||
else
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
end
|
||
|
||
local curDetail = skynet.server.redisCache:GetPersonalDetail( myParentId ) --获取个人详细信息
|
||
if curDetail then
|
||
local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue")
|
||
local myScore = tonumber(skynet.server.redis:zscore( redisKey , myParentId ) or 0 ) * cfgSValue.weeklyContestHeatValue
|
||
data.themeId = activityThemeId
|
||
data.partnerId = myParentId
|
||
data.nickName = curDetail.nickName
|
||
data.score = myScore
|
||
|
||
if skynet.server.gameConfig:IsOnline() then
|
||
data.designUrl = curDetail.decoWeekDesignOssUrl
|
||
else
|
||
data.designUrl = curDetail.decoWeekDesignUrl
|
||
end
|
||
|
||
data.designTime = curDetail.decoWeekDesignTime
|
||
end
|
||
return data
|
||
end
|
||
|
||
--移除设计文件
|
||
function ActivityDecoWeek:RemoveDesignFile( activityThemeId , fileName )
|
||
local gameName = skynet.server.gameConfig.GameName
|
||
if skynet.server.gameConfig:IsTest() then
|
||
gameName = gameName.."_Test"
|
||
end
|
||
local filePath = string.format("../upload/%s/Images/ActivityDecoWeek/%d" , gameName , activityThemeId )
|
||
filePath = string.format("%s/%s.%s" , filePath , fileName , "jpg" )
|
||
os.execute("rm -rf ".. filePath)
|
||
end
|
||
|
||
--保存设计文件
|
||
function ActivityDecoWeek:SaveDesignFile( activityThemeId , fileName , binaryData )
|
||
local gameName = skynet.server.gameConfig.GameName
|
||
if skynet.server.gameConfig:IsTest() then
|
||
gameName = gameName.."_Test"
|
||
end
|
||
local filePath = string.format("../upload/%s/Images/ActivityDecoWeek/%d" , gameName , activityThemeId )
|
||
if not skynet.server.common:IsExistFolder( filePath ) then
|
||
--不存在文件夹就创建文件夹
|
||
os.execute("mkdir -p ".. filePath)
|
||
end
|
||
|
||
--写入二进制文件
|
||
filePath = string.format("%s/%s.%s" , filePath , fileName , "jpg" )
|
||
skynet.server.common:WriteBinaryFileData( filePath , binaryData )
|
||
|
||
--组装URL
|
||
local designUrl = ""
|
||
local designOssUrl = ""
|
||
local newDesignUrl = string.format("%s/Images/ActivityDecoWeek/%d" , gameName , activityThemeId )
|
||
if skynet.server.gameConfig:IsOnline() then
|
||
local cfgBasicConfig = skynet.server.gameConfig:GetAllCfg( "BasicConfig" )
|
||
|
||
designUrl = string.format("https://%s/%s/%s.jpg" , cfgBasicConfig.domain , newDesignUrl , fileName )
|
||
designOssUrl = string.format("https://%s/%s/%s.jpg" , cfgBasicConfig.ossUrl , newDesignUrl , fileName )
|
||
else
|
||
designUrl = string.format("http://%s/%s/%s.jpg" , skynet.externalIp , newDesignUrl , fileName)
|
||
end
|
||
return designUrl , designOssUrl
|
||
end
|
||
|
||
--是否存在设计玩家
|
||
function ActivityDecoWeek:IsExistSignPlayer( activityThemeId , partnerId , nowShowVoteInfos )
|
||
local isExistVote = skynet.server.common:IsExist( partnerId , nowShowVoteInfos )
|
||
if not isExistVote then
|
||
return false
|
||
end
|
||
|
||
local redisKey = ""
|
||
if self:IsNpc( partnerId) then
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
else
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
end
|
||
|
||
local isDesign = skynet.server.redis:zrank( redisKey , partnerId )
|
||
if isDesign then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
--获取下一个投票信息
|
||
function ActivityDecoWeek:GetNextVoteInfo( player , activityThemeId , activityStatus , stageStartTime , stageEndTime , isHighValue )
|
||
local canVotePartnerIds = {}
|
||
local myPartnerId = player.gameData.partner.id
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
local historyShowVotes = activity.historyShowVotes --历史显示的投票信息
|
||
local nowShowVoteInfos = activity.nowShowVoteInfos --当前自己展示的投票信息
|
||
local isAveMode = false
|
||
|
||
--将自己的好友ID传进到历史投票里,自己不能给自己投
|
||
if not skynet.server.common:IsExist( myPartnerId , historyShowVotes ) then
|
||
table.insert( historyShowVotes , myPartnerId)
|
||
end
|
||
|
||
--遍历所有热门信息
|
||
local function QueryCanVote()
|
||
local redisKey = redisKeyUrl.GameServerActivityDecoWeekNeedExpouseCountZSet
|
||
|
||
if skynet.server.gameConfig:IsTest() then
|
||
local testData = skynet.server.redis:zrevrange( redisKey , 0 , -1 , "withscores" )
|
||
log.info("周赛 获取需要曝光数据" , skynet.server.common:TableToString(testData))
|
||
log.info("周赛 获取自己历史的数据" , skynet.server.common:TableToString(historyShowVotes))
|
||
log.info("周赛 是否高价值" , isHighValue)
|
||
log.info("周赛 自己的ID" , myPartnerId)
|
||
end
|
||
|
||
local redisData = {}
|
||
if isHighValue then
|
||
--如果是高价值,先找出10分以上的5个玩家,按降序来排
|
||
redisData = skynet.server.redis:zrevrangebyscore( redisKey , "+inf" , 11 , "limit" , 0 , 5 )
|
||
else
|
||
--如果是低价值,就找出10分以下并且1分以上的5个玩家,按降序来排
|
||
redisData = skynet.server.redis:zrevrangebyscore( redisKey , 10 , 1 , "limit" , 0 , 5 )
|
||
end
|
||
|
||
if skynet.server.gameConfig:IsTest() then
|
||
log.info("周赛 第一次获取5个玩家数据 " , skynet.server.common:TableToString(redisData))
|
||
end
|
||
|
||
if 0 == #redisData then
|
||
if isHighValue then
|
||
--如果高价值玩家没有,就找5个从高到低的玩家
|
||
redisData = skynet.server.redis:zrevrangebyscore( redisKey , "+inf" , 1 , "limit" , 0 , 5 )
|
||
else
|
||
--如果低价值玩家没有,就找5个从低到高的玩家
|
||
redisData = skynet.server.redis:zrangebyscore( redisKey , 1 , "+inf" , "limit" , 0 , 5 )
|
||
end
|
||
end
|
||
|
||
if skynet.server.gameConfig:IsTest() then
|
||
log.info("周赛 第二次获取5个玩家数据 " , skynet.server.common:TableToString(redisData))
|
||
end
|
||
|
||
if 0 == #redisData then
|
||
--所有玩家都没有展示次数了,就采用平均曝光模式
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekAveExpouseCountZSet
|
||
redisData = skynet.server.redis:zrange( redisKey , 0 , 4 ) --先找出5个平均曝光次数最少的玩家
|
||
isAveMode = true
|
||
|
||
if skynet.server.gameConfig:IsTest() then
|
||
local testData = skynet.server.redis:zrevrange( redisKey , 0 , -1 , "withscores" )
|
||
log.info("周赛 获取所有平均曝光数据" , skynet.server.common:TableToString(testData))
|
||
end
|
||
end
|
||
|
||
--对找到的玩家,只要不是自己,不是历史出现过,不是当前正在显示的,就加进来
|
||
for k, v in pairs( redisData ) do
|
||
if v ~= myPartnerId and not skynet.server.common:IsExist( v , historyShowVotes ) and not skynet.server.common:IsExist( v , nowShowVoteInfos ) then
|
||
table.insert( canVotePartnerIds , v)
|
||
end
|
||
end
|
||
|
||
if skynet.server.gameConfig:IsTest() then
|
||
log.info("周赛 最后获得的数据" , skynet.server.common:TableToString(canVotePartnerIds))
|
||
end
|
||
end
|
||
|
||
QueryCanVote()
|
||
local count = #canVotePartnerIds
|
||
if 0 == count then
|
||
--清除下历史投票,再来找。
|
||
historyShowVotes = {}
|
||
QueryCanVote()
|
||
end
|
||
|
||
count = #canVotePartnerIds
|
||
if 0 == count then
|
||
--没有一个玩家,那就获取NPC的数据
|
||
local redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
local queryData = skynet.server.redis:zrange( redisKey , 0 , -1 , "withscores" )
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
for partnerId , score in pairs( queryData ) do
|
||
if not skynet.server.common:IsExist( partnerId , nowShowVoteInfos ) then
|
||
table.insert( canVotePartnerIds , partnerId )
|
||
end
|
||
end
|
||
|
||
count = #canVotePartnerIds
|
||
if count > 0 then
|
||
--如果有NPC数据,就随机选一个
|
||
local randIndex = math.random( 1 , count )
|
||
local npcPartnerId = canVotePartnerIds[ randIndex ]
|
||
canVotePartnerIds = {}
|
||
table.insert( canVotePartnerIds , npcPartnerId )
|
||
log.debug("周赛 最后获得NPC的数据" , npcPartnerId)
|
||
end
|
||
end
|
||
|
||
count = #canVotePartnerIds
|
||
if 0 == count then
|
||
return nil
|
||
else
|
||
--local noVotePartnerId = canVotePartnerIds[ 1 ]
|
||
local randIndex = math.random( 1 , count ) --之前是取的第一个投票玩家,现在改成随机一个投票的玩家
|
||
local noVotePartnerId = canVotePartnerIds[ randIndex ]
|
||
local noVoteInfo = self:GetDesignInfo( noVotePartnerId , activityThemeId , activityStatus , stageStartTime , stageEndTime )
|
||
if noVoteInfo then
|
||
table.insert( historyShowVotes , noVotePartnerId)
|
||
table.insert( nowShowVoteInfos , noVotePartnerId )
|
||
|
||
if not self:IsNpc( noVotePartnerId ) then
|
||
--增加所有曝光次数
|
||
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekInfoHash )
|
||
skynet.server.redis:hincrby( redisKey , "allExposureCount" , 1 )
|
||
|
||
if not isAveMode then
|
||
--还有剩余曝光次数,就减少1次
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNeedExpouseCountZSet
|
||
skynet.server.redis:zincrby( redisKey , -1 , noVotePartnerId )
|
||
else
|
||
--开始平均曝光,增加1次
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekAveExpouseCountZSet
|
||
skynet.server.redis:zincrby( redisKey , 1 , noVotePartnerId )
|
||
end
|
||
end
|
||
end
|
||
return noVoteInfo
|
||
end
|
||
end
|
||
|
||
--获取热门的投票信息
|
||
function ActivityDecoWeek:GetHotVoteInfo( activityThemeId , activityStatus , stageStartTime , stageEndTime , historyShowHotDesigns )
|
||
local canShowPartnerIds = {}
|
||
local function QueryHotDesign()
|
||
--遍历所有热门信息,过滤掉我已经投票的玩家
|
||
for k, v in pairs( self.highScoreDesigns ) do
|
||
if not skynet.server.common:IsExist( v.partnerId , historyShowHotDesigns ) then
|
||
table.insert( canShowPartnerIds , v.partnerId )
|
||
end
|
||
end
|
||
end
|
||
|
||
QueryHotDesign()
|
||
local count = #canShowPartnerIds
|
||
if 0 == count then
|
||
historyShowHotDesigns = {} --清空历史显示再查询
|
||
QueryHotDesign()
|
||
end
|
||
|
||
count = #canShowPartnerIds
|
||
if 0 == count then
|
||
--没有一个玩家,那就获取NPC的数据
|
||
local redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
local queryData = skynet.server.redis:zrevrange( redisKey , 0 , self.HotDesignMaxCount , "withscores" )
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
for partnerId , score in pairs( queryData ) do
|
||
if not skynet.server.common:IsExist( partnerId , historyShowHotDesigns ) then
|
||
table.insert( canShowPartnerIds , partnerId )
|
||
table.insert( historyShowHotDesigns , partnerId)
|
||
break
|
||
end
|
||
end
|
||
end
|
||
|
||
local showVoteInfos = {}
|
||
local randList = skynet.server.common:RandNoRepeatItem( 1 , canShowPartnerIds )
|
||
for k, partnerId in pairs( randList ) do
|
||
table.insert( historyShowHotDesigns , partnerId)
|
||
showVoteInfos = self:GetDesignInfo( partnerId , activityThemeId , activityStatus , stageStartTime , stageEndTime )
|
||
break
|
||
end
|
||
|
||
return showVoteInfos
|
||
end
|
||
|
||
--检查有不有消息提示
|
||
function ActivityDecoWeek:CheckMsgTips( player , activityThemeId , activityStatus )
|
||
if 0 == activityThemeId or 0 == activityStatus then
|
||
return
|
||
end
|
||
|
||
skynet.server.msgTips:Reset(player , 96)
|
||
skynet.server.msgTips:Reset(player , 97)
|
||
skynet.server.msgTips:Reset(player , 98)
|
||
skynet.server.msgTips:Reset(player , 122)
|
||
|
||
--周赛投稿已开启红点
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
if self.ActivityStatus_Join == activityStatus and not activity.isSubmitDesign then
|
||
skynet.server.msgTips:Add( player , 96 )
|
||
end
|
||
|
||
--周赛奖励可领取时
|
||
local cfgOneWeekly = skynet.server.gameConfig:GetCurCfg( "WeeklyContest" , activityThemeId )
|
||
local voteReward = cfgOneWeekly.voteReward
|
||
for k, v in pairs( voteReward ) do
|
||
local rewardInfo = skynet.server.common:Split( v ,"_" )
|
||
rewardInfo[1] = tonumber(rewardInfo[1])
|
||
|
||
--如果满足奖励并且没有领取就发红点
|
||
local isExistReward = skynet.server.common:IsExist( rewardInfo[1] , activity.rewardIds )
|
||
if not isExistReward and activity.weekVoteCount >= rewardInfo[1] then
|
||
skynet.server.msgTips:Add( player , 97 )
|
||
break
|
||
elseif isExistReward and k == #voteReward then
|
||
activity.getAllWeekReward = true
|
||
end
|
||
end
|
||
|
||
--周赛有剩余投票次数可使用且周投票进度未满
|
||
if self.ActivityStatus_Vote == activityStatus and not activity.getAllWeekReward and skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30)>0 then
|
||
skynet.server.msgTips:Add( player , 98 )
|
||
end
|
||
|
||
--有未领取的结算奖励添加红点
|
||
local myParentId = player.gameData.partner.id
|
||
local detail = skynet.server.personal:GetDetail( myParentId , "decoWeekLastRewardId")
|
||
local rewardId = detail or 0
|
||
if rewardId ~= 0 then
|
||
skynet.server.msgTips:Add( player , 122 )
|
||
end
|
||
end
|
||
|
||
--是否投票调节阶段(投票阶段结束前30分钟停止投票计分)
|
||
function ActivityDecoWeek:IsVoteAdjust( activityStatus , stageEndTime )
|
||
if self.ActivityStatus_Vote == activityStatus and stageEndTime - skynet.GetTime() <= 1800 then
|
||
--如果投票阶段还剩半小时小时就进入调节状态
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
--是否为NPC
|
||
function ActivityDecoWeek:IsNpc( partnerId )
|
||
if string.find( partnerId , "Npc_") then
|
||
return true
|
||
end
|
||
return false
|
||
end
|
||
|
||
--解锁系统后立刻执行的逻辑
|
||
function ActivityDecoWeek:UnlockSystemFunc(player)
|
||
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityDecoWeek ) then
|
||
return
|
||
end
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
if activityStatus == self.ActivityStatus_Vote and not activity and not player.gameData.todayGain.weeklyDesignFreeVote then
|
||
self:LoginInitData(player)
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, 5)
|
||
skynet.server.msgTips:Add( player , 98 )
|
||
player.gameData.todayGain.weeklyDesignFreeVote = true
|
||
end
|
||
end
|
||
|
||
--免费投票券发放逻辑
|
||
function ActivityDecoWeek:GetFreeVote( player )
|
||
|
||
if not player:IsUnlockSystem( dataType.UnlockSystem_ActivityDecoWeek ) then
|
||
return
|
||
end
|
||
if player.gameData.todayGain.weeklyDesignFreeVote then
|
||
return
|
||
end
|
||
|
||
|
||
local activity = player.gameData.activity[ self.ActivityType ]
|
||
local activityThemeId,activityStatus,stageStartTime = self:GetCurActivityInfo()
|
||
|
||
if activityStatus == self.ActivityStatus_Vote then
|
||
--防止跳时间登陆数据有误
|
||
if activity.themeId ~= activityThemeId then
|
||
self:LoginInitData( player )
|
||
end
|
||
|
||
--要补发投票阶段开始后玩家漏掉登陆的天数对应的投票券 加一秒处理0点会计算出0的情况
|
||
local lastDay = math.ceil(( player.basicInfo.lastLoginTime - stageStartTime + 1 ) /3600/24 )
|
||
local toDay = math.ceil(( skynet.GetTime() - stageStartTime + 1 ) /3600/24 )
|
||
if lastDay < 0 then
|
||
lastDay = 0
|
||
elseif lastDay == 0 then
|
||
lastDay = 1
|
||
end
|
||
local count = (toDay - lastDay) * 5
|
||
if count <= 0 then
|
||
count = 5
|
||
end
|
||
|
||
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) < 0 then
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, -skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30))
|
||
end
|
||
|
||
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
||
if count + skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) > cfgSValue.weeklyContestVoteMax then
|
||
count = cfgSValue.weeklyContestVoteMax - skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30)
|
||
end
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, count)
|
||
skynet.server.msgTips:Add( player , 98 )
|
||
player.gameData.todayGain.weeklyDesignFreeVote = true
|
||
local data = {}
|
||
data.voteNum = count
|
||
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_ActivityDecoWeekFreeVote" , data )
|
||
elseif activityStatus ~= self.ActivityStatus_Vote and skynet.server.common:GetDayInWeek() == 1 then --周一零点可能出现周赛服和游戏服时间不同步的问题这里做单独处理
|
||
--防止跳时间登陆数据有误
|
||
if activity.themeId ~= activityThemeId then
|
||
self:LoginInitData( player )
|
||
end
|
||
|
||
if skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30) < 0 then
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, -skynet.server.bag:GetGoodsCount(player, dataType.GoodsType_Prop, 30))
|
||
end
|
||
|
||
skynet.server.bag:AddGoods(player, dataType.GoodsType_Prop, 30, 5)
|
||
skynet.server.msgTips:Add( player , 98 )
|
||
player.gameData.todayGain.weeklyDesignFreeVote = true
|
||
local data = {}
|
||
data.voteNum = 5
|
||
skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_ActivityDecoWeekFreeVote" , data )
|
||
end
|
||
end
|
||
|
||
--[[
|
||
--同步设计数据(废弃)
|
||
function ActivityDecoWeek:SyncHotDesignListOld()
|
||
local activityThemeId,activityStatus = self:GetCurActivityInfo()
|
||
|
||
--获取设计详情
|
||
local function GetDesignDetail( queryData )
|
||
local listDesigns = {}
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
for partnerId , score in pairs( queryData ) do
|
||
table.insert( listDesigns , { partnerId = partnerId , score = score })
|
||
end
|
||
return listDesigns
|
||
end
|
||
|
||
--获取设计数据
|
||
local function GetDesignData( isHighScoreDesign )
|
||
local redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekInfoHash )
|
||
local allVoteScore = skynet.server.redis:hget( redisKey , "allVoteScore" ) or 0 --所有投票分数
|
||
|
||
redisKey = string.format( redisKeyUrl.GameServerActivityDecoWeekHumanVoteScoreZSet , activityThemeId )
|
||
local designCount = skynet.server.redis:zcard( redisKey ) --获取设计数量
|
||
|
||
if 0 == designCount then
|
||
--如果没有设计信息就用NPC数据
|
||
redisKey = redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet
|
||
designCount = skynet.server.redis:zcard( redisKey )
|
||
end
|
||
|
||
local queryData = nil
|
||
if isHighScoreDesign then
|
||
--热门数据
|
||
local cfgSValue = skynet.server.gameConfig:GetAllCfg( "SValue" )
|
||
local hotRange = math.ceil(cfgSValue.heatWeeklyContestWork * designCount)
|
||
queryData = skynet.server.redis:zrevrange( redisKey , 0 , hotRange , "withscores" ) --每次获取50个高分数据
|
||
self.highScoreDesigns = GetDesignDetail( queryData )
|
||
else
|
||
local allAveVoteScore = 0
|
||
if designCount > 0 then
|
||
allAveVoteScore = math.floor( allVoteScore / designCount ) --所有平均投票分数
|
||
end
|
||
|
||
if 0 == allAveVoteScore then
|
||
--由于没有平均分,就获取50个最低分的数据
|
||
self.lowScoreArea = {}
|
||
self.highScoreArea = {}
|
||
queryData = skynet.server.redis:zrange( redisKey , 0 , self.RefreshDesignMaxCount , "withscores" )
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
local isSingleNum = true --是否单数
|
||
for partnerId, score in pairs( queryData ) do
|
||
if isSingleNum then
|
||
isSingleNum = false
|
||
table.insert( self.lowScoreArea , { partnerId = partnerId , score = score })
|
||
else
|
||
isSingleNum = true
|
||
table.insert( self.highScoreArea , { partnerId = partnerId , score = score })
|
||
end
|
||
end
|
||
else
|
||
--根据平均投票分数划分低分区和高分区
|
||
queryData = skynet.server.redis:zrangebyscore( redisKey , 0 , allAveVoteScore , "withscores", "limit" , self.lowScoreOffset , self.RefreshDesignMaxCount )
|
||
if #queryData > 0 then
|
||
--成功获取数据,就增加偏移量
|
||
self.lowScoreOffset = self.lowScoreOffset + self.RefreshDesignMaxCount
|
||
else
|
||
--未获取数据,就偏移量归0,并重新获取
|
||
self.lowScoreOffset = 0
|
||
queryData = skynet.server.redis:zrangebyscore( redisKey , 0 , allAveVoteScore , "withscores", "limit" , self.lowScoreOffset , self.RefreshDesignMaxCount )
|
||
end
|
||
self.lowScoreArea = GetDesignDetail( queryData )
|
||
|
||
queryData = skynet.server.redis:zrangebyscore( redisKey , allAveVoteScore + 1 , 99999999 , "withscores", "limit" , self.highScoreOffset , self.RefreshDesignMaxCount )
|
||
if #queryData > 0 then
|
||
--成功获取数据,就增加偏移量
|
||
self.highScoreOffset = self.highScoreOffset + self.RefreshDesignMaxCount
|
||
else
|
||
--未获取数据,就偏移量归0,并重新获取
|
||
self.highScoreOffset = 0
|
||
queryData = skynet.server.redis:zrangebyscore( redisKey , allAveVoteScore + 1 , 99999999 , "withscores", "limit" , self.highScoreOffset , self.RefreshDesignMaxCount )
|
||
end
|
||
self.highScoreArea = GetDesignDetail( queryData )
|
||
end
|
||
|
||
--如果玩家设计数量小于10,加入NPC的设计进来,方便测试时,玩家设计的数量比较少的情况
|
||
--[[
|
||
if designCount <= 10 then
|
||
queryData = skynet.server.redis:zrange( redisKeyUrl.GameServerActivityDecoWeekNpcVoteScoreZSet , 0 , self.RefreshDesignMaxCount , "withscores" )
|
||
queryData = redisKeyUrl:CovertTable(queryData)
|
||
local isSingleNum = true --是否单数
|
||
for partnerId, score in pairs( queryData ) do
|
||
if isSingleNum then
|
||
isSingleNum = false
|
||
table.insert( self.lowScoreArea , { partnerId = partnerId , score = score })
|
||
else
|
||
isSingleNum = true
|
||
table.insert( self.highScoreArea , { partnerId = partnerId , score = score })
|
||
end
|
||
end
|
||
end
|
||
end
|
||
end
|
||
|
||
if self.ActivityStatus_No == activityStatus then
|
||
return
|
||
elseif self.ActivityStatus_Vote == activityStatus then
|
||
GetDesignData( false )
|
||
end
|
||
|
||
--获取热门数据
|
||
GetDesignData( true )
|
||
end
|
||
]]
|
||
skynet.server.activityDecoWeek = ActivityDecoWeek
|
||
return ActivityDecoWeek |