local skynet = require "skynet" local oo = require "Class" local log = require "Log" local pb = require "pb" local errorInfo = require "ErrorInfo" local json =require "json" local redisKeyUrl = require "RedisKeyUrl" local clusterServer = require "ClusterServer" local serverId = tonumber(skynet.getenv "serverId") local GameClubTask = oo.class() --构造函数 function GameClubTask:Init() end -- 每次登录需要进行修改的数据 function GameClubTask:LoginInitData(player) --初始游戏圈信息 if player.gameData.gameClubTaskList == nil then player.gameData.gameClubTaskList={} end --检查重置数据 self:ResetData(player) --邀请好友 self:InviteInfoHandle(player) end --游戏圈任务 显示任务 function GameClubTask:Show(player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SGameClubTaskShow", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2S_GameClubTaskShow") --返回信息 local data = {} data.taskList={} --检查重置数据 self:ResetData(player) if next(player.gameData.gameClubTaskList)~=nil then for _, value in pairs(player.gameData.gameClubTaskList) do table.insert(data.taskList,value) end end s2cData.data = assert(pb.encode("S2CGameClubTaskShow", data)) end --游戏圈任务 完成任务 function GameClubTask:Complete(player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SGameClubTaskComplete", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2S_GameClubTaskComplete") --参数 local taskType = c2sData.data.taskType --任务类型id local finishNum = c2sData.data.finishNum --完成数量 --返回信息 local data = {} data.taskList={} --获取配置 local cfgGameClubTaskList = skynet.server.gameConfig:GetAllCfg( "GameClubTask") --获取对应配置 local cfgGameClubTaskCompList = {} for _, value in ipairs(cfgGameClubTaskList) do if value.taskType == taskType then table.insert(cfgGameClubTaskCompList,value) end end if next(cfgGameClubTaskCompList)==nil then log.error(string.format("cfgGameClubTaskCompList is nil,taskType:%d,finishNum:%d",taskType,finishNum)) s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end --循环添加 for _, cfgGameClubTaskComp in ipairs(cfgGameClubTaskCompList) do local id = cfgGameClubTaskComp.id --不存在数据 添加 if player.gameData.gameClubTaskList[id] == nil then player.gameData.gameClubTaskList[id] = {id = id, finishNum = finishNum, status = 1,updateTime = skynet.GetTime()} else --签到活动一天只能完成一次,这里2只能写死 if taskType ==3 and os.date("%Y-%m-%d",player.gameData.gameClubTaskList[id].updateTime) == os.date("%Y-%m-%d",skynet.GetTime()) and player.gameData.gameClubTaskList[id].finishNum ~= 0 then--处理第二天修改了时间的错误数据 log.error("游戏圈任务 签到已完成") s2cData.code = errorInfo.ErrorCode.ToDaySignIn --直接返回 return end --判断是否已经领取 if player.gameData.gameClubTaskList[id].status==1 then player.gameData.gameClubTaskList[id].finishNum=player.gameData.gameClubTaskList[id].finishNum+finishNum player.gameData.gameClubTaskList[id].updateTime=skynet.GetTime() else goto coroutine end end --设置状态 if player.gameData.gameClubTaskList[id].finishNum >= cfgGameClubTaskComp.taskValue then player.gameData.gameClubTaskList[id].status=2 end ::coroutine:: end if next(player.gameData.gameClubTaskList)~=nil then for _, value in pairs(player.gameData.gameClubTaskList) do table.insert(data.taskList,value) end end s2cData.data = assert(pb.encode("S2CGameClubTaskComplete", data)) end --游戏圈任务 领取奖励 function GameClubTask:DrawReward(player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SGameClubTaskDrawReward", c2sData.data )) s2cData.cmd = pb.enum("MsgType","CMD_S2S_GameClubTaskDrawReward") --参数 local id = c2sData.data.id --任务id --返回信息 local data = {} data.taskList={} --获取配置 local cfgGameClubTaskList = skynet.server.gameConfig:GetAllCfg( "GameClubTask") --获取对应配置 local cfgGameClubTask = {} for _, value in ipairs(cfgGameClubTaskList) do if value.id == id then cfgGameClubTask=value break end end if next(cfgGameClubTask)==nil then log.error("cfgGameClubTask is nil") s2cData.code = errorInfo.ErrorCode.ErrRequestParam return end --目前只有签到才会判断状态 if cfgGameClubTask.taskAttribute == 2 then --不存在数据.未完成,或者已经领取 if player.gameData.gameClubTaskList[id] == nil or player.gameData.gameClubTaskList[id].finishNum < cfgGameClubTask.taskValue or player.gameData.gameClubTaskList[id].status == 3 then log.error("cfgGameClubTask is nil") s2cData.code = errorInfo.ErrorCode.NotGet return end else--其他直接完成,这里以客户端准(虽然不推荐,但是。。。。) --不存在数据.添加 if player.gameData.gameClubTaskList[id] == nil then player.gameData.gameClubTaskList[id]={id = id, finishNum = cfgGameClubTask.taskValue, status = 2, updateTime = skynet.GetTime()} end --不存在数据.未完成,或者已经领取 if player.gameData.gameClubTaskList[id].status == 3 then log.error("cfgGameClubTask is nil") s2cData.code = errorInfo.ErrorCode.NotGet return end end --领取奖励 local eventId = pb.enum("EnumMoneyChangeEventID","EventID_121") player:GiveReward(cfgGameClubTask.taskReward ,eventId,1) --设置状态 player.gameData.gameClubTaskList[id].status=3 player.gameData.gameClubTaskList[id].updateTime = skynet.GetTime() --data.status = player.gameData.gameClubTaskList[id].status data.rewardId=cfgGameClubTask.taskReward if next(player.gameData.gameClubTaskList)~=nil then for _, value in pairs(player.gameData.gameClubTaskList) do table.insert(data.taskList,value) end end s2cData.data = assert(pb.encode("S2CGameClubTaskDrawReward", data)) end --重置游戏圈 function GameClubTask:ResetData(player) if player.gameData.gameClubTaskList == nil or not next(player.gameData.gameClubTaskList) then return end --获取配置 local cfgGameClubTaskList = skynet.server.gameConfig:GetAllCfg( "GameClubTask") --签到总天数 local signTotalNum = 0 local signMaxNum = 0 --循环配置 for _, cfgGameClubTask in ipairs(cfgGameClubTaskList) do --点赞 if (cfgGameClubTask.taskType == 2 or cfgGameClubTask.taskType == 5 or cfgGameClubTask.taskType == 6 )--点赞,评论,发布帖子 and player.gameData.gameClubTaskList[cfgGameClubTask.id] ~=nil --有玩家数据 --and player.gameData.gameClubTaskList[cfgGameClubTask.id].status==3 --完成状态 and os.date("%Y-%m-%d",player.gameData.gameClubTaskList[cfgGameClubTask.id].updateTime) ~= os.date("%Y-%m-%d",skynet.GetTime()) then--更新时间不是今天 --log.info("游戏圈任务 重置点赞次数") --player.gameData.gameClubTaskList[cfgGameClubTask.id].updateTime=skynet.GetTime() player.gameData.gameClubTaskList[cfgGameClubTask.id].finishNum=0 player.gameData.gameClubTaskList[cfgGameClubTask.id].status=1 end --统计签到最大次数 if cfgGameClubTask.taskType == 3--签到 and signMaxNum <= cfgGameClubTask.taskValue then signMaxNum = cfgGameClubTask.taskValue end if cfgGameClubTask.taskType == 3--签到 and player.gameData.gameClubTaskList[cfgGameClubTask.id] ~=nil --有玩家数据 and player.gameData.gameClubTaskList[cfgGameClubTask.id].status==3 --完成状态 and cfgGameClubTask.taskValue <= player.gameData.gameClubTaskList[cfgGameClubTask.id].finishNum --达到配置的目标值 and signTotalNum < player.gameData.gameClubTaskList[cfgGameClubTask.id].finishNum --需要更新总次数 and os.date("%Y-%m-%d",player.gameData.gameClubTaskList[cfgGameClubTask.id].updateTime) ~= os.date("%Y-%m-%d",skynet.GetTime()) then--更新时间不是今天 signTotalNum = player.gameData.gameClubTaskList[cfgGameClubTask.id].finishNum end end --签到是否有更新 if signTotalNum >= signMaxNum then for _, cfgGameClubTask in ipairs(cfgGameClubTaskList) do if cfgGameClubTask.taskType == 3 then --player.gameData.gameClubTaskList[cfgGameClubTask.id].updateTime=skynet.GetTime() player.gameData.gameClubTaskList[cfgGameClubTask.id].finishNum = 0 player.gameData.gameClubTaskList[cfgGameClubTask.id].status=1 end end end end --被邀请信息处理 function GameClubTask:BeInviteInfoHandle(newPlayer,partnerId) local playerInfo = skynet.server.personal:GetDetail( partnerId ) if playerInfo and playerInfo.isOnline and true == playerInfo.isOnline then --是否是在同一台服务器上,直接调用 if serverId == playerInfo.gameServerId then local player = skynet.server.playerCenter:GetPlayer( playerInfo.userId ) if not player then --缓存不存在离线,走离线逻辑 local redisKey = string.format( redisKeyUrl.InviteInfoHandle , partnerId ) skynet.server.redis:lpush( redisKey , newPlayer.basicInfo.accountName ) return end self:InviteHandle(player,playerInfo.partnerId) else local c2sData={} c2sData.data={} c2sData.data.taskType=4--游戏圈好友邀请 c2sData.data.finishNum=1--完成数量 c2sData.data.accountName=newPlayer.basicInfo.accountName--被邀请玩家渠道id c2sData.data.partnerId=partnerId--邀请玩家渠道id skynet.server.gameServer:SendMsgToOnlineUser( partnerId , clusterServer.InviteFriend_Invite, c2sData) end else--离线 local redisKey = string.format( redisKeyUrl.InviteInfoHandle , partnerId ) skynet.server.redis:lpush( redisKey , newPlayer.basicInfo.accountName ) end end --邀请好友处理 function GameClubTask:InviteInfoHandle(player) local redisKey = string.format( redisKeyUrl.InviteInfoHandle , player.gameData.partner.id ) local queryData = skynet.server.redis:lrange( redisKey , 0 , -1 ) --不存在数据 if queryData == nil or not next(queryData) then return end for _, beInvitePartnerId in pairs( queryData ) do self:InviteHandle(player,beInvitePartnerId) end --删除redis数据 skynet.server.redis:del( redisKey ) end --邀请好友处理 function GameClubTask:InviteHandle(player,accountName) --log.info("开始处理 游戏圈好友邀请") local taskType=4--游戏圈好友邀请 local finishNum=1--完成数量 --获取配置 local cfgGameClubTaskList = skynet.server.gameConfig:GetAllCfg( "GameClubTask") --获取对应配置 local cfgGameClubTaskCompList = {} for _, value in ipairs(cfgGameClubTaskList) do if value.taskType == taskType then table.insert(cfgGameClubTaskCompList,value) end end if next(cfgGameClubTaskCompList)==nil then log.error(string.format("cfgGameClubTaskCompList is nil,taskType:%d,finishNum:%d",taskType,finishNum)) return end --循环添加 for _, cfgGameClubTaskComp in ipairs(cfgGameClubTaskCompList) do local id = cfgGameClubTaskComp.id --不存在数据 添加 if player.gameData.gameClubTaskList[id] == nil then player.gameData.gameClubTaskList[id] = {id = id, finishNum = finishNum, status = 1,updateTime = skynet.GetTime()} else --判断是否已经领取 if player.gameData.gameClubTaskList[id].status==1 then player.gameData.gameClubTaskList[id].finishNum=player.gameData.gameClubTaskList[id].finishNum+finishNum player.gameData.gameClubTaskList[id].updateTime=skynet.GetTime() else goto coroutine end end --设置状态 if player.gameData.gameClubTaskList[id].finishNum >= cfgGameClubTaskComp.taskValue then player.gameData.gameClubTaskList[id].status=2 end ::coroutine:: end --发客户端消息 local data={} data.taskList={} if next(player.gameData.gameClubTaskList)~=nil then for _, value in pairs(player.gameData.gameClubTaskList) do table.insert(data.taskList,value) end end skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2S_GameClubTaskComplete" , data ) --是否记录日志 --log.info("游戏圈 邀请好友处理完成") end skynet.server.gameClubTask = GameClubTask return GameClubTask