181 lines
7.4 KiB
Lua
181 lines
7.4 KiB
Lua
|
|
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:Reset( player , 32 )
|
||
|
|
skynet.server.msgTips:Reduce( player , 32 )
|
||
|
|
local cfgSValue = skynet.server.gameConfig.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:GetCurCfg("DailyTask", taskId )
|
||
|
|
if 6 == curCfgTask.taskType or 7 == curCfgTask.taskType then
|
||
|
|
table.insert( player.gameData.dailyTask.item , { id = taskId , type = curCfgTask.taskType , progress = 0 , status = self.TaskStatus_NoComplete , historyId = {}})
|
||
|
|
else
|
||
|
|
table.insert( player.gameData.dailyTask.item , { id = taskId , type = curCfgTask.taskType , progress = 0 , status = self.TaskStatus_NoComplete })
|
||
|
|
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 )
|
||
|
|
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:GetEventsDailyTaskCfg( taskId )
|
||
|
|
local cfgReward = skynet.server.gameConfig:GetCurCfg("Reward" , curCfg.rewardId )
|
||
|
|
player:MoneyChange( dataType.MoneyType_Coin , cfgReward.coin )
|
||
|
|
curTask.status = self.TaskStatus_AlreadyGet
|
||
|
|
skynet.server.msgTips:Reduce( player , 32 )
|
||
|
|
log.info(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 = {}
|
||
|
|
if self.TaskStatus_AlreadyComplete == player.gameData.dailyTask.allAwardStatus then
|
||
|
|
--发奖
|
||
|
|
local reward = skynet.server.gameConfig.SValue.dailyTaskCompleteReward
|
||
|
|
player:MoneyChange( reward[1] , reward[2] )
|
||
|
|
player.gameData.dailyTask.allAwardStatus = self.TaskStatus_AlreadyGet
|
||
|
|
skynet.server.msgTips:Reduce( player , 32 )
|
||
|
|
log.info(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
|
||
|
|
for k1, v1 in pairs( player.gameData.dailyTask.item ) do
|
||
|
|
if self.TaskStatus_NoComplete == v1.status and taskType == v1.type then
|
||
|
|
local isAdd = true --是否能添加任务
|
||
|
|
--只有类型6和7的任务需要保存历史商品ID
|
||
|
|
if v1.historyId and ( 6 == taskType or 7 == taskType ) then
|
||
|
|
for k2, v2 in pairs(v1.historyId) do
|
||
|
|
if goodsId == v2 then
|
||
|
|
isAdd = false
|
||
|
|
break
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isAdd then
|
||
|
|
--该任务保存商品ID
|
||
|
|
table.insert( v1.historyId , goodsId)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if isAdd then
|
||
|
|
v1.progress = v1.progress + count
|
||
|
|
local curCfg = skynet.server.gameConfig:GetCurCfg("DailyTask", v1.id )
|
||
|
|
--条件达到,并且任务未完成,就修改成已经完成
|
||
|
|
if self.TaskStatus_NoComplete == v1.status and v1.progress >= curCfg.value then
|
||
|
|
v1.status = self.TaskStatus_AlreadyComplete
|
||
|
|
v1.progress = curCfg.value
|
||
|
|
|
||
|
|
--如果任务当前显示就发送TIPS
|
||
|
|
skynet.server.msgTips:Add( player , 32 )
|
||
|
|
log.info(string.format("玩家 %d 每日任务 任务ID %d 完成" , player.userId , v1.id ))
|
||
|
|
end
|
||
|
|
else
|
||
|
|
log.info(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.info(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
|