227 lines
No EOL
7.3 KiB
Lua
227 lines
No EOL
7.3 KiB
Lua
|
||
|
||
local XRegression3rdTask = XClass(XDataEntityBase, "XRegression3rdTask")
|
||
|
||
local default = {
|
||
_Id = 0, --战令玩法Id
|
||
_TaskGroupId = 0, --任务组id
|
||
_TaskFinishCount = 0, --任务完成次数(仅用于更新界面)
|
||
}
|
||
|
||
-- 默认排序优先级
|
||
local DefaultTaskState = 999
|
||
-- 任务类型排序
|
||
local TaskTypeSortOrder
|
||
-- 任务状态排序
|
||
local TaskStateSortOrder
|
||
-- 星期一
|
||
local Monday = 1
|
||
|
||
local function InitTaskSortOrder()
|
||
TaskTypeSortOrder = {
|
||
[XRegression3rdConfigs.TaskType.Daily] = 1,
|
||
[XRegression3rdConfigs.TaskType.Weekly] = 2,
|
||
[XRegression3rdConfigs.TaskType.TimeLimit] = 3,
|
||
[XRegression3rdConfigs.TaskType.Permanent] = 4,
|
||
}
|
||
|
||
TaskStateSortOrder = {
|
||
[XDataCenter.TaskManager.TaskState.Achieved] = 0,
|
||
[DefaultTaskState] = 1,
|
||
[XDataCenter.TaskManager.TaskState.Invalid] = 2,
|
||
[XDataCenter.TaskManager.TaskState.Finish] = 3,
|
||
}
|
||
end
|
||
|
||
function XRegression3rdTask:Ctor(id)
|
||
self:Init(default, id)
|
||
end
|
||
|
||
function XRegression3rdTask:InitData(id)
|
||
self:SetProperty("_Id", id)
|
||
self:SetProperty("_TaskGroupId", XRegression3rdConfigs.GetPassportTaskGroupId(id))
|
||
|
||
InitTaskSortOrder()
|
||
|
||
self.EndTimeFunc = {
|
||
[XRegression3rdConfigs.TaskType.Daily] = handler(self, self._GetDailyTaskEndTime),
|
||
[XRegression3rdConfigs.TaskType.Weekly] = handler(self, self._GetWeeklyTaskEndTime),
|
||
[XRegression3rdConfigs.TaskType.Permanent] = handler(self, self._GetPermanentTaskEndTime),
|
||
[XRegression3rdConfigs.TaskType.TimeLimit] = handler(self, self._GetTimeLimitTaskEndTime),
|
||
}
|
||
end
|
||
|
||
--常规任务列表(日常+周常)
|
||
function XRegression3rdTask:GetConventionTaskList(needSort)
|
||
local list = XRegression3rdConfigs.GetPassportTaskList(XRegression3rdConfigs.TaskType.Daily, self._TaskGroupId)
|
||
list = appendArray(list, XRegression3rdConfigs.GetPassportTaskList(XRegression3rdConfigs.TaskType.Weekly, self._TaskGroupId))
|
||
if needSort ~= false then
|
||
needSort = true
|
||
end
|
||
return self:_GetTaskList(list, needSort)
|
||
end
|
||
|
||
--活动任务(常驻 + 限时常驻)
|
||
function XRegression3rdTask:GetActivityTaskList(needSort)
|
||
local list = XRegression3rdConfigs.GetPassportTaskList(XRegression3rdConfigs.TaskType.Permanent, self._TaskGroupId)
|
||
list = appendArray(list, XRegression3rdConfigs.GetPassportTaskList(XRegression3rdConfigs.TaskType.TimeLimit, self._TaskGroupId))
|
||
if needSort ~= false then
|
||
needSort = true
|
||
end
|
||
return self:_GetTaskList(list, needSort)
|
||
end
|
||
|
||
function XRegression3rdTask:GetTaskGroupTemplateByTaskId(taskId)
|
||
return XRegression3rdConfigs.GetPassportTaskGroupTemplateByTaskId(self._TaskGroupId, taskId)
|
||
end
|
||
|
||
function XRegression3rdTask:GetTaskType(taskId)
|
||
local template = self:GetTaskGroupTemplateByTaskId(taskId)
|
||
return template.Type
|
||
end
|
||
|
||
function XRegression3rdTask:GetEndTime(taskId)
|
||
local type = self:GetTaskType(taskId)
|
||
local func = self.EndTimeFunc[type]
|
||
if not func then
|
||
return 0
|
||
end
|
||
return func(taskId)
|
||
end
|
||
|
||
function XRegression3rdTask:GetTaskListByType(taskType)
|
||
if taskType == XRegression3rdConfigs.TaskType.Daily
|
||
or taskType == XRegression3rdConfigs.TaskType.Weekly then
|
||
return self:GetConventionTaskList()
|
||
else
|
||
return self:GetActivityTaskList()
|
||
end
|
||
end
|
||
|
||
--- 获取可领取的任务列表
|
||
---@return number[]
|
||
--------------------------
|
||
function XRegression3rdTask:GetAchievedTaskList()
|
||
local taskIds = {}
|
||
for _, task in ipairs(self:GetConventionTaskList(false)) do
|
||
if task.State == XDataCenter.TaskManager.TaskState.Achieved then
|
||
table.insert(taskIds, task.Id)
|
||
end
|
||
end
|
||
|
||
for _, task in ipairs(self:GetActivityTaskList(false)) do
|
||
if task.State == XDataCenter.TaskManager.TaskState.Achieved then
|
||
table.insert(taskIds, task.Id)
|
||
end
|
||
end
|
||
|
||
return taskIds
|
||
end
|
||
|
||
function XRegression3rdTask:GetAchievedConventionTaskList()
|
||
local taskIds = {}
|
||
for _, task in ipairs(self:GetConventionTaskList(false)) do
|
||
if task.State == XDataCenter.TaskManager.TaskState.Achieved then
|
||
table.insert(taskIds, task.Id)
|
||
end
|
||
end
|
||
return taskIds
|
||
end
|
||
|
||
function XRegression3rdTask:GetAchievedActivityTaskList()
|
||
local taskIds = {}
|
||
for _, task in ipairs(self:GetActivityTaskList(false)) do
|
||
if task.State == XDataCenter.TaskManager.TaskState.Achieved then
|
||
table.insert(taskIds, task.Id)
|
||
end
|
||
end
|
||
return taskIds
|
||
end
|
||
|
||
function XRegression3rdTask:UpdateFinishCount()
|
||
local count = self._TaskFinishCount
|
||
count = count + 1
|
||
self:SetProperty("_TaskFinishCount", count)
|
||
end
|
||
|
||
--region ------------------private start-------------------
|
||
|
||
function XRegression3rdTask:_GetTaskList(list, needSort)
|
||
local taskList = {}
|
||
for _, taskId in ipairs(list or {}) do
|
||
local taskData = XDataCenter.TaskManager.GetTaskDataById(taskId)
|
||
if taskData then
|
||
table.insert(taskList, taskData)
|
||
end
|
||
end
|
||
return needSort and self:_SortTaskList(taskList) or taskList
|
||
end
|
||
|
||
function XRegression3rdTask:_SortTaskList(taskList)
|
||
local taskTemplate = XTaskConfig.GetTaskTemplate()
|
||
table.sort(taskList, function(taskA, taskB)
|
||
local orderA = TaskStateSortOrder[taskA.State] or TaskStateSortOrder[DefaultTaskState]
|
||
local orderB = TaskStateSortOrder[taskB.State] or TaskStateSortOrder[DefaultTaskState]
|
||
if orderA ~= orderB then
|
||
return orderA < orderB
|
||
end
|
||
|
||
local typeA = self:GetTaskType(taskA.Id)
|
||
local typeB = self:GetTaskType(taskB.Id)
|
||
orderA = TaskTypeSortOrder[typeA] or DefaultTaskState
|
||
orderB = TaskTypeSortOrder[typeB] or DefaultTaskState
|
||
if orderA ~= orderB then
|
||
return orderA < orderB
|
||
end
|
||
|
||
orderA = taskTemplate[taskA.Id].Priority
|
||
orderB = taskTemplate[taskB.Id].Priority
|
||
if orderA ~= orderB then
|
||
return orderA > orderB
|
||
end
|
||
|
||
return taskA.Id < taskB.Id
|
||
end)
|
||
|
||
return taskList
|
||
end
|
||
|
||
function XRegression3rdTask:_GetDailyTaskEndTime(taskId)
|
||
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
local nextRefresh = XTime.GetSeverNextRefreshTime()
|
||
return math.max(0, nextRefresh - timeOfNow)
|
||
end
|
||
|
||
function XRegression3rdTask:_GetWeeklyTaskEndTime(taskId)
|
||
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
local nextRefresh = XTime.GetSeverNextWeekOfDayRefreshTime(Monday)
|
||
return math.max(0, nextRefresh - timeOfNow)
|
||
end
|
||
|
||
function XRegression3rdTask:_GetPermanentTaskEndTime(taskId)
|
||
return 0
|
||
end
|
||
|
||
--- 获取限时任务时间,为负数则活动未开启,为0活动结束,正数表示距离活动结束时间
|
||
---@param taskId 任务Id
|
||
---@return number
|
||
--------------------------
|
||
function XRegression3rdTask:_GetTimeLimitTaskEndTime(taskId)
|
||
local template = self:GetTaskGroupTemplateByTaskId(taskId)
|
||
local timeId = template.TimeId or 0
|
||
if not XTool.IsNumberValid(timeId) then
|
||
return 0
|
||
end
|
||
local timeOfNow = XTime.GetServerNowTimestamp()
|
||
local timeOfEnd = XFunctionManager.GetEndTimeByTimeId(timeId)
|
||
local timeOfBgn = XFunctionManager.GetStartTimeByTimeId(timeId)
|
||
--未开始
|
||
if timeOfBgn > timeOfNow then
|
||
return timeOfNow - timeOfBgn
|
||
end
|
||
return math.max(0, timeOfEnd - timeOfNow)
|
||
end
|
||
|
||
--endregion------------------private finish------------------
|
||
|
||
return XRegression3rdTask |