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 GeneralTask = oo.class(task) GeneralTask.MaxShowItem = 3 --任务最大显示多少个 --检查一下玩家是否有新的任务 function GeneralTask:CheckNew( player ) local cfgTask = skynet.server.gameConfig.Task --任务配置 for k, v in pairs( cfgTask ) do if not player.gameData.generalTask[ v.id ] then player.gameData.generalTask[ v.id ] = {} player.gameData.generalTask[ v.id ].id = v.id player.gameData.generalTask[ v.id ].type = v.taskType --任务类型 player.gameData.generalTask[ v.id ].target = v.taskTarget --任务目标 player.gameData.generalTask[ v.id ].curProgress =0 --当前进度 player.gameData.generalTask[ v.id ].status =self.TaskStatus_NoComplete --是否完成 end end end --任务列表显示 function GeneralTask:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2STaskShow", c2sData.data )) local data = {} data.taskInfo = self:GetShowTaskData( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_TaskShow") s2cData.data = assert(pb.encode("S2CTaskShow", data)) end --任务完成 function GeneralTask:Accomplish( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2STaskAccomplish", c2sData.data )) local data = {} local taskId = c2sData.data.taskId for k, v in pairs( player.gameData.generalTask ) do if taskId == k and self.TaskStatus_AlreadyComplete == v.status then --只有状态为任务已完成才能领取 local cfgOne = skynet.server.gameConfig:GetTaskConfig( k ) player:MoneyChange( cfgOne.awardType , cfgOne.awardNumber ) v.status = self.TaskStatus_AlreadyGet log.info(string.format("玩家 %d 任务完成 ID %d " , player.basicInfo.userID , taskId )) break end end data.taskInfo = self:GetShowTaskData( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_TaskAccomplish") s2cData.data = assert(pb.encode("S2CTaskAccomplish", data)) end --修改任务 function GeneralTask:Modify( player , type , count , taskTarge ) taskTarge = taskTarge or 0 local cfgTask = skynet.server.gameConfig.Task --任务配置 local isAcc = false --是否需要累计 1-5 ,9,10需要累计 if type >= dataType.GeneralTaskType_BuyFurniture and type <= dataType.GeneralTaskType_BuyDecorate or type == dataType.GeneralTaskType_SellUsed or type == dataType.GeneralTaskType_ReciveUsed then isAcc = true end log.info(string.format("玩家 %d 任务修改 类型 %d 是否加速 %s" , player.basicInfo.userID , type , isAcc )) local maxProgress = 0 for k, v in pairs( player.gameData.generalTask ) do maxProgress = skynet.server.gameConfig:GetTaskConfig( k ).value if type == v.type and self.TaskStatus_NoComplete == v.status and taskTarge == v.target then v.curProgress = v.curProgress + count --检查是否完成任务 if v.curProgress >= maxProgress then v.status =self.TaskStatus_AlreadyComplete --刷新一次任务列表 --self:GetShowTaskData( player ) --如果任务当前显示就发送TIPS if self:IsShow( player , k ) then skynet.server.msgTips:Add( player , 19 ) end log.info(string.format("玩家 %d 任务ID %d 完成 " , player.basicInfo.userID , k)) end if not isAcc then break end end end end --获取任务数据 function GeneralTask:GetTaskData( player ) local taskInfo = {} for k, v in pairs( player.gameData.generalTask ) do table.insert( taskInfo , { id = k , curProgress = v.curProgress , status = v.status }) end return taskInfo end --获取显示的任务数据 function GeneralTask:GetShowTaskData( player ) local taskInfo = {} local count = 0 local tipsCount = 0 for k, v in pairs( player.gameData.generalTask ) do if count >= self.MaxShowItem then break end --如果玩家已经完成了,并且可以显示就需要发送红点信息 if self.TaskStatus_AlreadyComplete == v.status then tipsCount = tipsCount + 1 end --已领取的就不用再显示了 if self.TaskStatus_AlreadyGet ~= v.status then table.insert( taskInfo , { id = k , curProgress = v.curProgress , status = v.status }) count = count + 1 end end return taskInfo end --该任务是否显示中 function GeneralTask: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 skynet.server.generalTask = GeneralTask return GeneralTask