local skynet = require "skynet" local oo = require "Class" local task = require "Task" local log = require "Log" local dataType = require "DataType" local pb = require "pb" local AchieveTask = oo.class(task) AchieveTask.MaxShowItem = 4 --任务最大显示多少个 --检查一下玩家是否有新的任务 function AchieveTask:CheckNew( player ) if not player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) then return end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "AchievementTask") --任务配置 local achieveTask = player.gameData.achieveTask for k, v in pairs( cfgTask ) do if not achieveTask[ v.id ] then achieveTask[ v.id ] = {} achieveTask[ v.id ].id = v.id achieveTask[ v.id ].order = v.order achieveTask[ v.id ].type = v.taskType --任务类型 achieveTask[ v.id ].progress =0 --当前进度 achieveTask[ v.id ].status =self.TaskStatus_NoComplete --是否完成 if 39 == v.taskType then --签到检查下当前签到的天数 achieveTask[ v.id ].progress = player.gameData.signIn.signCount end end end --local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") --if cfgSValue.achTaskUnlockLvl == player.gameData.level then --self:Modify( player , 43 , cfgSValue.achTaskUnlockLvl ) --else self:Modify( player , 43 , 1) skynet.server.taskListEvent:Modify( player , 43 , 1) --end end --修复任务ID 125和126 function AchieveTask:RepairTaskType125And126( player ) if not player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) or player.gameData.level < 80 then return end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "AchievementTask") --任务配置 local achieveTask = player.gameData.achieveTask for k, v in pairs( cfgTask ) do if (125 == v.id or 126 == v.id) and not achieveTask[ v.id ] then achieveTask[ v.id ] = {} achieveTask[ v.id ].id = v.id achieveTask[ v.id ].order = v.order achieveTask[ v.id ].type = v.taskType --任务类型 if 125 == v.id then achieveTask[ v.id ].progress =70 elseif 126 == v.id then achieveTask[ v.id ].progress =80 end achieveTask[ v.id ].status =self.TaskStatus_AlreadyComplete --是否完成 end end end --修复任务类型43 function AchieveTask:RepairTaskType43( player ) if not player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) then return end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "AchievementTask") --任务配置 local achieveTask = player.gameData.achieveTask local level = player.gameData.level for k, v in pairs( cfgTask ) do --将成就任务的等级设置为最新等级,并检查是否完成 if achieveTask[ v.id ] and achieveTask[ v.id ].type == 43 and self.TaskStatus_NoComplete == achieveTask[ v.id ].status then achieveTask[ v.id ].progress = level if achieveTask[ v.id ].progress >= v.value then achieveTask[ v.id ].status =self.TaskStatus_AlreadyComplete achieveTask[ v.id ].progress = v.value end end end end --任务列表显示 function AchieveTask:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SAchieveTaskShow", c2sData.data )) local data = {} local showTaskData = self:GetShowTaskData( player ) data.taskInfo = showTaskData local tipsCount = 0 --获取最新的红点数量 for k, v in pairs( showTaskData ) do if self.TaskStatus_AlreadyComplete == v.status then tipsCount = tipsCount + 1 end end skynet.server.msgTips:Reset( player , 33 ) skynet.server.msgTips:Add( player , 33 , tipsCount) skynet.server.msgTips:Reduce( player , 92 ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_AchieveTaskShow") s2cData.data = assert(pb.encode("S2CAchieveTaskShow", data)) end --任务完成 function AchieveTask:Accomplish( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SAchieveTaskAccomplish", c2sData.data )) local data = {} local taskId = c2sData.data.taskId for k, v in pairs( player.gameData.achieveTask ) do if taskId == v.id and self.TaskStatus_AlreadyComplete == v.status then --只有状态为任务已完成才能领取 local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg(player , "AchievementTask" , v.id) local eventId = pb.enum("EnumMoneyChangeEventID","EventID_76") player:GiveReward( cfgOne.rewardId , eventId) v.status = self.TaskStatus_AlreadyGet skynet.server.msgTips:Reduce( player , 33 ) --发放个人信息的奖励 local data = {} data.newOwn = {} skynet.server.personal:AddOwnData( player , dataType.PersonalOwnType_Title1 , cfgOne.unlockTitle , data.newOwn ) --获取头衔 skynet.server.personal:AddOwnData( player , dataType.PersonalOwnType_Medal , cfgOne.unlockBadge , data.newOwn ) --获取勋章 if #data.newOwn > 0 then skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_PersonalUpdateOwnInfo" , data ) skynet.server.msgTips:Add( player , 52 ) end log.debug(string.format("玩家 %d 成就任务 任务完成 ID %d " , player.basicInfo.userID , taskId )) break end end data.taskInfo = self:GetShowTaskData( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_AchieveTaskAccomplish") s2cData.data = assert(pb.encode("S2CAchieveTaskAccomplish", data)) end --修改任务 function AchieveTask:Modify( player , type , count ) if not player:IsUnlockSystem( dataType.UnlockSystem_AchieveTask ) then return end local maxProgress = 0 for k, v in pairs( player.gameData.achieveTask ) do local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg( player , "AchievementTask" , v.id) maxProgress = cfgOne.value if type == v.type and self.TaskStatus_NoComplete == v.status then v.progress = v.progress + count --检查是否完成任务 if v.progress >= maxProgress then v.status =self.TaskStatus_AlreadyComplete v.progress = maxProgress --如果任务当前显示就发送TIPS if self:IsShow( player , k ) then skynet.server.msgTips:Add( player , 33 ) end log.debug(string.format("玩家 %d 成就任务 任务ID %d 完成 " , player.basicInfo.userID , v.id )) --成就任务完成时发送对应消息到客户端 local data = {} data.achieveTaskId = v.id skynet.server.gameServer:SendMsgToUser( player.userId , "CMD_S2C_AchieveTaskComplete" , data ) end end end end --获取显示的任务数据 function AchieveTask:GetShowTaskData( player ) local taskInfo = {} for k, v in pairs( player.gameData.achieveTask ) do --已领取的就不用再显示了 if self.TaskStatus_AlreadyGet ~= v.status and not self:IsExistOrder( player , taskInfo , v.order ) then table.insert( taskInfo , { id = k , order = v.order , progress = v.progress , status = v.status }) end end --最终返回给客户端数据 local data = {} for k, v in pairs(taskInfo ) do table.insert( data , { id = v.id , progress = v.progress , status = v.status }) end return data end --该任务是否显示中 function AchieveTask:IsShow( player , taskId ) local showTask = self:GetShowTaskData( player ) for k, v in pairs( showTask ) do if taskId == v.id then return true end end return false end --是否存在顺序 function AchieveTask:IsExistOrder( player , taskInfo , order ) for k, v in pairs( taskInfo ) do if order == v.order then return true end end return false end skynet.server.achieveTask = AchieveTask return AchieveTask