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 NpcTask = oo.class(task) NpcTask.MaxShowItem = 4 --任务最大显示多少个 --检查一下玩家是否有新的任务 function NpcTask:CheckNew( player ) if not player:IsUnlockSystem( dataType.UnlockSystem_NpcTask ) then return end local cfgTask = skynet.server.gameConfig:GetPlayerAllCfg( player , "NPCTask") --任务配置 for k, v in pairs( cfgTask ) do if not player.gameData.npcTask[ v.id ] then player.gameData.npcTask[ v.id ] = {} player.gameData.npcTask[ v.id ].id = v.id player.gameData.npcTask[ v.id ].type = v.taskType --任务类型 player.gameData.npcTask[ v.id ].target = v.seedId --任务目标 player.gameData.npcTask[ v.id ].progress =0 --当前进度 player.gameData.npcTask[ v.id ].status =self.TaskStatus_NoComplete --是否完成 player.gameData.npcTask[ v.id ].historyId = {} end end end --任务列表显示 function NpcTask:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SNpcTaskShow", c2sData.data )) local data = {} local showTaskData = self:GetShowTaskData( player ) 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 , 70 ) skynet.server.msgTips:Add( player , 70 , tipsCount) skynet.server.msgTips:Reduce( player , 91 ) data.taskInfo = showTaskData s2cData.cmd = pb.enum("MsgType","CMD_S2C_NpcTaskShow") s2cData.data = assert(pb.encode("S2CNpcTaskShow", data)) end --任务完成 function NpcTask:Accomplish( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SNpcTaskAccomplish", c2sData.data )) local data = {} local taskId = c2sData.data.taskId for k, v in pairs( player.gameData.npcTask ) do if taskId == k and self.TaskStatus_AlreadyComplete == v.status then --只有状态为任务已完成才能领取 local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCTask" , v.id) local eventId = pb.enum("EnumMoneyChangeEventID","EventID_78") player:GiveReward( cfgOne.rewardId , eventId) v.status = self.TaskStatus_AlreadyGet player:AddExpCount( cfgOne.taskExp ) skynet.server.msgTips:Reduce( player , 70 ) log.debug(string.format("玩家 %d NPC任务 任务完成 ID %d " , player.basicInfo.userID , taskId )) break end end data.taskInfo = self:GetShowTaskData( player ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_NpcTaskAccomplish") s2cData.data = assert(pb.encode("S2CNpcTaskAccomplish", data)) end --修改任务 function NpcTask:Modify( player , type , count , taskTarge , goodsId ) if not player:IsUnlockSystem( dataType.UnlockSystem_NpcTask )then return end local level = player.gameData.level taskTarge = taskTarge or 0 count = count or 1 goodsId = goodsId or 0 log.debug(string.format("玩家 %d NPC任务 任务修改 类型 %d " , player.basicInfo.userID , type )) local maxProgress = 0 for k1, v1 in pairs( player.gameData.npcTask ) do local cfgOne = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCTask" , v1.id) if not cfgOne then return end maxProgress = cfgOne.value if type == v1.type and level >= cfgOne.beginCountLevel and self.TaskStatus_NoComplete == v1.status and taskTarge == v1.target then local isAdd = true --是否能添加任务 if 0 ~= goodsId then for k2, v2 in pairs( v1.historyId ) do if goodsId == v2 then isAdd = false break end end if isAdd then --不存在商品ID, 该任务保存商品ID table.insert( v1.historyId , goodsId ) end end if isAdd then v1.progress = v1.progress + count --检查是否完成任务 if v1.progress >= maxProgress then v1.status =self.TaskStatus_AlreadyComplete v1.progress = maxProgress if self:IsShow( player , k1 ) then skynet.server.msgTips:Add( player , 70 ) end log.debug(string.format("玩家 %d NPC任务 任务类型 %d 完成 " , player.basicInfo.userID , v1.type )) end end end end end --获取显示的任务数据 function NpcTask:GetShowTaskData( player ) local taskInfo = {} local count = 0 local tipsCount = 0 local level = player.gameData.level for k, v in pairs( player.gameData.npcTask ) do if count >= self.MaxShowItem then break end --如果玩家已经完成了,并且可以显示就需要发送红点信息 if self.TaskStatus_AlreadyComplete == v.status then tipsCount = tipsCount + 1 end --已领取的就不用再显示了 local cfgOneNPCTask = skynet.server.gameConfig:GetPlayerCurCfg( player , "NPCTask" , k ) if self.TaskStatus_AlreadyGet ~= v.status and level >= cfgOneNPCTask.taskLevel and 26 ~= v.id then --任务26暂时完不成,就屏蔽了 table.insert( taskInfo , { id = k , progress = v.progress , status = v.status }) count = count + 1 end end return taskInfo end --该任务是否显示中 function NpcTask: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.npcTask = NpcTask return NpcTask