local skynet = require "skynet" local oo = require "Class" local task = require "Task" local log = require "Log" local dataType = require "DataType" local errorInfo = require "ErrorInfo" local pb = require "pb" local DailyTask = oo.class(task) --检查一下玩家是否有新的任务 function DailyTask:Refresh( player ) if not player:IsUnlockSystem( dataType.UnlockSystem_DailyTask ) then return end skynet.server.msgTips:ReduceAll( player , 32 ) local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") local taskItem = self:GetRandDailyTask( player , cfgSValue.dailyTaskNum ) --随机获取6个任务 player.gameData.dailyTask = {} player.gameData.dailyTask.allAwardStatus = self.TaskStatus_NoComplete --所有奖励状态 player.gameData.dailyTask.item = {} --所有任务条目 for k, taskId in pairs( taskItem ) do local curCfgTask = skynet.server.gameConfig:GetPlayerCurCfg( player , "DailyTask", taskId ) if 39 == curCfgTask.taskType then --根据玩家是是否签到来设置任务状态 local isSignin = skynet.server.signIn:GetDaySignInStatus( player ) if isSignin then table.insert( player.gameData.dailyTask.item , { id = taskId , type = curCfgTask.taskType , progress = curCfgTask.value , status = self.TaskStatus_AlreadyComplete , historyId = {} }) else table.insert( player.gameData.dailyTask.item , { id = taskId , type = curCfgTask.taskType , progress = 0 , status = self.TaskStatus_NoComplete , historyId = {} }) end else table.insert( player.gameData.dailyTask.item , { id = taskId , type = curCfgTask.taskType , progress = 0 , status = self.TaskStatus_NoComplete , historyId = {} }) end end end --任务列表显示 function DailyTask:Show( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDailyTaskShow", c2sData.data )) local data = {} data.allAwardStatus = player.gameData.dailyTask.allAwardStatus data.taskInfo = self:GetAllTaskInfo( player ) skynet.server.msgTips:Reduce( player , 90 ) skynet.server.msgTips:Reduce( player , 75 ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_DailyTaskShow") s2cData.data = assert(pb.encode("S2CDailyTaskShow", data)) end --单个任务完成 function DailyTask:OneAccomplish( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDailyTaskOneAccomplish", c2sData.data )) local data = {} local taskId = c2sData.data.taskId local curTask = {} for k, v in pairs( player.gameData.dailyTask.item ) do if taskId == v.id then curTask = v break end end if not taskId or not curTask then s2cData.code = errorInfo.ErrorCode.ErrRequestParam else if self.TaskStatus_AlreadyComplete == curTask.status then --发奖 local curCfg = skynet.server.gameConfig:GetPlayerCurCfg( player , "DailyTask" , taskId ) local cfgReward = skynet.server.gameConfig:GetPlayerCurCfg( player , "Reward" , curCfg.rewardId ) local eventId = pb.enum("EnumMoneyChangeEventID","EventID_58") player:MoneyChange( dataType.MoneyType_Coin , cfgReward.coin , eventId) curTask.status = self.TaskStatus_AlreadyGet local curCfg = skynet.server.gameConfig:GetPlayerCurCfg( player , "DailyTask" , curTask.id ) player:AddExpCount( curCfg.expNum ) skynet.server.msgTips:Reduce( player , 32 ) log.debug(string.format("玩家 %d 每日任务 获取单个任务奖励 ID %d " , player.basicInfo.userID , taskId )) else s2cData.code = errorInfo.ErrorCode.AlreadyGet end end data.taskInfo = self:GetOneTaskInfo( player , taskId ) s2cData.cmd = pb.enum("MsgType","CMD_S2C_DailyTaskOneAccomplish") s2cData.data = assert(pb.encode("S2CDailyTaskOneAccomplish", data)) end --所有任务完成 function DailyTask:AllAccomplish( player , c2sData , s2cData ) c2sData.data = assert(pb.decode("C2SDailyTaskAllAccomplish", c2sData.data )) local data = {} local cfgSValue = skynet.server.gameConfig:GetPlayerAllCfg( player , "SValue") if self.TaskStatus_AlreadyComplete == player.gameData.dailyTask.allAwardStatus then --发奖 local reward = cfgSValue.dailyTaskCompleteReward local eventId = pb.enum("EnumMoneyChangeEventID","EventID_58") player:MoneyChange( reward[1] , reward[2] , eventId) player.gameData.dailyTask.allAwardStatus = self.TaskStatus_AlreadyGet skynet.server.msgTips:Reduce( player , 32 ) log.debug(string.format("玩家 %d 每日任务 获取所有任务奖励" , player.basicInfo.userID )) else s2cData.code = errorInfo.ErrorCode.AlreadyGet end data.allAwardStatus = player.gameData.dailyTask.allAwardStatus s2cData.cmd = pb.enum("MsgType","CMD_S2C_DailyTaskAllAccomplish") s2cData.data = assert(pb.encode("S2CDailyTaskAllAccomplish", data)) end --修改任务 function DailyTask:Modify( player , taskType , count , goodsId ) if not player:IsUnlockSystem( dataType.UnlockSystem_DailyTask ) then return end count = count or 1 goodsId = goodsId or 0 for k1, v1 in pairs( player.gameData.dailyTask.item ) do if self.TaskStatus_NoComplete == v1.status and taskType == v1.type then local isAdd = true --是否能添加任务 if 0 ~= goodsId and v1.historyId 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 local curCfg = skynet.server.gameConfig:GetPlayerCurCfg( player , "DailyTask", v1.id ) --条件达到,并且任务未完成,就修改成已经完成 if self.TaskStatus_NoComplete == v1.status and v1.progress >= curCfg.value then v1.status = self.TaskStatus_AlreadyComplete v1.progress = curCfg.value skynet.server.msgTips:Add( player , 32 ) log.debug(string.format("玩家 %d 每日任务 任务ID %d 完成" , player.userId , v1.id )) end else log.debug(string.format("玩家 %d 每日任务 任务ID %d 已经存在商品ID 无法完成" , player.userId , v1.id )) end end --只有所有任务未完成才去检查下是不是所有任务都完成了 if self.TaskStatus_NoComplete == player.gameData.dailyTask.allAwardStatus then local isAllAccomplish = true for k2, v2 in pairs( player.gameData.dailyTask.item ) do if self.TaskStatus_NoComplete == v2.status then isAllAccomplish = false break end end --所有完成了 if isAllAccomplish then player.gameData.dailyTask.allAwardStatus = self.TaskStatus_AlreadyComplete skynet.server.msgTips:Add( player , 32 ) log.debug(string.format("玩家 %d 每日任务 所有任务完成 " , player.userId)) end end end end --获取单个任务信息 function DailyTask:GetOneTaskInfo( player , taskId ) local taskInfo = {} for k, v in pairs( player.gameData.dailyTask.item ) do if taskId == v.id then taskInfo = { id = v.id , progress = v.progress , status = v.status} break end end return taskInfo end --获取所有任务信息 function DailyTask:GetAllTaskInfo( player ) local taskInfo = {} for k, v in pairs( player.gameData.dailyTask.item ) do table.insert( taskInfo , { id = v.id , progress = v.progress , status = v.status}) end return taskInfo end skynet.server.dailyTask = DailyTask return DailyTask