forked from endernon/PGRData
365 lines
13 KiB
Lua
365 lines
13 KiB
Lua
|
--===============
|
|||
|
--成就系统管理器
|
|||
|
--模块负责:吕天元
|
|||
|
--依赖模块:XDataCenter.TaskManager
|
|||
|
--===============
|
|||
|
XAchievementManagerCreator = function()
|
|||
|
local XAchievementManager = {}
|
|||
|
local XAchievement = require("XEntity/XAchievement/XAchievement")
|
|||
|
--=============
|
|||
|
--成就列表
|
|||
|
--List<XAchievement>
|
|||
|
--=============
|
|||
|
local AchievementList
|
|||
|
--=============
|
|||
|
--成就表Id -> 成就字典
|
|||
|
--Key : Id -> Achievement表的Id
|
|||
|
--Value : XAchievement对象
|
|||
|
--=============
|
|||
|
local AchievementDicById
|
|||
|
--=============
|
|||
|
--任务Id -> 成就字典
|
|||
|
--Key : Id -> Task表的Id
|
|||
|
--Value : XAchievement对象
|
|||
|
--=============
|
|||
|
local AchievementDicByTaskId
|
|||
|
--=============
|
|||
|
--任务Id -> 成就任务字典
|
|||
|
--Key : Id -> Task表的Id
|
|||
|
--Value : { Id : TaskId State : XTaskManager.TaskState}
|
|||
|
--=============
|
|||
|
local TaskDicByTaskId
|
|||
|
--=============
|
|||
|
--成就类型Id -> 成就列表字典
|
|||
|
--Key : Id -> AchievementTypeInfo表的Id
|
|||
|
--Value : List<XAchievement>
|
|||
|
--=============
|
|||
|
local AchievementListDicByType
|
|||
|
--=============
|
|||
|
--总成就数量
|
|||
|
--=============
|
|||
|
local TotalAchievementNum
|
|||
|
--=============
|
|||
|
--完成成就数量
|
|||
|
--=============
|
|||
|
local CompleteAchievementNum
|
|||
|
--=============
|
|||
|
--初始化监听事件标记
|
|||
|
--=============
|
|||
|
local InitListenerFlag
|
|||
|
--=============
|
|||
|
--任务初始化标记
|
|||
|
--=============
|
|||
|
local TaskInitialFlag = false
|
|||
|
|
|||
|
local function AddInitListener()
|
|||
|
if InitListenerFlag then return end
|
|||
|
XEventManager.AddEventListener(XEventId.EVENT_NOTICE_TASKINITFINISHED, XAchievementManager.SetTaskInitFlag)
|
|||
|
XEventManager.AddEventListener(XEventId.EVENT_TASK_SYNC, XAchievementManager.SyncTasks)
|
|||
|
InitListenerFlag = true
|
|||
|
end
|
|||
|
|
|||
|
local function RemoveInitListener()
|
|||
|
if not InitListenerFlag then return end
|
|||
|
XEventManager.RemoveEventListener(XEventId.EVENT_NOTICE_TASKINITFINISHED, XAchievementManager.SetTaskInitFlag)
|
|||
|
XEventManager.RemoveEventListener(XEventId.EVENT_TASK_SYNC, XAchievementManager.SyncTasks)
|
|||
|
InitListenerFlag = false
|
|||
|
end
|
|||
|
|
|||
|
--=============
|
|||
|
--初始化
|
|||
|
--等任务系统数据初始化成功后才初始化
|
|||
|
--=============
|
|||
|
function XAchievementManager.Init()
|
|||
|
AchievementList = {}
|
|||
|
AchievementDicById = {}
|
|||
|
AchievementDicByTaskId = {}
|
|||
|
TaskDicByTaskId = {}
|
|||
|
AchievementListDicByType = {}
|
|||
|
TaskInitialFlag = false
|
|||
|
TotalAchievementNum = 0
|
|||
|
CompleteAchievementNum = 0
|
|||
|
AddInitListener()
|
|||
|
end
|
|||
|
|
|||
|
local function CreateAchievement(achievementId)
|
|||
|
local achievement
|
|||
|
local cfg = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.Achievement,
|
|||
|
achievementId
|
|||
|
)
|
|||
|
if cfg then
|
|||
|
achievement = XAchievement.New(achievementId)
|
|||
|
table.insert(AchievementList, achievement)
|
|||
|
AchievementDicById[achievementId] = achievement
|
|||
|
AchievementDicByTaskId[achievement:GetTaskId()] = achievement
|
|||
|
end
|
|||
|
return achievement
|
|||
|
end
|
|||
|
|
|||
|
local function CreateAchievementListByType(achievementTypeId)
|
|||
|
AchievementListDicByType[achievementTypeId] = {}
|
|||
|
local allCfgs = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.Type2AchievementDic,
|
|||
|
achievementTypeId
|
|||
|
)
|
|||
|
for _, cfg in pairs(allCfgs or {}) do
|
|||
|
local id = cfg.Id
|
|||
|
if AchievementDicById[id] then
|
|||
|
goto checkNext
|
|||
|
end
|
|||
|
local achievement = CreateAchievement(id)
|
|||
|
if achievement then
|
|||
|
table.insert(AchievementListDicByType[achievementTypeId], achievement)
|
|||
|
end
|
|||
|
:: checkNext ::
|
|||
|
end
|
|||
|
return AchievementListDicByType[achievementTypeId]
|
|||
|
end
|
|||
|
|
|||
|
local function CreateAchievementList()
|
|||
|
local allCfgs = XAchievementConfigs.GetAllConfigs(
|
|||
|
XAchievementConfigs.TableKey.AchievementType
|
|||
|
)
|
|||
|
for id, _ in pairs(allCfgs) do
|
|||
|
CreateAchievementListByType(id)
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
local function GetAchievementList()
|
|||
|
if not AchievementList or (not next(AchievementList)) then
|
|||
|
CreateAchievementList()
|
|||
|
end
|
|||
|
return AchievementList
|
|||
|
end
|
|||
|
|
|||
|
--=============
|
|||
|
--根据成就类型Id获取成就列表
|
|||
|
--=============
|
|||
|
function XAchievementManager.GetAchievementListByType(achievementTypeId)
|
|||
|
if not AchievementList or (not next(AchievementList)) then
|
|||
|
CreateAchievementList()
|
|||
|
end
|
|||
|
return AchievementListDicByType[achievementTypeId]
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.CheckHasRewardByType(achievementTypeId)
|
|||
|
local list = XAchievementManager.GetAchievementListByType(achievementTypeId)
|
|||
|
for _, achievement in pairs(list or {}) do
|
|||
|
if achievement:GetTaskState() == XDataCenter.TaskManager.TaskState.Achieved then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.CheckHasRewardByBaseType(baseAchvTypeId)
|
|||
|
local achievementTypes = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.BaseId2AchievementTypeDic,
|
|||
|
baseAchvTypeId,
|
|||
|
true
|
|||
|
)
|
|||
|
for _, typeCfg in pairs(achievementTypes) do
|
|||
|
if XAchievementManager.CheckHasRewardByType(typeCfg.Id) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.CheckHasReward()
|
|||
|
local baseCfgs = XAchievementConfigs.GetAllConfigs(
|
|||
|
XAchievementConfigs.TableKey.AchievementBaseType
|
|||
|
)
|
|||
|
for _, cfg in pairs(baseCfgs or {}) do
|
|||
|
if XAchievementManager.CheckHasRewardByBaseType(cfg.Id) then
|
|||
|
return true
|
|||
|
end
|
|||
|
end
|
|||
|
return false
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetCanGetRewardTypeIndexByBaseType(baseAchvTypeId)
|
|||
|
local achievementTypes = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.BaseId2AchievementTypeDic,
|
|||
|
baseAchvTypeId,
|
|||
|
true
|
|||
|
)
|
|||
|
local index = 0
|
|||
|
local canGetReward = false
|
|||
|
for _, typeCfg in pairs(achievementTypes) do
|
|||
|
index = index + 1
|
|||
|
canGetReward = XAchievementManager.CheckHasRewardByType(typeCfg.Id)
|
|||
|
if canGetReward then
|
|||
|
break
|
|||
|
end
|
|||
|
end
|
|||
|
return canGetReward and index or 1
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetAchievementCompleteCount()
|
|||
|
return CompleteAchievementNum or 0
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetTotalAchievementCount()
|
|||
|
return TotalAchievementNum or 0
|
|||
|
end
|
|||
|
--=================
|
|||
|
--根据基础成就类型获取完成成就数
|
|||
|
--=================
|
|||
|
function XAchievementManager.GetAchievementCompleteCountByType(baseAchvTypeId)
|
|||
|
if not baseAchvTypeId then return XAchievementManager.GetAchievementCompleteCount() end
|
|||
|
local XTaskManager = XDataCenter.TaskManager
|
|||
|
local typeInfos = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.BaseId2AchievementTypeDic,
|
|||
|
baseAchvTypeId
|
|||
|
)
|
|||
|
local list = {}
|
|||
|
for _, typeInfo in pairs(typeInfos) do
|
|||
|
local newList = XAchievementManager.GetAchievementListByType(typeInfo.Id)
|
|||
|
if newList then
|
|||
|
list = XTool.MergeArray(list, newList)
|
|||
|
end
|
|||
|
end
|
|||
|
local totalCount = 0
|
|||
|
for _, achievement in pairs(list) do
|
|||
|
local task = achievement:GetTaskState()
|
|||
|
if task == XTaskManager.TaskState.Finish then
|
|||
|
totalCount = totalCount + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return totalCount
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetAchvCompleteQualityDic()
|
|||
|
local resultDic = {
|
|||
|
[1] = 0,
|
|||
|
[2] = 0,
|
|||
|
[3] = 0,
|
|||
|
[4] = 0,
|
|||
|
[5] = 0
|
|||
|
}
|
|||
|
local XTaskManager = XDataCenter.TaskManager
|
|||
|
for _, achievement in pairs(GetAchievementList() or {}) do
|
|||
|
local quality = achievement:GetQuality()
|
|||
|
local task = achievement:GetTaskState()
|
|||
|
if task == XTaskManager.TaskState.Finish then
|
|||
|
resultDic[quality] = resultDic[quality] + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return resultDic
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetAchvCompleteQualityDicByType(baseAchvTypeId)
|
|||
|
if not baseAchvTypeId then return XAchievementManager.GetAchvCompleteQualityDic() end
|
|||
|
local resultDic = {
|
|||
|
[1] = 0,
|
|||
|
[2] = 0,
|
|||
|
[3] = 0,
|
|||
|
[4] = 0,
|
|||
|
[5] = 0
|
|||
|
}
|
|||
|
local XTaskManager = XDataCenter.TaskManager
|
|||
|
local typeInfos = XAchievementConfigs.GetCfgByIdKey(
|
|||
|
XAchievementConfigs.TableKey.BaseId2AchievementTypeDic,
|
|||
|
baseAchvTypeId
|
|||
|
)
|
|||
|
local list = {}
|
|||
|
for _, typeInfo in pairs(typeInfos) do
|
|||
|
local newList = XAchievementManager.GetAchievementListByType(typeInfo.Id)
|
|||
|
if newList then
|
|||
|
list = XTool.MergeArray(list, newList)
|
|||
|
end
|
|||
|
end
|
|||
|
for _, achievement in pairs(list) do
|
|||
|
local quality = achievement:GetQuality()
|
|||
|
local task = achievement:GetTaskState()
|
|||
|
if task == XTaskManager.TaskState.Finish then
|
|||
|
resultDic[quality] = resultDic[quality] + 1
|
|||
|
end
|
|||
|
end
|
|||
|
return resultDic
|
|||
|
end
|
|||
|
--=============
|
|||
|
--根据成就Id获取成就对象
|
|||
|
--=============
|
|||
|
function XAchievementManager.GetAchievementById(achievementId)
|
|||
|
if not AchievementList or (not next(AchievementList)) then
|
|||
|
CreateAchievementList()
|
|||
|
end
|
|||
|
local achievement = AchievementDicById[achievementId]
|
|||
|
if achievement then
|
|||
|
return achievement
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.GetAchievementByTaskId(taskId)
|
|||
|
if not taskId then return end
|
|||
|
return AchievementDicByTaskId[taskId]
|
|||
|
end
|
|||
|
--=============
|
|||
|
--根据任务Id获取任务数据(TaskData)
|
|||
|
--=============
|
|||
|
function XAchievementManager.GetTaskByTaskId(taskId)
|
|||
|
if not taskId then return end
|
|||
|
return TaskDicByTaskId[taskId]
|
|||
|
end
|
|||
|
--=============
|
|||
|
--根据任务Id获取任务状态
|
|||
|
--=============
|
|||
|
function XAchievementManager.GetTaskStateByTaskId(taskId)
|
|||
|
if not taskId then return XDataCenter.TaskManager.TaskState.Invalid end
|
|||
|
return TaskDicByTaskId[taskId] and TaskDicByTaskId[taskId].State or XDataCenter.TaskManager.TaskState.Invalid
|
|||
|
end
|
|||
|
|
|||
|
function XAchievementManager.SetTaskInitFlag()
|
|||
|
TaskInitialFlag = true
|
|||
|
end
|
|||
|
--=============
|
|||
|
--同步成就任务状态
|
|||
|
--=============
|
|||
|
function XAchievementManager.SyncTasks()
|
|||
|
local achieveCount = 0
|
|||
|
local totalCount = 0
|
|||
|
local newAchieveList = {}
|
|||
|
local XTaskManager = XDataCenter.TaskManager
|
|||
|
local achvTaskData = XTaskManager.GetAchvTaskList()
|
|||
|
GetAchievementList()
|
|||
|
for _, task in pairs(achvTaskData) do
|
|||
|
if task ~= nil then
|
|||
|
if AchievementDicByTaskId[task.Id] and
|
|||
|
AchievementDicByTaskId[task.Id]:GetIsHidden() and
|
|||
|
(task.State ~= XTaskManager.TaskState.Finish) and
|
|||
|
(task.State ~= XTaskManager.TaskState.Achieved) then
|
|||
|
goto continue
|
|||
|
end
|
|||
|
totalCount = totalCount + 1
|
|||
|
TaskDicByTaskId[task.Id] = XTool.Clone(task)
|
|||
|
--登陆时推送全部任务数据
|
|||
|
if not TaskDicByTaskId[task.Id] then
|
|||
|
if task.State == XTaskManager.TaskState.Finish then
|
|||
|
table.insert(newAchieveList, TaskDicByTaskId[task.Id])
|
|||
|
end
|
|||
|
else --后面同步的任务数据刷新
|
|||
|
if TaskDicByTaskId[task.Id].State ~= task.State and task.State == XTaskManager.TaskState.Finish then
|
|||
|
table.insert(newAchieveList, TaskDicByTaskId[task.Id])
|
|||
|
end
|
|||
|
end
|
|||
|
if task.State == XTaskManager.TaskState.Finish then
|
|||
|
achieveCount = achieveCount + 1
|
|||
|
end
|
|||
|
:: continue ::
|
|||
|
end
|
|||
|
end
|
|||
|
|
|||
|
--若有新达成的任务则打开新成就达成事件界面
|
|||
|
if TaskInitialFlag and next(newAchieveList) then
|
|||
|
XLuaUiManager.Open("UiAchievementTips", newAchieveList)
|
|||
|
end
|
|||
|
TotalAchievementNum = totalCount
|
|||
|
CompleteAchievementNum = achieveCount
|
|||
|
XEventManager.DispatchEvent(XEventId.EVENT_ACHIEVEMENT_SYNC_SUCCESS)
|
|||
|
end
|
|||
|
XAchievementManager.Init()
|
|||
|
return XAchievementManager
|
|||
|
end
|