local skynet = require "skynet" local oo = require "Class" local pb = require "pb" local log = require "Log" local json =require "json" local errorInfo = require "ErrorInfo" local dataType = require "DataType" local redisKeyUrl = require "RedisKeyUrl" local group = require "Group" local GroupRank = oo.class(group) --家园显示排行榜 function GroupRank:ShowRank( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SGroupShowRank", c2sData.data )) local data = {} local myPartnerId = player.gameData.partner.id local groupId = self:GetGroupID( player ) local redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId ) data.ranks = {} data.isHaveReward = false --获取排行榜数据 local rankList = skynet.server.redis:zrange( redisKey , 0 , -1 , "withscores") rankList = redisKeyUrl:CovertTable( rankList ) rankList = self:SortRank( rankList ) local curRankId = 0 local rankInfo = {} local prevScore = 0 --前一个人 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") for k , v in pairs( rankList ) do --只有达到了周贡献进排行榜标准值才能进行排名统计 local isRank = false if v.score >= cfgSValue.communityRankValue then isRank = true if 0 == prevScore or v.score ~= prevScore then curRankId = curRankId + 1 prevScore = v.score end end local curDetail = skynet.server.personal:GetDetail( v.partnerId ) local rankInfo = {} if not isRank then rankInfo.rankId = 0 else rankInfo.rankId = curRankId end rankInfo.partnerId = v.partnerId rankInfo.nickName = curDetail.nickName rankInfo.headId = curDetail.headId --自定义头像 if rankInfo.headId == 0 and curDetail.DIYHeadInfo ~=nil then rankInfo.DIYHeadInfo = curDetail.DIYHeadInfo end rankInfo.headFrameID = curDetail.headFrameId rankInfo.contributionScore = v.score table.insert( data.ranks , rankInfo ) --如果自己排名在1~12并且未领取奖励 if v.partnerId == myPartnerId and curDetail.groupRandId >= 1 and curDetail.groupRandId <= 12 then data.isHaveReward = true end end self:CheckRankStatus( player , groupId ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupShowRank") s2cData.data = assert(pb.encode("S2CGroupShowRank", data)) end --家园排行榜奖励领取 function GroupRank:GetReward( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SGroupRankGetReward", c2sData.data )) local data = {} local myPartnerId = player.gameData.partner.id local curDetail = skynet.server.personal:GetDetail( myPartnerId ) local groupId = curDetail.groupId if not self:IsVaildParam( "groupId" , groupId ) then s2cData.code = errorInfo.ErrorCode.NoGroupMember else local rankId = curDetail.groupRandId if not rankId or rankId <=0 or rankId > 12 then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else --开始根据排行榜领取奖励 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local rankRewardIds = cfgSValue.communityRankReward local curRewardId = 0 if 1 == rankId then curRewardId = rankRewardIds[1] elseif 2 == rankId then curRewardId = rankRewardIds[2] elseif 3 == rankId then curRewardId = rankRewardIds[3] elseif rankId >= 4 and rankId <= 6 then curRewardId = rankRewardIds[4] elseif rankId >= 7 and rankId <= 12 then curRewardId = rankRewardIds[5] end --发放奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_73") player:GiveReward( curRewardId , eventId) skynet.server.personal:SetDetail( myPartnerId , "groupRandId" , 0 ) skynet.server.msgTips:ReduceAll( player , 39 ) data.rewardId = curRewardId end end s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupRankGetReward") s2cData.data = assert(pb.encode("S2CGroupRankGetReward", data)) end --家园检查排行榜状态 function GroupRank:CheckRankStatus( player , groupId ) local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId ) local redisData = skynet.server.redis:hmget( redisKey , "rankStatus" , "nexRankStatusTime") --当前时间大于状态改变时间 if skynet.GetTime() >= tonumber(redisData[2]) then --清空贡献分数 local function ClearContributionScore() redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId ) local parentIds = skynet.server.redis:zrange( redisKey , 0 , -1 ) for k, parentId in pairs(parentIds) do skynet.server.redis:zadd( redisKey , 0 , parentId ) end end if self.RankStatus_Acc == tonumber(redisData[1]) then --累加状态 --获取上一轮的贡献分数 local redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId ) local rankList = skynet.server.redis:zrevrange( redisKey , 0 , -1 , "withscores") rankList = redisKeyUrl:CovertTable( rankList ) rankList = self:SortRank( rankList ) --获取排行榜的奖励信息 local curRankId = 0 local rankInfo = {} local prevScore = 0 --前一个人 local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") for k, v in pairs( rankList ) do --只有达到了周贡献进排行榜标准值才能进行排名统计 if v.score >= cfgSValue.communityRankValue then --上一个分数为0或者上一个分数与当前分数不相等才进行排名累加 if 0 == prevScore or v.score ~= prevScore then curRankId = curRankId + 1 prevScore = v.score end skynet.server.personal:SetDetail( v.partnerId , "groupRandId" , curRankId ) if curRankId >= 1 and curRankId <= 12 then skynet.server.partner:SendMsgTips( v.partnerId , 39 , true ) end end end elseif self.RankStatus_Calc == tonumber(redisData[1]) then --结算状态 ClearContributionScore() end --设置下一轮的状态和时间 local nextRankStatus , nexRankStatusTime = self:CalcRankStatusAndTime() --计算排行榜状态和时间 --如果当前是累加状态,并且下一个状态还是累加,说明该群未在周日20点后触发状态切换,这里就直接清空贡献分数 if self.RankStatus_Acc == tonumber(redisData[1]) and self.RankStatus_Acc == nextRankStatus then ClearContributionScore() end redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId ) skynet.server.redis:hmset( redisKey , "rankStatus", nextRankStatus , "nexRankStatusTime", nexRankStatusTime) local myPartnerId = player.gameData.partner.id skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_109 , groupId , myPartnerId , nextRankStatus , nexRankStatusTime ) end end --家园获取排行榜状态 function GroupRank:GetRankStatus( player ) local groupId = self:GetGroupID( player ) local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId ) return tonumber(skynet.server.redis:hget( redisKey , "rankStatus")) end skynet.server.groupRank = GroupRank return GroupRank