PGRData/Script/matrix/xmanager/XNewbieTaskManager.lua

489 lines
16 KiB
Lua
Raw Normal View History

2024-09-01 20:49:41 +00:00
local NewbieTaskCondition = {
-- 每日首进
[XNewbieEventType.FIRST_ENTER] = function()
return not XDataCenter.NewbieTaskManager.CheckIsDailyFirstEnter()
end,
-- 非每日首进
[XNewbieEventType.NOT_FIRST_ENTER] = function()
return XDataCenter.NewbieTaskManager.CheckIsDailyFirstEnter()
end,
-- 有未领取的奖励
[XNewbieEventType.REWARD] = function()
if XDataCenter.NewbieTaskManager.CheckTaskHaveAchieved() or XDataCenter.NewbieTaskManager.CheckProgressRewardHaveAchieved() then
return true
end
return false
end,
}
-- 新手任务(二期)管理类
XNewbieTaskManagerCreator = function()
local tableInsert = table.insert
local tableSort = table.sort
local pairs = pairs
local XNewbieTaskManager = {}
local RequestProto = {
GetNewbieRewardRequest = "GetNewbieRewardRequest", -- 请求新手任务奖励
GetNewbieHonorRewardRequest = "GetNewbieHonorRewardRequest", -- 请求新手荣耀奖励
}
-- 当前解锁阶段
local UnlockPeriod = 1
local NewbieRecordProgress = {}
local NewbieHonorReward = false
--播放器数据
local PlayerData = nil
function XNewbieTaskManager.GetNewbieTaskAnimPlayerData()
if not PlayerData then
PlayerData = {}
PlayerData.PlayerList = {} --播放列表
PlayerData.PlayingElement = nil --播放对象
PlayerData.PlayedList = {} --播放过的列表
PlayerData.LastPlayTime = -1 --上次播放时间
end
return PlayerData
end
function XNewbieTaskManager.ResetPlayerData()
if PlayerData then
PlayerData.PlayerList = {} --播放列表
PlayerData.PlayingElement = nil --播放对象
PlayerData.PlayedList = {} --播放过的列表
PlayerData.LastPlayTime = -1 --上次播放时间
end
end
-- 获取互动的事件
function XNewbieTaskManager.GetPlayElements()
local elements = XNewbieTaskConfigs.GetPassiveAnimConfig()
if not elements or #elements <= 0 then
return {}
end
local all = {}
for _, tab in pairs(elements) do
local condition = NewbieTaskCondition[tab.ConditionId]
if condition and condition(tab.ConditionParam) then
local element = {}
element.Id = tab.Id
element.StartTime = -1 --开始播放的时间
element.EndTime = -1 --结束时间
element.Duration = tab.Duration --播放持续时间
element.CoolTime = tab.CoolTime --冷却时间
element.Priority = tab.Priority -- 优先级
element.Config = tab
tableInsert(all, element)
end
end
table.sort(all, function(a, b)
return a.Priority < b.Priority
end)
return all
end
-- 通过点击次数获取事件
function XNewbieTaskManager.GetPlayElementsByClick(clickTimes)
local configs = XNewbieTaskConfigs.GetAnimConfigByFeedback(XNewbieEventType.CLICK, clickTimes)
local element = XNewbieTaskManager.WeightRandomSelect(configs)
return element
end
--权重随机算法
function XNewbieTaskManager.WeightRandomSelect(elements)
if not elements or #elements <= 0 then
return
end
if #elements == 1 then
return elements[1]
end
--获取权重总和
local sum = 0
for _, v in ipairs(elements) do
sum = sum + v.Weight
end
--设置随机数种子
math.randomseed(os.time())
--随机数加上权重,越大的权重,数值越大
local weightList = {}
for i, v in ipairs(elements) do
local rand = math.random(0, sum)
local seed = {}
seed.Index = i
seed.Weight = rand + v.Weight
table.insert(weightList, seed)
end
--排序
table.sort(weightList, function(x, y)
return x.Weight > y.Weight
end)
--返回最大的权重值
local index = weightList[1].Index
return elements[index]
end
-- 获取进度奖励
function XNewbieTaskManager.GetNewbieReward(progress, cb)
local req = { Progress = progress }
XNetwork.Call(RequestProto.GetNewbieRewardRequest, req, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
XNewbieTaskManager.UpdateNewbieRecordProgress(progress)
if cb then
cb(res.RewardGoodsList)
end
end)
end
-- 获取荣誉奖励
function XNewbieTaskManager.GetNewbieHonorReward(cb)
XNetwork.Call(RequestProto.GetNewbieHonorRewardRequest, nil, function(res)
if res.Code ~= XCode.Success then
XUiManager.TipCode(res.Code)
return
end
NewbieHonorReward = true
if cb then
cb(res.RewardGoodsList)
end
end)
end
-- 打开新手任务二期UI
function XNewbieTaskManager.OpenMainUi()
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.NewbieTask) then
return
end
XLuaUiManager.Open("UiNewbieTaskMain")
end
-- 当前新手任务二期是否开启
function XNewbieTaskManager.GetIsOpen()
-- 功能是否开启
if not XFunctionManager.DetectionFunction(XFunctionManager.FunctionName.NewbieTask, false, true) then
return false
end
-- 奖励是否全部领取了。全部领取了返回false,否则为True
local isAllReceive = XNewbieTaskManager.CheckTaskAllFinish() and XNewbieTaskManager.CheckProgressRewardAllReceive() and NewbieHonorReward
return not isAllReceive
end
-- 返回荣誉奖励领取状态
function XNewbieTaskManager.CheckNewbieHonorReward()
return NewbieHonorReward
end
-- 检测活动入口红点
function XNewbieTaskManager.CheckActivityEntryRedPoint()
-- 是否有待领取的任务奖励
if XNewbieTaskManager.CheckTaskHaveAchieved() then
return true
end
-- 是否有待领取的进度奖励
if XNewbieTaskManager.CheckProgressRewardHaveAchieved() then
return true
end
-- 是否有待领取的荣誉奖励(任务奖励和进度奖励都完成了才会有荣誉奖励)
if XNewbieTaskManager.CheckTaskAllFinish() and XNewbieTaskManager.CheckProgressRewardAllReceive() and not NewbieHonorReward then
return true
end
-- 是否有新解锁的任务
if XNewbieTaskManager.CheckHaveNewRegisterDay() then
return true
end
return false
end
-- 检测解锁天数红点
function XNewbieTaskManager.CheckRegisterDayRedPoint(day)
-- 是否有待领取的任务奖励
if XNewbieTaskManager.CheckTaskAchievedByDay(day) then
return true
end
-- 是否是新解锁的任务
if not XNewbieTaskManager.GetRegisterDayBtnClick(day) then
return true
end
return false
end
-- 检测任务奖励是否有已完成未领取的奖励
function XNewbieTaskManager.CheckTaskHaveAchieved()
local groupConfig = XNewbieTaskConfigs.GetNewbieTaskGroupConfig()
for _, config in pairs(groupConfig) do
if XNewbieTaskManager.CheckUnlockPeriod(config.RegisterDay) and XNewbieTaskManager.CheckTaskAchievedByDay(config.RegisterDay) then
return true
end
end
return false
end
-- 检测进度奖励是否有已完成未领取的奖励(不包含荣誉奖励)
function XNewbieTaskManager.CheckProgressRewardHaveAchieved()
local progressNumber = XNewbieTaskManager.GetCurrentTaskProgress()
local newbieActiveness = XTaskConfig.GetNewbieTaskTwoActivenessTemplate()
for _, activeness in pairs(newbieActiveness.Activeness) do
if progressNumber >= activeness and not XNewbieTaskManager.CheckProgressRewardReceive(activeness) then
return true
end
end
return false
end
-- 检测任务是否全部完成
function XNewbieTaskManager.CheckTaskAllFinish()
local groupConfig = XNewbieTaskConfigs.GetNewbieTaskGroupConfig()
for _, config in pairs(groupConfig) do
if not XNewbieTaskManager.CheckTaskFinishByDay(config.RegisterDay) then
return false
end
end
return true
end
-- 检测进度奖励是否全部已领取(不包含荣誉奖励)
function XNewbieTaskManager.CheckProgressRewardAllReceive()
local newbieActiveness = XTaskConfig.GetNewbieTaskTwoActivenessTemplate()
for _, activeness in pairs(newbieActiveness.Activeness) do
if not XNewbieTaskManager.CheckProgressRewardReceive(activeness) then
return false
end
end
return true
end
-- 检测是否是新解锁的任务
function XNewbieTaskManager.CheckHaveNewRegisterDay()
local groupConfig = XNewbieTaskConfigs.GetNewbieTaskGroupConfig()
for _, config in pairs(groupConfig) do
if XNewbieTaskManager.CheckUnlockPeriod(config.RegisterDay) and not XNewbieTaskManager.GetRegisterDayBtnClick(config.RegisterDay) then
return true
end
end
return false
end
--region 保存到本地
function XNewbieTaskManager.SaveRegisterDayBtnClick(day)
local key = XNewbieTaskManager.GetBtnClickKey(day)
local isClick = XSaveTool.GetData(key)
if isClick then
return false
end
XSaveTool.SaveData(key, true)
return true
end
function XNewbieTaskManager.GetRegisterDayBtnClick(day)
local key = XNewbieTaskManager.GetBtnClickKey(day)
local isClick = XSaveTool.GetData(key) or false
return isClick
end
function XNewbieTaskManager.GetBtnClickKey(day)
if XPlayer.Id and day then
return string.format("%s_%s_%s", "NewbieTaskRegisterDayBtnClick", tostring(XPlayer.Id), tostring(day))
end
end
-- 检测是否是每日首进 非每日首进返回true,否则返回false
function XNewbieTaskManager.CheckIsDailyFirstEnter()
local key = XNewbieTaskManager.GetDailyFirstEnterKey()
local updateTime = XSaveTool.GetData(key)
if not updateTime then
return false
end
return XTime.GetServerNowTimestamp() < updateTime
end
function XNewbieTaskManager.SaveDailyFirstEnter()
if XNewbieTaskManager.CheckIsDailyFirstEnter() then
return
end
local key = XNewbieTaskManager.GetDailyFirstEnterKey()
local updateTime = XTime.GetSeverTomorrowFreshTime()
XSaveTool.SaveData(key, updateTime)
end
function XNewbieTaskManager.GetDailyFirstEnterKey()
if XPlayer.Id then
return string.format("%s_%s","NewbieTaskDailyFirstEnterTime",tostring(XPlayer.Id))
end
end
--endregion
-- 检测第几天是否解锁
-- 解锁返回true否则返回false
function XNewbieTaskManager.CheckUnlockPeriod(day)
if not XTool.IsNumberValid(UnlockPeriod) then
return false
end
return day <= UnlockPeriod
end
-- 检测第day天的任务是否都已完成
function XNewbieTaskManager.CheckTaskFinishByDay(day)
local taskIds = XNewbieTaskConfigs.GetNewbieTaskIdByDay(day)
for _, taskId in pairs(taskIds) do
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
if taskData and taskData.State ~= XDataCenter.TaskManager.TaskState.Finish and taskData.State ~= XDataCenter.TaskManager.TaskState.Invalid then
return false
end
end
return true
end
-- 检测第day天的任务是否有待领取的
function XNewbieTaskManager.CheckTaskAchievedByDay(day)
local taskIds = XNewbieTaskConfigs.GetNewbieTaskIdByDay(day)
for _, taskId in pairs(taskIds) do
if XDataCenter.TaskManager.CheckTaskAchieved(taskId) then
return true
end
end
return false
end
-- 获取任务天数
function XNewbieTaskManager.GetNewbieTaskRegisterDay()
local groupConfig = XNewbieTaskConfigs.GetNewbieTaskGroupConfig()
local registerDay = {}
for _, config in pairs(groupConfig) do
tableInsert(registerDay, config.RegisterDay)
end
tableSort(registerDay, function(a, b)
return a < b
end)
return registerDay
end
-- 获取第几天的任务
function XNewbieTaskManager.GetTaskDataList(day)
local taskIds = XNewbieTaskConfigs.GetNewbieTaskIdByDay(day)
local achieved = XDataCenter.TaskManager.TaskState.Achieved
local finish = XDataCenter.TaskManager.TaskState.Finish
tableSort(taskIds, function(a, b)
local taskDataA = XDataCenter.TaskManager.GetTaskDataById(a)
local taskDataB = XDataCenter.TaskManager.GetTaskDataById(b)
if taskDataA.State ~= taskDataB.State then
if taskDataA.State == achieved then
return true
end
if taskDataB.State == achieved then
return false
end
if taskDataA.State == finish then
return false
end
if taskDataB.State == finish then
return true
end
end
local templatesTaskA = XDataCenter.TaskManager.GetTaskTemplate(a)
local templatesTaskB = XDataCenter.TaskManager.GetTaskTemplate(b)
if templatesTaskA.Priority ~= templatesTaskB.Priority then
return templatesTaskA.Priority > templatesTaskB.Priority
else
return a > b
end
end)
return taskIds
end
-- 获取完成的任务进度数
function XNewbieTaskManager.GetCurrentTaskProgress()
local number = 0
local taskGroup = XNewbieTaskConfigs.GetNewbieTaskGroupConfig()
for _, config in pairs(taskGroup) do
local taskIds = config.TaskId
for _, taskId in pairs(taskIds) do
if XDataCenter.TaskManager.CheckTaskFinished(taskId) then
number = number + 1
end
end
end
return number
end
-- 检测进度奖励是否已领取
function XNewbieTaskManager.CheckProgressRewardReceive(activeness)
for _, v in pairs(NewbieRecordProgress or {}) do
if v == activeness then
return true
end
end
return false
end
-- 更新奖励进度领取记录
function XNewbieTaskManager.UpdateNewbieRecordProgress(activeness)
for _, v in pairs(NewbieRecordProgress or {}) do
if v == activeness then
return
end
end
NewbieRecordProgress[#NewbieRecordProgress + 1] = activeness
end
-- 更新解锁阶段
function XNewbieTaskManager.UpdateUnlockPeriod(data)
if XTool.IsNumberValid(data.UnlockPeriod) then
UnlockPeriod = data.UnlockPeriod
CsXGameEventManager.Instance:Notify(XEventId.EVENT_NEWBIE_TASK_UNLOCK_PERIOD_CHANGED)
XEventManager.DispatchEvent(XEventId.EVENT_NEWBIE_TASK_UNLOCK_PERIOD_CHANGED)
end
end
function XNewbieTaskManager.InitTaskData(data)
-- 新手荣誉任务解锁阶段(新手任务二期)
if XTool.IsNumberValid(data.NewbieUnlockPeriod) then
UnlockPeriod = data.NewbieUnlockPeriod
end
-- 新手荣誉任务奖励进度领取记录(新手任务二期)
NewbieRecordProgress = data.NewbieRecvProgress
-- 是否领取新手荣耀奖励(新手任务二期)
NewbieHonorReward = data.NewbieHonorReward
end
function XNewbieTaskManager.Init()
end
XNewbieTaskManager.Init()
return XNewbieTaskManager
end
XRpc.NotifyNewbieTaskPeriod = function(data)
XDataCenter.NewbieTaskManager.UpdateUnlockPeriod(data)
end