135 lines
5.2 KiB
Lua
135 lines
5.2 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 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 ,9,10需要累计
|
|||
|
|
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
|