StepPackModule = StepPackModule or BaseClass()
|
|
local StepPackModule = StepPackModule
|
|
local Util = Util
|
|
local os = os
|
|
local setTimeout = setTimeout
|
|
local AppConst_CdnUrl = AppConst.CdnUrl
|
|
local Util_DataPath = Util.DataPath
|
|
local AppConst_OpenDownloadLog = AppConst.OpenDownloadLog
|
|
|
|
|
|
StepPackModule.PRELOAD_MAP_RES = "" --"1001" --新手200级使用12个地图资源的顺序
|
|
|
|
function StepPackModule:__init()
|
|
if StepPackModule.Instance ~= nil then
|
|
error("attempt to create singleton(StepPackModule) twice!")
|
|
return
|
|
end
|
|
StepPackModule.Instance = self
|
|
|
|
self.hight_res_list = nil
|
|
self.need_retry_res_list = {}
|
|
|
|
self.update_res_count = 0
|
|
self.update_res_size = 0
|
|
self.cur_update_index = 1
|
|
|
|
self.cur_download_size = 0
|
|
self.all_download_size = 0
|
|
self.all_download_count = 0
|
|
self.last_download_speed = 0
|
|
|
|
self.last_download_start_time = os.time()
|
|
|
|
self.earch_download_wait_time = 1
|
|
|
|
self.need_retry_count = 0
|
|
|
|
self.wait_download_time = nil
|
|
|
|
self.work_state = false
|
|
self.download_now = false
|
|
self.pause_state = false
|
|
self.auto_pause = false
|
|
self.res_checking_state = false
|
|
|
|
self.download_finish_state = false
|
|
|
|
self.callback_func = nil
|
|
|
|
self.last_show_speed_size = 0
|
|
self.last_show_speed_time = 0
|
|
|
|
self.newplayer_map_res_finish = false
|
|
|
|
self.max_download_speed = false
|
|
self.max_speed_mode = false -- 外部设置加速模式
|
|
|
|
local check_start = function()
|
|
self:CheckAutoUpdate()
|
|
end
|
|
|
|
local scene_start_event = nil
|
|
local scene_start = function()
|
|
GlobalEventSystem:UnBind(scene_start_event)
|
|
if not self.work_state and not self.download_finish_state then
|
|
setTimeout(check_start,15) --避开scene_start后10秒时设置的帧率流程
|
|
end
|
|
end
|
|
scene_start_event = GlobalEventSystem:Bind(EventName.SCENE_LOAD_VIEW_COMPLETE,scene_start)
|
|
|
|
self:CheckNewPlayerResState()
|
|
|
|
local callfunc = function(module_name,func)
|
|
if module_name == "download" and func == "maxspeed" then
|
|
self.max_download_speed = true
|
|
elseif module_name == "download" and func == "smallspeed" then
|
|
self.max_download_speed = false
|
|
end
|
|
end
|
|
GlobalEventSystem:Bind(EventName.DO_MODULE_DEBUG_FUNC,callfunc)
|
|
|
|
local lock_screen = function()
|
|
self.max_download_speed = true
|
|
end
|
|
GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_DEL_EVENT, lock_screen)
|
|
|
|
local normal_screen = function()
|
|
if not self.max_speed_mode then
|
|
self.max_download_speed = false
|
|
end
|
|
end
|
|
GlobalEventSystem:Bind(SceneEventType.SCREEN_BRIGHT_ADD_EVENT, normal_screen)
|
|
end
|
|
|
|
function StepPackModule:SetMaxSpeedMode( state )
|
|
self.max_speed_mode = state
|
|
self.max_download_speed = state
|
|
end
|
|
|
|
function StepPackModule:CheckNewPlayerResState()
|
|
-- if self.check_newplayer_res_state or self.newplayer_map_res_finish then
|
|
-- return
|
|
-- end
|
|
-- self.check_newplayer_res_state = true
|
|
-- local data = Split(StepPackModule.PRELOAD_MAP_RES,",")
|
|
-- if data and #data > 0 then
|
|
-- self.map_list = data
|
|
-- end
|
|
|
|
-- local data = CookieWrapper.Instance:GetCookie(CookieLevelType.Common, CookieKey.NEWPLAYER_MAP_RES_DOWNLOAD_DATA)
|
|
-- if data then
|
|
-- local info = Split(data,",")
|
|
-- if info and #info >= 3 then
|
|
-- local finish = info[1]
|
|
-- if tonumber(finish) == 1 then
|
|
-- self.newplayer_map_res_finish = true
|
|
-- end
|
|
|
|
-- if not self.newplayer_map_res_finish then
|
|
-- local last_map = tonumber(info[2])
|
|
-- local last_index = tonumber(info[3])
|
|
|
|
-- if last_map and last_index then
|
|
-- self.last_newplayer_map = last_map
|
|
-- self.last_newplayer_index = last_index
|
|
-- end
|
|
-- end
|
|
-- end
|
|
-- else
|
|
-- --检测是老号并且无新手下载记录,则不下载新手资源
|
|
-- local last_role_id = CookieWrapper.Instance:GetCookie(CookieLevelType.Common, CookieKey.LAST_LOGIN_ROLE_ID)
|
|
-- if last_role_id then
|
|
-- self.newplayer_map_res_finish = true
|
|
-- else
|
|
-- if self.map_list and #self.map_list >= 2 then
|
|
-- self.last_newplayer_map = self.map_list[2]
|
|
-- self.last_newplayer_index = 1
|
|
-- CookieWrapper.Instance:SaveCookie(CookieLevelType.Common, CookieTimeType.TYPE_ALWAYS,CookieKey.NEWPLAYER_MAP_RES_DOWNLOAD_DATA,"0," .. self.last_newplayer_map .. "," .. self.last_newplayer_index)
|
|
-- CookieWrapper.Instance:WriteAll()
|
|
-- end
|
|
-- end
|
|
-- end
|
|
end
|
|
|
|
function StepPackModule:getInstance()
|
|
if StepPackModule.Instance == nil then
|
|
StepPackModule.New()
|
|
end
|
|
return StepPackModule.Instance
|
|
end
|
|
|
|
function StepPackModule:AddDownloadSize( size )
|
|
self.all_download_size = self.all_download_size + size
|
|
self.all_download_count = self.all_download_count + 1
|
|
|
|
self:CheckDownloadFinish()
|
|
end
|
|
|
|
function StepPackModule:CheckDownloadFinish()
|
|
if self.all_download_count >= self.update_res_count * 0.99 or self.all_download_size >= self.update_res_size * 0.99 then
|
|
self.download_finish_state = true
|
|
self.all_download_size = self.update_res_size
|
|
self.work_state = false
|
|
|
|
if self.update_speed_timer then
|
|
TimerQuest.CancelQuest(GlobalTimerQuest, self.update_speed_timer)
|
|
self.update_speed_timer = nil
|
|
end
|
|
|
|
if self.delay_write_version_timer then
|
|
--延迟的版本全部写入
|
|
Util.AutoWriteVersionFile(9999)
|
|
|
|
TimerQuest.CancelQuest(GlobalTimerQuest, self.delay_write_version_timer)
|
|
self.delay_write_version_timer = nil
|
|
end
|
|
|
|
if self.callback_func then
|
|
self.callback_func(self.all_download_size,self.update_res_size,0,self.download_finish_state)
|
|
end
|
|
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Common,CookieTimeType.TYPE_ALWAYS,CookieKey.SILENT_ASSETS_FINISH,"finish")
|
|
CookieWrapper.Instance:WriteAll()
|
|
end
|
|
|
|
--Debugger.Log("---------download count--------------" .. self.all_download_count .. "/" .. self.update_res_count)
|
|
end
|
|
|
|
function StepPackModule:Update(now_time, elapse_time)
|
|
-- 自动暂停状态时,检测到有wifi,则取消暂停
|
|
if self.auto_pause and Util.IsWifi then
|
|
self.pause_state = false
|
|
end
|
|
|
|
if not self.pause_state and not self.download_now and self.update_res_count + self.need_retry_count >= self.cur_update_index then
|
|
|
|
-- 下载中检测到流量网络状态,并且非手动在流量状态开始的,则自动暂停
|
|
if not Util.IsWifi and not self.no_wifi_download then
|
|
self.pause_state = true
|
|
self.auto_pause = true
|
|
return
|
|
end
|
|
|
|
if not Util.NetAvailable then
|
|
return
|
|
end
|
|
|
|
|
|
local pass_time = os.time() - self.last_download_start_time
|
|
if pass_time < self.earch_download_wait_time and not self.max_download_speed then
|
|
return
|
|
end
|
|
|
|
local res = nil
|
|
if self.cur_update_index <= self.update_res_count then
|
|
res = self.hight_res_list[self.cur_update_index-1]
|
|
else
|
|
res = self.need_retry_res_list[self.cur_update_index - self.update_res_count]
|
|
end
|
|
|
|
self.cur_update_index = self.cur_update_index + 1
|
|
|
|
local exist = resMgr:ExistDownloadHistory(res)
|
|
if exist then
|
|
self.all_download_count = self.all_download_count + 1
|
|
self:CheckDownloadFinish()
|
|
--print("--------normal exist------------------",res)
|
|
return
|
|
end
|
|
|
|
self.last_download_start_time = os.time()
|
|
|
|
--local update = Util.FileNeedUpdate(res)
|
|
self.download_now = true
|
|
|
|
print("--------normal download------------------",res)
|
|
self:DownloadFile(res)
|
|
|
|
local check_last_res
|
|
check_last_res = function()
|
|
if not self.pause_state and self.download_now and Util.NetAvailable then
|
|
if res == self.cur_download_file then
|
|
self.download_now = false
|
|
self.all_download_count = self.all_download_count + 1
|
|
end
|
|
else
|
|
setTimeout(check_last_res,10)
|
|
end
|
|
end
|
|
setTimeout(check_last_res,10)
|
|
end
|
|
end
|
|
|
|
function StepPackModule:DownloadError()
|
|
table.insert(self.need_retry_res_list,self.cur_download_file)
|
|
self.need_retry_count = self.need_retry_count + 1
|
|
end
|
|
|
|
|
|
function StepPackModule:DoNewPlayerOperate( )
|
|
-- if not self.newplayer_map_res_finish then
|
|
-- CookieWrapper.Instance:SaveCookie(CookieLevelType.Common, CookieTimeType.TYPE_ALWAYS, CookieKey.NEWPLAYER_MAP_RES_DOWNLOAD_DATA,"0," .. self.last_newplayer_map .. "," .. self.last_newplayer_index)
|
|
-- self.last_newplayer_index = self.last_newplayer_index + 1
|
|
-- end
|
|
end
|
|
|
|
function download_func(state,download_size)
|
|
|
|
-- StepPackModule.Instance:DoNewPlayerOperate()
|
|
StepPackModule.Instance.download_now = false
|
|
StepPackModule.Instance:AddDownloadSize(download_size)
|
|
|
|
if state == false and download_size == 0 then
|
|
--local cur_file = StepPackModule.Instance.cur_download_file
|
|
--local res = Util.GetAssetsBundlePathFromBase64(cur_file)
|
|
--Debugger.LogWarning("download error:" .. res)
|
|
else
|
|
--print("---------------download size-------------",download_size)
|
|
end
|
|
end
|
|
|
|
function StepPackModule:DownloadFile( res )
|
|
local remote_path = AppConst_CdnUrl .. res
|
|
if AppConst_EnglineVer >= 50 then
|
|
remote_path = AppConst_CdnUrl .. string.sub(res,2,-1)
|
|
end
|
|
|
|
-- local ingore_str = "/client/unitybundle/"
|
|
-- if SystemRuntimePlatform.IsIphone() then
|
|
-- ingore_str = "/client/iosbundle/"
|
|
-- elseif SystemRuntimePlatform.IsAndroid() then
|
|
-- ingore_str = "/client/androidbundle/"
|
|
-- end
|
|
-- local download_path = Util_DataPath .. string.gsub(res,ingore_str,"")
|
|
|
|
local ignore_list = {"/client/unitybundle/", "/client/iosbundle/", "/client/androidbundle/"}
|
|
local path = res
|
|
for k,v in pairs(ignore_list) do
|
|
path = string.gsub(path, v, "")
|
|
end
|
|
local download_path = Util_DataPath .. path
|
|
|
|
self.cur_download_file = res
|
|
|
|
if AppConst_OpenDownloadLog then
|
|
Debugger.Log("download request:" .. remote_path)
|
|
end
|
|
|
|
Util.DownloadFile(remote_path, download_path, 19000)
|
|
end
|
|
|
|
|
|
-- 以下是对外接口
|
|
-- 开始下载,调用前先设置回调函数
|
|
function StepPackModule:Start()
|
|
if self:CheckFinish() then
|
|
if self.callback_func then
|
|
self.callback_func(0,0,0,true)
|
|
end
|
|
return
|
|
end
|
|
|
|
-- 记录在流量状态下手动开始标识
|
|
if not Util.IsWifi then
|
|
self.no_wifi_download = true
|
|
end
|
|
|
|
if self.work_state or self.download_finish_state then
|
|
return
|
|
end
|
|
self.work_state = true
|
|
Runner.Instance:AddRunObj(self, 10)
|
|
|
|
Util.SetDownloadFileFunc(download_func)
|
|
|
|
local func = function(update_size,update_count,update_list)
|
|
self.res_checking_state = false
|
|
self.update_res_count = update_count
|
|
self.update_res_size = update_size
|
|
|
|
--Debugger.Log("---update_res---" .. self.update_res_count .. "/" .. self.update_res_size)
|
|
|
|
if self.update_res_count == 0 then
|
|
self.download_finish_state = true
|
|
self.work_state = false
|
|
|
|
if self.callback_func then
|
|
self.callback_func(0,0,0,true)
|
|
end
|
|
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Common,CookieTimeType.TYPE_ALWAYS,CookieKey.SILENT_ASSETS_FINISH,"finish")
|
|
CookieWrapper.Instance:WriteAll()
|
|
|
|
return
|
|
end
|
|
|
|
self.hight_res_list = update_list
|
|
end
|
|
|
|
self.res_checking_state = true
|
|
|
|
local frame_check_count = 15
|
|
if SystemMemoryLevel.Cur == SystemMemoryLevel.Low then
|
|
frame_check_count = 5
|
|
elseif SystemMemoryLevel.Cur == SystemMemoryLevel.Middle then
|
|
frame_check_count = 10
|
|
end
|
|
|
|
Util.CheckUpdateFileList("unitybundle",func,frame_check_count)
|
|
|
|
local update_func = function()
|
|
if self.all_download_size > 0 and not self.pause_state then
|
|
local add = self.all_download_size - self.last_show_speed_size
|
|
self.last_download_speed = add / self.earch_download_wait_time
|
|
if self.callback_func then
|
|
self.callback_func(self.all_download_size,self.update_res_size,self.last_download_speed,self.download_finish_state)
|
|
end
|
|
self.last_show_speed_size = self.all_download_size
|
|
end
|
|
end
|
|
self.update_speed_timer = TimerQuest.AddPeriodQuest(GlobalTimerQuest, update_func, self.earch_download_wait_time, -1)
|
|
|
|
if tonumber(AppConst.EnglineVer) > 83 then
|
|
local write_func = function()
|
|
Util.AutoWriteVersionFile(20)
|
|
end
|
|
self.delay_write_version_timer = TimerQuest.AddPeriodQuest(GlobalTimerQuest, write_func, 20, -1)
|
|
end
|
|
end
|
|
|
|
-- 设置暂停状态
|
|
function StepPackModule:SetPauseState( state )
|
|
self.pause_state = state
|
|
self.download_now = false
|
|
|
|
-- 记录在流量状态下手动开始标识
|
|
if not self.pause_state and not Util.IsWifi then
|
|
self.no_wifi_download = true
|
|
end
|
|
end
|
|
|
|
-- 设置下载回调函数
|
|
-- func(已下载量,总更新量,当前更新速度,是否已更新完成)
|
|
function StepPackModule:SetCallbackFunc( func )
|
|
self.callback_func = func
|
|
if self.callback_func and self.all_download_size > 0 then
|
|
self.callback_func(self.all_download_size,self.update_res_size,self.last_download_speed,self.download_finish_state)
|
|
end
|
|
end
|
|
|
|
function StepPackModule:IsResCheckState()
|
|
return self.res_checking_state
|
|
end
|
|
|
|
-- 状态: 0 未开始 1 暂停 2 下载中 3 已下载完成
|
|
function StepPackModule:CurrentPackState()
|
|
if self:CheckFinish() then
|
|
return 3
|
|
end
|
|
|
|
if self.pause_state then
|
|
return 1
|
|
end
|
|
|
|
if self.work_state then
|
|
return 2
|
|
end
|
|
|
|
if self.download_finish_state then
|
|
return 3
|
|
end
|
|
|
|
return 0
|
|
end
|
|
|
|
-- 是否支持静默下载
|
|
function StepPackModule:IsSupport()
|
|
if AppConst_EnglineVer > 44 and AppConst.UpdateMode and SystemMemoryLevel.Cur ~= SystemMemoryLevel.Low then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function StepPackModule:CheckFinish()
|
|
local flag = CookieWrapper.Instance:GetCookie(CookieLevelType.Common, CookieKey.SILENT_ASSETS_FINISH)
|
|
local assets_update = false
|
|
if AppConst_EnglineVer > 41 then
|
|
assets_update = AppConst.SilentAssetsUpdate
|
|
end
|
|
|
|
if flag == "finish" and not assets_update then
|
|
self.download_finish_state = true
|
|
self.work_state = false
|
|
end
|
|
|
|
return self.download_finish_state
|
|
end
|
|
|
|
|
|
function StepPackModule:CheckAutoUpdate()
|
|
local real_start = function()
|
|
self:Start()
|
|
GlobalEventSystem:Fire(EventName.AFTER_AUTO_UPDATE_RES)
|
|
|
|
CookieWrapper.Instance:SaveCookie(CookieLevelType.Common,CookieTimeType.TYPE_ALWAYS,CookieKey.SILENT_ASSETS_FINISH,"no")
|
|
CookieWrapper.Instance:WriteAll()
|
|
end
|
|
|
|
if self:IsSupport() and Util.IsWifi and ClientConfig.auto_slient_update and (RoleManager and RoleManager.Instance.mainRoleInfo.level > 120) then
|
|
if not self:CheckFinish() then
|
|
real_start()
|
|
end
|
|
else
|
|
-- --进入游戏时非wifi,一分钟定时检测如果切换到wifi则自动开启
|
|
-- if self:IsSupport() and not Util.IsWifi and not self:CheckFinish() and ClientConfig.auto_slient_update then
|
|
|
|
-- local cancel_check = function()
|
|
-- if self.check_wifi_open then
|
|
-- TimerQuest.CancelQuest(GlobalTimerQuest, self.check_wifi_open)
|
|
-- self.check_wifi_open = nil
|
|
-- end
|
|
-- end
|
|
|
|
-- cancel_check()
|
|
|
|
-- local check_func = function()
|
|
-- if self.work_state or self:CheckFinish() then
|
|
-- cancel_check()
|
|
-- return
|
|
-- end
|
|
|
|
-- if Util.IsWifi then
|
|
-- cancel_check()
|
|
-- real_start()
|
|
-- end
|
|
-- end
|
|
-- self.check_wifi_open = TimerQuest.AddPeriodQuest(GlobalTimerQuest, check_func, 60, -1)
|
|
-- end
|
|
end
|
|
end
|