2024-09-01 20:49:41 +00:00
|
|
|
|
--- 资源分包管理器
|
2023-07-14 19:35:33 +00:00
|
|
|
|
XDlcManagerCreator = function()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
---@class XDlcManager
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local XDlcManager = {}
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local XDLCItem = require("XEntity/XDLC/XDLCItem")
|
|
|
|
|
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local AllTitleList = nil
|
|
|
|
|
local AllItemList = nil
|
|
|
|
|
local ItemMap = nil
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
---@type XLaunchDlcManager
|
2023-07-14 19:35:33 +00:00
|
|
|
|
local XLaunchDlcManager = nil
|
|
|
|
|
local IsDlcBuild = false
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local IsDebugBuild = CS.XApplication.Debug
|
|
|
|
|
local DlcIndexInfo = nil
|
|
|
|
|
|
|
|
|
|
local STATE_DOWNLOAD_READY = "STATE_DOWNLOAD_READY" -- 可开始下载
|
|
|
|
|
local STATE_DOWNLOAD_ING = "STATE_DOWNLOAD_ING" -- 下载中
|
|
|
|
|
local STATE_DOWNLOAD_PAUSE = "STATE_DOWNLOAD_PAUSE" -- 暂停下载
|
|
|
|
|
|
|
|
|
|
local DLC_BASE_INDEX = 0 -- 基础资源包索引
|
|
|
|
|
local DLC_COMMON_INDEX = -1 -- 通用资源包索引
|
|
|
|
|
|
|
|
|
|
local PreEnterFightCallback
|
|
|
|
|
local OnExitFight
|
|
|
|
|
local DownloadState = STATE_DOWNLOAD_READY
|
|
|
|
|
|
|
|
|
|
---@type XLaunchFileModule
|
|
|
|
|
local FileModule = nil
|
|
|
|
|
local CurrentProcessCb = nil
|
|
|
|
|
local CurrentDoneCb = nil
|
|
|
|
|
local CurrentDlcListId = nil
|
|
|
|
|
|
|
|
|
|
local DownloadRedPointMap = nil
|
|
|
|
|
local RedPointKey = "DLC_DOWNLOAD_RED_POINT_KEY"
|
|
|
|
|
local DownloadAllTimer
|
|
|
|
|
local IsDownloadAll = false
|
|
|
|
|
local IsInterruptDownload = false --打断全部下载
|
|
|
|
|
|
|
|
|
|
local DoRecord = function(dlcListId)
|
|
|
|
|
if not XLaunchDlcManager then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local dlcItem = XDlcManager.GetItemData(dlcListId)
|
|
|
|
|
local dict = {}
|
|
|
|
|
dict["version"] = XLaunchDlcManager.GetVersionmodule().GetNewLaunchModuleVersion()
|
|
|
|
|
dict["size"] = dlcItem and dlcItem:GetTotalSize() or 0
|
|
|
|
|
dict["id"] = dlcListId
|
|
|
|
|
dict["download_all"] = IsDownloadAll
|
|
|
|
|
CS.XRecord.Record(dict, "80031", "DLCDownloadComplete")
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
function XDlcManager.Init()
|
|
|
|
|
IsDlcBuild = CS.XInfo.IsDlcBuild
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not IsDlcBuild then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XLaunchDlcManager = require("XLaunchDlcManager")
|
|
|
|
|
---@type table<number, XDLCItem>
|
2023-07-14 19:35:33 +00:00
|
|
|
|
ItemMap = {}
|
2024-09-01 20:49:41 +00:00
|
|
|
|
XDlcManager.InitRedPoint()
|
|
|
|
|
DlcIndexInfo = XLaunchDlcManager.GetIndexInfo()
|
|
|
|
|
-- XLog.Debug("=====DlcIndexInfo = XLaunchDlcManager.GetIndexInfo()" .. tostring(DlcIndexInfo), DlcIndexInfo)
|
|
|
|
|
DownloadState = STATE_DOWNLOAD_READY
|
|
|
|
|
XEventManager.AddEventListener(XEventId.EVENT_PRE_ENTER_FIGHT, XDlcManager.OnPreEnterFight)
|
|
|
|
|
CS.XGameEventManager.Instance:RegisterEvent(XEventId.EVENT_FIGHT_EXIT, XDlcManager.OnExitFight)
|
|
|
|
|
CS.XGameEventManager.Instance:RegisterEvent(XEventId.EVENT_DLC_FIGHT_ENTER, XDlcManager.OnPreEnterFight)
|
|
|
|
|
CS.XGameEventManager.Instance:RegisterEvent(XEventId.EVENT_DLC_FIGHT_EXIT, XDlcManager.OnExitFight)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--region ------------------RedPoint start-------------------
|
|
|
|
|
function XDlcManager.InitRedPoint()
|
|
|
|
|
DownloadRedPointMap = XSaveTool.GetData(RedPointKey)
|
|
|
|
|
if not DownloadRedPointMap then
|
|
|
|
|
DownloadRedPointMap = {}
|
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XDlcManager.ClearRedPoint()
|
|
|
|
|
DownloadRedPointMap = {}
|
|
|
|
|
XSaveTool.RemoveData(RedPointKey)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XDlcManager.CheckRedPoint()
|
|
|
|
|
if not XDlcManager.CheckIsOpen() then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
for _, state in pairs(DownloadRedPointMap or {}) do
|
|
|
|
|
if state then
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return false
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
function XDlcManager.MarkRedPoint(dlcListId, state)
|
|
|
|
|
DownloadRedPointMap[dlcListId] = state
|
|
|
|
|
XSaveTool.SaveData(RedPointKey, DownloadRedPointMap)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--endregion------------------RedPoint finish------------------
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XDlcManager.CheckIsOpen()
|
|
|
|
|
local CanDownloadDLC = CS.XRemoteConfig.LaunchSelectType and CS.XRemoteConfig.LaunchSelectType ~= 0
|
|
|
|
|
return IsDlcBuild and XDlcManager.HasDlcList() and CanDownloadDLC and not XUiManager.IsHideFunc
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--仅可选基础包
|
|
|
|
|
function XDlcManager.CheckIsOnlyBasicPackage()
|
|
|
|
|
-- 0:默认禁用下载选择; 1:启用(可选基础或全量); 2:启用(仅可选基础,暂用于xf测试)
|
|
|
|
|
return CS.XRemoteConfig.LaunchSelectType == 2
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.HasDlcList()
|
|
|
|
|
local dlcListConfig = XDlcConfig.GetDlcListConfig()
|
|
|
|
|
return (next(dlcListConfig))
|
|
|
|
|
end
|
2024-09-01 20:49:41 +00:00
|
|
|
|
|
|
|
|
|
function XDlcManager.GetLaunchDlcManager()
|
|
|
|
|
return XLaunchDlcManager
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.CheckIsDownloading()
|
|
|
|
|
return DownloadState == STATE_DOWNLOAD_ING
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 下载入口是否开放
|
|
|
|
|
---@param entryType number
|
|
|
|
|
---@param entryParam number 可为0
|
|
|
|
|
---@return boolean
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.CheckNeedDownload(entryType, entryParam)
|
|
|
|
|
if not XTool.IsNumberValid(entryType) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if not XDlcManager.CheckIsOpen() then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local dlcListId = XDlcConfig.GetDlcListIdByEntry(entryType, entryParam)
|
|
|
|
|
if not XTool.IsNumberValid(dlcListId) then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local itemData = XDlcManager.GetItemData(dlcListId)
|
|
|
|
|
return not itemData:IsComplete()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 获取Dlc列表数据
|
|
|
|
|
---@param id number dlcListId
|
|
|
|
|
---@return XDLCItem
|
|
|
|
|
--------------------------
|
2023-07-14 19:35:33 +00:00
|
|
|
|
function XDlcManager.GetItemData(id)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local item = ItemMap[id]
|
|
|
|
|
if not item then
|
|
|
|
|
item = XDLCItem.New(id)
|
|
|
|
|
local config = XDlcConfig.GetListConfigById(id)
|
|
|
|
|
local validDlcIdList = {}
|
|
|
|
|
for _, dlcId in ipairs(config.PatchConfigIds) do
|
|
|
|
|
if DlcIndexInfo[dlcId] then
|
|
|
|
|
table.insert(validDlcIdList, dlcId)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if #validDlcIdList <= 0 then
|
|
|
|
|
XLog.Warning("[DLC] init dlc list skipped Id:" .. id .. " not has dlc patch. PatchConfigIds:" .. table.concat(config.PatchConfigIds, ","))
|
|
|
|
|
end
|
|
|
|
|
item:SetValidDlcIds(validDlcIdList)
|
|
|
|
|
ItemMap[id] = item
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
return ItemMap[id]
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.GetAllItemList()
|
|
|
|
|
if not AllItemList then
|
|
|
|
|
AllItemList = {}
|
|
|
|
|
local dlcListConfig = XDlcConfig.GetDlcListConfig()
|
|
|
|
|
for id, config in pairs(dlcListConfig) do
|
|
|
|
|
if config.RootId ~= 0 then
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local item = XDlcManager.GetItemData(id)
|
|
|
|
|
table.insert(AllItemList, item)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
table.sort(AllItemList, function(a, b)
|
|
|
|
|
return a:GetId() < b:GetId()
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
return AllItemList
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--- 获取 Dlc列表
|
|
|
|
|
---@param rootId number 根节点id
|
|
|
|
|
---@return XDLCItem[]
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.GetItemList(rootId)
|
|
|
|
|
local dlcListIds = XDlcConfig.GetDlcListIdsByRootId(rootId) or {}
|
|
|
|
|
---@type XDLCItem[]
|
|
|
|
|
local list = {}
|
|
|
|
|
for _, dlcId in pairs(dlcListIds) do
|
|
|
|
|
local item = XDlcManager.GetItemData(dlcId)
|
|
|
|
|
if XDlcManager.FilterItem(item) then
|
|
|
|
|
table.insert(list, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
table.sort(list, function(a, b)
|
|
|
|
|
local downloadA = a:IsComplete()
|
|
|
|
|
local downloadB = b:IsComplete()
|
|
|
|
|
if downloadA ~= downloadB then
|
|
|
|
|
return downloadB
|
|
|
|
|
end
|
|
|
|
|
return a:GetId() < b:GetId()
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 获取未下载完的Dlc列表
|
|
|
|
|
---@param rootId number 根节点id
|
|
|
|
|
---@return XDLCItem[]
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.GetUnDownloadItemList(rootId)
|
|
|
|
|
local dlcListIds = XDlcConfig.GetDlcListIdsByRootId(rootId) or {}
|
|
|
|
|
---@type XDLCItem[]
|
|
|
|
|
local list = {}
|
|
|
|
|
for _, dlcId in pairs(dlcListIds) do
|
|
|
|
|
local item = XDlcManager.GetItemData(dlcId)
|
|
|
|
|
if not item:IsComplete() and XDlcManager.FilterItem(item) then
|
|
|
|
|
table.insert(list, item)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
table.sort(list, function(a, b)
|
|
|
|
|
return a:GetId() < b:GetId()
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
return list
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 过滤没有独立资源的包
|
|
|
|
|
---@param item XDLCItem
|
|
|
|
|
---@return boolean
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.FilterItem(item)
|
|
|
|
|
if not item then
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if XDlcManager.GetTotalDownloadSize(item:GetValidDlcIds()) <= 0 then
|
|
|
|
|
XLog.Debug(string.format("[DLC] 分包<%s>没有独立资源,请检查DlcList.tab! Id = %s", item:GetTitle(), tostring(item:GetId())))
|
|
|
|
|
return false
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.GetDlcSizeStr(dlcIds)
|
|
|
|
|
return XDlcManager.GetDownloadedSizeStr(dlcIds) .. "/" .. XDlcManager.GetTotalSizeStr(dlcIds)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.GetDownloadedSizeStr(dlcIds)
|
|
|
|
|
local downloadedSize = XDlcManager.GetDownloadedSize(dlcIds)
|
|
|
|
|
local num, unit = XDlcConfig.GetSizeAndUnit(downloadedSize)
|
|
|
|
|
return num .. unit
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.GetTotalSizeStr(dlcIds)
|
|
|
|
|
local totalSize = XDlcManager.GetTotalDownloadSize(dlcIds)
|
|
|
|
|
local numTotal, unitTotal = XDlcConfig.GetSizeAndUnit(totalSize)
|
|
|
|
|
return numTotal .. unitTotal
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 下载全部DLC内容
|
|
|
|
|
---@param itemList XDLCItem[]
|
|
|
|
|
---@return void
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.DownloadAllDlc(itemList, singleCb, allFinishCb)
|
|
|
|
|
itemList = itemList or {}
|
|
|
|
|
local index, count = 1, #itemList
|
|
|
|
|
if index > count then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if XDlcManager.CheckIsDownloading() then
|
|
|
|
|
XUiManager.TipText("DlcDownloadIsProgress")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
IsInterruptDownload = false
|
|
|
|
|
IsDownloadAll = true
|
|
|
|
|
|
|
|
|
|
local downloadItem
|
|
|
|
|
|
|
|
|
|
DownloadAllTimer = XScheduleManager.ScheduleForever(function()
|
|
|
|
|
if index > count or IsInterruptDownload then
|
|
|
|
|
IsDownloadAll = false
|
|
|
|
|
--移除定时器
|
|
|
|
|
if DownloadAllTimer then
|
|
|
|
|
XScheduleManager.UnSchedule(DownloadAllTimer)
|
|
|
|
|
DownloadAllTimer = nil
|
|
|
|
|
end
|
|
|
|
|
--全部下载完
|
|
|
|
|
if index >= count then
|
|
|
|
|
if allFinishCb then allFinishCb() end
|
|
|
|
|
end
|
|
|
|
|
--暂停正在下载
|
|
|
|
|
local item = XDlcManager.GetDownloadingItem()
|
|
|
|
|
if item then
|
|
|
|
|
item:Pause()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if DownloadState == STATE_DOWNLOAD_ING then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
--提示上一个已经下载完
|
|
|
|
|
if downloadItem and downloadItem:IsComplete() then
|
|
|
|
|
XUiManager.PopupLeftTip(XUiHelper.GetText("DlcDownloadCompleteTitle"), downloadItem:GetTitle())
|
|
|
|
|
end
|
|
|
|
|
downloadItem = itemList[index]
|
|
|
|
|
if downloadItem then
|
|
|
|
|
downloadItem:TryDownload()
|
|
|
|
|
end
|
|
|
|
|
if singleCb then singleCb() end
|
|
|
|
|
index = index + 1
|
|
|
|
|
end, 10, 0)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.InterruptDownload()
|
|
|
|
|
IsDownloadAll = false
|
|
|
|
|
IsInterruptDownload = true
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.CheckIsDownloadAll()
|
|
|
|
|
return IsDownloadAll
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.DownloadDlcByListId(listId, progressCb, doneCb)
|
|
|
|
|
--单任务下载模式
|
|
|
|
|
if DownloadState == STATE_DOWNLOAD_ING then
|
|
|
|
|
XUiManager.TipText("DlcDownloadIsProgress")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local newDoneCb = function(isPause)
|
|
|
|
|
print("newDoneCb: isPause:" .. tostring(isPause))
|
|
|
|
|
if doneCb then
|
|
|
|
|
doneCb()
|
|
|
|
|
end
|
|
|
|
|
if not isPause then
|
|
|
|
|
XDlcManager.ResetDownloadState(isPause)
|
|
|
|
|
XDlcManager.MarkRedPoint(listId, false)
|
|
|
|
|
DoRecord(listId)
|
|
|
|
|
end
|
|
|
|
|
XEventManager.DispatchEvent(XEventId.EVENT_DLC_DOWNLOAD_STOP)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local exitCb = function()
|
|
|
|
|
local itemData = XDlcManager.GetItemData(CurrentDlcListId)
|
|
|
|
|
if itemData then
|
|
|
|
|
itemData:Pause()
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--上个资源未下载完,点击了暂停,需要恢复暂停状态
|
|
|
|
|
if XTool.IsNumberValid(CurrentDlcListId) and CurrentDlcListId ~= listId then
|
|
|
|
|
FileModule.ResumeDownload()
|
|
|
|
|
CurrentProcessCb = nil
|
|
|
|
|
CurrentDoneCb = nil
|
|
|
|
|
end
|
|
|
|
|
local dlcItem = XDlcManager.GetItemData(listId)
|
|
|
|
|
local dlcIds = dlcItem:GetValidDlcIds()
|
|
|
|
|
CurrentDlcListId = listId
|
|
|
|
|
CurrentProcessCb = progressCb
|
|
|
|
|
CurrentDoneCb = doneCb
|
|
|
|
|
|
|
|
|
|
DownloadState = STATE_DOWNLOAD_ING
|
|
|
|
|
|
|
|
|
|
XDlcManager.MarkRedPoint(listId, true)
|
|
|
|
|
XLaunchDlcManager.DownloadDlc(dlcIds, progressCb, newDoneCb, exitCb)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.IsCurDlcListId(listId)
|
|
|
|
|
return CurrentDlcListId == listId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 开始下载后,设置下载模块(XLaunchFileModule)
|
|
|
|
|
function XDlcManager.SetFileModule(fileModule)
|
|
|
|
|
if FileModule ~= fileModule then
|
|
|
|
|
fileModule.ResumeDownload()
|
|
|
|
|
end
|
|
|
|
|
FileModule = fileModule
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.OnPreEnterFight()
|
|
|
|
|
--没有正在下载的任务
|
|
|
|
|
if DownloadState ~= STATE_DOWNLOAD_ING then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XDlcManager.PauseDownloadDlc()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.OnExitFight()
|
|
|
|
|
--没有需要恢复的任务
|
|
|
|
|
if DownloadState ~= STATE_DOWNLOAD_PAUSE then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XDlcManager.ResumeDownloadDlc()
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.PauseDownloadDlc()
|
|
|
|
|
if DownloadState ~= STATE_DOWNLOAD_ING then
|
|
|
|
|
XLog.Error("[DLC] PauseDownloadDlc Error, DownloadState ~= STATE_DOWNLOAD_ING")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
DownloadState = STATE_DOWNLOAD_PAUSE
|
|
|
|
|
FileModule.PauseDownload()
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
function XDlcManager.ResumeDownloadDlc()
|
|
|
|
|
if DownloadState ~= STATE_DOWNLOAD_PAUSE then
|
|
|
|
|
XLog.Error("[DLC] ResumeDownloadDlc Error, DownloadState ~= STATE_DOWNLOAD_PAUSE")
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
DownloadState = STATE_DOWNLOAD_READY
|
|
|
|
|
FileModule.ResumeDownload()
|
|
|
|
|
XDlcManager.DownloadDlcByListId(CurrentDlcListId, CurrentProcessCb, CurrentDoneCb)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.ResetDownloadState(isPause)
|
|
|
|
|
FileModule = nil
|
|
|
|
|
CurrentDlcListId = nil
|
|
|
|
|
CurrentProcessCb = nil
|
|
|
|
|
CurrentDoneCb = nil
|
|
|
|
|
DownloadState = STATE_DOWNLOAD_READY
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 通用正在下载提示
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.TipDownloading()
|
|
|
|
|
if not (XDlcManager.CheckIsDownloading() and XTool.IsNumberValid(CurrentDlcListId)) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local itemData = XDlcManager.GetItemData(CurrentDlcListId)
|
|
|
|
|
if not itemData then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local tip = itemData and itemData:GetTitle() or "nil"
|
|
|
|
|
XUiManager.TipMsg(XUiHelper.GetText("DlcDownloadingTips", tip))
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--- 获取正在下载的分包
|
|
|
|
|
---@return XDLCItem
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.GetDownloadingItem()
|
|
|
|
|
if not (XDlcManager.CheckIsDownloading() and XTool.IsNumberValid(CurrentDlcListId)) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
return XDlcManager.GetItemData(CurrentDlcListId)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 功能入口检查下载
|
|
|
|
|
function XDlcManager.CheckDownloadForEntry(entryType, entryParam, doneCb)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not XDlcManager.CheckIsOpen() then
|
|
|
|
|
if doneCb then doneCb() end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
local dlcListId = XDlcConfig.GetDlcListIdByEntry(entryType, entryParam)
|
|
|
|
|
XDlcManager.TryDownloadByListId(dlcListId, nil, doneCb)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 进入关卡时检查下载
|
|
|
|
|
function XDlcManager.CheckDownloadForStage(stageId, doneCb)
|
2024-09-01 20:49:41 +00:00
|
|
|
|
if not XDlcManager.CheckIsOpen() then
|
|
|
|
|
if doneCb then doneCb() end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local dlcListIds = XDlcConfig.GetDlcListIdByStageId(stageId)
|
|
|
|
|
if XTool.IsTableEmpty(dlcListIds) then
|
|
|
|
|
if doneCb then doneCb() end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local temDlcListId
|
|
|
|
|
local downloaded = false
|
|
|
|
|
for _, dlcListId in ipairs(dlcListIds or {}) do
|
|
|
|
|
local itemData = XDlcManager.GetItemData(dlcListId)
|
|
|
|
|
--当前关卡已有分包下载完成
|
|
|
|
|
if itemData:IsComplete() then
|
|
|
|
|
downloaded = true
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
temDlcListId = dlcListId
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if downloaded then
|
|
|
|
|
if doneCb then doneCb() end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
XDlcManager.TryDownloadByListId(temDlcListId, nil, doneCb)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.TryDonwloadByIds(dlcIds, doneCb)
|
|
|
|
|
if not dlcIds then
|
|
|
|
|
doneCb()
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local needDownload = false
|
|
|
|
|
for _, dlcId in pairs(dlcIds) do
|
2024-09-01 20:49:41 +00:00
|
|
|
|
needDownload = XLaunchDlcManager.CheckGameNeedDownload(dlcId)
|
2023-07-14 19:35:33 +00:00
|
|
|
|
if needDownload then
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
if needDownload then
|
|
|
|
|
XLuaUiManager.Open("UiDownload", function()
|
|
|
|
|
XLaunchDlcManager.DownloadDlc(dlcIds, nil, doneCb)
|
|
|
|
|
end)
|
|
|
|
|
else
|
|
|
|
|
doneCb()
|
2024-09-01 20:49:41 +00:00
|
|
|
|
end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
end
|
|
|
|
|
|
2024-09-01 20:49:41 +00:00
|
|
|
|
--- 尝试下载Dlc资源
|
|
|
|
|
---@param dlcListId number DlcList.tab的Id
|
|
|
|
|
---@param progressCb function 进度改变回调
|
|
|
|
|
---@param doneCb function 下载完成回调
|
|
|
|
|
---@param beginCb function 下载开始回调
|
|
|
|
|
---@return void
|
|
|
|
|
--------------------------
|
|
|
|
|
function XDlcManager.TryDownloadByListId(dlcListId, progressCb, doneCb, beginCb)
|
|
|
|
|
--未传参
|
|
|
|
|
if not XTool.IsNumberValid(dlcListId) then
|
|
|
|
|
if doneCb then
|
|
|
|
|
doneCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local itemData = XDlcManager.GetItemData(dlcListId)
|
|
|
|
|
--已经下载完
|
|
|
|
|
if itemData:IsComplete() then
|
|
|
|
|
if doneCb then
|
|
|
|
|
doneCb()
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
local jumpCb = function()
|
|
|
|
|
XLuaUiManager.Open("UiDownLoadMain", itemData:GetRootId(), itemData:GetId())
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local downloadCb = function()
|
|
|
|
|
if XDlcManager.CheckIsDownloading() then
|
|
|
|
|
XDlcManager.TipDownloading()
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
if beginCb then beginCb() end
|
|
|
|
|
itemData:TryDownload(progressCb, doneCb)
|
|
|
|
|
end
|
|
|
|
|
local content = XUiHelper.GetText("DlcDownloadContentAndSizeTip", itemData:GetTitle(), itemData:GetTotalSizeWithUnit())
|
|
|
|
|
local subContent = ""
|
|
|
|
|
if CS.UnityEngine.Application.internetReachability == CS.UnityEngine.NetworkReachability.ReachableViaCarrierDataNetwork then
|
|
|
|
|
subContent = XUiHelper.GetText("CellularNetworkDownloadTip")
|
|
|
|
|
end
|
|
|
|
|
XUiManager.DialogDownload(XUiHelper.GetText("DlcDownloadTitle"), content, subContent, downloadCb, jumpCb)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.TryDownloadByEntryTypeAndParam(entryType, entryParam, progressCb, doneCb, beginCb)
|
|
|
|
|
local dlcListId = XDlcConfig.GetDlcListIdByEntry(entryType, entryParam)
|
|
|
|
|
if not XTool.IsNumberValid(dlcListId) then
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
XDlcManager.TryDownloadByListId(dlcListId, progressCb, doneCb, beginCb)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 清理dlc资源(不包括基础及通用)
|
|
|
|
|
function XDlcManager.CleanDlcFiles(dlcId, cb)
|
|
|
|
|
if dlcId == DLC_BASE_INDEX or dlcId == DLC_COMMON_INDEX then
|
|
|
|
|
XLog.Error("[DLC] 清理dlc资源失败 dlcId:" .. tostring(dlcId))
|
|
|
|
|
if cb then
|
|
|
|
|
cb(false, 0)
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local PathModule = XLaunchDlcManager.GetPathmodule()
|
|
|
|
|
local DocFileModule = XLaunchDlcManager.GetFilemodule()
|
|
|
|
|
local VersionModule = XLaunchDlcManager.GetVersionmodule()
|
|
|
|
|
|
|
|
|
|
local DocumentFilePath = PathModule.GetDocumentFilePath()
|
|
|
|
|
local ResFileType = RES_FILE_TYPE.MATRIX_FILE
|
|
|
|
|
local NeedLaunchTest = CS.XResourceManager.NeedLaunchTest
|
|
|
|
|
local dirPath = DocumentFilePath .. "/" .. ResFileType .. "/"
|
|
|
|
|
if NeedLaunchTest then
|
|
|
|
|
dirPath = DocFileModule.LaunchTestDirDoc .. "/" .. ResFileType .. "/"
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local indexInfo = DlcIndexInfo[dlcId]
|
|
|
|
|
if indexInfo == nil then
|
|
|
|
|
XLog.Error("[DLC] 清理dlc资源失败 indexInfo is nil, dlcId:" .. tostring(dlcId))
|
|
|
|
|
if cb then
|
|
|
|
|
cb(false, 0)
|
|
|
|
|
end
|
|
|
|
|
return
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
local commonInfo = DlcIndexInfo[DLC_COMMON_INDEX]
|
|
|
|
|
local baseInfo = DlcIndexInfo[DLC_BASE_INDEX]
|
|
|
|
|
|
|
|
|
|
local count, size = 0, 0
|
|
|
|
|
local logTab = {}
|
|
|
|
|
for assetPath, info in pairs(indexInfo) do
|
|
|
|
|
if not baseInfo[assetPath] and not commonInfo[assetPath] then
|
|
|
|
|
local file = dirPath .. info[1]
|
|
|
|
|
if CS.System.IO.File.Exists(file) then
|
|
|
|
|
CS.XFileTool.DeleteFile(file)
|
|
|
|
|
XLaunchDlcManager.SetDownloadedFile(info[1], false)
|
|
|
|
|
table.insert(logTab, info[1])
|
|
|
|
|
count = count + 1
|
|
|
|
|
size = size + info[3]
|
|
|
|
|
end
|
|
|
|
|
elseif IsDebugBuild then
|
|
|
|
|
table.insert(logTab, info[1] .. "保留,base:" .. tostring(baseInfo[assetPath] ~= nil) .. ", common:" .. tostring(commonInfo[assetPath] ~= nil))
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if IsDebugBuild then
|
|
|
|
|
XLog.Debug("[DLC] 清理DLC .." .. dlcId .. "下载资源,数量:" .. count .. ",大小:" .. math.ceil(size/1024/1024) .. "mb. " .. table.concat(logTab, "\n"))
|
|
|
|
|
end
|
|
|
|
|
XLaunchDlcManager.SetDlcDownloadedRecord(dlcId, false)
|
|
|
|
|
if cb then
|
|
|
|
|
cb(true, size)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
--=======资源索引接口begin
|
|
|
|
|
-- local DlcSizeDic = {}
|
|
|
|
|
-- local DlcCommonSizeDic = {}
|
|
|
|
|
|
|
|
|
|
-- 获取dlc总大小(独占, 通用)
|
|
|
|
|
-- commonTab 可选,收集记录,当多次调用时保证一个通用资源仅统计一次
|
|
|
|
|
local _GetTotalDownloadSize = function(dlcId, commonTab)
|
|
|
|
|
local size = 0
|
|
|
|
|
local indexInfo = DlcIndexInfo[dlcId]
|
|
|
|
|
if indexInfo == nil then
|
|
|
|
|
XLog.Error("indexInfo == nil dlcId:" .. tostring(dlcId))
|
|
|
|
|
return 0, 0
|
|
|
|
|
end
|
|
|
|
|
local commonSize = 0
|
|
|
|
|
if dlcId == DLC_COMMON_INDEX then
|
|
|
|
|
for assetPath, info in pairs(indexInfo) do
|
|
|
|
|
size = size + info[3]
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
-- 区分通用资源
|
|
|
|
|
local commonInfo = DlcIndexInfo[DLC_COMMON_INDEX]
|
|
|
|
|
local baseInfo = DlcIndexInfo[DLC_BASE_INDEX]
|
|
|
|
|
for assetPath, info in pairs(indexInfo) do
|
|
|
|
|
if not baseInfo[assetPath] then -- 基础包资源不需统计
|
|
|
|
|
if not commonInfo[assetPath] then
|
|
|
|
|
size = size + info[3]
|
|
|
|
|
else
|
|
|
|
|
if commonTab then
|
|
|
|
|
if not commonTab[assetPath] then
|
|
|
|
|
commonTab[assetPath] = true
|
|
|
|
|
commonSize = commonSize + info[3]
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
commonSize = commonSize + info[3]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return size, commonSize
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 获取dlc已下载大小(独占, 通用)
|
|
|
|
|
-- commonTab 可选,收集记录,当多次调用时保证一个通用资源仅统计一次
|
|
|
|
|
local _GetDownloadedSize = function(dlcId, commonTab)
|
|
|
|
|
local indexInfo = DlcIndexInfo[dlcId]
|
|
|
|
|
if indexInfo == nil then
|
|
|
|
|
XLog.Error("indexInfo == nil dlcId:" .. tostring(dlcId))
|
|
|
|
|
return 0, 0
|
|
|
|
|
end
|
|
|
|
|
local size = 0
|
|
|
|
|
local commonSize = 0
|
|
|
|
|
local commonInfo = DlcIndexInfo[DLC_COMMON_INDEX]
|
|
|
|
|
local baseInfo = DlcIndexInfo[DLC_BASE_INDEX] -- 基础包资源不需统计
|
|
|
|
|
for assetPath, info in pairs(indexInfo) do
|
|
|
|
|
if not baseInfo[assetPath] and XLaunchDlcManager.IsNameDownloaded(info[1]) then
|
|
|
|
|
if not commonInfo[assetPath] then
|
|
|
|
|
size = size + info[3]
|
|
|
|
|
else
|
|
|
|
|
if commonTab then
|
|
|
|
|
if not commonTab[assetPath] then
|
|
|
|
|
commonTab[assetPath] = true
|
|
|
|
|
commonSize = commonSize + info[3]
|
|
|
|
|
end
|
|
|
|
|
else
|
|
|
|
|
commonSize = commonSize + info[3]
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
return size, commonSize
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 已下载大小
|
|
|
|
|
XDlcManager.GetDownloadedSize = function(dlcIds)
|
|
|
|
|
local size = 0
|
|
|
|
|
local commonSize = 0
|
|
|
|
|
local commmonTab = {}
|
|
|
|
|
local tab = {}
|
|
|
|
|
for _, dlcId in pairs(dlcIds) do
|
|
|
|
|
local dlcSize, cSize = _GetDownloadedSize(dlcId, commmonTab)
|
|
|
|
|
size = size + dlcSize
|
|
|
|
|
commonSize = commonSize + cSize
|
|
|
|
|
-- table.insert(tab, dlcId .. ", size:" .. (math.ceil(dlcSize/1024/1024)) .. "mb, common:" .. (math.ceil(cSize/1024/1024)) .. "mb")
|
|
|
|
|
end
|
|
|
|
|
-- XLog.Debug("[Download] GetDownloadedSize(" .. table.concat(dlcIds,",") .. ") size:" .. (math.ceil((size+commonSize)/1024/1024)) .. "mb = dlc:" .. (math.ceil(size/1024/1024)) .. "mb + common:" .. (math.ceil(commonSize/1024/1024)) .. "mb\n" .. table.concat(tab, "\n"))
|
|
|
|
|
return size + commonSize
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- 总下载大小
|
|
|
|
|
XDlcManager.GetTotalDownloadSize = function(dlcIds)
|
|
|
|
|
local size = 0
|
|
|
|
|
local commonSize = 0
|
|
|
|
|
local tab = {}
|
|
|
|
|
local commmonTab = {}
|
|
|
|
|
for _, dlcId in pairs(dlcIds) do
|
|
|
|
|
local dlcSize, cSize = _GetTotalDownloadSize(dlcId, commmonTab)
|
|
|
|
|
size = size + dlcSize
|
|
|
|
|
commonSize = commonSize + cSize
|
|
|
|
|
-- table.insert(tab, dlcId .. ", size:" .. (math.ceil(dlcSize/1024/1024)) .. "mb" .. ", common Size:" .. (math.ceil(cSize/1024/1024)) .. "mb")
|
|
|
|
|
end
|
|
|
|
|
-- XLog.Debug("[Download] GetTotalDownloadSize(" .. table.concat(dlcIds,",") .. ") size:" .. (math.ceil((size+commonSize)/1024/1024)) .. "mb = dlc:" .. (math.ceil(size/1024/1024)) .. "mb + common:" .. (math.ceil(commonSize/1024/1024)) .. "mb\n" .. table.concat(tab, "\n"))
|
|
|
|
|
return size + commonSize
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
-- test
|
|
|
|
|
XDlcManager.GetDownloadSizeById = function(dlcId)
|
|
|
|
|
local size, commonSize = _GetTotalDownloadSize(dlcId, {}, 0)
|
|
|
|
|
return size
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
XDlcManager.GetAllDlcId = function(dlcId)
|
|
|
|
|
local idList = {}
|
|
|
|
|
for dlcId, _ in pairs(DlcIndexInfo) do
|
|
|
|
|
table.insert(idList, dlcId)
|
|
|
|
|
end
|
|
|
|
|
return idList
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function XDlcManager.PrintAllDownloadSize()
|
|
|
|
|
do return end
|
|
|
|
|
local idMap = {}
|
|
|
|
|
for _, itemData in ipairs(XDlcManager.GetAllItemList()) do
|
|
|
|
|
for _, id in ipairs(itemData:GetDlcIdList()) do
|
|
|
|
|
if not idMap[id] then
|
|
|
|
|
idMap[id] = 0
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for patchId, _ in pairs(idMap) do
|
|
|
|
|
local size = XDlcManager.GetDownloadSizeById(patchId)
|
|
|
|
|
idMap[patchId] = math.ceil(size / 1024 / 1024) .. "(mb)"
|
|
|
|
|
end
|
|
|
|
|
XLog.Debug("[DLC] >>>>下载分类的资源包大小情况:", idMap)
|
|
|
|
|
|
|
|
|
|
local idMap = {}
|
|
|
|
|
for i, patchId in pairs(XDlcManager.GetAllDlcId()) do
|
|
|
|
|
local size = XDlcManager.GetDownloadSizeById(patchId)
|
|
|
|
|
idMap[patchId] = math.ceil(size / 1024 / 1024) .. "(mb)"
|
|
|
|
|
end
|
|
|
|
|
XLog.Debug("[DLC] >>>>所有资源包大小情况:", idMap)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
local commonInfo = DlcIndexInfo[DLC_COMMON_INDEX]
|
|
|
|
|
for k, v in pairs(commonInfo) do
|
|
|
|
|
XLog.Debug(" === Common, k:" .. k .. ',v:' .. v[1] .. ", " .. v[2] .. ", " .. v[3])
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
--========资源索引接口end
|
2023-07-14 19:35:33 +00:00
|
|
|
|
|
|
|
|
|
XDlcManager.Init()
|
|
|
|
|
return XDlcManager
|
|
|
|
|
end
|