PGRData/Script/matrix/xmanager/XNewbieTaskManager.lua
2024-09-01 22:49:41 +02:00

489 lines
No EOL
16 KiB
Lua
Raw Permalink 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 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