390 lines
14 KiB
Lua
390 lines
14 KiB
Lua
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 |