214 lines
8.4 KiB
Lua
214 lines
8.4 KiB
Lua
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 |