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

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