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

187 lines
8.0 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 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