HomeServer/Server/AllServer/GameServer/Group/GroupRank.lua

187 lines
8.0 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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