1244 lines
57 KiB
Lua
1244 lines
57 KiB
Lua
|
|
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 GroupManage = oo.class(group)
|
|||
|
|
|
|||
|
|
GroupManage.ShowType_JoinList = 1 --加入列表
|
|||
|
|
GroupManage.ShowType_GroupInfo = 2 --家园信息
|
|||
|
|
|
|||
|
|
GroupManage.JoinType_Freedom = 1 --自由加入
|
|||
|
|
GroupManage.JoinType_Audit = 2 --审批加入
|
|||
|
|
|
|||
|
|
GroupManage.QueryType_Recommond = 1 --家园推荐
|
|||
|
|
GroupManage.QueryType_ID = 2 --家园ID查询
|
|||
|
|
GroupManage.QueryType_NickName = 3 --家园昵称查询
|
|||
|
|
|
|||
|
|
GroupManage.ShowGroupMaxCount = 6 --显示家园最大数量
|
|||
|
|
|
|||
|
|
GroupManage.MaxGetGroupCount = 100 --最大获取在线家园数量
|
|||
|
|
GroupManage.RefreshGroupInterval = 3600 --刷新群信息间隔时间
|
|||
|
|
--[[
|
|||
|
|
{"group",
|
|||
|
|
{
|
|||
|
|
{"isAdd", false , "是否加入家园" } ,
|
|||
|
|
{"data", {} , "消息提示数据" } ,
|
|||
|
|
{"reward", {} , "红点奖励" } ,
|
|||
|
|
} ,
|
|||
|
|
"消息提示" } ,
|
|||
|
|
]]
|
|||
|
|
|
|||
|
|
--[[
|
|||
|
|
GroupManage
|
|||
|
|
家园ID , 家园名称、家园宣言、家园徽章、加入家园方式(自由加入和审批加入)、加入等级限制
|
|||
|
|
]]
|
|||
|
|
|
|||
|
|
function GroupManage:Init()
|
|||
|
|
skynet.server.timer:Add( dataType.Timer_SyncGroupList , self.RefreshGroupInterval , self["SyncGroupList"] , self )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--同步群数据
|
|||
|
|
function GroupManage:SyncGroupList()
|
|||
|
|
local redisKey = redisKeyUrl.GameServerGroupAllZSet
|
|||
|
|
local queryData = skynet.server.redis:zrevrange( redisKey , 0, self.MaxGetGroupCount -1 )
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( nil , "SValue")
|
|||
|
|
local outOfTime = ( cfgSValue.friendChatSave ) * 3600 --好友聊天内容有效期
|
|||
|
|
local curTime = skynet.GetTime()
|
|||
|
|
self.onlineGroupList = {}
|
|||
|
|
|
|||
|
|
--根据找到的数据获取详情
|
|||
|
|
for k, v in pairs( queryData ) do
|
|||
|
|
local curInfo = self:GetGroup( v )
|
|||
|
|
if curInfo and curInfo.memberCount < cfgSValue.communityNum then
|
|||
|
|
table.insert( self.onlineGroupList , curInfo)
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--需要清理聊天记录
|
|||
|
|
if curInfo and curInfo.cleanChatMsgTime and curTime >= curInfo.cleanChatMsgTime then
|
|||
|
|
local groupId = curInfo.id
|
|||
|
|
local msgKey = string.format( redisKeyUrl.GameServerGroupMsgRecordZSet , groupId )
|
|||
|
|
local msgList = skynet.server.redis:zrange( msgKey , 0 , -1 ) --将聊天记录全部取出
|
|||
|
|
local tmpMsg = nil
|
|||
|
|
local startPos,endPos = 0,0 --过期消息的开始位置和结束位置
|
|||
|
|
for k, v in pairs( msgList ) do
|
|||
|
|
tmpMsg = json:decode( v )
|
|||
|
|
if curTime >= tonumber(tmpMsg.updateTime) + outOfTime then
|
|||
|
|
if 0 == startPos then
|
|||
|
|
--记录开始和结束位置
|
|||
|
|
startPos = tmpMsg.msgId
|
|||
|
|
endPos = tmpMsg.msgId
|
|||
|
|
elseif 0 ~= startPos then
|
|||
|
|
--记录结束位置
|
|||
|
|
endPos = tmpMsg.msgId
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if 0 ~= startPos then
|
|||
|
|
--删除所有过期数据
|
|||
|
|
skynet.server.redis:zremrangebyscore( msgKey , startPos , endPos)
|
|||
|
|
self:SetGroupInfo( groupId , "cleanChatMsgTime" , curTime + outOfTime )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园显示
|
|||
|
|
function GroupManage:Show( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupShow", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = curDetail.groupId
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "groupId" , myGroupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoGroupMember
|
|||
|
|
else
|
|||
|
|
data.groupInfo = self:GetGroupAllInfo( player )
|
|||
|
|
|
|||
|
|
--发放别人赠送的材料
|
|||
|
|
local needGoods = json:decode(curDetail.groupNeedGoods or "{}")
|
|||
|
|
for k, v in pairs( needGoods ) do
|
|||
|
|
skynet.server.bag:AddGoods( player , v.goodsType , v.goodsId , v.goodsCount )
|
|||
|
|
player.gameData.group.helpCount = player.gameData.group.helpCount + 1
|
|||
|
|
end
|
|||
|
|
local needCount = #needGoods
|
|||
|
|
if needCount >= 1 then
|
|||
|
|
--互助次数统计到整个家园上面
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , myGroupId )
|
|||
|
|
skynet.server.redis:hincrby( redisKey , "helpCount" , needCount )
|
|||
|
|
|
|||
|
|
skynet.server.personal:SetDetail( myPartnerId ,"groupNeedGoods", "{}" )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--修改群的最新活跃时间
|
|||
|
|
local redisKey = redisKeyUrl.GameServerGroupAllZSet
|
|||
|
|
skynet.server.redis:zadd( redisKey , skynet.GetTime() , myGroupId )
|
|||
|
|
|
|||
|
|
--检查福利是否能获得
|
|||
|
|
self:CheckContributeReward( player , myGroupId )
|
|||
|
|
|
|||
|
|
skynet.server.levelTask:Modify( player , 89 , 1 )
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 89 , 1 )
|
|||
|
|
skynet.server.msgTips:ReduceAll(player , 65 )
|
|||
|
|
end
|
|||
|
|
data.groupInfo.member.birthdayDate=player.gameData.personal.birthday.birthdayDate
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupShow")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupShow", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园创建
|
|||
|
|
function GroupManage:Create( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupCreate", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local nexJoinTime = cfgSValue.communityReEnterTime * 3600 --下一次加入时间
|
|||
|
|
|
|||
|
|
local curPartner = player.gameData.partner
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( curPartner.id )
|
|||
|
|
local groupId = curDetail.groupId
|
|||
|
|
|
|||
|
|
local name = c2sData.data.name
|
|||
|
|
local declaration = c2sData.data.declaration
|
|||
|
|
local badgeId = c2sData.data.badgeId
|
|||
|
|
local joinType = c2sData.data.joinType
|
|||
|
|
local minJoinLevel = c2sData.data.minJoinLevel
|
|||
|
|
local myLevel = player.gameData.level
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "groupName" , name ) or not self:IsVaildParam( "declaration" , declaration ) or not self:IsVaildParam( "badgeId" , badgeId )
|
|||
|
|
or not self:IsVaildParam( "joinType" , joinType ) or not self:IsVaildParam( "minJoinLevel" , minJoinLevel ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif skynet.server.common:IsMaskWords( name ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
|
|||
|
|
elseif skynet.server.common:IsMaskWords( declaration ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
|
|||
|
|
elseif not player:GetSwitch( dataType.SwitchType_GainGarden ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoUnlockGarden
|
|||
|
|
elseif "" ~= groupId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyExistGroup
|
|||
|
|
elseif myLevel < cfgSValue.communityUnlockLvl then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.LevelLimit
|
|||
|
|
elseif skynet.GetTime() < tonumber(curDetail.groupExitTime) + nexJoinTime then
|
|||
|
|
--退出时间冻结期,无法加入
|
|||
|
|
local hour = math.ceil(((tonumber(curDetail.groupExitTime) + nexJoinTime) - skynet.GetTime()) / 3600)
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExistGroupFreezeTime
|
|||
|
|
s2cData.desc = string.format(errorInfo.ErrorMsg[ s2cData.code ] , hour )
|
|||
|
|
else
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_43")
|
|||
|
|
if not player:MoneyChange( dataType.MoneyType_Coin , -cfgSValue.communityCreate , eventId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoEnoughMoney
|
|||
|
|
else
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local whileCount = 0
|
|||
|
|
--开始创建家园
|
|||
|
|
while true do
|
|||
|
|
whileCount = whileCount + 1
|
|||
|
|
if whileCount >= 100 then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.OPFailed
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
local groupId = skynet.server.common:RandIDNoIAndL( 10 ) --生成10位随机ID
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
if not skynet.server.redis:exists( redisKey ) then
|
|||
|
|
--计算排行榜状态和时间
|
|||
|
|
local rankStatus , nexRankStatusTime = self:CalcRankStatusAndTime()
|
|||
|
|
local nextRewardTime = self:CalcContributeRewardTime()
|
|||
|
|
|
|||
|
|
--扣除金币
|
|||
|
|
skynet.server.redis:hmset( redisKey , --初始化家园信息
|
|||
|
|
"id" , groupId ,
|
|||
|
|
"name" , name , --家园名称
|
|||
|
|
"declaration" , declaration , --家园宣言
|
|||
|
|
"badgeId" , badgeId , --徽章ID
|
|||
|
|
"joinType" , joinType , --加入类型
|
|||
|
|
"minJoinLevel" , minJoinLevel, --最小加入等级
|
|||
|
|
"memberCount", 0, --成员数量
|
|||
|
|
"leader" , myPartnerId , --园长
|
|||
|
|
"viceLeader1" , "" , --副园长1
|
|||
|
|
"viceLeader2" , "", --副园长2
|
|||
|
|
"communityLevel",1 , --社区等级
|
|||
|
|
"communityExp",0 , --社区经验
|
|||
|
|
"contributeScore",0, --所有人的贡献分数
|
|||
|
|
"contributeReward",0, --福利奖励
|
|||
|
|
"nextContributeRewardTime", nextRewardTime , --下一次福利时间
|
|||
|
|
"rankStatus", rankStatus , --排行榜状态
|
|||
|
|
"nexRankStatusTime", nexRankStatusTime , --排行榜下一个状态时间
|
|||
|
|
"createTime", skynet.GetTime() , --创建时间
|
|||
|
|
"cleanChatMsgTime", skynet.GetTime() --清理聊天消息的时间
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_100 , groupId , myPartnerId , name , declaration , badgeId , joinType , minJoinLevel )
|
|||
|
|
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_109 , groupId , myPartnerId , rankStatus , nexRankStatusTime )
|
|||
|
|
--添加到家园集合
|
|||
|
|
local redisKey = redisKeyUrl.GameServerGroupAllZSet
|
|||
|
|
skynet.server.redis:zadd( redisKey , skynet.GetTime() , groupId )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupPublicPlot, groupId )
|
|||
|
|
local arch = { }
|
|||
|
|
--读取家园建筑表
|
|||
|
|
local cfgAllCommunityArch = skynet.server.gameConfig:GetPlayerAllCfg( player , "CommunityArch")
|
|||
|
|
local cacheArch = {}
|
|||
|
|
local isExist = false
|
|||
|
|
--初始化地图列表 建筑类型 1-公园 2-集市 3-图书馆 4-甜品店 5-地面 --修改Tag
|
|||
|
|
for k, v in pairs( cfgAllCommunityArch ) do
|
|||
|
|
if v.optionName ~= nil and v.optionName ~= 0 and v.optionName ~= "" then
|
|||
|
|
if next(cacheArch) == nil then
|
|||
|
|
table.insert(cacheArch,{ optionName = v.optionName , type = v.archPlace })
|
|||
|
|
else
|
|||
|
|
for i, v1 in pairs(cacheArch) do
|
|||
|
|
if v1.optionName == v.optionName then
|
|||
|
|
isExist = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
if not isExist then
|
|||
|
|
table.insert(cacheArch,{ optionName = v.optionName , type = v.archPlace })
|
|||
|
|
end
|
|||
|
|
isExist = false
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
for k, v in ipairs(cacheArch) do
|
|||
|
|
if k <= 4 then
|
|||
|
|
arch = { type = v.type , progress = 0 , level = 1 , styleId = 1 , optionName = v.optionName , isShow = true }
|
|||
|
|
else
|
|||
|
|
arch = { type = v.type , progress = 0 , level = 0 , styleId = 0 , optionName = v.optionName , isShow = false }
|
|||
|
|
end
|
|||
|
|
skynet.server.redis:rpush( redisKey , json:encode(arch))
|
|||
|
|
end
|
|||
|
|
--路面类型单独处理
|
|||
|
|
arch = { type = 5 , progress = 0 , level = 0 , styleId = 41 , optionName = "RoadType" , isShow = true }
|
|||
|
|
skynet.server.redis:rpush( redisKey , json:encode(arch))
|
|||
|
|
|
|||
|
|
--初始化地图列表 建筑类型 1-公园 2-集市 3-图书馆 4-甜品店
|
|||
|
|
--local arch1 = { type = 1 , progress = 0 , level = 1 , styleId = 1 }
|
|||
|
|
--local arch2 = { type = 2 , progress = 0 , level = 1 , styleId = 1 }
|
|||
|
|
--local arch3 = { type = 3 , progress = 0 , level = 1 , styleId = 1 }
|
|||
|
|
--local arch4 = { type = 4 , progress = 0 , level = 1 , styleId = 1 }
|
|||
|
|
--
|
|||
|
|
--skynet.server.redis:rpush( redisKey , json:encode(arch1) , json:encode(arch2), json:encode(arch3), json:encode(arch4))
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupPrivatePlot, groupId )
|
|||
|
|
local plotInfos = {}
|
|||
|
|
for i = 1, self.MaxMapCount, 1 do
|
|||
|
|
plotInfos[ i ] = json:encode({ plotId = i , partnerId = "" , archs = {}})
|
|||
|
|
end
|
|||
|
|
skynet.server.redis:rpush( redisKey , plotInfos[ 1 ] , plotInfos[ 2 ] , plotInfos[ 3 ] , plotInfos[ 4 ] , plotInfos[ 5 ] , plotInfos[ 6 ] ,
|
|||
|
|
plotInfos[ 7 ] , plotInfos[ 8 ] , plotInfos[ 9 ] , plotInfos[ 10 ] , plotInfos[ 11 ] , plotInfos[ 12 ])
|
|||
|
|
|
|||
|
|
--添加成员
|
|||
|
|
self:AddMember( player , groupId , myPartnerId , self.IdentityType_Leader )
|
|||
|
|
|
|||
|
|
--同步群信息
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Create , true )
|
|||
|
|
|
|||
|
|
data.groupInfo = self:GetGroupAllInfo( player )
|
|||
|
|
log.debug(string.format("玩家 %d 家园 成功创建 家园ID %s 伙伴ID %s ", player.userId , groupId , myPartnerId))
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupCreate")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupCreate", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园加入
|
|||
|
|
function GroupManage:Join( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupJoin", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local curPartner = player.gameData.partner
|
|||
|
|
local myPartnerId = curPartner.id
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = curDetail.groupId
|
|||
|
|
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local nexJoinTime = cfgSValue.communityReEnterTime * 3600 --下一次加入时间
|
|||
|
|
local communityNum = cfgSValue.communityNum --最大加入人数
|
|||
|
|
|
|||
|
|
local groupId = c2sData.data.groupId
|
|||
|
|
local curGroup = self:GetGroup( groupId )
|
|||
|
|
local myLevel = player.gameData.level
|
|||
|
|
|
|||
|
|
if "" ~= myGroupId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyExistGroup
|
|||
|
|
elseif not player:GetSwitch( dataType.SwitchType_GainGarden ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoUnlockGarden
|
|||
|
|
elseif not self:IsExistGroup( groupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif curGroup.memberCount >= communityNum then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.MaxLimit
|
|||
|
|
elseif skynet.GetTime() < tonumber(curDetail.groupExitTime) + nexJoinTime then
|
|||
|
|
local hour = math.ceil(((tonumber(curDetail.groupExitTime) + nexJoinTime) - skynet.GetTime()) / 3600)
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExistGroupFreezeTime
|
|||
|
|
s2cData.desc = string.format(errorInfo.ErrorMsg[ s2cData.code ] , hour )
|
|||
|
|
elseif myLevel < cfgSValue.communityUnlockLvl or myLevel < curGroup.minJoinLevel then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.LevelLimit
|
|||
|
|
else
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
|
|||
|
|
if not curGroup then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
else
|
|||
|
|
data.joinType = curGroup.joinType
|
|||
|
|
|
|||
|
|
if self.JoinType_Freedom == curGroup.joinType then
|
|||
|
|
self:AddMember( player , groupId , myPartnerId , self.IdentityType_Member )
|
|||
|
|
data.groupInfo = self:GetGroupAllInfo( player )
|
|||
|
|
skynet.server.levelTask:Modify( player , 89 , 1 )
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 89 , 1 )
|
|||
|
|
self:ResetAllMsgTips( myPartnerId )
|
|||
|
|
log.debug(string.format("玩家 %d 家园 直接加入 家园ID %s 伙伴ID %s ", player.userId , groupId , curPartner.id))
|
|||
|
|
elseif self.JoinType_Audit == curGroup.joinType then
|
|||
|
|
--skynet.server.redis:multi()
|
|||
|
|
--玩家申请加入
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupUserApplyJoinZSet , groupId )
|
|||
|
|
if nil ~= skynet.server.redis:zrank( redisKey , curPartner.id ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyApply
|
|||
|
|
else
|
|||
|
|
--未申请的才能申请
|
|||
|
|
skynet.server.redis:zadd( redisKey , skynet.GetTime() , curPartner.id )
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupMyApplyJoinZSet , curPartner.id )
|
|||
|
|
skynet.server.redis:zadd( redisKey , skynet.GetTime() , groupId )
|
|||
|
|
|
|||
|
|
--给3位领导发红点信息
|
|||
|
|
if "" ~= curGroup.leader then
|
|||
|
|
skynet.server.partner:SendMsgTips( curGroup.leader , 60 , true )
|
|||
|
|
end
|
|||
|
|
if "" ~= curGroup.viceLeader1 then
|
|||
|
|
skynet.server.partner:SendMsgTips( curGroup.viceLeader1 , 60 , true )
|
|||
|
|
end
|
|||
|
|
if "" ~= curGroup.viceLeader2 then
|
|||
|
|
skynet.server.partner:SendMsgTips( curGroup.viceLeader2 , 60 , true )
|
|||
|
|
end
|
|||
|
|
data.groupInfo = {}
|
|||
|
|
log.debug(string.format("玩家 %d 家园 申请加入 家园ID %s 伙伴ID %s ", player.userId , groupId , curPartner.id))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Update , true )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupJoin")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupJoin", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园退出
|
|||
|
|
function GroupManage:Quit( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupQuit", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local curPartner = player.gameData.partner
|
|||
|
|
local myPartnerId = curPartner.id
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local groupId = curDetail.groupId
|
|||
|
|
local groupPlotId = curDetail.groupPlotId
|
|||
|
|
local cmd = c2sData.cmd
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "groupId" , groupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoGroupMember
|
|||
|
|
elseif player:IsMsgTooFast( cmd ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.RequestMsgTooFast
|
|||
|
|
else
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
if not skynet.server.redis:exists( redisKey) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoExistGroup
|
|||
|
|
else
|
|||
|
|
skynet.server.personal:SetDetail( myPartnerId , "groupExitTime" , skynet.GetTime())
|
|||
|
|
|
|||
|
|
if errorInfo.Suc == s2cData.code then
|
|||
|
|
--副园长和成员继续走退出流程
|
|||
|
|
self:DeleteMember( player.userId , groupId , myPartnerId , groupPlotId )
|
|||
|
|
log.debug(string.format("玩家 %d 家园 申请退出 家园ID %s 伙伴ID %s 身份类型 %d", player.userId , groupId , curPartner.id , curDetail.groupIdentityType))
|
|||
|
|
end
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Update , true )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupQuit")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupQuit", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园查询
|
|||
|
|
function GroupManage:Query( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupQuery", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
data.groupInfo = {}
|
|||
|
|
|
|||
|
|
local queryType = c2sData.data.queryType
|
|||
|
|
local queryValue = c2sData.data.queryValue
|
|||
|
|
|
|||
|
|
local curPartner = player.gameData.partner
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( curPartner.id )
|
|||
|
|
local groupId = queryValue
|
|||
|
|
if not queryType or queryType < self.QueryType_Recommond or queryType > self.QueryType_ID then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif self.QueryType_ID == queryType and not self:IsVaildParam( "groupId" , groupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoExistGroup
|
|||
|
|
else
|
|||
|
|
local redisKey = nil
|
|||
|
|
local myPlayerId = player.gameData.partner.id
|
|||
|
|
local groupList = {}
|
|||
|
|
if self.QueryType_Recommond == queryType then
|
|||
|
|
data.groupInfo = self:Recommond( player )
|
|||
|
|
elseif self.QueryType_ID == queryType and queryValue then
|
|||
|
|
table.insert( groupList , queryValue )
|
|||
|
|
elseif self.QueryType_NickName == queryType and queryValue then
|
|||
|
|
--[[
|
|||
|
|
redisKey = redisKeyUrl.GameServerGroupNickNameZSet
|
|||
|
|
local tmpQueryData = skynet.server.redis:zscan( redisKey ,0,"match" , string.format("*%s*",queyValue)) --根据关键字模糊查询相关昵称
|
|||
|
|
for k, v in pairs( tmpQueryData[2] ) do
|
|||
|
|
if 2 == k and myPlayerId ~= v then
|
|||
|
|
table.insert( groupList , v )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
]]
|
|||
|
|
else
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if self.QueryType_ID == queryType or self.QueryType_NickName == queryType then
|
|||
|
|
data.groupInfo = self:GroupJoinInfo( curPartner.id , groupList)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupQuery")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupQuery", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园更新信息(园长/副园长)
|
|||
|
|
function GroupManage:UpdateInfo( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupUpdateInfo", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local curGroup = player.gameData.group
|
|||
|
|
|
|||
|
|
local declaration = c2sData.data.declaration
|
|||
|
|
local badgeId = c2sData.data.badgeId
|
|||
|
|
local joinType = c2sData.data.joinType
|
|||
|
|
local minJoinLevel = c2sData.data.minJoinLevel
|
|||
|
|
|
|||
|
|
local partnerId = player.gameData.partner.id
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( partnerId )
|
|||
|
|
local groupId = curDetail.groupId
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "declaration" , declaration ) or not self:IsVaildParam( "badgeId" , badgeId ) or
|
|||
|
|
not self:IsVaildParam( "joinType" , joinType ) or not self:IsVaildParam( "minJoinLevel" , minJoinLevel )then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif not self:IsVaildParam( "groupId" , groupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoGroupMember
|
|||
|
|
elseif skynet.server.common:IsMaskWords( declaration ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExistMaskWords
|
|||
|
|
elseif not self:IsManage( partnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
else
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
skynet.server.redis:hmset( redisKey ,"declaration" , declaration , "badgeId" , badgeId ,"joinType" , joinType ,"minJoinLevel" , minJoinLevel)
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Update , true )
|
|||
|
|
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_102 , groupId , partnerId , declaration , badgeId , joinType , minJoinLevel )
|
|||
|
|
data.groupInfo = self:GetGroupAllInfo( player )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupUpdateInfo")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupUpdateInfo", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园家园改变身份(园长/副园长)
|
|||
|
|
function GroupManage:ChangeIdentity( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupChangeIdentity", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = myDetail.groupId
|
|||
|
|
|
|||
|
|
local toPartnerId = c2sData.data.partnerId
|
|||
|
|
local toIdentityType = c2sData.data.identityType
|
|||
|
|
|
|||
|
|
local toDetail = skynet.server.personal:GetDetail( toPartnerId )
|
|||
|
|
local toGroupId = toDetail.groupId
|
|||
|
|
if not toDetail or not self:IsVaildParam( "partnerId" , toPartnerId ) or not self:IsVaildParam( "identityType" , toIdentityType ) or myPartnerId == toPartnerId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif not self:IsLeader( myPartnerId ) then --只有园长才能把园长身份转给别人
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
elseif myGroupId ~= toGroupId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoGroupMember
|
|||
|
|
else
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , myGroupId )
|
|||
|
|
local viceIdentityInfo = skynet.server.redis:hmget( redisKey , "viceLeader1" , "viceLeader2")
|
|||
|
|
local viceCount = 0
|
|||
|
|
for k, v in pairs( viceIdentityInfo ) do
|
|||
|
|
if "" ~= v then
|
|||
|
|
viceCount = viceCount + 1
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if self.IdentityType_ViceLeader == toIdentityType and viceCount >= 2 then
|
|||
|
|
--设置副管理员数量大于2就不能再设了
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.MaxLimit
|
|||
|
|
else
|
|||
|
|
if self.IdentityType_ViceLeader == toDetail.groupIdentityType then --被转让的人如果是副园长,就清理标记
|
|||
|
|
for k, v in pairs( viceIdentityInfo ) do
|
|||
|
|
if 1 == k and toPartnerId == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader1" , "" )
|
|||
|
|
break
|
|||
|
|
elseif 2 == k and toPartnerId == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader2" , "" )
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if self.IdentityType_Leader == toIdentityType then --园长交换
|
|||
|
|
skynet.server.redis:hset( redisKey , "leader" , toPartnerId ) --将玩家设为园长
|
|||
|
|
skynet.server.personal:SetDetail( myPartnerId , "groupIdentityType" , self.IdentityType_Member ) --将自己身份改为成员
|
|||
|
|
skynet.server.personal:SetDetail( toPartnerId , "groupIdentityType" , self.IdentityType_Leader ) --将玩家身份改为园长
|
|||
|
|
elseif self.IdentityType_ViceLeader == toIdentityType then --园长指定副园长
|
|||
|
|
for k, v in pairs( viceIdentityInfo ) do
|
|||
|
|
--找个指定的空位安置副园长
|
|||
|
|
if 1 == k and "" == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader1" , toPartnerId )
|
|||
|
|
break
|
|||
|
|
elseif 2 == k and "" == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader2" , toPartnerId )
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
skynet.server.personal:SetDetail( toPartnerId , "groupIdentityType" , self.IdentityType_ViceLeader) --将玩家身份改为副园长
|
|||
|
|
elseif self.IdentityType_Member == toIdentityType then
|
|||
|
|
skynet.server.personal:SetDetail( toPartnerId , "groupIdentityType" , self.IdentityType_Member ) --将玩家身份改为园长
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_103 , myGroupId , myPartnerId , toPartnerId , toIdentityType )
|
|||
|
|
self:SyncOnlineGroupInfo( myGroupId , self.GroupOpType_Update , true )
|
|||
|
|
data.member = self:GetMember( myGroupId , myPartnerId )
|
|||
|
|
log.debug(string.format("玩家 %d 家园 成员 %s 指定成员类型 %d", player.userId , toPartnerId , toIdentityType ))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupChangeIdentity")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupChangeIdentity", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园请求加入的玩家列表(园长/副园长)
|
|||
|
|
function GroupManage:ApplyList( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupApplyList", 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
|
|||
|
|
elseif not self:IsManage( myPartnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
else
|
|||
|
|
data.partnerInfos = {}
|
|||
|
|
|
|||
|
|
local groupId = self:GetGroupID( player )
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupUserApplyJoinZSet , groupId )
|
|||
|
|
local partnerIds = skynet.server.redis:zrange( redisKey , 0 , -1 )
|
|||
|
|
for k , partnerId in pairs( partnerIds ) do
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( partnerId )
|
|||
|
|
if curDetail then
|
|||
|
|
table.insert( data.partnerInfos , curDetail )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--[[
|
|||
|
|
skynet.server.msgTips:Reduce(player , 60 )
|
|||
|
|
if #data.partnerInfos > 0 then
|
|||
|
|
skynet.server.msgTips:Add(player , 60 )
|
|||
|
|
end]]
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupApplyList")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupApplyList", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园审核(园长/副园长)
|
|||
|
|
function GroupManage:Audit( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupAudit", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local joinPartnerId = c2sData.data.partnerId
|
|||
|
|
local isAgree = c2sData.data.isAgree
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = myDetail.groupId
|
|||
|
|
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local nexJoinTime = cfgSValue.communityReEnterTime * 3600 --下一次加入时间
|
|||
|
|
local communityNum = cfgSValue.communityNum --最大加入人数
|
|||
|
|
local curGroup = self:GetGroup( myGroupId )
|
|||
|
|
local joinDetail = skynet.server.personal:GetDetail( joinPartnerId )
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "partnerId" , joinPartnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif not self:IsManage( myPartnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
elseif true == isAgree and curGroup.memberCount >= communityNum then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.MaxLimit
|
|||
|
|
elseif true == isAgree and skynet.GetTime() < tonumber(joinDetail.groupExitTime) + nexJoinTime then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ExitGroupOver24Hour
|
|||
|
|
else
|
|||
|
|
--从申请的列表中删除该玩家
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupMyApplyJoinZSet , joinPartnerId )
|
|||
|
|
skynet.server.redis:zrem( redisKey , myGroupId )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupUserApplyJoinZSet , myGroupId )
|
|||
|
|
skynet.server.redis:zrem( redisKey , joinPartnerId )
|
|||
|
|
|
|||
|
|
local joinGroupId = joinDetail.groupId
|
|||
|
|
if not joinDetail then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoExistUser
|
|||
|
|
elseif isAgree and "" ~= joinGroupId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyExistGroup
|
|||
|
|
else
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
if isAgree then
|
|||
|
|
self:ResetAllMsgTips( joinPartnerId )
|
|||
|
|
--加入到家园
|
|||
|
|
self:AddMember( player , myGroupId , joinPartnerId , self.IdentityType_Member )
|
|||
|
|
skynet.server.partner:SendMsgTips( joinPartnerId , 65 , true )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
local isHaveJoin = false --是否还有加入的玩家
|
|||
|
|
data.partnerInfos = {}
|
|||
|
|
local partnerIds = skynet.server.redis:zrange( redisKey , 0 , -1 )
|
|||
|
|
for k , partnerId in pairs( partnerIds ) do
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( partnerId )
|
|||
|
|
if curDetail then
|
|||
|
|
table.insert( data.partnerInfos , curDetail )
|
|||
|
|
isHaveJoin = true
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if not isHaveJoin then
|
|||
|
|
--没有加入的了就清空红点
|
|||
|
|
if "" ~= curGroup.leader then
|
|||
|
|
skynet.server.partner:ReduceAllMsgTips( curGroup.leader , 60)
|
|||
|
|
end
|
|||
|
|
if "" ~= curGroup.viceLeader1 then
|
|||
|
|
skynet.server.partner:ReduceAllMsgTips( curGroup.viceLeader1 , 60)
|
|||
|
|
end
|
|||
|
|
if "" ~= curGroup.viceLeader2 then
|
|||
|
|
skynet.server.partner:ReduceAllMsgTips( curGroup.viceLeader2 , 60)
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
self:SyncOnlineGroupInfo( myGroupId , self.GroupOpType_Update , true )
|
|||
|
|
data.member = self:GetMember( myGroupId , myPartnerId )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupAudit")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupAudit", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园踢出成员
|
|||
|
|
function GroupManage:Kick( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupKick", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local kickPartnerId = c2sData.data.partnerId
|
|||
|
|
local cmd = c2sData.cmd
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "partnerId" , kickPartnerId ) or myPartnerId == kickPartnerId then --不能踢自己
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif not self:IsManage( myPartnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
elseif player:IsMsgTooFast( cmd ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.RequestMsgTooFast
|
|||
|
|
else
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local kickDetail = skynet.server.personal:GetDetail( kickPartnerId )
|
|||
|
|
|
|||
|
|
local isRight = false
|
|||
|
|
if self.IdentityType_Leader == myDetail.groupIdentityType then --园长可以踢一切人
|
|||
|
|
isRight = true
|
|||
|
|
elseif self.IdentityType_ViceLeader == myDetail.groupIdentityType and self.IdentityType_Member == kickDetail.groupIdentityType then --副园长可以踢成员
|
|||
|
|
isRight = true
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if not isRight then
|
|||
|
|
--非成员不允许踢出
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
else
|
|||
|
|
local groupId = myDetail.groupId
|
|||
|
|
local kickGroupPlotId = kickDetail.groupPlotId
|
|||
|
|
|
|||
|
|
self:DeleteMember( tonumber( kickDetail.userId ) , groupId , kickPartnerId , kickGroupPlotId)
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Update , true )
|
|||
|
|
|
|||
|
|
--发送邮件
|
|||
|
|
local content = string.format("您已被移出 %s 家园,请24小时后再加入新的家园吧!" , groupId )
|
|||
|
|
skynet.server.mail:SendAsyncMailForPartnerId( kickPartnerId , skynet.server.mail.MailType_Msg , "退出家园" , content , {})
|
|||
|
|
|
|||
|
|
|
|||
|
|
data.partnerId = kickPartnerId
|
|||
|
|
data.member = self:GetMember( groupId , myPartnerId )
|
|||
|
|
|
|||
|
|
--被踢后,如果玩家在线也需要通知,并关闭所有红点
|
|||
|
|
skynet.server.gameServer:SendMsgToOnlineUser( kickPartnerId , "CMD_S2C_GroupKickByLeader" , {} )
|
|||
|
|
self:ResetAllMsgTips( kickPartnerId )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupKick")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupKick", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园解散(园长)
|
|||
|
|
function GroupManage:Dissolve( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupDissolve", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local groupId = self:GetGroupID( player )
|
|||
|
|
|
|||
|
|
if not self:IsVaildParam( "groupId" , groupId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
elseif not self:IsLeader( myPartnerId ) then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NoRight
|
|||
|
|
else
|
|||
|
|
--同步群信息
|
|||
|
|
self:SyncOnlineGroupInfo( groupId , self.GroupOpType_Dissolve , true )
|
|||
|
|
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
redisKey = redisKeyUrl.GameServerGroupAllZSet
|
|||
|
|
skynet.server.redis:zrem( redisKey , groupId )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupPublicPlot , groupId )
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupPrivatePlot , groupId )
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupDreamLifeTaskList , groupId )
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId )
|
|||
|
|
|
|||
|
|
--将所有玩家的群ID置空
|
|||
|
|
local allPartnerId = skynet.server.redis:zrange( redisKey , 0 , -1 )
|
|||
|
|
for k, v in pairs( allPartnerId ) do
|
|||
|
|
skynet.server.personal:SetDetail( v , "groupId", "" , "groupExitTime" , skynet.GetTime())
|
|||
|
|
end
|
|||
|
|
skynet.server.redis:del( redisKey )
|
|||
|
|
|
|||
|
|
skynet.server.gameRecord:Add( player.userId , dataType.GameRecordType_101 , groupId , myPartnerId )
|
|||
|
|
log.debug(string.format("玩家 %d 家园 解散 家园ID %s 操作人ID %s ", player.userId , groupId , player.gameData.partner.id ))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupDissolve")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupDissolve", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园签到
|
|||
|
|
function GroupManage:Signin( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupSignin", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
|
|||
|
|
local signInType = c2sData.data.signInType
|
|||
|
|
if signInType < 1 or signInType > 3 then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.ErrRequestParam
|
|||
|
|
else
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
|
|||
|
|
if 0 ~= curDetail.groupSignInType then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyGet
|
|||
|
|
else
|
|||
|
|
local groupId = self:GetGroupID( player )
|
|||
|
|
local groupInfo = self:GetGroup( groupId )
|
|||
|
|
local communityLevel = groupInfo.communityLevel
|
|||
|
|
|
|||
|
|
--根据家园等级获取打卡奖励
|
|||
|
|
local signReward = nil
|
|||
|
|
local signMaterialReward = nil
|
|||
|
|
local cfgAllCommunity = skynet.server.gameConfig:GetPlayerAllCfg( player , "Community")
|
|||
|
|
for k, v in pairs( cfgAllCommunity ) do
|
|||
|
|
if communityLevel == v.communityLvl then
|
|||
|
|
signReward = v.signReward
|
|||
|
|
signMaterialReward = v.signMaterialReward
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.levelTask:Modify( player , 90 , 1 )
|
|||
|
|
skynet.server.taskListEvent:Modify( player , 90 , 1 )
|
|||
|
|
|
|||
|
|
--随机发放奖励
|
|||
|
|
local randIndex = math.random( 1 , #signReward )
|
|||
|
|
local curRewardId = signReward[ randIndex ]
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_72")
|
|||
|
|
player:GiveReward( curRewardId , eventId)
|
|||
|
|
|
|||
|
|
--打卡建材奖励
|
|||
|
|
local curMaterialReward = signMaterialReward[ signInType ]
|
|||
|
|
local rewardInfo = skynet.server.common:Split( curMaterialReward ,"_" )
|
|||
|
|
rewardInfo[1],rewardInfo[2] = tonumber(rewardInfo[1]),tonumber(rewardInfo[2])
|
|||
|
|
skynet.server.bag:AddGoods( player , dataType.GoodsType_Prop, rewardInfo[1] , rewardInfo[2] )
|
|||
|
|
|
|||
|
|
skynet.server.personal:SetDetail( myPartnerId , "groupSignInType" , signInType )
|
|||
|
|
data.signInType = signInType
|
|||
|
|
data.rewardId = curRewardId
|
|||
|
|
data.rewardGoods = { goodsType = dataType.GoodsType_Prop , goodsId = rewardInfo[1] , goodsCount = rewardInfo[2] }
|
|||
|
|
|
|||
|
|
skynet.server.msgTips:ReduceAll(player , 38)
|
|||
|
|
log.debug(string.format("玩家 %d 家园 签到 家园ID %s 伙伴ID %s 获取奖励 %d", player.userId , groupId , myPartnerId , curRewardId))
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupSignin")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupSignin", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园福利展示
|
|||
|
|
function GroupManage:WelfareShow( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupWelfareShow", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
|
|||
|
|
local curGroup = player.gameData.group
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local signInType = myDetail.groupSignInType
|
|||
|
|
local myGroupId = myDetail.groupId
|
|||
|
|
|
|||
|
|
local curGroupInfo = self:GetGroupInfo( myGroupId , "contributeScore" , "contributeReward" , "helpCount" )
|
|||
|
|
local contributeScore = tonumber(curGroupInfo[1] or 0)
|
|||
|
|
local contributeReward = tonumber(curGroupInfo[2] or 0)
|
|||
|
|
local helpCount = tonumber(curGroupInfo[3] or 0)
|
|||
|
|
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupContributeRewardRecordSet, myGroupId )
|
|||
|
|
local isGainWelfare = true
|
|||
|
|
|
|||
|
|
if contributeReward > 0 and skynet.server.redis:sismember( redisKey , myPartnerId ) then
|
|||
|
|
--有福利并且没领取,就可以领
|
|||
|
|
isGainWelfare = false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
data.signInType = signInType;
|
|||
|
|
data.contributeScore = contributeScore;
|
|||
|
|
data.isGainWelfare = isGainWelfare
|
|||
|
|
data.helpCount = helpCount
|
|||
|
|
data.gainHelpCounts = {}
|
|||
|
|
for k, v in pairs( curGroup.helpGainReward ) do
|
|||
|
|
table.insert( data.gainHelpCounts , v )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupWelfareShow")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupWelfareShow", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取家园福利
|
|||
|
|
function GroupManage:ContributeRewardGain( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupContributeRewardGain", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = myDetail.groupId
|
|||
|
|
|
|||
|
|
--检查福利是否能获得
|
|||
|
|
self:CheckContributeReward( player , myGroupId )
|
|||
|
|
|
|||
|
|
local groupData = self:GetGroupInfo( myGroupId , "contributeReward")
|
|||
|
|
local rewardId = tonumber(groupData[1])
|
|||
|
|
|
|||
|
|
if 0 == rewardId then
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.NowNoWelfare
|
|||
|
|
else
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupContributeRewardRecordSet, myGroupId )
|
|||
|
|
if skynet.server.redis:sismember( redisKey , myPartnerId ) then
|
|||
|
|
--发放贡献奖励
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_95")
|
|||
|
|
player:GiveReward( rewardId , eventId)
|
|||
|
|
|
|||
|
|
--删除奖励记录
|
|||
|
|
skynet.server.redis:srem( redisKey , myPartnerId )
|
|||
|
|
data.rewardId = rewardId
|
|||
|
|
else
|
|||
|
|
s2cData.code = errorInfo.ErrorCode.AlreadyGet
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupContributeRewardGain")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupContributeRewardGain", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园帮助奖励领取
|
|||
|
|
function GroupManage:HelpRewardGain( player , c2sData , s2cData )
|
|||
|
|
c2sData.data = assert(pb.decode("C2SGroupHelpRewardGain", c2sData.data ))
|
|||
|
|
local data = {}
|
|||
|
|
local curGroup = player.gameData.group
|
|||
|
|
local helpCount,rewardId = self:CheckHelpReward( player )
|
|||
|
|
if 0 ~= helpCount then
|
|||
|
|
local eventId = pb.enum("EnumMoneyChangeEventID","EventID_96")
|
|||
|
|
player:GiveReward( rewardId , eventId)
|
|||
|
|
table.insert( curGroup.helpGainReward , helpCount )
|
|||
|
|
|
|||
|
|
data.rewardId = rewardId
|
|||
|
|
data.gainHelpCounts = {}
|
|||
|
|
for k, v in pairs( curGroup.helpGainReward ) do
|
|||
|
|
table.insert( data.gainHelpCounts , v )
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
s2cData.cmd = pb.enum("MsgType","CMD_S2C_GroupHelpRewardGain")
|
|||
|
|
s2cData.data = assert(pb.encode("S2CGroupHelpRewardGain", data))
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--检查是不是有帮助奖励
|
|||
|
|
function GroupManage:CheckHelpReward( player )
|
|||
|
|
local curGroup = player.gameData.group
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local myDetail = skynet.server.personal:GetDetail( myPartnerId )
|
|||
|
|
local myGroupId = myDetail.groupId
|
|||
|
|
local curGroupInfo = self:GetGroupInfo( myGroupId , "helpCount" )
|
|||
|
|
local groupHelpCount = tonumber(curGroupInfo[1] or 0)
|
|||
|
|
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
for k1, v1 in pairs( cfgSValue.communityHelpExtraReward ) do
|
|||
|
|
local parseData = skynet.server.common:Split( v1 ,"_" )
|
|||
|
|
local helpCount = tonumber(parseData[1])
|
|||
|
|
local rewardId = tonumber(parseData[2])
|
|||
|
|
|
|||
|
|
--检查下是否领取奖励
|
|||
|
|
local isGain =false
|
|||
|
|
for k2, v2 in pairs( curGroup.helpGainReward ) do
|
|||
|
|
if helpCount == v2 then
|
|||
|
|
isGain = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--如果未获得,并且数量大于了就可以领取
|
|||
|
|
if not isGain and groupHelpCount >= helpCount then
|
|||
|
|
return helpCount,rewardId
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
return 0,0
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园添加成员
|
|||
|
|
function GroupManage:AddMember( player , groupId , partnerId , identityType )
|
|||
|
|
local userId = player.userId
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId )
|
|||
|
|
skynet.server.redis:zadd( redisKey , 0 , partnerId )
|
|||
|
|
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
skynet.server.redis:hincrby( redisKey , "memberCount" , 1 )
|
|||
|
|
|
|||
|
|
--找出地图中一个空地
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupPrivatePlot, groupId )
|
|||
|
|
local mapList = skynet.server.redis:lrange( redisKey , 0 , -1 )
|
|||
|
|
local plotId = 0
|
|||
|
|
for k, v in pairs(mapList) do
|
|||
|
|
local info = json:decode(v)
|
|||
|
|
if "" == info.partnerId then
|
|||
|
|
plotId = info.plotId
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--初始化地块
|
|||
|
|
self:InitScenePlot( player , groupId , plotId , partnerId )
|
|||
|
|
|
|||
|
|
--将加入的家园ID设置到个人信息中
|
|||
|
|
skynet.server.personal:SetDetail( partnerId ,
|
|||
|
|
"groupId", groupId ,
|
|||
|
|
"groupIdentityType" , identityType ,
|
|||
|
|
"groupJoinTime" , skynet.GetTime() ,
|
|||
|
|
"groupSignInType" ,0 , --是否签到
|
|||
|
|
"groupContributeScore" , 0 , --贡献分
|
|||
|
|
"groupPlotId", plotId,
|
|||
|
|
"groupExitTime" , 0 ,
|
|||
|
|
"groupRandId" , 0 , --排行榜ID
|
|||
|
|
"groupNeedGoods","{}"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
skynet.server.gameRecord:Add( userId , dataType.GameRecordType_104 , groupId , partnerId , identityType , plotId )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园删除成员
|
|||
|
|
function GroupManage:DeleteMember( userId , groupId , partnerId , plotId )
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, groupId )
|
|||
|
|
skynet.server.redis:zrem( redisKey , partnerId )
|
|||
|
|
|
|||
|
|
redisKey = string.format( redisKeyUrl.GameServerGroupInfoHash , groupId )
|
|||
|
|
skynet.server.redis:hincrby( redisKey , "memberCount" , -1 )
|
|||
|
|
|
|||
|
|
self:ResetScenePlot( groupId , plotId )
|
|||
|
|
|
|||
|
|
--先检查下玩家的身份信息
|
|||
|
|
local IdentityInfo = skynet.server.redis:hmget( redisKey ,"viceLeader1" , "viceLeader2")
|
|||
|
|
for k, v in pairs( IdentityInfo ) do
|
|||
|
|
if 1 == k and partnerId == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader1" , "")
|
|||
|
|
elseif 2 == k and partnerId == v then
|
|||
|
|
skynet.server.redis:hset( redisKey , "viceLeader2" , "")
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--删除个人详情中的群信息
|
|||
|
|
skynet.server.personal:SetDetail( partnerId , "groupId", "" , "groupRandId" , 0 , "groupExitTime" , skynet.GetTime())
|
|||
|
|
skynet.server.gameRecord:Add( userId , dataType.GameRecordType_105 , groupId , partnerId , plotId )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取家园加入信息
|
|||
|
|
function GroupManage:GroupJoinInfo( partnerId , groupList )
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupMyApplyJoinZSet , partnerId )
|
|||
|
|
local groupInfo = {}
|
|||
|
|
local myApplyJoin = skynet.server.redis:zrange( redisKey , 0 , -1)
|
|||
|
|
for k1, v1 in pairs( groupList ) do
|
|||
|
|
local curInfo = self:GetGroup( v1 )
|
|||
|
|
if curInfo then
|
|||
|
|
--检查玩家是否申请该家园
|
|||
|
|
local isApply = false
|
|||
|
|
for k2, v2 in pairs( myApplyJoin ) do
|
|||
|
|
if v1 == v2 then
|
|||
|
|
isApply = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取会长的昵称
|
|||
|
|
local leaderPartnerId = curInfo.leader
|
|||
|
|
local leaderNickName = ""
|
|||
|
|
local leaderHeadId = 0
|
|||
|
|
local leaderHeadFrameId = 0
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( leaderPartnerId )
|
|||
|
|
if curDetail then
|
|||
|
|
leaderNickName = curDetail.nickName or ""
|
|||
|
|
leaderHeadId = curDetail.headId
|
|||
|
|
leaderHeadFrameId = curDetail.headFrameId
|
|||
|
|
end
|
|||
|
|
--组织返回数据
|
|||
|
|
--自定义头像
|
|||
|
|
if leaderHeadId == 0 and curDetail.DIYHeadInfo ~= nil then
|
|||
|
|
table.insert( groupInfo , {
|
|||
|
|
id = curInfo.id ,
|
|||
|
|
name = curInfo.name ,
|
|||
|
|
level = curInfo.communityLevel ,
|
|||
|
|
badgeId = curInfo.badgeId,
|
|||
|
|
isApply = isApply,
|
|||
|
|
curMemberCount = curInfo.memberCount,
|
|||
|
|
leaderHeadId = leaderHeadId,
|
|||
|
|
leaderHeadFrameId = leaderHeadFrameId,
|
|||
|
|
leaderNickName = leaderNickName,
|
|||
|
|
declaration = curInfo.declaration,
|
|||
|
|
joinType = curInfo.joinType,
|
|||
|
|
leaderDIYHeadInfo = curDetail.DIYHeadInfo
|
|||
|
|
})
|
|||
|
|
else
|
|||
|
|
table.insert( groupInfo , {
|
|||
|
|
id = curInfo.id ,
|
|||
|
|
name = curInfo.name ,
|
|||
|
|
level = curInfo.communityLevel ,
|
|||
|
|
badgeId = curInfo.badgeId,
|
|||
|
|
isApply = isApply,
|
|||
|
|
curMemberCount = curInfo.memberCount,
|
|||
|
|
leaderHeadId = leaderHeadId,
|
|||
|
|
leaderHeadFrameId = leaderHeadFrameId,
|
|||
|
|
leaderNickName = leaderNickName,
|
|||
|
|
declaration = curInfo.declaration,
|
|||
|
|
joinType = curInfo.joinType
|
|||
|
|
})
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
return groupInfo
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--家园推荐
|
|||
|
|
function GroupManage:Recommond( player )
|
|||
|
|
local myPartnerId = player.gameData.partner.id
|
|||
|
|
local tmpGroup = player.tmpData.group
|
|||
|
|
local groupInfo = {}
|
|||
|
|
local firstQuery = true
|
|||
|
|
|
|||
|
|
--是否存在好友
|
|||
|
|
local function IsExistGroup( groupId )
|
|||
|
|
for k, v in pairs( tmpGroup.alreadyQueryList ) do
|
|||
|
|
if groupId == v then
|
|||
|
|
return true
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
return false
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--查询家园
|
|||
|
|
local function QueryGroup()
|
|||
|
|
local count = 0
|
|||
|
|
local isEnough = false
|
|||
|
|
|
|||
|
|
--我申请的加入列表
|
|||
|
|
local redisKey = string.format( redisKeyUrl.GameServerGroupMyApplyJoinZSet , myPartnerId )
|
|||
|
|
local myApplyJoin = skynet.server.redis:zrange( redisKey , 0 , -1)
|
|||
|
|
for k, v in pairs( self.onlineGroupList ) do
|
|||
|
|
if not IsExistGroup( v.id ) then
|
|||
|
|
table.insert( tmpGroup.alreadyQueryList , v.id )
|
|||
|
|
--检查玩家是否申请该家园
|
|||
|
|
local isApply = false
|
|||
|
|
for k2, v2 in pairs( myApplyJoin ) do
|
|||
|
|
if v.id == v2 then
|
|||
|
|
isApply = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--获取会长的昵称
|
|||
|
|
local leaderPartnerId = v.leader
|
|||
|
|
local leaderNickName = ""
|
|||
|
|
local leaderHeadId = 0
|
|||
|
|
local leaderHeadFrameId = 0
|
|||
|
|
local curDetail = skynet.server.personal:GetDetail( leaderPartnerId )
|
|||
|
|
if curDetail then
|
|||
|
|
leaderNickName = curDetail.nickName or ""
|
|||
|
|
leaderHeadId = curDetail.headId
|
|||
|
|
leaderHeadFrameId = curDetail.headFrameId
|
|||
|
|
end
|
|||
|
|
--自定义头像
|
|||
|
|
if leaderHeadId == 0 and curDetail.DIYHeadInfo ~= nil then
|
|||
|
|
table.insert( groupInfo , {
|
|||
|
|
id = v.id ,
|
|||
|
|
name = v.name ,
|
|||
|
|
level = v.communityLevel ,
|
|||
|
|
badgeId = v.badgeId,
|
|||
|
|
isApply = isApply,
|
|||
|
|
curMemberCount = v.memberCount,
|
|||
|
|
leaderHeadId = leaderHeadId,
|
|||
|
|
leaderNickName = leaderNickName,
|
|||
|
|
declaration = v.declaration,
|
|||
|
|
joinType = v.joinType,
|
|||
|
|
leaderHeadFrameId = leaderHeadFrameId,
|
|||
|
|
leaderDIYHeadInfo = curDetail.DIYHeadInfo
|
|||
|
|
})
|
|||
|
|
else
|
|||
|
|
table.insert( groupInfo , {
|
|||
|
|
id = v.id ,
|
|||
|
|
name = v.name ,
|
|||
|
|
level = v.communityLevel ,
|
|||
|
|
badgeId = v.badgeId,
|
|||
|
|
isApply = isApply,
|
|||
|
|
curMemberCount = v.memberCount,
|
|||
|
|
leaderHeadId = leaderHeadId,
|
|||
|
|
leaderNickName = leaderNickName,
|
|||
|
|
declaration = v.declaration,
|
|||
|
|
joinType = v.joinType,
|
|||
|
|
leaderHeadFrameId = leaderHeadFrameId
|
|||
|
|
})
|
|||
|
|
end
|
|||
|
|
count = count + 1
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if count >= self.MaxQueryCount then
|
|||
|
|
isEnough = true
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
if 0 == #groupInfo and firstQuery then
|
|||
|
|
firstQuery = false
|
|||
|
|
tmpGroup.alreadyQueryList = {}
|
|||
|
|
QueryGroup()
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
QueryGroup()
|
|||
|
|
return groupInfo
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--检查福利
|
|||
|
|
function GroupManage:CheckContributeReward( player , myGroupId )
|
|||
|
|
--检测一下,是否更新家园福利奖励
|
|||
|
|
local curGroupInfo = self:GetGroupInfo( myGroupId , "nextContributeRewardTime", "contributeScore" )
|
|||
|
|
local nextContributeRewardTime = tonumber(curGroupInfo[1])
|
|||
|
|
local contributeScore = tonumber(curGroupInfo[2])
|
|||
|
|
|
|||
|
|
if skynet.GetTime() >= nextContributeRewardTime then
|
|||
|
|
-- 设置下一次福利时间
|
|||
|
|
self:SetGroupInfo( myGroupId , "nextContributeRewardTime" , self:CalcContributeRewardTime())
|
|||
|
|
|
|||
|
|
--计算福利
|
|||
|
|
local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue")
|
|||
|
|
local communityContribute = cfgSValue.communityContribute --所有贡献范围
|
|||
|
|
local communityContributeReward = cfgSValue.communityContributeReward
|
|||
|
|
for k, v in pairs( communityContribute) do
|
|||
|
|
local range = skynet.server.common:Split( v ,"_" )
|
|||
|
|
if contributeScore >= tonumber(range[1]) and contributeScore <= tonumber(range[2]) then
|
|||
|
|
--设置发放福利
|
|||
|
|
self:SetGroupInfo( myGroupId , "contributeReward" , communityContributeReward[ k ] )
|
|||
|
|
|
|||
|
|
--存在领取记录就删除
|
|||
|
|
local redisContributeRewardKey = string.format( redisKeyUrl.GameServerGroupContributeRewardRecordSet, myGroupId )
|
|||
|
|
if skynet.server.redis:exists( redisContributeRewardKey ) then
|
|||
|
|
skynet.server.redis:del( redisContributeRewardKey )
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
--遍历当前该家园的所有好友ID , 将能领取奖励的ID全部写入进云
|
|||
|
|
local redisContributionScoreKey = string.format( redisKeyUrl.GameServerGroupContributionScoreZSet, myGroupId )
|
|||
|
|
local rankList = skynet.server.redis:zrange( redisContributionScoreKey , 0 , -1 )
|
|||
|
|
local partnerIdList = {}
|
|||
|
|
for k, partnerId in pairs(rankList) do
|
|||
|
|
table.insert( partnerIdList, partnerId )
|
|||
|
|
end
|
|||
|
|
skynet.server.redis:sadd( redisContributeRewardKey , table.unpack( partnerIdList ))
|
|||
|
|
break
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
end
|
|||
|
|
|
|||
|
|
skynet.server.groupManage = GroupManage
|
|||
|
|
return GroupManage
|