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