HomeServer/lualib-src/Server-main/AllServer/GameServer/Task/AchieveTask.lua

145 lines
5.1 KiB
Lua
Raw Normal View History

2024-11-20 15:41:09 +08:00
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.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 --是否完成
end
end
if 9 == player.gameData.level then
self:Modify( player , 43 , 9)
else
self:Modify( player , 43 , 1)
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)
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:GetCurCfg("AchievementTask" , v.id)
player:GiveReward( cfgOne.rewardId )
v.status = self.TaskStatus_AlreadyGet
skynet.server.msgTips:Reduce( player , 33 )
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_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:GetCurCfg("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.info(string.format("玩家 %d 成就任务 任务ID %d 完成 " , player.basicInfo.userID , v.id ))
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