HomeServer/lualib-src/Server-main/AllServer/GameServer/Task/GeneralTask.lua
2024-11-20 15:41:37 +08:00

135 lines
5.2 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 910需要累计
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