local HotFix_Controller = {} local private = {} local EventSystem = require('Event/EventSystem') local LuaFuncEntry = require("Main/LuaFuncEntry") local UPDATE_INTERVAL = 1 local RECONNECT_INTERVAL = 5 local WARN_SIZE_DEFAULT = 20 * 1024 --非wifi下超过20M才提示 local WARN_SIZE_JP = 5 * 1024 local WARN_SIZE_CN = 20 * 1024 local isDownloadInLoginFreeLevel = true --是否在体验关开启下载 --热更不会下载压缩包,碎文件比较多,可以适当调高下载的进程数,减小每次下载数据的大小 local HOTFIX_DOWNLOAD_NUM = 3 local HOTFIX_FRAGMENTSIZE = 128 * 1024 local HOTFIX_ENABLE_MD5 = 0 local PRE_HOTFIX_DOWNLOAD_NUM = 1 local PRE_HOTFIX_FRAGMENTSIZE = 128 * 1024 local PRE_HOTFIX_ENABLE_MD5 = 1 --分包下载下载压缩包,进程数为1,每次下载数据可以尽可能的大 local STAGE_DOWNLOAD_NUM = 1 local STAGE_FRAGMENTSIZE = 1024 * 1024 local STAGE_ENABLE_MD5 = 1 local START_STAGE1_INDEX = 100 --分包1开始下载的stage local END_STAGE1_INDEX = 199 --分包1最后一个stage local END_STATE2_INDEX = 299 --分包2最后一个state local END_STATE3_INDEX = 399 --分包3最后一个state local SCENE_BUNDLE_PATH = ConstAssetPathConfig.SCENE_FORMAT_PATH local PRE_HOTFIX_PATH = "prehotfix" local PRE_HOTFIX_BACKUP_PATH = "prehotfix_backup" local PRE_HOTFIX_CODE_PATH = "prehotfix/code.lg" local MAX_STAGE = 999 --越南下载速度在心跳检测持续的时间(单位秒) local DonwLoadHeartbeatsTime = 600 --越南下载速度检测的心跳周期(单位秒) local DonwLoadHeartbeatsCycle = 5 private.progressHandle = nil private.downloadSpeedHandle = nil private.reconnectHandle = nil private.reconnectWifiHandle = nil private.stage2PackSizeDic = nil --Key:分包stage Value:Size private.lastDownloadSize = 0 --流量状态下是否可下载 private.isAllowCarrier = false private.isDownloadPause = false private.isTempAllowWarn = false --当次弹窗是否允许流量下载的标识,如果是分包,则需要在该分包组下完重置,否则会导致一直自动下载 --越南地区可通过任何网络链接方式下载 private.isDownloadAnyway = false --使用这个开关区分是用越南的提示弹窗还是 UIStagePackageTip 的弹窗 private.isShowDownloadTips = true private.preHotfixCode = nil private.isOpenTipAllNet = false private.isWifiCanDownload = false --SmallAPK 配置 local LEVEL_ID_1_1 = 1011 -- 1-1 levelid local LEVEL_ID_1_2 = 1012 -- 1-2 levelid local CHAPTER_LEVEL_ID_1_1 = 10101 -- 1-1 章节配表id 用来判断是否通关 local CHAPTER_LEVEL_ID_1_2 = 10102 -- 1-2 章节配表id 用来判断是否通关 local LEVEL_1_2_STAGE = 129 local LEVEL_1_3_STAGE = 199 --各个模块的分包stage映射 local ModuleStageCfg = { ["OperationActivity"] = END_STATE2_INDEX, ["PushGift"] = END_STATE2_INDEX, ["PushInterface"] = END_STATE2_INDEX, ["Welfare"] = END_STATE2_INDEX, ["WelfareEntry"] = LEVEL_1_2_STAGE, ["PayMallTab_1"] = END_STATE2_INDEX, ["Title"] = END_STATE2_INDEX, ["OpenChapter"] = END_STATE2_INDEX, ["OfficialPrivilege"] = END_STATE2_INDEX, ["GuildActivity"] = END_STATE3_INDEX, } function HotFix_Controller.OnStartup() private.SetupEntryFunc(true) EventSystem.Regist(EventID.ApplicationPause, private.OnApplicationPause) if (not DEF.USE_SMALL_APK and ((AppInfo.isBuildAAB and USE_AAB_SMALL_PAD == false) or (DEF.USE_BIG_APK))) or DEF.USE_AAB_NOT_PAD then LoginProxy.SetBaseDiffStage(END_STAGE1_INDEX) end if DEF.OPEN_STAGE_DOWNLOAD then private.stageSceneDic = {} --key:levelType value:stage for _, v in DataSheetManager.LevelInfoData:GetEnumerator() do local sceneStage = private.stageSceneDic[v.LevelType] if sceneStage == nil or v.PackStage > sceneStage then private.stageSceneDic[v.LevelType] = v.PackStage end end --如果当前已经是分包全部下完,给当前的stage设一个最大值,防止后续版本分包stage变大无法热更 --测试包下默认给设置分包最大值,防止挪了完整资源也会卡住 if (LoginProxy.Get_IfAllDownload() and LoginProxy.GetCurStage() ~= MAX_STAGE) or DEF.DISABLE_ASSET_CHECK then LoginProxy.SetPackStage(MAX_STAGE) end end private.isAutoWithoutWifiToStage199 = true end function private.SetupEntryFunc(isRegist) LuaFuncEntry.SetupMainEntryFunc(isRegist, LuaFuncEntry.FuncType.HotfixReady, private.OnHotfixReady, LuaFuncEntry.FuncType.HotfixFinishDownload, private.OnDownLoadAllSuccess, LuaFuncEntry.FuncType.HotfixFinishNoDownload, private.OnHotfixFinishNoDownload, LuaFuncEntry.FuncType.PackReady, private.OnPackReady, LuaFuncEntry.FuncType.PackFinish, private.OnPackFinish, LuaFuncEntry.FuncType.SetStagePackSize, private.SetStagePackSize ) end --是否开启全网络更新大小检测 function HotFix_Controller.SetOpenTipAllNet(isEnable) if UNITY_IOS then private.isOpenTipAllNet = isEnable WARN_SIZE_CN = 0 end end --进度条tips显示下载数量 function private.UpdateSizeTips(hasDownLoadedSize) local maxSize = MDL.HotFix.GetMaxDownloadSize() private.lastDownloadSize = hasDownLoadedSize local speed = LoginProxy.GetDownloadSpeed() EventSystem.Dispatch(EventID.UI_Loading_UpdateDownloadProgress, hasDownLoadedSize, maxSize, speed) end function HotFix_Controller.GetLastDownloadSize() return private.lastDownloadSize end function private.BeginReconnectWifiTimer() if private.reconnectWifiHandle then TimerUtil.Remove(private.reconnectWifiHandle) end private.reconnectWifiHandle = TimerUtil.Interval(private.ReconnectWifiFunc, RECONNECT_INTERVAL, 0) end function private.EndReconnectWifiTimer() if private.reconnectWifiHandle then TimerUtil.Remove(private.reconnectWifiHandle) end private.reconnectWifiHandle = nil end function private.ReconnectWifiFunc() if HotFix_Controller.Get_IsWifi() then private.EndReconnectWifiTimer() UIManager.CloseView(Const_UI_Lua.UIEnum.UIMessageBoxView) HotFix_Controller.ContinueDownload() end end function private.BeginReconnectTimer() if private.reconnectHandle then TimerUtil.Remove(private.reconnectHandle) end private.reconnectHandle = TimerUtil.Interval(private.ReconnectFunc, RECONNECT_INTERVAL, 0) end function private.EndReconnectTimer() if private.reconnectHandle then TimerUtil.Remove(private.reconnectHandle) end private.reconnectHandle = nil end function private.ReconnectFunc() if UnityEngine.Application.internetReachability ~= UnityEngine.NetworkReachability.NotReachable then private.EndReconnectTimer() HotFix_Controller.ResumeDownload() end end function private.BeginProgressTimer() private.lastDownloadSize = 0 if private.progressHandle then TimerUtil.Remove(private.progressHandle) end private.progressHandle = TimerUtil.Interval(private.ProgressFunc, UPDATE_INTERVAL, 0) private.EndReconnectWifiTimer() end function private.EndProgressTimer() if private.progressHandle then TimerUtil.Remove(private.progressHandle) end private.progressHandle = nil end function private.ProgressFunc() --网络中断 if UnityEngine.Application.internetReachability == UnityEngine.NetworkReachability.NotReachable then HotFix_Controller.PauseDownload() private.BeginReconnectTimer() return end --获取进度更新 local curSize = LoginProxy.Get_CurDownloadSize() private.UpdateSizeTips(curSize) --下载中网络状态变更 if HotFix_Controller.GetIsPreHotfix() then if GameAppInfo.IsJapanesePackage() and CTL.PreDownloadJP.JudgeNoWifiHotFix() then -- 日本包需要判断是否勾选过非wifi可下载 -- 如果勾选了非wifi可下载 玩家切换网络无需做操作 else --预热更非wifi下直接停止下载,等待下次连接wifi重下 if HotFix_Controller.Get_IsWifi() == false then HotFix_Controller.PauseDownload() private.BeginReconnectWifiTimer() end end else if HotFix_Controller.IsUploadPackageCheckVN() then if MDL.Loading.LoadingType == MDL.Loading.LoadingTypeEnum.HotFix then --热更状态直接恢复下载,弹窗已经弹过了,但是不要动后续资源下载的标记位。 HotFix_Controller.ResumeDownload() else -- 越南无论 wifi 还是移动网络都需要弹窗 if not private.isDownloadAnyway and private.isShowDownloadTips then if LoginProxy.Get_IsDownloading() then HotFix_Controller.PauseDownload() private.WarnToResumeDownloadVN() end elseif private.isDownloadAnyway and not private.isShowDownloadTips then private.isDownloadAnyway = true private.isShowDownloadTips = true HotFix_Controller.ResumeDownload() end end else if private.GetIfWarnWifi() then HotFix_Controller.PauseDownload() private.WarnToResumeDownload(true) elseif private.GetIfWarn() then HotFix_Controller.PauseDownload() private.BeginReconnectWifiTimer() private.WarnToResumeDownload(false) end end end end function private.WarnToResumeDownload(isWifiTip) if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIStagePackage) then return end local offsetSize = 0 if MDL.Loading.LoadingType == MDL.Loading.LoadingTypeEnum.HotFix then offsetSize = MDL.HotFix.GetMaxDownloadSize() - LoginProxy.Get_CurDownloadSize() else if DEF.USE_SMALL_APK and LoginProxy.GetCurStage() < LEVEL_1_3_STAGE then offsetSize = HotFix_Controller.GetStage1TotalDownloadSize() - HotFix_Controller.GetStage1DownloadedSize(LoginProxy.GetCurStage()) - LoginProxy.Get_CurDownloadSize() else offsetSize = HotFix_Controller.GetStageGroupLeftKiloBytes(LoginProxy.Get_CurDownloadSize()) end end if isWifiTip then CTL.Login.OpenErrorWarnPanel(string.FormatByIdsId(Const_IDS.IDS_LoginMobileNet2, math.ceil(offsetSize / 1024)), private.ProcessStagePackageDownloadViaWifi, private.CancelViaWifi) else CTL.Login.OpenErrorWarnPanel(string.FormatByIdsId(Const_IDS.IDS_LoginMobileNet, math.ceil(offsetSize / 1024)), private.AllowDownloadViaCarrier, private.CancelViaCarrier) end end function private.WarnToResumeDownloadVN() local offsetSize = 0 if MDL.Loading.LoadingType == MDL.Loading.LoadingTypeEnum.HotFix then offsetSize = MDL.HotFix.GetMaxDownloadSize() - LoginProxy.Get_CurDownloadSize() --热更状态直接恢复下载,弹窗已经弹过了,但是不要动后续资源下载的标记位。 HotFix_Controller.ResumeDownload() return else offsetSize = HotFix_Controller.GetStage2TotalDownloadSize() - private.GetStageAlreadyDownloadedSize(LoginProxy.GetCurStage()) end CTL.Login.OpenErrorWarnPanel(string.FormatByIdsId(Const_IDS.IDS_LoginMobileNet3, math.ceil(offsetSize / 1024)), private.AllowDownloadAnywayVN, private.CancelDownloadAnywayVN) end function private.AllowDownloadAnywayVN() private.isDownloadAnyway = true HotFix_Controller.ResumeDownload() end function private.CancelDownloadAnywayVN() private.isDownloadAnyway = false EventSystem.Dispatch(EventID.UpdateDownloadState, true) end --允许流量状态下载 function private.AllowDownloadViaCarrier() private.isTempAllowWarn = true HotFix_Controller.ResumeDownload() end --拒绝流量下载 function private.CancelViaCarrier() private.isTempAllowWarn = false EventSystem.Dispatch(EventID.UpdateDownloadState, true) end --中断下载后,点击继续下载 function HotFix_Controller.ContinueDownload() EventSystem.Dispatch(EventID.UpdateDownloadState, false) if private.isDownloadPause == true then HotFix_Controller.ResumeDownload() else if MDL.Loading.LoadingType == MDL.Loading.LoadingTypeEnum.HotFix then private.ProcessHotfixDownload() else HotFix_Controller.ContinueDownloadStage() end end end --当前是否在Wifi状态 function HotFix_Controller.Get_IsWifi() return UnityEngine.Application.internetReachability == UnityEngine.NetworkReachability.ReachableViaLocalAreaNetwork end -- 判断当前是否有网 function HotFix_Controller.Get_IsNetReachable() return UnityEngine.Application.internetReachability == UnityEngine.NetworkReachability.NotReachable end function private.GetIfWarnWifi() if HotFix_Controller.IsUploadPackageCheckVN() then return false end if GameAppInfo.IsChinesePackage() then if not private.isOpenTipAllNet then return false end if HotFix_Controller.Get_IsWifi() and not private.isWifiCanDownload then return true end end return false end function private.Get_IsAutoDownloadToPack199() if private.isAutoWithoutWifiToStage199 then if PersistentData.DeviceData:Get("HIGH_LEVEL_SYMBOL", 0) > 0 then --大号不处理 return false end return LoginProxy.GetCurStage() < LEVEL_1_3_STAGE end return false end function private.Get_IsAutoDownloadToPack299() --国服分包2自动下载 if GameAppInfo.IsChinesePackage() and MDL.Loading.LoadingType ~= MDL.Loading.LoadingTypeEnum.HotFix and HotFix_Controller.IsStage2Finished() == false then return true end return false end --是否需要提示 function private.GetIfWarn() if HotFix_Controller.IsUploadPackageCheckVN() then return false end if MDL.Loading.LoadingType ~= MDL.Loading.LoadingTypeEnum.HotFix and private.Get_IsAutoDownloadToPack199() then --分包1自动下载开关开启,不用判断是否弹窗 return false end if private.Get_IsAutoDownloadToPack299() then return false end if private.isAllowCarrier == false and HotFix_Controller.Get_IsWifi() == false then if private.isTempAllowWarn then return false end return true end return false end --是否有剩余空间,size单位为mb function private.CheckSpaceAvailable(mbSize, isWarnQuit, notQuitGame) --接口返回的磁盘大小单位为mb local availableDiskSpace = SDKUtil.GetAvailableDiskSpace() logging.crit(LTAG.CRIT, "storage size:(Mb)", availableDiskSpace) if availableDiskSpace < 0 then --说明接口版本有问题,不影响下载,返回true return true end if availableDiskSpace > mbSize then return true else --磁盘空间不足 if isWarnQuit then if notQuitGame then UTL.MessageBox.ShowOnlyOkNoCloseBox("", Const_IDS.IDS_AABDownload_Tips_4) else UTL.MessageBox.ShowOnlyOkNoCloseBox("", Const_IDS.IDS_AABDownload_Tips_4, UIUtils.QuitGame) end end end end --region Hotfix function HotFix_Controller.SetPreHotfixCode(code) private.preHotfixCode = code end function HotFix_Controller.GetPreHotfixCode() return private.preHotfixCode end --获取本地的预热更号,无预热更目录时返回0 function HotFix_Controller.GetLocalPreHotfixCode() return LuaExt.FileReadText(PRE_HOTFIX_CODE_PATH) or "0" end function HotFix_Controller.WritePreHotfixCodeToLocal(code) if LuaExt.DirectoryExists(PRE_HOTFIX_PATH) then LuaExt.FileWriteText(PRE_HOTFIX_CODE_PATH, code) end end function private.TryDeleteLocalPreHotfix() if private.IsRemoteClosePreHotfix() then LuaExt.DirectoryDelete(PRE_HOTFIX_PATH, true) end end --分包是否下完 function HotFix_Controller.AllPackageDownload() return HotFix_Controller.Get_IfAllDownload() == true and MDL.HotFix.Get_HasStagePackageAward() == true end --开启热更预下载,一些意外情况导致暂停下载,也是调用该接口恢复下载 function HotFix_Controller.TryStartPreHotfix() --上报预热更号前确保预热更号正确(可能热更无新文件下载,直接重启了状态机) private.TryDeleteLocalPreHotfix() local curPreHotfixCode = HotFix_Controller.GetLocalPreHotfixCode() BIManager.SendDownloadEvent(201, curPreHotfixCode) --只有分包下完才开启预下载 if not HotFix_Controller.AllPackageDownload() then return end if USE_ASSET_UPDATE == false then return end if private.IsRemoteClosePreHotfix() then return end if GameAppInfo.IsJapanesePackage() then if CTL.PreDownloadJP.GetCanClickPreHotfixBtn() then CTL.PreDownloadJP.SetCanClickPreHotfixBtn(false) LoginProxy.StartPreHotFix(PRE_HOTFIX_FRAGMENTSIZE, PRE_HOTFIX_ENABLE_MD5, PRE_HOTFIX_DOWNLOAD_NUM, private.preHotfixCode) end else if not HotFix_Controller.Get_IsWifi() then return end if LoginProxy.Get_IsDownloading() then return end if LoginProxy.Get_IsPauseDownload() then HotFix_Controller.ResumeDownload() return end if curPreHotfixCode == 0 or curPreHotfixCode ~= private.preHotfixCode then LoginProxy.StartPreHotFix(PRE_HOTFIX_FRAGMENTSIZE, PRE_HOTFIX_ENABLE_MD5, PRE_HOTFIX_DOWNLOAD_NUM, private.preHotfixCode) end end end --检查热更 function HotFix_Controller.CheckHotFix() logging.crit(LTAG.CRIT, "CurrentHotfixCode", LoginProxy.Get_HotfixVer(), "InternalHotfixCode", DEF.LOCAL_HOTFIX_CODE, "RemoteHotfixCode", AppInfo.hotfixCodeFromServer) if USE_ASSET_UPDATE == false then return false end if DEF.DISABLE_ASSET_CHECK then logging.crit(LTAG.CRIT, "热更关闭") return false end if string.isNilOrEmpty(AppInfo.hotfixCodeFromServer) then return false end logging.crit(LTAG.CRIT, "Start CheckHotFix") local diffSeconds = os.time() - BIManager.LastUpdateStepTime BIManager.LastUpdateStepTime = os.time() BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_StartHotUpdate, BIManager.BDCEventParam.update_id, BIManager.BDCEventParamValue.BeginCheckUpdate, BIManager.BDCEventParam.update_state, BIManager.BDCEventParamValue.Update_State_Success, BIManager.BDCEventParam.duration_time, tostring(diffSeconds)) --开始资源检查热更 HOTFIX_ENABLE_MD5 = 1 LoginProxy.StartHotFix(HOTFIX_FRAGMENTSIZE, HOTFIX_ENABLE_MD5, HOTFIX_DOWNLOAD_NUM) return true end --检查完毕,无需下载,热更结束 function private.OnHotfixFinishNoDownload() logging.crit(LTAG.CRIT, "OnHotFixFinish") --越南关闭网速的心跳检测 private.CloseHeartBeatVN() private.isTempAllowWarn = false --将热更号写进本地 LoginProxy.SetHotfixVerFromCDN(AppInfo.hotfixCodeFromServer) CTL.Login.OnHotFixFinish() end function HotFix_Controller.GetIsPreHotfix() return LoginProxy.GetIsPreHotfix() end --索引文件下载后完成diff,得到需要下载文件的总大小,单位:K function private.OnHotfixReady(maxSize, hasDownSize) MDL.HotFix.SetMaxDownloadSize(maxSize) local size = (maxSize - hasDownSize) / 1024 logging.crit(LTAG.CRIT, "OnHotfixReady, size:", size) if HotFix_Controller.GetIsPreHotfix() then private.DownloadAfterGetPreHotfixSize(size, hasDownSize) else if private.CheckSpaceAvailable(size, true) then CTL.Loading.BeginLoading(MDL.Loading.LoadingTypeEnum.HotFix, size) private.DownloadAfterGetHotfixSize(hasDownSize) end end end function private.DownloadAfterGetPreHotfixSize(size, hasDownSize) if GameAppInfo.IsJapanesePackage() then if private.CheckSpaceAvailable(size, true, true) then local maxSize = MDL.HotFix.GetMaxDownloadSize() if PersistentData.DeviceData:Get(CTL.PreDownloadJP.PreHotfixCode, "0") == CTL.HotFix.GetPreHotfixCode() then -- 表示已经询问过下载 private.ProcessHotfixDownload() else -- 只有在预下载界面里触发了下载 才会弹出提示 否则算是下载索引文件 if CTL.PreDownloadJP.GetInUIPreDownloadJPPanel() then -- 如果不是wifi环境 日服包需要让玩家选择是否下载 if not HotFix_Controller.Get_IsWifi() then local offset = maxSize - hasDownSize local desc = string.FormatByIdsId(Const_IDS.IDS_PreDownload_Tips, UTL.String.TransferKiloBytesSize(offset)) UTL.MessageBox.ShowOKCancelBox(Const_IDS.IDS_Login_UpdateTitle, desc, private.ProcessHotfixDownloadJP, private.CancelHotfixDownloadJP) else private.ProcessHotfixDownloadJP(true) end else private.CancelHotfixDownloadJP() end end else private.CancelHotfixDownloadJP() end else --预热更,直接下载 if private.CheckSpaceAvailable(size, false) then private.ProcessHotfixDownload() end end end function private.ProcessHotfixDownloadJP(noWifiCanHotFix) if not noWifiCanHotFix then PersistentData.DeviceData:Set(CTL.PreDownloadJP.NoWifiCanHotFix, false, true) end private.ProcessHotfixDownload() local curPreHotfixCode = CTL.HotFix.GetPreHotfixCode() PersistentData.DeviceData:Set(CTL.PreDownloadJP.PreHotfixCode, curPreHotfixCode, true) -- 保存下载进度 MDL.PreDownloadJP.JapanUpdateVersionReq(MDL.PreDownloadJP.VersionGiftState.NoOpen, curPreHotfixCode) -- 通知服务器开始下载 private.CancelHotfixDownloadJP() end function private.CancelHotfixDownloadJP() CTL.PreDownloadJP.SetCanClickPreHotfixBtn(true) end function private.DownloadAfterGetHotfixSize(hasDownSize) local maxSize = MDL.HotFix.GetMaxDownloadSize() local hasSize = hasDownSize local offset = maxSize - hasSize if GameAppInfo.IsJapanesePackage() then --日本无论是否wifi都需要弹窗提示 if offset > WARN_SIZE_JP then local desc = string.FormatByIdsId(Const_IDS.IDS_Login_StartUpdateTips, UTL.String.TransferKiloBytesSize(offset)) UTL.MessageBox.ShowOnlyOkNoCloseBox(Const_IDS.IDS_Login_UpdateTitle, desc, private.ProcessHotfixDownload) else private.ProcessHotfixDownload() end elseif GameAppInfo.IsChinesePackage() then if offset > WARN_SIZE_CN then local desc = string.FormatByIdsId(Const_IDS.IDS_Login_StartUpdateTips, UTL.String.TransferKiloBytesSize(offset)) UTL.MessageBox.ShowOnlyOkNoCloseBox(Const_IDS.IDS_Login_UpdateTitle, desc, private.ProcessHotfixDownload) else private.ProcessHotfixDownload() end elseif HotFix_Controller.IsUploadPackageCheckVN() then if offset > 0 then local desc = string.FormatByIdsId(Const_IDS.IDS_Login_StartUpdateTips, UTL.String.TransferKiloBytesSize(offset)) UTL.MessageBox.ShowOnlyOkNoCloseBox(Const_IDS.IDS_Login_UpdateTitle, desc, private.ProcessHotfixDownload) else private.ProcessHotfixDownload() end else if offset > WARN_SIZE_DEFAULT and not HotFix_Controller.Get_IsWifi() then local desc = string.FormatByIdsId(Const_IDS.IDS_Login_StartUpdateTips, UTL.String.TransferKiloBytesSize(offset)) UTL.MessageBox.ShowOnlyOkNoCloseBox(Const_IDS.IDS_Login_UpdateTitle, desc, private.ProcessHotfixDownload) else private.ProcessHotfixDownload() end end end function private.ProcessHotfixDownload() local diffTime = os.time() - BIManager.LastUpdateStepTime BIManager.LastUpdateStepTime = os.time() BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_StartHotUpdate, BIManager.BDCEventParam.update_id, BIManager.BDCEventParamValue.UpdateDownloadTip, BIManager.BDCEventParam.update_state, BIManager.BDCEventParamValue.Update_State_Success, BIManager.BDCEventParam.duration_time, tostring(diffTime)) diffTime = os.time() - BIManager.LastUpdateStepTime BIManager.LastUpdateStepTime = os.time() BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_StartHotUpdate, BIManager.BDCEventParam.update_id, BIManager.BDCEventParamValue.BeginDownloadUpdate, BIManager.BDCEventParam.update_state, BIManager.BDCEventParamValue.Update_State_Success, BIManager.BDCEventParam.duration_time, tostring(diffTime)) LoginProxy.ProcessHotfixDownload() if UnityEngine.Application.internetReachability == UnityEngine.NetworkReachability.ReachableViaCarrierDataNetwork then private.isTempAllowWarn = true else if private.isOpenTipAllNet then private.isWifiCanDownload = true end end EventSystem.Dispatch(EventID.UpdateDownloadState, false) private.UpdateSizeTips(0) private.BeginProgressTimer() --越南开启热更心跳监测 private.TurnOnHeartBeatVN() end --没有可下载的文件,将索引文件和热更号写进本地,重新拉取公告,打开登录界面和公告界面 function private.OnDownLoadAllSuccess() local diffTime = os.time() - BIManager.LastUpdateStepTime BIManager.LastUpdateStepTime = os.time() BIManager.DispatchBIClientEvent(BIManager.EventName.BDC_StartHotUpdate, BIManager.BDCEventParam.update_id, BIManager.BDCEventParamValue.UpdateReturn, BIManager.BDCEventParam.update_state, BIManager.BDCEventParamValue.Update_State_Success, BIManager.BDCEventParam.duration_time, tostring(diffTime)) private.EndProgressTimer() --越南关闭网速的心跳检测 private.CloseHeartBeatVN() if HotFix_Controller.GetIsPreHotfix() then logging.crit(LTAG.CRIT, "PreDownloadAllSuccess") --预热更结束 EventSystem.Dispatch(EventID.UI_Loading_UpdateDownloadProgress, 1, 1, 0) LoginProxy.OnPreDownloadAllSuccess(private.preHotfixCode) HotFix_Controller.WritePreHotfixCodeToLocal(private.preHotfixCode) BIManager.SendDownloadEvent(201, private.preHotfixCode) else logging.crit(LTAG.CRIT, "OnDownLoadAllSuccess") private.OnHotfixPostProcess() --完成下载之后会重置资源,这里需要将标识重置 PersistentData.DeviceData:Set("ExecuteIfLoadedAB", false, true) LoginProxy.OnDownLoadAllSuccess() end end --远端是否关闭了预热更 function private.IsRemoteClosePreHotfix() return string.isNilOrEmpty(private.preHotfixCode) or private.preHotfixCode == "0" end --正式热更的后处理,目前主要处理预热更资源 function private.OnHotfixPostProcess() if LoginProxy.GetIsForceAppDataPath() then local lastPkgVer = LuaExt.FileReadText("pkgver") or "" logging.crit(LTAG.CRIT, string.format("package version changed, from %s to %s, with hotfix", lastPkgVer, AppInfo.marketVersion)) --当前是覆盖安装,到这个阶段之前资源全是用的包内的,需要改成【优先包外】模式,这里无需重启,热更结束会自动重启 LoginProxy.SetIsForceAppDataPath(false) LuaExt.FileWriteText("pkgver", AppInfo.marketVersion) end if GameAppInfo.IsVersionGreaterThan16000() then --新包优化了提取预热更下载的资源逻辑,这里不删除 else local isRemove = private.IsRemoteClosePreHotfix() --正式热更,当远端的预热更为空时(配0)删除 if isRemove then LuaExt.DirectoryDelete(PRE_HOTFIX_PATH, true) end end end --endregion --region StagePackage function private.InitStagePackParam() private.stage2PackSizeDic = {} private.hasSendBI = false if DEF.OPEN_STAGE_DOWNLOAD then LoginProxy.InitStagePackParam(STAGE_FRAGMENTSIZE, STAGE_ENABLE_MD5, STAGE_DOWNLOAD_NUM)--下载下一个阶段的资源 end end --开启分包下载 function HotFix_Controller.StartStagePackage() if DEF.OPEN_STAGE_DOWNLOAD then if private.stage2PackSizeDic == nil then BIManager.ReportStartStageDownload() private.InitStagePackParam() end local nextStage = HotFix_Controller.GetNextStage() if nextStage <= END_STAGE1_INDEX then if DEF.USE_SMALL_APK then BIManager.SendSmallPackDownloadEvent("ReportPackDownProgressStart", nextStage) else BIManager.SendDownloadEvent(0, 0) end end LoginProxy.StartStagePackage()--下载下一个阶段的资源 end end --初始化分包下载列表,获取下载大小 function private.OnPackReady(maxSize, hasDownSize) MDL.HotFix.SetMaxDownloadSize(maxSize) local size = (maxSize - hasDownSize) / 1024 if private.CheckSpaceAvailable(size, true) then private.DownloadAfterGetSPDownloadSize(hasDownSize) end end function private.DownloadAfterGetSPDownloadSize(hasDownSize) if private.GetIfWarnWifi() then local kbSize = HotFix_Controller.GetStageGroupLeftKiloBytes(hasDownSize) local size = math.ceil(kbSize / 1024) local desc = string.FormatByIdsId(Const_IDS.IDS_LoginMobileNet2, size) CTL.Login.OpenErrorWarnPanel(desc, private.ProcessStagePackageDownloadViaWifi, private.CancelViaWifi) elseif private.GetIfWarn() then local kbSize = 0 if DEF.USE_SMALL_APK and LoginProxy.GetCurStage() < LEVEL_1_3_STAGE then kbSize = HotFix_Controller.GetStage1TotalDownloadSize() - HotFix_Controller.GetStage1DownloadedSize(LoginProxy.GetCurStage()) - hasDownSize else kbSize = HotFix_Controller.GetStageGroupLeftKiloBytes(hasDownSize) end local size = math.ceil(kbSize / 1024) local desc = string.FormatByIdsId(Const_IDS.IDS_LoginMobileNet, size) CTL.Login.OpenErrorWarnPanel(desc, private.ProcessStagePackageDownloadViaCarrier, private.CancelViaCarrier) else private.ProcessStagePackageDownload() end end function private.ProcessStagePackageDownloadViaWifi() private.isWifiCanDownload = true private.ProcessStagePackageDownload() end function private.CancelViaWifi() private.isWifiCanDownload = false EventSystem.Dispatch(EventID.UpdateDownloadState, true) end function private.ProcessStagePackageDownloadViaCarrier() private.isTempAllowWarn = true private.ProcessStagePackageDownload() end function private.ProcessStagePackageDownload() --分包1未下完,开始下载打点 if HotFix_Controller.Get_IsFirstPackageComplete() == false and private.hasSendBI == false then private.hasSendBI = true BIManager.SendDownloadEvent(0, 0) end LoginProxy.ProcessStagePackageDownload() EventSystem.Dispatch(EventID.UpdateDownloadState, false) private.UpdateSizeTips(0) private.BeginProgressTimer() end function HotFix_Controller.OnPADFinish() if DEF.USE_SMALL_APK then return end if (AppInfo.isBuildAAB and (USE_AAB_SMALL_PAD == nil or USE_AAB_SMALL_PAD == false)) or (DEF.USE_BIG_APK) then --pad结束,如果当前stage小于分包1的stage,需要将stage修改为分包1的stage,防止走到分包1界面内 local curStage = LoginProxy.GetCurStage() if curStage < END_STAGE1_INDEX then LoginProxy.SetPackStage(END_STAGE1_INDEX) end end end --分包下载完成 function private.OnPackFinish(stage) AuxUtil.BuglyAgentAddSceneData("PackageStage", tostring(stage)) private.EndProgressTimer() private.ResetTempAllow() EventSystem.Dispatch(EventID.OnPerPackFinish, stage) --新增资源下载埋点,监控每个stage的网速。 HotFix_Controller.OnPackFinishEvent(stage) if HotFix_Controller.OnLevelPackFinish(stage) then return end --分包1资源下完,此时在阻挡公告下,继续下载 if LoginProxy.GetCurStage() <= END_STAGE1_INDEX and HotFix_Controller.Get_IsFirstPackageComplete() and CTL.Login.GetIsAnnouncementObstruct() == false then --需要是刚刚下完分包1的判断,不然会一直进入该分支 --重置确认状态 private.isAllowWarn = false CTL.Login.ShowLoginUI() else if HotFix_Controller.Get_IfAllDownload() == false then --分包资源没下完,则继续下载 HotFix_Controller.StartStagePackage() else --分包资源全部下载完 EventSystem.Dispatch(EventID.UpdateDownloadState, false) EventSystem.Dispatch(EventID.UI_StagePackage_AllDownload) if private.finishDownloadFunc then private.finishDownloadFunc() private.finishDownloadFunc = nil end end end if HotFix_Controller.GetNextStage() > END_STATE2_INDEX and stage <= END_STATE2_INDEX then MDL.HotFix.Stage299PackageAwardRequest() end end function private.ResetTempAllow() --每到一个分包时机点,需要将同意流量下载的状态重置 local curStage = LoginProxy.GetCurStage() local nextStage = HotFix_Controller.GetNextStage() if nextStage > LEVEL_1_2_STAGE and curStage <= LEVEL_1_2_STAGE then private.isTempAllowWarn = false elseif nextStage > LEVEL_1_3_STAGE and curStage <= LEVEL_1_3_STAGE then private.isTempAllowWarn = false end end function HotFix_Controller.OnLevelPackFinish(stage) if DEF.USE_SMALL_APK then if stage <= LEVEL_1_3_STAGE then if not UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIStagePackage) then if (private.IsFinishPack1_2() and LoginProxy.GetCurStage() <= LEVEL_1_2_STAGE) or (HotFix_Controller.IsFinishPack1_3() and LoginProxy.GetCurStage() <= LEVEL_1_3_STAGE) then if private.dowloadSmallLevelPackage then private.dowloadSmallLevelPackage = false UIManager.CloseAllBase() CTL.Loading.EndLoading() UIManager.CloseSpecialView(Const_UI_Lua.UIEnum.UILoginVideo) CTL.Level.ConveyLevelByLevelID(1, true) end end end BIManager.SendSmallPackDownloadEvent("ReportPackDownProgressEnd", stage) if MDL.Loading.LoadingType == MDL.Loading.LoadingTypeEnum.StagePackage or UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIStagePackage) then HotFix_Controller.ContinueDownloadStage() else HotFix_Controller.PreDownloadStage() end return true end end end --获取是否所有分包资源下载完成 function HotFix_Controller.Get_IfAllDownload() if DEF.OPEN_STAGE_DOWNLOAD then return LoginProxy.Get_IfAllDownload() end return true end --获取当前的分包组 function HotFix_Controller.GetStageNum(stage) return math.floor(stage / 100) end --通过当前的stage获取该分包的最大stage function HotFix_Controller.GetGroupMaxStageByStage(stage) if stage == 0 then return 0 elseif DEF.USE_SMALL_APK and stage >0 and stage <= LEVEL_1_2_STAGE then local dic = private.GetStagePackSizeDic() local result = 0 for stage, size in pairs(dic) do if stage <= LEVEL_1_2_STAGE and stage > 0 then if result == 0 or result < stage then result = stage end end end return result end local group = HotFix_Controller.GetStageNum(stage) return HotFix_Controller.GetGroupMaxStage(group) end --获取完成当前整个分包组剩余的大小 function HotFix_Controller.GetStageGroupLeftKiloBytes(hasDownSize) local curStage = LoginProxy.GetCurStage() local nextStage = HotFix_Controller.GetNextStage() local curStageGroup = HotFix_Controller.GetStageNum(curStage) local nextStageGroup = HotFix_Controller.GetStageNum(nextStage) local sumPackSize = HotFix_Controller.GetStageGroupSize(nextStageGroup) local downloadedPackSize = 0 if curStageGroup == nextStageGroup then downloadedPackSize = HotFix_Controller.GetSeriesStageSize(HotFix_Controller.GetGroupMinStage(curStageGroup), curStage) end return sumPackSize - downloadedPackSize - hasDownSize end --勾选可在流量状态下下载 function HotFix_Controller.Set_IsAllowCarrier(state) if private.isAllowCarrier == state then return end private.isAllowCarrier = state --state为false在ProgressFunc中会暂停下载,为true时需要开启下载 if state == true and LoginProxy.Get_IsDownloading() == false then if private.isDownloadPause == true then HotFix_Controller.ResumeDownload() else HotFix_Controller.StartStagePackage() end end end function HotFix_Controller.Set_IsDownloadAnyway(state, isShowDownloadTips) if isShowDownloadTips ~= nil then -- 当玩家在 UIStagePackageTip 页面点击下载时,不使用我们的 MessageBox 弹窗,但是执行隐式下载逻辑。 private.isShowDownloadTips = isShowDownloadTips private.isDownloadAnyway = true end if state == true then HotFix_Controller.ContinueDownloadStage() elseif state == false then HotFix_Controller.PauseDownload() private.isDownloadAnyway = false end end function HotFix_Controller.Get_IsAllowCarrier() if HotFix_Controller.IsUploadPackageCheckVN() then return private.isDownloadAnyway else return private.isAllowCarrier end end --分包1是否下载完成 function HotFix_Controller.Get_IsFirstPackageComplete() if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end return HotFix_Controller.GetNextStage() > END_STAGE1_INDEX end return true end function HotFix_Controller.GetGroupMaxStage(stageGroup) local result = 0 local maxStage = stageGroup * 100 + 99 local minStage = stageGroup * 100 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage <= maxStage and stage >= minStage then if result == 0 or result < stage then result = stage end end end return result end function HotFix_Controller.GetGroupMinStage(stageGroup) local result = 0 local maxStage = stageGroup * 100 + 99 local minStage = stageGroup * 100 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage <= maxStage and stage >= minStage then if result == 0 or result > stage then result = stage end end end return result end --size:单位K function private.SetStagePackSize(stage, size) private.stage2PackSizeDic[stage] = size end function private.GetStagePackSizeDic() if private.stage2PackSizeDic == nil then private.InitStagePackParam() end return private.stage2PackSizeDic end function HotFix_Controller.GetStageGroupSize(stageGroup) local stage1 = HotFix_Controller.GetGroupMinStage(stageGroup) local stage2 = HotFix_Controller.GetGroupMaxStage(stageGroup) return HotFix_Controller.GetSeriesStageSize(stage1, stage2) end --预下载,获取总分包数 function HotFix_Controller.GetMaxGroupStage() local maxStage = 0 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage > maxStage then maxStage = stage end end return HotFix_Controller.GetStageNum(maxStage) end --预下载,获取当前下载的分包数 function HotFix_Controller.GetCurGroupStage() local curStage = LoginProxy.GetCurStage() local maxStage = HotFix_Controller.GetGroupMaxStageByStage(curStage) local stageGroup = HotFix_Controller.GetStageNum(curStage) if curStage == maxStage then return stageGroup else return math.max(stageGroup - 1, 0) end end function HotFix_Controller.ClearStagePackInfo() private.stage2PackSizeDic = nil end function HotFix_Controller.GetNextStage() if private.stage2PackSizeDic == nil then private.InitStagePackParam() end return LoginProxy.GetNextStage() end function HotFix_Controller.OpenStageDownloadUI() if DEF.OPEN_STAGE_DOWNLOAD then UIManager.OpenView(Const_UI_Lua.UIEnum.UIStagePackage) end end function HotFix_Controller.ForceOpenStageDownload(finishFunc, isClickStartGame) if DEF.USE_SMALL_APK then if LoginProxy.GetCurStage() < LEVEL_1_3_STAGE and not isClickStartGame then return end end UIManager.CloseAllBase() if CTL.HomeMain then CTL.HomeMain.ClearTownHomeDelayView() end CTL.Loading.EndLoading() --打开视频界面挡住 CTL.Login.ShowLoginMoviePanel(MDL.Login.LoginBGTypeCfgValue, MDL.Login.GetLoginShowPath()) --打开分包下载界面 CTL.Tips.AddTipsMsg(Const_IDS["IDS_StagePackage_DownloadUnfinished"]) CTL.HotFix.OpenStageDownloadUI() EventSystem.Dispatch(EventID.UI_StagePackage_ForceDownload) HotFix_Controller.PreDownloadStage() private.finishDownloadFunc = finishFunc end --继续未下完的Stage function HotFix_Controller.ContinueDownloadStage() if CTL.HotFix.Get_IfAllDownload() then return end if LoginProxy.Get_IsDownloading() == false then if private.isDownloadPause == false then HotFix_Controller.StartStagePackage() else HotFix_Controller.ResumeDownload() end else private.ResumeDownloadOnReboot() end end function HotFix_Controller.PreDownloadStage() if DEF.DISABLE_ASSET_CHECK then --这里返回是防止Debug包去请求无效的cdn地址 --由于这里返回了,后续逻辑没执行,就算挪了完整资源,也还是会卡在分包下载界面 --防止Debug出现这种情况,在启动时将分包设置最大值默认是资源完整的状态 return false end -- iOS 越南包无论什么网络条件,都需要弹窗询问用户是否要下载 if HotFix_Controller.IsUploadPackageCheckVN() then HotFix_Controller.ContinueDownloadStage() return end if HotFix_Controller.Get_IsWifi() or private.isAllowCarrier or private.Get_IsAutoDownloadToPack199() or private.Get_IsAutoDownloadToPack299() then HotFix_Controller.ContinueDownloadStage() else private.BeginReconnectWifiTimer() if LoginProxy.Get_IsDownloading() then private.ResumeDownloadOnReboot() end end end --返回了登录,重启状态机恢复下载 function private.ResumeDownloadOnReboot() local maxSize = LoginProxy.Get_CurDownloadMaxSize() MDL.HotFix.SetMaxDownloadSize(maxSize) private.BeginProgressTimer() end function HotFix_Controller.GetStage2TotalDownloadSize() if DEF.USE_SMALL_APK then return private.GetStageTotalDownloadSize(LEVEL_1_2_STAGE + 1) else return private.GetStageTotalDownloadSize(END_STAGE1_INDEX + 1) end end function HotFix_Controller.GetStage1TotalDownloadSize() if DEF.USE_SMALL_APK then local nextStage = HotFix_Controller.GetNextStage() if nextStage <= LEVEL_1_2_STAGE then return HotFix_Controller.GetSeriesStageSize(100, LEVEL_1_2_STAGE) elseif nextStage <= LEVEL_1_3_STAGE then return HotFix_Controller.GetSeriesStageSize(130, LEVEL_1_3_STAGE) end end return HotFix_Controller.GetSeriesStageSize(START_STAGE1_INDEX, END_STAGE1_INDEX) end function private.GetStageTotalDownloadSize(tarStage) local totalSize = 0 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage >= tarStage then totalSize = totalSize + size end end return totalSize end function private.GetStageAlreadyDownloadedSize(tarStage) local totalSize = 0 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage < tarStage then totalSize = totalSize + size end end return totalSize end function HotFix_Controller.GetStage1DownloadedSize(stage) if DEF.USE_SMALL_APK then local curStage = LoginProxy.GetCurStage() local nextStage = HotFix_Controller.GetNextStage() if nextStage <= LEVEL_1_2_STAGE then return HotFix_Controller.GetSeriesStageSize(START_STAGE1_INDEX, stage) elseif curStage < LEVEL_1_3_STAGE then return HotFix_Controller.GetSeriesStageSize(LEVEL_1_2_STAGE + 1, stage) end end return HotFix_Controller.GetSeriesStageSize(START_STAGE1_INDEX, stage) end function HotFix_Controller.GetStage2DownloadedSize(stage) if DEF.USE_SMALL_APK then return HotFix_Controller.GetSeriesStageSize(LEVEL_1_2_STAGE + 1, stage) else return HotFix_Controller.GetSeriesStageSize(END_STAGE1_INDEX + 1, stage) end end --连续的两个Stage的大小,单位Kb function HotFix_Controller.GetSeriesStageSize(stage1, stage2) local totalSize = 0 local dic = private.GetStagePackSizeDic() for stage, size in pairs(dic) do if stage >= stage1 and stage <= stage2 then totalSize = totalSize + size end end return totalSize end function HotFix_Controller.GetNextStageSize() local nextStage = HotFix_Controller.GetNextStage() local dic = private.GetStagePackSizeDic() return dic[nextStage] end --endregion function private.OnApplicationPause(value) if private.progressHandle then if value then HotFix_Controller.PauseDownload() end else if private.isDownloadPause then if value == false then HotFix_Controller.ResumeDownload() end end end end function HotFix_Controller.IsDownloading() return private.progressHandle ~= nil end --暂停下载 function HotFix_Controller.PauseDownload() private.isDownloadPause = true LoginProxy.PauseDownload() private.EndProgressTimer() --下载停止后更新下进度显示,将速度置零 EventSystem.Dispatch(EventID.UI_Loading_UpdateDownloadProgress, private.lastDownloadSize, MDL.HotFix.GetMaxDownloadSize(), 0) EventSystem.Dispatch(EventID.Pause_Download) --越南关闭下载速度心跳检测 private.CloseHeartBeatVN() end --恢复下载 function HotFix_Controller.ResumeDownload() private.isDownloadPause = false LoginProxy.ResumeDownload() private.BeginProgressTimer() EventSystem.Dispatch(EventID.Resume_Download) --越南开启下载速度心跳检测 private.TurnOnHeartBeatVN() end function HotFix_Controller.HasActivityDownload(activityID) if DEF.OPEN_STAGE_DOWNLOAD then local levelFeatureID = MDL.Activities.TeamActivity2LevelType[activityID] return HotFix_Controller.HasLevelPackageDownload(levelFeatureID) end return true end --通过LevelFeatureID判断分包资源是否已下完 --两个参数可能为空,但不能全为空 function HotFix_Controller.HasLevelPackageDownload(levelType, levelID) if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end if levelType or levelID then local curStage = LoginProxy.GetCurStage() if levelID then local infoData = DataSheetManager.LevelInfoData:GetDataByLevelID(levelID) if infoData == nil then return true end --分包1-2下载 if HotFix_Controller.CheckLevelStage1_2(levelID) or HotFix_Controller.CheckLevelStage1_3(infoData.LevelType) then HotFix_Controller.DownLoadLevelPack() return false end local path = string.format(SCENE_BUNDLE_PATH, infoData.ScenePath) local stage = AuxUtil.GetAssetBundleStage(path) local tarStage = HotFix_Controller.GetGroupMaxStageByStage(stage) if curStage < tarStage then private.WarnToDownload(tarStage) return false end else --没有传levelID,需要整个levelType都下完 local sceneStage = private.stageSceneDic[levelType] if sceneStage then local stage = HotFix_Controller.GetGroupMaxStage(sceneStage) if curStage < stage then private.WarnToDownload(stage) return false end end end end end return true end --判断是否需要下载1-2分包资源 function HotFix_Controller.CheckLevelStage1_2(levelID) return DEF.USE_SMALL_APK and levelID == 1 and not private.IsFinishPack1_2() and MDL.Unlock.PassedLevel(CHAPTER_LEVEL_ID_1_1) end --判断是否需要下载1-3分包资源 function HotFix_Controller.CheckLevelStage1_3(levelType) return DEF.USE_SMALL_APK and levelType == LuaConst.LevelType.TOWN and not HotFix_Controller.IsFinishPack1_3() and MDL.Unlock.PassedLevel(CHAPTER_LEVEL_ID_1_2) end function HotFix_Controller.DownLoadLevelPack() UTL.MessageBox.ShowOnlyOkNoCloseBox(nil , Const_IDS.IDS_Download_Continue, function() UIUtils.SetScreenBlack(false) CTL.Loading.BeginLoading(MDL.Loading.LoadingTypeEnum.StagePackage, CTL.Loading.PackDownloadType.Video) HotFix_Controller.ContinueDownloadStage() private.dowloadSmallLevelPackage = true end) end function HotFix_Controller.CheckAndWarnDownloadPack(stage) if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end local curStage = LoginProxy.GetCurStage() local stage = HotFix_Controller.GetGroupMaxStageByStage(stage) if curStage < stage then private.WarnToDownload(stage) return false end end return true end function private.WarnToDownload(stage) if UIManager.IsViewOpened(Const_UI_Lua.UIEnum.UIStagePackageTip) then return end local curStage = LoginProxy.GetCurStage() if curStage >= stage then logging.warn(LTAG.WARN,"All Packages Finished") return end if DEF.USE_SMALL_APK and curStage < LEVEL_1_2_STAGE then return end local nextStage = CTL.HotFix.GetNextStage() if CTL.HotFix.IsFinishPack1_3() and nextStage <= END_STATE2_INDEX then --分包2定制tips UIManager.OpenView(Const_UI_Lua.UIEnum.UIPack2DownloadTip) else UIManager.OpenView(Const_UI_Lua.UIEnum.UIStagePackageTip, { tarStage = stage }) end end function HotFix_Controller.CanAssetLoad(assetPath) if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end local stage = AuxUtil.GetAssetBundleStage(assetPath) local nextStage = HotFix_Controller.GetNextStage() if stage == 0 then return true elseif DEF.USE_SMALL_APK and stage <= LEVEL_1_2_STAGE then return nextStage > LEVEL_1_2_STAGE elseif DEF.USE_SMALL_APK and stage <= LEVEL_1_3_STAGE then return nextStage > LEVEL_1_3_STAGE else return nextStage > HotFix_Controller.GetGroupMaxStageByStage(stage) end end return true end --判断武将是否已下载好 function HotFix_Controller.CanHeroLoad(heroId, isShow, heroAppearanceID) if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end local stageData if heroAppearanceID and heroAppearanceID > 0 then stageData = DataSheetManager.StageHero:GetDataByID_StageType(heroAppearanceID, 2) if stageData == nil then --可能是变色,这种情况返回本体数据即可,变色跟本体保持一致 stageData = DataSheetManager.StageHero:GetDataByID_StageType(heroId, 1) end else stageData = DataSheetManager.StageHero:GetDataByID_StageType(heroId, 1) end if stageData == nil then return false end if isShow then --不进包 if stageData.ShowStage == -1 then return false end if stageData.ShowStage == 0 then return true end else if stageData.NormalStage == -1 then return false end if stageData.NormalStage == 0 then return true end end local path = UTL.UIRender.GetModelPath(heroId, isShow, heroAppearanceID) return HotFix_Controller.CanAssetLoad(path) end return true end --获取分包的下载进度和stage --stage*1000 + progress*100 function HotFix_Controller.GetPackProgress() if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then --全部下完,返回理论最大值 return 999100 end local nextStage = HotFix_Controller.GetNextStage() local nextStageGroup = HotFix_Controller.GetStageNum(nextStage) local sumPackSize = HotFix_Controller.GetStageGroupSize(nextStageGroup) local leftPackSize = HotFix_Controller.GetStageGroupLeftKiloBytes(private.lastDownloadSize) return nextStage * 1000 + math.floor(((sumPackSize - leftPackSize) / sumPackSize) * 100) end return 0 end function HotFix_Controller.IsStage2Finished() if HotFix_Controller.Get_IfAllDownload() then return true end if DEF.OPEN_STAGE_DOWNLOAD then if HotFix_Controller.GetNextStage() < END_STATE2_INDEX then return false end end return true end function HotFix_Controller.OnShutdown() if LoginProxy.Get_IsDownloading() then HotFix_Controller.PauseDownload() end private.SetupEntryFunc(false) end --1-2分包是否下载完成 function private.IsFinishPack1_2() return HotFix_Controller.Get_IfAllDownload() or HotFix_Controller.GetNextStage() > LEVEL_1_2_STAGE end function HotFix_Controller.OnPackFinishEvent(stage) if stage then BIManager.ReportStageDownloadInfo(LoginProxy.GetDownloadSpeed(), stage) local curStageGroup = HotFix_Controller.GetStageNum(stage) local nextStageGroup = HotFix_Controller.GetStageNum(HotFix_Controller.GetNextStage()) if curStageGroup and nextStageGroup and curStageGroup ~= nextStageGroup then BIManager.ReportPackDownloadCompleted(LoginProxy.GetDownloadSpeed(), curStageGroup) end else logging.error(LTAG.ERROR,"[OnPackFinishEvent] stage is nil.") end end function private.TurnOnHeartBeatVN() if GameAppInfo.IsVietnamPackage() and not private.downloadSpeedHandle then private.downloadSpeedHandle = TimerUtil.Interval(private.SendEventWithDownloadSpeed, DonwLoadHeartbeatsCycle, DonwLoadHeartbeatsTime/DonwLoadHeartbeatsCycle) end end function private.CloseHeartBeatVN() if GameAppInfo.IsVietnamPackage() and private.downloadSpeedHandle then TimerUtil.Remove(private.downloadSpeedHandle) private.downloadSpeedHandle = nil end end function private.SendEventWithDownloadSpeed() if LoginProxy.GetDownloadSpeed() and LoginProxy.GetCurStage() then BIManager.ReportDownloadSpeedHeartbeat(LoginProxy.GetDownloadSpeed(), LoginProxy.GetCurStage()) end end --1-3分包是否下载完成 function HotFix_Controller.IsFinishPack1_3() return HotFix_Controller.Get_IfAllDownload() or HotFix_Controller.GetNextStage() > LEVEL_1_3_STAGE end -- 处理是否是越南提审包 function HotFix_Controller.IsUploadPackageCheckVN() return UNITY_IOS and GameAppInfo.IsVietnamPackage() and MDL.Login.IsReviewService end function HotFix_Controller.CheckAssetIsReady(key) if DEF.OPEN_STAGE_DOWNLOAD then if LoginProxy.Get_IfAllDownload() then return true end local stage = ModuleStageCfg[key] if stage then return HotFix_Controller.GetNextStage() > stage else logging.error(LTAG.ERROR, "can`t find stage cfg", key) return false end end return true end function HotFix_Controller.TryOpenPack2Tips() if DEF.OPEN_STAGE_DOWNLOAD == false then return end if HotFix_Controller.IsStage2Finished() then UIManager.OpenView(Const_UI_Lua.UIEnum.UIPack2DownloadTip) end end return HotFix_Controller