[del] HUD
This commit is contained in:
		
							
								
								
									
										13
									
								
								assets/Script/Engine/CatanEngine/TableV3.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/Script/Engine/CatanEngine/TableV3.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "ver": "1.1.3", | ||||||
|  |   "uuid": "c12c11f7-2e17-4727-a114-d4b19dfbe650", | ||||||
|  |   "importer": "folder", | ||||||
|  |   "isBundle": false, | ||||||
|  |   "bundleName": "", | ||||||
|  |   "priority": 1, | ||||||
|  |   "compressionType": {}, | ||||||
|  |   "optimizeHotUpdate": {}, | ||||||
|  |   "inlineSpriteFrames": {}, | ||||||
|  |   "isRemoteBundle": {}, | ||||||
|  |   "subMetas": {} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								assets/Script/Engine/Component.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/Script/Engine/Component.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "ver": "1.1.3", | ||||||
|  |   "uuid": "63dab366-ead1-4057-a9c2-a2548219328e", | ||||||
|  |   "importer": "folder", | ||||||
|  |   "isBundle": false, | ||||||
|  |   "bundleName": "", | ||||||
|  |   "priority": 1, | ||||||
|  |   "compressionType": {}, | ||||||
|  |   "optimizeHotUpdate": {}, | ||||||
|  |   "inlineSpriteFrames": {}, | ||||||
|  |   "isRemoteBundle": {}, | ||||||
|  |   "subMetas": {} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								assets/Script/Engine/Data.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/Script/Engine/Data.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "ver": "1.1.3", | ||||||
|  |   "uuid": "edf98a7e-294c-4e7a-8a53-c0b10ea75a45", | ||||||
|  |   "importer": "folder", | ||||||
|  |   "isBundle": false, | ||||||
|  |   "bundleName": "", | ||||||
|  |   "priority": 1, | ||||||
|  |   "compressionType": {}, | ||||||
|  |   "optimizeHotUpdate": {}, | ||||||
|  |   "inlineSpriteFrames": {}, | ||||||
|  |   "isRemoteBundle": {}, | ||||||
|  |   "subMetas": {} | ||||||
|  | } | ||||||
| @@ -1,456 +0,0 @@ | |||||||
| import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting"; |  | ||||||
| import LocalStorageData from "../Data/LocalStorageData"; |  | ||||||
| import Enum_Loading from "../HUDV2/Enum_Loading"; |  | ||||||
| import HUDM from "./HUDM"; |  | ||||||
|  |  | ||||||
| export default class AssetBundleMamager { |  | ||||||
|     //#region static 屬性 |  | ||||||
|  |  | ||||||
|     private static _instance: AssetBundleMamager = null; |  | ||||||
|     public static get Instance(): AssetBundleMamager { return AssetBundleMamager._instance; } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region public 屬性 |  | ||||||
|  |  | ||||||
|     public HUGroup: Map<string, HUDM> = new Map<string, HUDM>(); |  | ||||||
|  |  | ||||||
|     /** 本地VerList */ |  | ||||||
|     public LocalVerList: Enum_Loading.VerListObj = null; |  | ||||||
|  |  | ||||||
|     /** 遠端VerList */ |  | ||||||
|     public RemoteVerList: Enum_Loading.VerListObj = null; |  | ||||||
|  |  | ||||||
|     public DownloadList_Preview: Object = {}; |  | ||||||
|  |  | ||||||
|     /** IsChangeBundleUrl */ |  | ||||||
|     public IsChangeBundleUrl: boolean = false; |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region Lifecycle |  | ||||||
|  |  | ||||||
|     constructor() { |  | ||||||
|         AssetBundleMamager._instance = this; |  | ||||||
|         CC_PREVIEW && this._initdownloadList_Preview(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region Custom Function |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 取得Bundle |  | ||||||
|      * @param {string} BundleName Bundle名稱 |  | ||||||
|      * @param {string} Version 版號 |  | ||||||
|      * @return {cc.AssetManager.Bundle} Bundle |  | ||||||
|      */ |  | ||||||
|     public *GetBundle(BundleName: string, Version: string = ""): IterableIterator<cc.AssetManager.Bundle> { |  | ||||||
|         let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(BundleName); |  | ||||||
|         if (bundle) { |  | ||||||
|             return bundle; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // options是可选参数,引擎会根据保留字段 进行对应的操作,这里添加了version和onFileProgress,可用来记录热更资源版本和下载进度 |  | ||||||
|         let options: any = null; |  | ||||||
|  |  | ||||||
|         let BundleUrl: string = BundleName; |  | ||||||
|         if (cc.sys.isNative && !this.LocalVerList[BundleName].UseLocal) { |  | ||||||
|             BundleUrl = `${(jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "/")}Bundle/${BundleName}/remote/${BundleName}`; |  | ||||||
|             options = { |  | ||||||
|                 version: Version |  | ||||||
|             }; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         cc.assetManager.loadBundle(BundleUrl, options, (err: Error, resp: cc.AssetManager.Bundle) => { |  | ||||||
|             if (err) { |  | ||||||
|                 cc.error(err); |  | ||||||
|                 bundle = null; |  | ||||||
|             } |  | ||||||
|             bundle = resp; |  | ||||||
|         }); |  | ||||||
|         while (typeof bundle === "undefined") { |  | ||||||
|             yield null; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return bundle; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 更新Bundle |  | ||||||
|      * @param {HUDM} HUDName HUD |  | ||||||
|      */ |  | ||||||
|     public *UpdateBundle(HUDName: HUDM | string, onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> { |  | ||||||
|         let HUD: HUDM; |  | ||||||
|         if (HUDName instanceof HUDM) { |  | ||||||
|             HUD = HUDName; |  | ||||||
|         } else { |  | ||||||
|             HUD = this.GetHUD(HUDName); |  | ||||||
|         } |  | ||||||
|         let UpdateingData: Enum_Loading.UpdateingDataObj = yield* HUD.HUD(onFileProgress); |  | ||||||
|         if (UpdateingData.IsUpdatecomplete) { |  | ||||||
|             this.LocalVerList[HUD.BundleName] = this.RemoteVerList[HUD.BundleName]; |  | ||||||
|             this.LocalVerList[HUD.BundleName]["UseLocal"] = false; |  | ||||||
|             LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
|         } |  | ||||||
|         return UpdateingData; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 更新Bundle |  | ||||||
|      * @param {HUDM} HUDName HUD |  | ||||||
|      */ |  | ||||||
|     public *RetryUpdateBundle(HUDName: HUDM | string, onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> { |  | ||||||
|         let HUD: HUDM; |  | ||||||
|         if (HUDName instanceof HUDM) { |  | ||||||
|             HUD = HUDName; |  | ||||||
|         } else { |  | ||||||
|             HUD = this.GetHUD(HUDName); |  | ||||||
|         } |  | ||||||
|         let UpdateingData: Enum_Loading.UpdateingDataObj = yield* HUD.RetryDownLoadFailedAssets(); |  | ||||||
|         return UpdateingData; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 從Bundle取得資源 |  | ||||||
|      * @param {cc.AssetManager.Bundle | string} BundleName Bundle名稱 |  | ||||||
|      * @param {string} SourceName 資源名稱 |  | ||||||
|      * @param {string} type 資源型別 |  | ||||||
|      * @return {any} Source |  | ||||||
|      */ |  | ||||||
|     public *GetBundleSource(BundleName: cc.AssetManager.Bundle | string, SourceName: string, type?: string | Bundle_Source_Type, onFileProgress?: (finish: number, total: number, item: cc.AssetManager.RequestItem) => void): IterableIterator<any> { |  | ||||||
|         let bundle: cc.AssetManager.Bundle; |  | ||||||
|         let source: any; |  | ||||||
|         if (BundleName instanceof cc.AssetManager.Bundle) { |  | ||||||
|             bundle = BundleName; |  | ||||||
|         } else { |  | ||||||
|             bundle = cc.assetManager.getBundle(BundleName); |  | ||||||
|             if (!bundle) { |  | ||||||
|                 cc.error(`GetBundleSource Error BundleName: ${BundleName}`); |  | ||||||
|                 return null; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         switch (type) { |  | ||||||
|             case Bundle_Source_Type.Scene: { |  | ||||||
|                 bundle.loadScene(SourceName, onFileProgress, function (err: Error, scene: cc.SceneAsset): void { |  | ||||||
|                     if (err) { |  | ||||||
|                         cc.error(err); |  | ||||||
|                         return null; |  | ||||||
|                     } |  | ||||||
|                     // cc.director.runScene(scene); |  | ||||||
|                     source = scene; |  | ||||||
|                 }); |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             case Bundle_Source_Type.Json: { |  | ||||||
|                 bundle.load(SourceName, onFileProgress, function (err: Error, json: cc.JsonAsset): void { |  | ||||||
|                     if (err) { |  | ||||||
|                         cc.error(err); |  | ||||||
|                         return null; |  | ||||||
|                     } |  | ||||||
|                     // source = JSON.parse(json["_nativeAsset"]); |  | ||||||
|                     source = json; |  | ||||||
|                 }); |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             case Bundle_Source_Type.Prefab: { |  | ||||||
|                 bundle.load(SourceName, cc.Prefab, onFileProgress, function (err: Error, prefab: cc.Asset): void { |  | ||||||
|                     if (err) { |  | ||||||
|                         cc.error(err); |  | ||||||
|                         return null; |  | ||||||
|                     } |  | ||||||
|                     // source = JSON.parse(json["_nativeAsset"]); |  | ||||||
|                     source = prefab; |  | ||||||
|                 }); |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             default: |  | ||||||
|                 bundle.load(SourceName, function (err: Error, any: any): void { |  | ||||||
|                     if (err) { |  | ||||||
|                         cc.error(err); |  | ||||||
|                         return null; |  | ||||||
|                     } |  | ||||||
|                     source = any; |  | ||||||
|                 }); |  | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         while (typeof source === "undefined") { |  | ||||||
|             yield null; |  | ||||||
|         } |  | ||||||
|         return source; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 釋放Bundle |  | ||||||
|      * @param {string} slotID slotID |  | ||||||
|      */ |  | ||||||
|     public *BundleRelease(slotID: number): IterableIterator<any> { |  | ||||||
|         let gameName: string = `Game_${slotID}`; |  | ||||||
|         let sceneName: string = `Slot${slotID}`; |  | ||||||
|         let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(gameName); |  | ||||||
|         if (!bundle) { |  | ||||||
|             cc.log(`BundleRelease Error BundleName: ${gameName}`); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // let bundles: cc.AssetManager.Cache<cc.AssetManager.Bundle> = cc.assetManager.bundles; |  | ||||||
|         // let cacheDir: string = cc.assetManager.cacheManager.cacheDir; |  | ||||||
|         // let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles; |  | ||||||
|  |  | ||||||
|         yield* this.DelBundleCache(bundle); |  | ||||||
|         yield* this.DelOthersCache(slotID); |  | ||||||
|         bundle.release(sceneName, cc.SceneAsset); |  | ||||||
|         cc.assetManager.removeBundle(bundle); |  | ||||||
|         cc.sys.garbageCollect(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 從Bundle刪除暫存資源 |  | ||||||
|      * @param {string} BundleName Bundle名稱 |  | ||||||
|      */ |  | ||||||
|     public *DelBundleCache(BundleName: cc.AssetManager.Bundle | string): IterableIterator<any> { |  | ||||||
|         if (!CC_JSB) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         let bundle: cc.AssetManager.Bundle; |  | ||||||
|         let source: any; |  | ||||||
|         if (BundleName instanceof cc.AssetManager.Bundle) { |  | ||||||
|             bundle = BundleName; |  | ||||||
|         } else { |  | ||||||
|             bundle = cc.assetManager.getBundle(BundleName); |  | ||||||
|             if (!bundle) { |  | ||||||
|                 // cc.error(`GetBundleSource Error BundleName: ${BundleName}`); |  | ||||||
|                 // return; |  | ||||||
|                 bundle = yield* AssetBundleMamager.Instance.GetBundle(BundleName, this.RemoteVerList[BundleName].Version); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         let _map: Object = bundle["_config"].assetInfos._map; |  | ||||||
|         for (let map of Object.keys(_map)) { |  | ||||||
|             let path: string = _map[map].path; |  | ||||||
|             if (!path) { |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|             source = yield* AssetBundleMamager.Instance.GetBundleSource(bundle, path); |  | ||||||
|             cc.assetManager.cacheManager.removeCache(source.nativeUrl); |  | ||||||
|             bundle.release(path); |  | ||||||
|             // return; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 從cachedFiles刪除暫存資源 |  | ||||||
|      * @param {number} slotID slotID |  | ||||||
|      */ |  | ||||||
|     public *DelOthersCache(slotID: number): IterableIterator<any> { |  | ||||||
|         if (!CC_JSB) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles["_map"]; |  | ||||||
|         let delcache_group: string[] = [`shared/jsons`, `Slot/Slot${slotID}`, "sounds/Slot/Default", `${BusinessTypeSetting.FolderUrlBundle}project.manifest`, "submit.txt"]; |  | ||||||
|         for (let cached of Object.keys(cachedFiles)) { |  | ||||||
|             for (var i: number = 0; i < delcache_group.length; ++i) { |  | ||||||
|                 let delcache: string = delcache_group[i]; |  | ||||||
|                 if (cached.includes(delcache)) { |  | ||||||
|                     cc.assetManager.cacheManager.removeCache(cached); |  | ||||||
|                     // console.log(`removeCache: ${cached}`); |  | ||||||
|                     break; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public GetHUD(BundleName: HUDM | string): HUDM { |  | ||||||
|         let HUD: HUDM; |  | ||||||
|         if (BundleName instanceof HUDM) { |  | ||||||
|             HUD = BundleName; |  | ||||||
|         } else { |  | ||||||
|             if (!this.HUGroup.has(BundleName)) { |  | ||||||
|                 HUD = new HUDM(BundleName); |  | ||||||
|                 this.HUGroup.set(BundleName, HUD); |  | ||||||
|             } else { |  | ||||||
|                 HUD = this.HUGroup.get(BundleName); |  | ||||||
|             } |  | ||||||
|             HUD = this.HUGroup.get(BundleName); |  | ||||||
|         } |  | ||||||
|         return HUD; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** 刪除全部暫存資源 */ |  | ||||||
|     public ClearAllCache(): void { |  | ||||||
|         cc.assetManager.cacheManager.clearCache(); |  | ||||||
|         cc.game.restart(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     public *CheckBundleNeedHUD(BundleName: HUDM | string): IterableIterator<Enum_Loading.NeedUpdateDataObj> { |  | ||||||
|         let HUD: HUDM; |  | ||||||
|         if (BundleName instanceof HUDM) { |  | ||||||
|             HUD = BundleName; |  | ||||||
|         } else { |  | ||||||
|             HUD = this.GetHUD(BundleName); |  | ||||||
|         } |  | ||||||
|         if (!this.LocalVerList[HUD.BundleName]) { |  | ||||||
|             this.LocalVerList[HUD.BundleName] = new Enum_Loading.BundleDataObj(); |  | ||||||
|             let apkVersion: string = this.RemoteVerList[HUD.BundleName].ApkVersion; |  | ||||||
|             if (apkVersion && apkVersion !== "0") { |  | ||||||
|                 this.LocalVerList[HUD.BundleName].UseLocal = true; |  | ||||||
|                 this.LocalVerList[HUD.BundleName].Version = apkVersion; |  | ||||||
|             } |  | ||||||
|             LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
|         } else { |  | ||||||
|             if (this.RemoteVerList[HUD.BundleName].Version === this.RemoteVerList[HUD.BundleName].ApkVersion) { |  | ||||||
|                 this.LocalVerList[HUD.BundleName] = this.RemoteVerList[HUD.BundleName]; |  | ||||||
|                 this.LocalVerList[HUD.BundleName].UseLocal = true; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         let UpdateData: Enum_Loading.NeedUpdateDataObj = new Enum_Loading.NeedUpdateDataObj(); |  | ||||||
|         if (this.LocalVerList[HUD.BundleName].UseLocal) { |  | ||||||
|             UpdateData.IsNeedUpdate = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[HUD.BundleName].Version, this.RemoteVerList[HUD.BundleName].Version) < 0 ? true : false; |  | ||||||
|             if (UpdateData.IsNeedUpdate) { |  | ||||||
|                 UpdateData = yield* HUD.CheckUpdate(); |  | ||||||
|             } |  | ||||||
|         } else { |  | ||||||
|             UpdateData = yield* HUD.CheckUpdate(); |  | ||||||
|         } |  | ||||||
|         return UpdateData; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // public *CheckBundleNeedHUD(BundleName: string): IterableIterator<boolean> { |  | ||||||
|     //     if (!this.LocalVerList[BundleName]) { |  | ||||||
|     //         this.LocalVerList[BundleName] = new Enum_Loading.BundleDataObj(); |  | ||||||
|     //         let apkVersion: string = this.RemoteVerList[BundleName].ApkVersion; |  | ||||||
|     //         if (apkVersion && apkVersion !== "0") { |  | ||||||
|     //             this.LocalVerList[BundleName].UseLocal = true; |  | ||||||
|     //             this.LocalVerList[BundleName].Version = apkVersion; |  | ||||||
|     //         } |  | ||||||
|     //         LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
|     //     } |  | ||||||
|     //     let IsUpdate: boolean = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[BundleName].Version, this.RemoteVerList[BundleName].Version) < 0 ? true : false; |  | ||||||
|     //     return IsUpdate; |  | ||||||
|     // } |  | ||||||
|  |  | ||||||
|     public CheckGameNeedUpdate(GameID: number): boolean { |  | ||||||
|         let IsUpdate: boolean = false; |  | ||||||
|         let bundleName: string = `Game_${GameID}`; |  | ||||||
|         if (!this.RemoteVerList[bundleName]) { |  | ||||||
|             this.RemoteVerList[bundleName] = new Enum_Loading.BundleDataObj(); |  | ||||||
|             this.RemoteVerList[bundleName].HasBundle = false; |  | ||||||
|             LocalStorageData.Instance.RemoteVerList = JSON.stringify(this.RemoteVerList); |  | ||||||
|             IsUpdate = true; |  | ||||||
|         } |  | ||||||
|         if (!this.LocalVerList[bundleName]) { |  | ||||||
|             this.LocalVerList[bundleName] = new Enum_Loading.BundleDataObj(); |  | ||||||
|             let apkVersion: string = this.RemoteVerList[bundleName].ApkVersion; |  | ||||||
|             if (apkVersion && apkVersion !== "0") { |  | ||||||
|                 this.LocalVerList[bundleName].UseLocal = true; |  | ||||||
|                 this.LocalVerList[bundleName].Version = apkVersion; |  | ||||||
|             } |  | ||||||
|             LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
|         } |  | ||||||
|         if (CC_PREVIEW) { |  | ||||||
|             return this._getIsDownload_Preview(GameID); |  | ||||||
|         } |  | ||||||
|         if (IsUpdate) { |  | ||||||
|             return IsUpdate; |  | ||||||
|         } |  | ||||||
|         IsUpdate = AssetBundleMamager.Instance.versionCompareHandle(this.LocalVerList[bundleName].Version, this.RemoteVerList[bundleName].Version) < 0 ? true : false; |  | ||||||
|         return IsUpdate; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 比對版號(熱更能從1.0.0更新到2.0.0,從2.0.0回退到1.0.0) |  | ||||||
|      * 官方提供的版本比較函數,只有服務端版本>客戶端版本時,才會進行更新。所以不能從2.0.0回退到1.0.0版本。 |  | ||||||
|      * @param {string} versionA 本地版號 |  | ||||||
|      * @param {string} versionB 遠程版號 |  | ||||||
|      * @return {number} num = -1 須更新 |  | ||||||
|      * @return {number} num = 0 不須更新 |  | ||||||
|      */ |  | ||||||
|     public versionCompareHandle(versionA: string, versionB: string): number { |  | ||||||
|         // console.log("Ver A " + versionA + "VerB " + versionB); |  | ||||||
|         var vA: string[] = versionA.split("."); |  | ||||||
|         var vB: string[] = versionB.split("."); |  | ||||||
|  |  | ||||||
|         // 長度不相等,則進行更新 |  | ||||||
|         if (vA.length !== vB.length) { |  | ||||||
|             return -1; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         for (var i: number = 0; i < vA.length; ++i) { |  | ||||||
|             var a: number = +vA[i]; |  | ||||||
|             var b: number = +vB[i] || 0; |  | ||||||
|             if (a === b) { |  | ||||||
|                 // 數字相同,則跳過 |  | ||||||
|                 continue; |  | ||||||
|             } else { |  | ||||||
|                 // 數字不同,則進行更新 |  | ||||||
|                 return -1; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 長度相等且數字相等,則不更新 |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region DownloadList_Preview |  | ||||||
|  |  | ||||||
|     private _initdownloadList_Preview(): void { |  | ||||||
|         this.DownloadList_Preview = JSON.parse(LocalStorageData.Instance.DownloadList_Preview); |  | ||||||
|         this.DownloadList_Preview = this.DownloadList_Preview ? this.DownloadList_Preview : {}; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private _getIsDownload_Preview(slotID: number): boolean { |  | ||||||
|         if (!this.DownloadList_Preview[slotID]) { |  | ||||||
|             this.SetIsDownload_Preview(slotID, false); |  | ||||||
|         } |  | ||||||
|         return !this.DownloadList_Preview[slotID]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public SetIsDownload_Preview(slotID: number, isDownload: boolean = true): void { |  | ||||||
|         this.DownloadList_Preview[slotID] = isDownload; |  | ||||||
|         LocalStorageData.Instance.DownloadList_Preview = JSON.stringify(this.DownloadList_Preview); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //#region enum |  | ||||||
|  |  | ||||||
| /** Bundle資源類型 */ |  | ||||||
| export enum Bundle_Source_Type { |  | ||||||
|     /** Json */ |  | ||||||
|     Json = "json", |  | ||||||
|  |  | ||||||
|     /** Scene */ |  | ||||||
|     Scene = "scene", |  | ||||||
|  |  | ||||||
|     /** Prefab */ |  | ||||||
|     Prefab = "prefab" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //#endregion |  | ||||||
|  |  | ||||||
| //#region 廢棄 Function |  | ||||||
|  |  | ||||||
| // /** |  | ||||||
| //  * 從Bundle刪除暫存資源 |  | ||||||
| //  * @param {string} BundleName Bundle名稱 |  | ||||||
| //  */ |  | ||||||
| // public *DelBundleCache(BundleName: cc.AssetManager.Bundle | string): IterableIterator<any> { |  | ||||||
| //     if (!CC_JSB) { |  | ||||||
| //         return; |  | ||||||
| //     } |  | ||||||
| //     let WritablePath: string = `${jsb.fileUtils.getWritablePath()}gamecaches/${BundleName}`; |  | ||||||
| //     if (jsb.fileUtils.isDirectoryExist(WritablePath)) { |  | ||||||
| //         jsb.fileUtils.removeDirectory(WritablePath); |  | ||||||
| //     } |  | ||||||
| // } |  | ||||||
|  |  | ||||||
| //#endregion |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "ver": "1.1.0", |  | ||||||
|   "uuid": "97a0b2c9-72f8-4797-874a-263e4558f765", |  | ||||||
|   "importer": "typescript", |  | ||||||
|   "isPlugin": false, |  | ||||||
|   "loadPluginInWeb": true, |  | ||||||
|   "loadPluginInNative": true, |  | ||||||
|   "loadPluginInEditor": false, |  | ||||||
|   "subMetas": {} |  | ||||||
| } |  | ||||||
| @@ -1,425 +0,0 @@ | |||||||
| import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting"; |  | ||||||
| import Enum_Loading from "../HUDV2/Enum_Loading"; |  | ||||||
| import AssetBundleMamager from "./AssetBundleMamager"; |  | ||||||
|  |  | ||||||
| const { ccclass, property } = cc._decorator; |  | ||||||
|  |  | ||||||
| /** HUDManager  */ |  | ||||||
| @ccclass |  | ||||||
| export default class HUDM extends cc.Component { |  | ||||||
|  |  | ||||||
|     //#region static 屬性 |  | ||||||
|  |  | ||||||
|     private static _instance: HUDM = null; |  | ||||||
|     public static get Instance(): HUDM { return HUDM._instance; } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region static 屬性 |  | ||||||
|  |  | ||||||
|     public BundleName: string = ""; |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region private 屬性 |  | ||||||
|  |  | ||||||
|     private _am: jsb.AssetsManager; |  | ||||||
|     private _onFileProgress: (finish: number, total: number, item: string) => void; |  | ||||||
|     private _updateListener: any; |  | ||||||
|     private _checkListener: any; |  | ||||||
|     private _versionCompareHandle: any = null; |  | ||||||
|     private _needUpdateData: Enum_Loading.NeedUpdateDataObj = null; |  | ||||||
|     private _updateingData: Enum_Loading.UpdateingDataObj = null; |  | ||||||
|     private _updating: boolean = false; |  | ||||||
|     private _canRetry: boolean = false; |  | ||||||
|     private _isChangeUrl: boolean = false; |  | ||||||
|     private _path: string = "Bundle"; |  | ||||||
|     private _customManifest: string = ""; |  | ||||||
|     private _storagePath: string = ""; |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region Lifecycle |  | ||||||
|  |  | ||||||
|     constructor(...params: any[]) { |  | ||||||
|         super(); |  | ||||||
|  |  | ||||||
|         if (!cc.sys.isNative) { |  | ||||||
|             return; |  | ||||||
|         } else if (params.length === 0) { |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         HUDM._instance = this; |  | ||||||
|  |  | ||||||
|         this.BundleName = params[0]; |  | ||||||
|         // let packageUrl: string = params[1]; |  | ||||||
|         // let BundleData: Enum_Loading.BundleDataObj = AssetBundleMamager.Instance.RemoteVerList[this.BundleName]; |  | ||||||
|         // let packageUrl: string = BundleData.BundleUrl; |  | ||||||
|         let packageUrl: string = `${BusinessTypeSetting.UsePatch}${BusinessTypeSetting.FolderUrlBundle}${this.BundleName}`; |  | ||||||
|  |  | ||||||
|         this._customManifest = JSON.stringify({ |  | ||||||
|             "packageUrl": packageUrl, |  | ||||||
|             "remoteManifestUrl": `${packageUrl}/project.manifest`, |  | ||||||
|             "remoteVersionUrl": `${packageUrl}/version.json`, |  | ||||||
|             "version": "0.0.0", |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         this._storagePath = `${(jsb.fileUtils ? jsb.fileUtils.getWritablePath() : "./")}${this._path}/${this.BundleName}`; |  | ||||||
|  |  | ||||||
|         // 本地熱更目錄下已存在project.manifest,則直接修改已存在的project.manifest |  | ||||||
|         if (AssetBundleMamager.Instance.IsChangeBundleUrl) { |  | ||||||
|             if (jsb.fileUtils.isFileExist(this._storagePath + "/project.manifest")) { |  | ||||||
|                 this._isChangeUrl = true; |  | ||||||
|                 this._modifyAppLoadUrlForManifestFile(this._storagePath, packageUrl); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this._versionCompareHandle = function (versionA: string, versionB: string): number { |  | ||||||
|             // console.log("Ver A " + versionA + "VerB " + versionB); |  | ||||||
|             var vA: string[] = versionA.split("."); |  | ||||||
|             var vB: string[] = versionB.split("."); |  | ||||||
|  |  | ||||||
|             // 長度不相等,則進行更新 |  | ||||||
|             if (vA.length !== vB.length) { |  | ||||||
|                 return -1; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             for (var i: number = 0; i < vA.length; ++i) { |  | ||||||
|                 var a: number = +vA[i]; |  | ||||||
|                 var b: number = +vB[i] || 0; |  | ||||||
|                 if (a === b) { |  | ||||||
|                     // 數字相同,則跳過 |  | ||||||
|                     continue; |  | ||||||
|                 } else { |  | ||||||
|                     // 數字不同,則進行更新 |  | ||||||
|                     return -1; |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             // 長度相等且數字相等,則不更新 |  | ||||||
|             return 0; |  | ||||||
|         }; |  | ||||||
|         this._initAssetManaget(); |  | ||||||
|     } |  | ||||||
|     private _initAssetManaget(): void { |  | ||||||
|         // |  | ||||||
|         this._am = new jsb.AssetsManager("", this._storagePath, this._versionCompareHandle); |  | ||||||
|  |  | ||||||
|         // Setup the verification callback, but we don't have md5 check function yet, so only print some message |  | ||||||
|         // Return true if the verification passed, otherwise return false |  | ||||||
|         this._am.setVerifyCallback(function (path: any, asset: { compressed: any; md5: any; path: any; size: any; }): boolean { |  | ||||||
|             // When asset is compressed, we don't need to check its md5, because zip file have been deleted. |  | ||||||
|             var compressed: any = asset.compressed; |  | ||||||
|             // Retrieve the correct md5 value. |  | ||||||
|             var expectedMD5: string = asset.md5; |  | ||||||
|             // asset.path is relative path and path is absolute. |  | ||||||
|             var relativePath: string = asset.path; |  | ||||||
|             // The size of asset file, but this value could be absent. |  | ||||||
|             var size: any = asset.size; |  | ||||||
|             if (compressed) { |  | ||||||
|                 // panel.info.string = "Verification passed : " + relativePath; |  | ||||||
|                 // cc.log("onLoad -> Verification passed : " + relativePath); |  | ||||||
|                 return true; |  | ||||||
|             } else { |  | ||||||
|                 // panel.info.string = "Verification passed : " + relativePath + ' (' + expectedMD5 + ')'; |  | ||||||
|                 // cc.log("onLoad -> setVerifyCallbackVerification passed : " + relativePath + " (" + expectedMD5 + ")"); |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|         }); |  | ||||||
|  |  | ||||||
|         if (cc.sys.os === cc.sys.OS_ANDROID) { |  | ||||||
|             // Some Android device may slow down the download process when concurrent tasks is too much. |  | ||||||
|             // The value may not be accurate, please do more test and find what's most suitable for your game. |  | ||||||
|             // this._am.setMaxConcurrentTask(10); |  | ||||||
|             this._am["setMaxConcurrentTask"](10); |  | ||||||
|             // this.panel.info.string = "Max concurrent tasks count have been limited to 2"; |  | ||||||
|             // cc.log("onLoad -> Max concurrent tasks count have been limited to 10"); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private _modifyAppLoadUrlForManifestFile(filePath: string, newBundleUrl: string): void { |  | ||||||
|         let allpath: string[] = [filePath, filePath + "_temp"]; |  | ||||||
|         let manifestname: string[] = ["project.manifest", "project.manifest.temp"]; |  | ||||||
|         for (var i: number = 0; i < allpath.length; ++i) { |  | ||||||
|             let path: string = `${allpath[i]}/${manifestname[i]}`; |  | ||||||
|             if (jsb.fileUtils.isFileExist(path)) { |  | ||||||
|                 // console.log(`[HUD] modifyAppLoadUrlForManifestFile: 有下載的manifest文件,直接修改熱更地址`); |  | ||||||
|                 // 修改project.manifest |  | ||||||
|                 let projectManifest: string = jsb.fileUtils.getStringFromFile(path); |  | ||||||
|                 let projectManifestObj: any = JSON.parse(projectManifest); |  | ||||||
|                 projectManifestObj.packageUrl = newBundleUrl; |  | ||||||
|                 projectManifestObj.remoteManifestUrl = newBundleUrl + "/project.manifest"; |  | ||||||
|                 projectManifestObj.remoteVersionUrl = newBundleUrl + "/version.json"; |  | ||||||
|                 let afterString: string = JSON.stringify(projectManifestObj); |  | ||||||
|                 let isWrittenProject: boolean = jsb.fileUtils.writeStringToFile(afterString, path); |  | ||||||
|                 // // 更新數據庫中的新請求地址,下次如果檢測到不一致就重新修改 manifest 文件 |  | ||||||
|                 // if (isWrittenProject) { |  | ||||||
|                 //     LocalStorageData.Instance.BundleUrl = BusinessTypeSetting.UsePatch; |  | ||||||
|                 // } |  | ||||||
|                 // console.log("[HUD] 修改是否成功,project.manifest:", isWrittenProject); |  | ||||||
|                 // console.log("[HUD] 修改後文件:", projectManifestObj.packageUrl, projectManifestObj.remoteManifestUrl, projectManifestObj.remoteVersionUrl); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|  |  | ||||||
|     public *CheckUpdate(): IterableIterator<any> { |  | ||||||
|         this._needUpdateData = null; |  | ||||||
|         if (this._updating) { |  | ||||||
|             // this.panel.info.string = 'Checking or updating ...'; |  | ||||||
|             console.error("checkUpdate -> Checking or updating ..."); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { |  | ||||||
|             let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath); |  | ||||||
|             this._am.loadLocalManifest(manifest, this._storagePath); |  | ||||||
|         } |  | ||||||
|         if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) { |  | ||||||
|             // this.tipsLabel.string = "Failed to load local manifest ..."; |  | ||||||
|             console.error("checkUpdate -> Failed to load local manifest ..."); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|         this._am.setEventCallback(this.checkCb.bind(this)); |  | ||||||
|  |  | ||||||
|         this._am.checkUpdate(); |  | ||||||
|         this._updating = true; |  | ||||||
|  |  | ||||||
|         while (this._needUpdateData === null) { |  | ||||||
|             yield null; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         let newBundleUrl: string = `${BusinessTypeSetting.UsePatch}${BusinessTypeSetting.FolderUrlBundle}${this.BundleName}`; |  | ||||||
|         this._modifyAppLoadUrlForManifestFile(this._storagePath, newBundleUrl); |  | ||||||
|         this._initAssetManaget(); |  | ||||||
|  |  | ||||||
|         let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath); |  | ||||||
|         this._am.loadLocalManifest(manifest, this._storagePath); |  | ||||||
|         if (!this._am.getLocalManifest() || !this._am.getLocalManifest().isLoaded()) { |  | ||||||
|             // this.tipsLabel.string = "Failed to load local manifest ..."; |  | ||||||
|             console.error("checkUpdate -> Failed to load local manifest ..."); |  | ||||||
|             return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 更新動態路徑後再跑一次 |  | ||||||
|         this._am.setEventCallback(this.checkCb.bind(this)); |  | ||||||
|  |  | ||||||
|         this._needUpdateData = null; |  | ||||||
|         this._am.checkUpdate(); |  | ||||||
|         this._updating = true; |  | ||||||
|         while (this._needUpdateData === null) { |  | ||||||
|             yield null; |  | ||||||
|         } |  | ||||||
|         if (this._isChangeUrl && (!this._needUpdateData.IsNeedUpdate || this._needUpdateData.TotalBytes === "0 B")) { |  | ||||||
|             if (jsb.fileUtils.isFileExist(this._storagePath)) { |  | ||||||
|                 let isremoveDirectory: boolean = jsb.fileUtils.removeDirectory(this._storagePath); |  | ||||||
|                 let isremoveDirectory_temp: boolean = jsb.fileUtils.removeDirectory(this._storagePath + "_temp"); |  | ||||||
|                 if (isremoveDirectory_temp) { |  | ||||||
|                     console.log(`removeDirectory: ${this._storagePath}_temp`); |  | ||||||
|                 } |  | ||||||
|                 if (isremoveDirectory) { |  | ||||||
|                     console.log(`removeDirectory: ${this._storagePath}`); |  | ||||||
|                     this._needUpdateData = null; |  | ||||||
|                     this._initAssetManaget(); |  | ||||||
|                     this._needUpdateData = yield* this.CheckUpdate(); |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         return this._needUpdateData; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private checkCb(event: jsb.EventAssetsManager): void { |  | ||||||
|         var failed: boolean = false; |  | ||||||
|         switch (event.getEventCode()) { |  | ||||||
|             case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST: |  | ||||||
|                 // this.tipsLabel.string = "No local manifest file found, HUD skipped."; |  | ||||||
|                 console.error("checkCb -> No local manifest file found, HUD skipped."); |  | ||||||
|                 failed = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST: |  | ||||||
|             case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST: |  | ||||||
|                 // this.tipsLabel.string = "Fail to download manifest file, HUD skipped."; |  | ||||||
|                 console.error("checkCb -> Fail to download manifest file, HUD skipped."); |  | ||||||
|                 failed = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ALREADY_UP_TO_DATE: |  | ||||||
|                 // this.tipsLabel.string = "Already up to date with the latest remote version."; |  | ||||||
|                 // cc.log("checkCb -> Already up to date with the latest remote version."); |  | ||||||
|                 this._needUpdateData = new Enum_Loading.NeedUpdateDataObj(false); |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.NEW_VERSION_FOUND: |  | ||||||
|                 // this.downloadLabel.node.active = true; |  | ||||||
|                 // this.downloadLabel.string = "New version found, please try to update." + event.getTotalBytes(); |  | ||||||
|                 // this.panel.checkBtn.active = false; |  | ||||||
|                 // this.panel.fileProgress.progress = 0; |  | ||||||
|                 // this.panel.byteProgress.progress = 0; |  | ||||||
|                 // cc.log("checkCb -> New version found, please try to update." + event.getTotalBytes()); |  | ||||||
|                 this._needUpdateData = new Enum_Loading.NeedUpdateDataObj(true, this._bytesToSize(event.getTotalBytes())); |  | ||||||
|                 break; |  | ||||||
|             default: |  | ||||||
|                 return; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         this._am.setEventCallback(null); |  | ||||||
|         this._checkListener = null; |  | ||||||
|         this._updating = false; |  | ||||||
|  |  | ||||||
|         if (failed) { |  | ||||||
|             // |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public *HUD(onFileProgress?: (finish: number, total: number, item: string) => void): IterableIterator<any> { |  | ||||||
|         this._updateingData = null; |  | ||||||
|         if (this._am && !this._updating) { |  | ||||||
|             this._am.setEventCallback(this._updateCb.bind(this)); |  | ||||||
|  |  | ||||||
|             if (this._am.getState() === jsb.AssetsManager.State.UNINITED) { |  | ||||||
|                 let manifest: jsb.Manifest = new jsb.Manifest(this._customManifest, this._storagePath); |  | ||||||
|                 this._am.loadLocalManifest(manifest, this._storagePath); |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             this._onFileProgress = onFileProgress ? onFileProgress : null; |  | ||||||
|             this._am.update(); |  | ||||||
|             this._updating = true; |  | ||||||
|  |  | ||||||
|             while (this._updateingData === null) { |  | ||||||
|                 yield null; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             return this._updateingData; |  | ||||||
|         } else { |  | ||||||
|             return new Enum_Loading.UpdateingDataObj(false); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private _updateCb(event: jsb.EventAssetsManager): void { |  | ||||||
|         var needRestart: boolean = false; |  | ||||||
|         var failed: boolean = false; |  | ||||||
|         switch (event.getEventCode()) { |  | ||||||
|             case jsb.EventAssetsManager.ERROR_NO_LOCAL_MANIFEST: |  | ||||||
|                 // this.panel.info.string = 'No local manifest file found, HUD skipped.'; |  | ||||||
|                 cc.log("updateCb -> No local manifest file found, HUD skipped."); |  | ||||||
|                 failed = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.UPDATE_PROGRESSION: |  | ||||||
|                 // this.panel.byteProgress.progress = event.getPercent(); |  | ||||||
|                 // this.panel.fileProgress.progress = event.getPercentByFile(); |  | ||||||
|                 // this.panel.fileLabel.string = event.getDownloadedFiles() + ' / ' + event.getTotalFiles(); |  | ||||||
|                 // this.tipsLabel.string = event.getDownloadedBytes() + " / " + event.getTotalBytes(); |  | ||||||
|  |  | ||||||
|                 // cc.log("updateCb -> " + event.getDownloadedBytes() + " / " + event.getTotalBytes()); |  | ||||||
|                 // var msg: string = event.getMessage(); |  | ||||||
|                 // if (msg) { |  | ||||||
|                 //     // this.panel.info.string = 'Updated file: ' + msg; |  | ||||||
|                 //     cc.log("updateCb -> Updated file: " + msg); |  | ||||||
|                 //     console.log("updateCb -> " + event.getPercent() / 100 + "% : " + msg); |  | ||||||
|                 // } |  | ||||||
|  |  | ||||||
|                 var msg: string = event.getMessage(); |  | ||||||
|                 if (this._onFileProgress) { |  | ||||||
|                     this._onFileProgress(event.getDownloadedBytes(), event.getTotalBytes(), msg ? msg : ""); |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ERROR_DOWNLOAD_MANIFEST: |  | ||||||
|             case jsb.EventAssetsManager.ERROR_PARSE_MANIFEST: |  | ||||||
|                 // this.panel.info.string = 'Fail to download manifest file, HUD skipped.'; |  | ||||||
|                 console.error("updateCb -> Fail to download manifest file, HUD skipped."); |  | ||||||
|                 failed = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ALREADY_UP_TO_DATE: |  | ||||||
|                 // this.panel.info.string = 'Already up to date with the latest remote version.'; |  | ||||||
|                 console.error("updateCb -> Already up to date with the latest remote version."); |  | ||||||
|                 failed = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.UPDATE_FINISHED: |  | ||||||
|                 // this.tipsLabel.string = "更新完成. " + event.getMessage(); |  | ||||||
|                 // cc.log("updateCb -> 更新完成. " + event.getMessage()); |  | ||||||
|                 this._updateingData = new Enum_Loading.UpdateingDataObj(true); |  | ||||||
|                 needRestart = true; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.UPDATE_FAILED: |  | ||||||
|                 // this.panel.info.string = 'Update failed. ' + event.getMessage(); |  | ||||||
|                 console.error("updateCb -> Update failed. " + event.getMessage()); |  | ||||||
|                 // this.panel.retryBtn.active = true; |  | ||||||
|                 this._canRetry = true; |  | ||||||
|                 this._updateingData = new Enum_Loading.UpdateingDataObj(false); |  | ||||||
|                 this._updating = false; |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ERROR_UPDATING: |  | ||||||
|                 // this.panel.info.string = 'Asset update error: ' + event.getAssetId() + ', ' + event.getMessage(); |  | ||||||
|                 console.error("updateCb -> Asset update error: " + event.getAssetId() + ", " + event.getMessage()); |  | ||||||
|                 break; |  | ||||||
|             case jsb.EventAssetsManager.ERROR_DECOMPRESS: |  | ||||||
|                 // this.panel.info.string = event.getMessage(); |  | ||||||
|                 console.error("updateCb -> " + event.getMessage()); |  | ||||||
|                 break; |  | ||||||
|             default: |  | ||||||
|                 break; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         if (failed) { |  | ||||||
|             this._am.setEventCallback(null); |  | ||||||
|             this._updateListener = null; |  | ||||||
|             this._updating = false; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // 測試先不restart 之後看情況 |  | ||||||
|         // if (needRestart) { |  | ||||||
|         //     this._am.setEventCallback(null); |  | ||||||
|         //     this._updateListener = null; |  | ||||||
|         //     // Prepend the manifest's search path |  | ||||||
|         //     var searchPaths: string[] = jsb.fileUtils.getSearchPaths(); |  | ||||||
|  |  | ||||||
|         //     // var newPaths = this._am.getLocalManifest().getSearchPaths(); |  | ||||||
|         //     // cc.log("newPath."+JSON.stringify(newPaths)); |  | ||||||
|         //     // Array.prototype.unshift.apply(searchPaths, newPaths); |  | ||||||
|  |  | ||||||
|         //     cc.sys.localStorage.setItem("HUDSearchPaths", JSON.stringify(searchPaths)); |  | ||||||
|  |  | ||||||
|         //     jsb.fileUtils.setSearchPaths(searchPaths); |  | ||||||
|  |  | ||||||
|         //     cc.audioEngine.stopAll(); |  | ||||||
|         //     cc.game.restart(); |  | ||||||
|         // } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public *RetryDownLoadFailedAssets(): IterableIterator<any> { |  | ||||||
|         if (!this._updating && this._canRetry) { |  | ||||||
|             this._updateingData = null; |  | ||||||
|             // this.panel.retryBtn.active = false; |  | ||||||
|             this._canRetry = false; |  | ||||||
|  |  | ||||||
|             // this.panel.info.string = 'Retry failed Assets...'; |  | ||||||
|             // cc.log("retry -> Retry failed Assets..."); |  | ||||||
|             this._am.downloadFailedAssets(); |  | ||||||
|  |  | ||||||
|             while (this._updateingData === null) { |  | ||||||
|                 yield null; |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             return this._updateingData; |  | ||||||
|         } else { |  | ||||||
|             console.error(`retry -> error updating: ${this._updating}, canRetry: ${this._canRetry}`); |  | ||||||
|             this._updateingData = new Enum_Loading.UpdateingDataObj(false); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private _bytesToSize(bytes: number): string { |  | ||||||
|         if (bytes === 0) { |  | ||||||
|             return "0 B"; |  | ||||||
|         } |  | ||||||
|         let k: number = 1024; |  | ||||||
|         let sizes: string[] = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; |  | ||||||
|         let i: number = Math.floor(Math.log(bytes) / Math.log(k)); |  | ||||||
|         return (bytes / Math.pow(k, i)).toPrecision(3) + " " + sizes[i]; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     protected onDestroy(): void { |  | ||||||
|         if (this._updateListener) { |  | ||||||
|             this._am.setEventCallback(null); |  | ||||||
|             this._updateListener = null; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "ver": "1.1.0", |  | ||||||
|   "uuid": "dd9501f7-957a-4e62-8630-d43f62d171d1", |  | ||||||
|   "importer": "typescript", |  | ||||||
|   "isPlugin": false, |  | ||||||
|   "loadPluginInWeb": true, |  | ||||||
|   "loadPluginInNative": true, |  | ||||||
|   "loadPluginInEditor": false, |  | ||||||
|   "subMetas": {} |  | ||||||
| } |  | ||||||
| @@ -1,522 +0,0 @@ | |||||||
| import BusinessTypeSetting from "../../_BusinessTypeSetting/BusinessTypeSetting"; |  | ||||||
| import { CoroutineV2 } from "../CatanEngine/CoroutineV2/CoroutineV2"; |  | ||||||
| import LocalStorageData from "../Data/LocalStorageData"; |  | ||||||
| import Enum_Loading from "./Enum_Loading"; |  | ||||||
|  |  | ||||||
| export default class AssetBundleMamagerV2 { |  | ||||||
| 	//#region static 屬性 |  | ||||||
|  |  | ||||||
| 	private static _instance: AssetBundleMamagerV2 = null; |  | ||||||
| 	public static get Instance(): AssetBundleMamagerV2 { return AssetBundleMamagerV2._instance; } |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
|  |  | ||||||
| 	//#region public 屬性 |  | ||||||
|  |  | ||||||
| 	/** 本地VerList */ |  | ||||||
| 	public LocalVerList: Enum_Loading.VerListObj = null; |  | ||||||
|  |  | ||||||
| 	/** 遠端VerList */ |  | ||||||
| 	public RemoteVerList: JSON = null; |  | ||||||
|  |  | ||||||
| 	public DownloadList_Preview: Object = {}; |  | ||||||
|  |  | ||||||
| 	/** 快取資源 */ |  | ||||||
| 	public CachedFiles: Map<string, cc.Asset> = new Map<string, cc.Asset>(); |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
|  |  | ||||||
| 	//#region Lifecycle |  | ||||||
|  |  | ||||||
| 	constructor() { |  | ||||||
| 		AssetBundleMamagerV2._instance = this; |  | ||||||
| 		CC_PREVIEW && this._initdownloadList_Preview(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
|  |  | ||||||
| 	//#region 清除資料 |  | ||||||
|  |  | ||||||
| 	/** 判斷更改編譯版號.清除BUNDLE記錄 */ |  | ||||||
| 	public CheckCompileVersion(): void { |  | ||||||
| 		let oldCompileVersion: string = LocalStorageData.Instance.CompileVersion; |  | ||||||
| 		let newCompileVersion: string = BusinessTypeSetting.COMPILE_VERSION; |  | ||||||
| 		if (oldCompileVersion && oldCompileVersion !== newCompileVersion) { |  | ||||||
| 			this.ClearBundleData(); |  | ||||||
| 			console.log("change compile version."); |  | ||||||
| 		} |  | ||||||
| 		LocalStorageData.Instance.CompileVersion = BusinessTypeSetting.COMPILE_VERSION; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** 判斷更改PATCH環境.清除BUNDLE記錄 */ |  | ||||||
| 	public CheckChangePatchUrl(): void { |  | ||||||
| 		let oldBundleUrl: string = LocalStorageData.Instance.BundleUrl; |  | ||||||
| 		let newBundleUrl: string = BusinessTypeSetting.UsePatch; |  | ||||||
| 		if (oldBundleUrl && oldBundleUrl !== newBundleUrl) { |  | ||||||
| 			this.ClearBundleData(); |  | ||||||
| 			console.log("change patch url."); |  | ||||||
| 		} |  | ||||||
| 		LocalStorageData.Instance.BundleUrl = BusinessTypeSetting.UsePatch; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** 清除Bundle資料 */ |  | ||||||
| 	public ClearBundleData(): void { |  | ||||||
| 		cc.sys.localStorage.removeItem("LocalVerList"); |  | ||||||
| 		cc.sys.localStorage.removeItem("RemoteVerList"); |  | ||||||
| 		cc.assetManager.bundles.clear(); |  | ||||||
| 		if (CC_JSB) { |  | ||||||
| 			cc.assetManager.cacheManager.clearCache(); |  | ||||||
| 			console.log("clear bundle data."); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** 清除所有資料重啟 */ |  | ||||||
| 	public ClearAppDataToRestart(): void { |  | ||||||
| 		cc.sys.localStorage.clear(); |  | ||||||
| 		cc.assetManager.bundles.clear(); |  | ||||||
| 		if (CC_JSB) { |  | ||||||
| 			cc.assetManager.cacheManager.clearCache(); |  | ||||||
| 			cc.game.restart(); |  | ||||||
| 		} else { |  | ||||||
| 			window.location.reload(); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
|  |  | ||||||
| 	//#region Custom Function |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 取得Bundle |  | ||||||
| 	 * @param {string} BundleName Bundle名稱 |  | ||||||
| 	 * @param {string} Version 版號 |  | ||||||
| 	 * @return {cc.AssetManager.Bundle} Bundle |  | ||||||
| 	 */ |  | ||||||
| 	public *GetBundle(BundleName: string): IterableIterator<cc.AssetManager.Bundle> { |  | ||||||
| 		let self: this = this; |  | ||||||
| 		let bundle: cc.AssetManager.Bundle | boolean = cc.assetManager.getBundle(BundleName); |  | ||||||
| 		if (bundle) { |  | ||||||
| 			yield* this.GetDepsBundle(bundle.deps); |  | ||||||
| 			return bundle; |  | ||||||
| 		} |  | ||||||
| 		/** 判斷是不是要下載新版本 */ |  | ||||||
| 		let isNeedUpdate: boolean = this.IsNeedUpdate(BundleName); |  | ||||||
| 		if (isNeedUpdate) { |  | ||||||
| 			// 下載新版本前需要先清除暫存 |  | ||||||
| 			console.log(`removeCache: ${BundleName}`); |  | ||||||
| 			this.DelBundleCache(BundleName); |  | ||||||
| 			this.LocalVerList[BundleName].UseLocal = false; |  | ||||||
| 		} |  | ||||||
| 		/** Bundle路徑 */ |  | ||||||
| 		let BundleUrl: string = BusinessTypeSetting.GetRemoteFileUrl(BundleName); |  | ||||||
| 		if (CC_DEV) { |  | ||||||
| 			// CC_DEVBundle路徑為: BundleName |  | ||||||
| 			// if (BundleName.indexOf("Script") != -1) { |  | ||||||
| 			BundleUrl = `${BundleName}`; |  | ||||||
| 			// } else { |  | ||||||
| 			//	BundleUrl = "http://192.168.7.57/bj_casino/test/" + BundleName; |  | ||||||
| 			// } |  | ||||||
| 		} else if (this.LocalVerList[BundleName].UseLocal) { |  | ||||||
| 			// 本地Bundle路徑為: assets/assets/${BundleName} |  | ||||||
| 			BundleUrl = `assets/${BundleName}`; |  | ||||||
| 		} |  | ||||||
| 		if (CC_DEV) { |  | ||||||
| 			cc.assetManager.loadBundle(BundleUrl, (err: Error, resp: cc.AssetManager.Bundle) => { |  | ||||||
| 				if (err) { |  | ||||||
| 					console.error(err); |  | ||||||
| 					bundle = null; |  | ||||||
| 					return; |  | ||||||
| 				} |  | ||||||
| 				bundle = resp; |  | ||||||
| 			}); |  | ||||||
| 			while (typeof bundle === "undefined") { |  | ||||||
| 				yield null; |  | ||||||
| 			} |  | ||||||
| 		} else if (BundleName.includes("Script")) { |  | ||||||
| 			bundle = yield* self.loadScriptBundle(BundleUrl); |  | ||||||
| 		} else { |  | ||||||
| 			if (CC_JSB && !this.LocalVerList[BundleName].UseLocal) { |  | ||||||
| 				let bundlePath: string = `${jsb.fileUtils.getWritablePath()}gamecaches/${BundleName}/`; |  | ||||||
| 				if (!jsb.fileUtils.isFileExist(bundlePath)) { |  | ||||||
| 					cc.assetManager.cacheManager["makeBundleFolder"](BundleName); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 			bundle = yield* self.loadUIBundle(BundleUrl); |  | ||||||
| 		} |  | ||||||
| 		if (bundle) { |  | ||||||
| 			yield* this.GetDepsBundle((<cc.AssetManager.Bundle>bundle).deps); |  | ||||||
| 			if (isNeedUpdate) { |  | ||||||
| 				// 下載成功後更改本地Bundle版本 |  | ||||||
| 				self.LocalVerList[BundleName].Version = self.RemoteVerList[BundleName]; |  | ||||||
| 				LocalStorageData.Instance.LocalVerList = JSON.stringify(self.LocalVerList); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		return bundle; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從Bundle取得資源 |  | ||||||
| 	 * @param {string} BundleUrl Bundle路徑 |  | ||||||
| 	 */ |  | ||||||
| 	public *loadScriptBundle(BundleUrl: string): IterableIterator<any> { |  | ||||||
| 		let fileName: string = `index.${CC_DEBUG ? "js" : "jsc"}`; |  | ||||||
| 		let fileUrl: string = `${BundleUrl}/${fileName}`; |  | ||||||
| 		let run: boolean = true; |  | ||||||
| 		let isSuceess: boolean = false; |  | ||||||
| 		cc.assetManager.loadScript(fileUrl, (err: Error) => { |  | ||||||
| 			if (err) { |  | ||||||
| 				console.error(`[Error] ${fileUrl}載入失敗 err: ${err}`); |  | ||||||
| 				run = false; |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			isSuceess = true; |  | ||||||
| 			run = false; |  | ||||||
| 		}); |  | ||||||
| 		while (run) { |  | ||||||
| 			yield null; |  | ||||||
| 		} |  | ||||||
| 		return isSuceess; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從Bundle取得資源 |  | ||||||
| 	 * @param {string} BundleUrl Bundle路徑 |  | ||||||
| 	 */ |  | ||||||
| 	public *loadUIBundle(BundleUrl: string): IterableIterator<cc.AssetManager.Bundle> { |  | ||||||
| 		let fileName: string = "config.json"; |  | ||||||
| 		let fileUrl: string = `${BundleUrl}/${fileName}`; |  | ||||||
| 		let data: any; |  | ||||||
| 		let run: boolean = true; |  | ||||||
| 		cc.assetManager.loadRemote(fileUrl, (err: Error, res: cc.JsonAsset) => { |  | ||||||
| 			if (err) { |  | ||||||
| 				console.error(`[Error] ${fileUrl}載入失敗 err: ${err}`); |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			data = res.json; |  | ||||||
| 			run = false; |  | ||||||
| 		}); |  | ||||||
| 		while (run) { |  | ||||||
| 			yield null; |  | ||||||
| 		} |  | ||||||
| 		let bundle: cc.AssetManager.Bundle = new cc.AssetManager.Bundle(); |  | ||||||
| 		data.base = `${BundleUrl}/`; |  | ||||||
| 		bundle.init(data); |  | ||||||
| 		return bundle; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 取得Bundle |  | ||||||
| 	 * @param {string} BundleName Bundle名稱 |  | ||||||
| 	 * @param {string} Version 版號 |  | ||||||
| 	 * @return {cc.AssetManager.Bundle} Bundle |  | ||||||
| 	 */ |  | ||||||
| 	public *GetDepsBundle(deps: string[]): IterableIterator<any> { |  | ||||||
| 		if (!deps || deps.length <= 2) { |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		let self: this = this; |  | ||||||
| 		let GetBundle_F_Arr: IterableIterator<any>[] = []; |  | ||||||
| 		for (const bundleName of deps) { |  | ||||||
| 			if (!["main", "internal"].includes(bundleName)) { |  | ||||||
| 				let GetBundle_F: IterableIterator<any> = function* (): IterableIterator<any> { |  | ||||||
| 					yield* self.GetBundle(bundleName); |  | ||||||
| 				}(); |  | ||||||
| 				GetBundle_F_Arr.push(GetBundle_F); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		yield CoroutineV2.Parallel(...GetBundle_F_Arr).Start(); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從Bundle取得資源 |  | ||||||
| 	 * @param {number} slotID slotID |  | ||||||
| 	 * @param {Function} onFileProgress onFileProgress |  | ||||||
| 	 */ |  | ||||||
| 	public *PreloadBundleScene(slotID: number, onFileProgress?: (finish: number, total: number, item: cc.AssetManager.RequestItem) => void): IterableIterator<any> { |  | ||||||
| 		let BundleName: string = `Game_${slotID}`; |  | ||||||
| 		let SourceName: string = `Slot${slotID}`; |  | ||||||
| 		let run: boolean = true; |  | ||||||
| 		let UpdateingData: Enum_Loading.UpdateingDataObj = new Enum_Loading.UpdateingDataObj(false); |  | ||||||
| 		let bundle: cc.AssetManager.Bundle = yield* AssetBundleMamagerV2.Instance.GetBundle(BundleName); |  | ||||||
| 		if (!bundle) { |  | ||||||
| 			console.error(`GetBundleSource Error BundleName: ${BundleName}`); |  | ||||||
| 			return UpdateingData; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		bundle.preloadScene(SourceName, onFileProgress, function (error: Error): void { |  | ||||||
| 			if (error) { |  | ||||||
| 				console.error(error); |  | ||||||
| 				run = false; |  | ||||||
| 				return; |  | ||||||
| 			} |  | ||||||
| 			UpdateingData.IsUpdatecomplete = true; |  | ||||||
| 			run = false; |  | ||||||
| 		}); |  | ||||||
|  |  | ||||||
| 		while (run) { |  | ||||||
| 			yield null; |  | ||||||
| 		} |  | ||||||
| 		return UpdateingData; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從Bundle取得資源 |  | ||||||
| 	 * @param {cc.AssetManager.Bundle | string} BundleName Bundle名稱 |  | ||||||
| 	 * @param {string} SourceName 資源名稱 |  | ||||||
| 	 * @param {string} type 資源型別 |  | ||||||
| 	 * @return {any} Source |  | ||||||
| 	 */ |  | ||||||
| 	public *GetBundleSource(BundleName: cc.AssetManager.Bundle | string, SourceName: string, type?: string | Bundle_Source_Type, onFileProgress?: (finish: number, total: number, item: cc.AssetManager.RequestItem) => void): IterableIterator<any> { |  | ||||||
| 		let bundle: cc.AssetManager.Bundle; |  | ||||||
| 		let source: any; |  | ||||||
| 		if (BundleName instanceof cc.AssetManager.Bundle) { |  | ||||||
| 			bundle = BundleName; |  | ||||||
| 		} else { |  | ||||||
| 			bundle = yield* AssetBundleMamagerV2.Instance.GetBundle(BundleName); |  | ||||||
| 			if (!bundle) { |  | ||||||
| 				cc.error(`GetBundleSource Error BundleName: ${BundleName}`); |  | ||||||
| 				return null; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		switch (type) { |  | ||||||
| 			case Bundle_Source_Type.Scene: { |  | ||||||
| 				bundle.loadScene(SourceName, onFileProgress, function (err: Error, scene: cc.SceneAsset): void { |  | ||||||
| 					if (err) { |  | ||||||
| 						cc.error(err); |  | ||||||
| 						return null; |  | ||||||
| 					} |  | ||||||
| 					// cc.director.runScene(scene); |  | ||||||
| 					source = scene; |  | ||||||
| 				}); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			case Bundle_Source_Type.Json: { |  | ||||||
| 				bundle.load(SourceName, onFileProgress, function (err: Error, json: cc.JsonAsset): void { |  | ||||||
| 					if (err) { |  | ||||||
| 						cc.error(err); |  | ||||||
| 						return null; |  | ||||||
| 					} |  | ||||||
| 					// source = JSON.parse(json["_nativeAsset"]); |  | ||||||
| 					source = json; |  | ||||||
| 				}); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			case Bundle_Source_Type.Prefab: { |  | ||||||
| 				bundle.load(SourceName, cc.Prefab, onFileProgress, function (err: Error, prefab: cc.Asset): void { |  | ||||||
| 					if (err) { |  | ||||||
| 						cc.error(err); |  | ||||||
| 						return null; |  | ||||||
| 					} |  | ||||||
| 					// source = JSON.parse(json["_nativeAsset"]); |  | ||||||
| 					source = prefab; |  | ||||||
| 				}); |  | ||||||
| 				break; |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			default: |  | ||||||
| 				bundle.load(SourceName, function (err: Error, any: any): void { |  | ||||||
| 					if (err) { |  | ||||||
| 						cc.error(err); |  | ||||||
| 						return null; |  | ||||||
| 					} |  | ||||||
| 					source = any; |  | ||||||
| 				}); |  | ||||||
| 				break; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		while (typeof source === "undefined") { |  | ||||||
| 			yield null; |  | ||||||
| 		} |  | ||||||
| 		return source; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從Bundle取得資源(不卡協成) |  | ||||||
| 	 * @param {string} bundleName bundleName |  | ||||||
| 	 * @param {string} sourcePath Bundle資料夾下的路徑 |  | ||||||
| 	 */ |  | ||||||
| 	public static GetBundleSourceV2(bundleName: cc.bundleName | string, sourcePath: string): cc.Prefab { |  | ||||||
| 		let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(bundleName); |  | ||||||
| 		if (!bundle) { |  | ||||||
| 			cc.error(`GetBundleSourceV2 getBundle error bundleName: ${bundleName}`); |  | ||||||
| 			return null; |  | ||||||
| 		} |  | ||||||
| 		let source: cc.Prefab = bundle.get(sourcePath, cc.Prefab); |  | ||||||
| 		if (!source) { |  | ||||||
| 			cc.error(`GetBundleSourceV2 bundle.get error bundleName: ${bundleName}, sourcePath: ${sourcePath}`); |  | ||||||
| 			return null; |  | ||||||
| 		} |  | ||||||
| 		return source; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 釋放Bundle |  | ||||||
| 	 * @param {string} slotID slotID |  | ||||||
| 	 */ |  | ||||||
| 	public *BundleRelease(slotID: number): IterableIterator<any> { |  | ||||||
| 		let gameName: string = `Game_${slotID}`; |  | ||||||
| 		let sceneName: string = `Slot${slotID}`; |  | ||||||
| 		let bundle: cc.AssetManager.Bundle = cc.assetManager.getBundle(gameName); |  | ||||||
| 		if (!bundle) { |  | ||||||
| 			cc.log(`BundleRelease Error BundleName: ${gameName}`); |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		this.ReleaseSlotCache(slotID); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從cachedFiles刪除暫存資源 |  | ||||||
| 	 * @param {string} BundleName Bundle名稱 |  | ||||||
| 	 */ |  | ||||||
| 	public DelBundleCache(BundleName: string): void { |  | ||||||
| 		if (CC_BUILD && cc.sys.isNative) { |  | ||||||
| 			let cachedFiles: Object = cc.assetManager.cacheManager.cachedFiles["_map"]; |  | ||||||
| 			let delcache: string = BusinessTypeSetting.GetRemoteFileUrl(BundleName) + "/"; |  | ||||||
| 			for (let cached of Object.keys(cachedFiles)) { |  | ||||||
| 				if (cached.includes(delcache)) { |  | ||||||
| 					cc.assetManager.cacheManager.removeCache(cached); |  | ||||||
| 					// console.log(`removeCache: ${cached}`); |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 從cachedFiles釋放暫存資源 |  | ||||||
| 	 * @param {number} slotID slotID |  | ||||||
| 	 */ |  | ||||||
| 	public ReleaseSlotCache(slotID: number): void { |  | ||||||
| 		if (!CC_JSB) { |  | ||||||
| 			return; |  | ||||||
| 		} |  | ||||||
| 		let delcachedKeys: string[] = []; |  | ||||||
| 		let cachedFiles: Map<string, cc.Asset> = this.CachedFiles; |  | ||||||
| 		let delcache_group: string[] = [`shared/jsons`, `Slot/Slot${slotID}`, "sounds/Slot/Default", "submit.txt"]; |  | ||||||
| 		cachedFiles.forEach((cached: cc.Asset, key: string, map: Map<string, cc.Asset>) => { |  | ||||||
| 			for (var i: number = 0; i < delcache_group.length; ++i) { |  | ||||||
| 				let delcache: string = delcache_group[i]; |  | ||||||
| 				if (key.includes(delcache)) { |  | ||||||
| 					cc.assetManager.releaseAsset(cached); |  | ||||||
| 					delcachedKeys.push(key); |  | ||||||
| 					break; |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
| 		}); |  | ||||||
| 		for (var i: number = 0; i < delcachedKeys.length; ++i) { |  | ||||||
| 			this.CachedFiles.delete(delcachedKeys[i]); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 判斷要不要更新 |  | ||||||
| 	 * @param {string} BundleName Bundle名稱 |  | ||||||
| 	 */ |  | ||||||
| 	public IsNeedUpdate(BundleName: string): boolean { |  | ||||||
| 		let isNeedUpdate: boolean; |  | ||||||
| 		// 判斷本地有無Bundle資料 |  | ||||||
| 		if (this.LocalVerList[BundleName] && !this.LocalVerList[BundleName].HasBundle) { |  | ||||||
| 			if (this.RemoteVerList[BundleName]) { |  | ||||||
| 				// 改成有包過Bundle了,重新走下面流程 |  | ||||||
| 				this.LocalVerList[BundleName] = null; |  | ||||||
| 			} else { |  | ||||||
| 				return true; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		if (!this.LocalVerList[BundleName]) { |  | ||||||
| 			// 本地無Bundle資料需要新增 |  | ||||||
| 			this.LocalVerList[BundleName] = new Enum_Loading.BundleDataObj(); |  | ||||||
| 			LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
| 		} |  | ||||||
| 		let version: string = this.RemoteVerList[BundleName]; |  | ||||||
| 		if (!version) { |  | ||||||
| 			// !version代表還沒包Bundle |  | ||||||
| 			this.LocalVerList[BundleName].HasBundle = false; |  | ||||||
| 			LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
| 			return true; |  | ||||||
| 		} else if (version === "0") { |  | ||||||
| 			// version === "0" 代表要使用本體Bundle |  | ||||||
| 			this.LocalVerList[BundleName].UseLocal = true; |  | ||||||
| 			this.LocalVerList[BundleName].Version = "0"; |  | ||||||
| 			LocalStorageData.Instance.LocalVerList = JSON.stringify(this.LocalVerList); |  | ||||||
| 		} |  | ||||||
| 		isNeedUpdate = AssetBundleMamagerV2.Instance.versionCompareHandle(this.LocalVerList[BundleName].Version, this.RemoteVerList[BundleName]) !== 0 ? true : false; |  | ||||||
| 		return isNeedUpdate; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/** |  | ||||||
| 	 * 比對版號(熱更能從1.0.0更新到2.0.0,從2.0.0回退到1.0.0) |  | ||||||
| 	 * 官方提供的版本比較函數,只有服務端版本>客戶端版本時,才會進行更新。所以不能從2.0.0回退到1.0.0版本。 |  | ||||||
| 	 * @param {string} versionA 本地版號 |  | ||||||
| 	 * @param {string} versionB 遠程版號 |  | ||||||
| 	 * @return {number} num = -1 須更新 |  | ||||||
| 	 * @return {number} num = 0 不須更新 |  | ||||||
| 	 */ |  | ||||||
| 	public versionCompareHandle(versionA: string, versionB: string): number { |  | ||||||
| 		// console.log("Ver A " + versionA + "VerB " + versionB); |  | ||||||
| 		var vA: string[] = versionA.split("."); |  | ||||||
| 		var vB: string[] = versionB.split("."); |  | ||||||
|  |  | ||||||
| 		// 長度不相等,則進行更新 |  | ||||||
| 		if (vA.length !== vB.length) { |  | ||||||
| 			return -1; |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		for (var i: number = 0; i < vA.length; ++i) { |  | ||||||
| 			var a: number = +vA[i]; |  | ||||||
| 			var b: number = +vB[i] || 0; |  | ||||||
| 			if (a === b) { |  | ||||||
| 				// 數字相同,則跳過 |  | ||||||
| 				continue; |  | ||||||
| 			} else { |  | ||||||
| 				// 數字不同(且版號比目標低),則進行更新 |  | ||||||
| 				return a - b; |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
|  |  | ||||||
| 		// 長度相等且數字相等,則不更新 |  | ||||||
| 		return 0; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
|  |  | ||||||
| 	//#region DownloadList_Preview |  | ||||||
|  |  | ||||||
| 	private _initdownloadList_Preview(): void { |  | ||||||
| 		this.DownloadList_Preview = JSON.parse(LocalStorageData.Instance.DownloadList_Preview); |  | ||||||
| 		this.DownloadList_Preview = this.DownloadList_Preview ? this.DownloadList_Preview : {}; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public GetIsDownload_Preview(slotID: number): boolean { |  | ||||||
| 		if (!this.DownloadList_Preview[slotID]) { |  | ||||||
| 			this.SetIsDownload_Preview(slotID, false); |  | ||||||
| 		} |  | ||||||
| 		return this.DownloadList_Preview[slotID]; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	public SetIsDownload_Preview(slotID: number, isDownload: boolean = true): void { |  | ||||||
| 		this.DownloadList_Preview[slotID] = isDownload; |  | ||||||
| 		LocalStorageData.Instance.DownloadList_Preview = JSON.stringify(this.DownloadList_Preview); |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	//#endregion |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //#region enum |  | ||||||
|  |  | ||||||
| /** Bundle資源類型 */ |  | ||||||
| export enum Bundle_Source_Type { |  | ||||||
| 	/** Json */ |  | ||||||
| 	Json = "json", |  | ||||||
|  |  | ||||||
| 	/** Scene */ |  | ||||||
| 	Scene = "scene", |  | ||||||
|  |  | ||||||
| 	/** Prefab */ |  | ||||||
| 	Prefab = "prefab" |  | ||||||
| } |  | ||||||
|  |  | ||||||
| //#endregion |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "ver": "1.1.0", |  | ||||||
|   "uuid": "383b4628-2b2a-4de4-8aca-913015e91cae", |  | ||||||
|   "importer": "typescript", |  | ||||||
|   "isPlugin": false, |  | ||||||
|   "loadPluginInWeb": true, |  | ||||||
|   "loadPluginInNative": true, |  | ||||||
|   "loadPluginInEditor": false, |  | ||||||
|   "subMetas": {} |  | ||||||
| } |  | ||||||
| @@ -1,72 +0,0 @@ | |||||||
| const { ccclass, property } = cc._decorator; |  | ||||||
| export module Enum_Loading { |  | ||||||
|  |  | ||||||
|     //#region Enum |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
|  |  | ||||||
|     //#region Class |  | ||||||
|  |  | ||||||
|     // /** BaseBundle資料 */ |  | ||||||
|     // @ccclass("BaseBundleObj") |  | ||||||
|     // export class BaseBundleObj { |  | ||||||
|     //     @property({ displayName: "Bundle名稱", tooltip: "Bundle名稱" }) |  | ||||||
|     //     public BundleName: string = ""; |  | ||||||
|  |  | ||||||
|     //     @property({ displayName: "優先度", tooltip: "優先度", type: cc.Integer }) |  | ||||||
|     //     public Priority: number = 1; |  | ||||||
|     // } |  | ||||||
|  |  | ||||||
|     class BundleDictionary<T> { |  | ||||||
|         [x: string]: T; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** VerList資料 */ |  | ||||||
|     @ccclass("VerListObj") |  | ||||||
|     export class VerListObj extends BundleDictionary<BundleDataObj> { |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** Bundle資料 */ |  | ||||||
|     @ccclass("BundleDataObj") |  | ||||||
|     export class BundleDataObj { |  | ||||||
|         public Version: string = "0"; |  | ||||||
|  |  | ||||||
|         public ApkVersion: string = "0"; |  | ||||||
|  |  | ||||||
|         public UseLocal: boolean = false; |  | ||||||
|  |  | ||||||
|         /** 有沒有包到Bundle */ |  | ||||||
|         public HasBundle: boolean = true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** Bundle資料 */ |  | ||||||
|     @ccclass("NeedUpdateDataObj") |  | ||||||
|     export class NeedUpdateDataObj { |  | ||||||
|  |  | ||||||
|         /** 是否需要更新 */ |  | ||||||
|         public IsNeedUpdate: boolean; |  | ||||||
|  |  | ||||||
|         /** 更新大小 */ |  | ||||||
|         public TotalBytes: string; |  | ||||||
|  |  | ||||||
|         constructor(...params: any[]) { |  | ||||||
|             this.IsNeedUpdate = params[0]; |  | ||||||
|             this.TotalBytes = params[1] ? params[1] : null; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** Bundle資料 */ |  | ||||||
|     @ccclass("UpdateingDataObj") |  | ||||||
|     export class UpdateingDataObj { |  | ||||||
|  |  | ||||||
|         /** 是否更新完成 */ |  | ||||||
|         public IsUpdatecomplete: boolean; |  | ||||||
|  |  | ||||||
|         constructor(...params: any[]) { |  | ||||||
|             this.IsUpdatecomplete = params[0]; |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
| } |  | ||||||
| export default Enum_Loading; |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "ver": "1.1.0", |  | ||||||
|   "uuid": "573d847e-893c-4fa2-8bd2-41918709fcf4", |  | ||||||
|   "importer": "typescript", |  | ||||||
|   "isPlugin": false, |  | ||||||
|   "loadPluginInWeb": true, |  | ||||||
|   "loadPluginInNative": true, |  | ||||||
|   "loadPluginInEditor": false, |  | ||||||
|   "subMetas": {} |  | ||||||
| } |  | ||||||
| @@ -1,43 +0,0 @@ | |||||||
|  |  | ||||||
| const { ccclass, property } = cc._decorator; |  | ||||||
|  |  | ||||||
| export module GameData_HUD { |  | ||||||
|  |  | ||||||
|     //#region Enum |  | ||||||
|  |  | ||||||
|     /** BundleName */ |  | ||||||
|     export enum BundleName { |  | ||||||
|         /** CommonSound */ |  | ||||||
|         CommonSound = "CommonSound", |  | ||||||
|         CommonLanguageTexture = "CommonLanguageTexture", |  | ||||||
|         Common = "Common", |  | ||||||
|         ResourceItem = "ResourceItem", |  | ||||||
|         MainControl = "MainControl", |  | ||||||
|         Login = "Login", |  | ||||||
|         Lobby = "Lobby", |  | ||||||
|         BindAccount = "BindAccount", |  | ||||||
|         Shop = "Shop", |  | ||||||
|         Vip = "Vip", |  | ||||||
|         Ad = "Ad", |  | ||||||
|         SettingPanel = "SettingPanel", |  | ||||||
|         PlayerInfo = "PlayerInfo", |  | ||||||
|         Rank = "Rank", |  | ||||||
|         Chat = "Chat", |  | ||||||
|         Gift = "Gift", |  | ||||||
|         Activity = "Activity", |  | ||||||
|         Mail = "Mail", |  | ||||||
|         GettingPanel = "GettingPanel", |  | ||||||
|         Backpack = "Backpack", |  | ||||||
|         Game_GetCoin = "Game_GetCoin", |  | ||||||
|         Game_BigWinJackpot = "Game_BigWinJackpot", |  | ||||||
|         Game_BottomUI_BJ = "Game_BottomUI_BJ", |  | ||||||
|         Game_BottomUI_SD = "Game_BottomUI_SD", |  | ||||||
|         SlotCommom = "SlotCommom", |  | ||||||
|         TableCommon = "TableCommon", |  | ||||||
|         FishCommon = "FishCommon", |  | ||||||
| 		ActivityMission = "ActivityMission" |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     //#endregion |  | ||||||
| } |  | ||||||
| export default GameData_HUD; |  | ||||||
| @@ -1,10 +0,0 @@ | |||||||
| { |  | ||||||
|   "ver": "1.1.0", |  | ||||||
|   "uuid": "e85368d6-e018-430e-bf1d-6ecd2973c6a8", |  | ||||||
|   "importer": "typescript", |  | ||||||
|   "isPlugin": false, |  | ||||||
|   "loadPluginInWeb": true, |  | ||||||
|   "loadPluginInNative": true, |  | ||||||
|   "loadPluginInEditor": false, |  | ||||||
|   "subMetas": {} |  | ||||||
| } |  | ||||||
							
								
								
									
										13
									
								
								assets/Script/Engine/Timer.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/Script/Engine/Timer.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "ver": "1.1.3", | ||||||
|  |   "uuid": "fd4b4720-4e75-4bfe-a27c-1520c3f18eb0", | ||||||
|  |   "importer": "folder", | ||||||
|  |   "isBundle": false, | ||||||
|  |   "bundleName": "", | ||||||
|  |   "priority": 1, | ||||||
|  |   "compressionType": {}, | ||||||
|  |   "optimizeHotUpdate": {}, | ||||||
|  |   "inlineSpriteFrames": {}, | ||||||
|  |   "isRemoteBundle": {}, | ||||||
|  |   "subMetas": {} | ||||||
|  | } | ||||||
							
								
								
									
										13
									
								
								assets/Script/Engine/Utils.meta
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								assets/Script/Engine/Utils.meta
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | { | ||||||
|  |   "ver": "1.1.3", | ||||||
|  |   "uuid": "eba93305-455d-4d2d-a914-db71bc7f0022", | ||||||
|  |   "importer": "folder", | ||||||
|  |   "isBundle": false, | ||||||
|  |   "bundleName": "", | ||||||
|  |   "priority": 1, | ||||||
|  |   "compressionType": {}, | ||||||
|  |   "optimizeHotUpdate": {}, | ||||||
|  |   "inlineSpriteFrames": {}, | ||||||
|  |   "isRemoteBundle": {}, | ||||||
|  |   "subMetas": {} | ||||||
|  | } | ||||||
							
								
								
									
										218
									
								
								tslint.json
									
									
									
									
									
								
							
							
						
						
									
										218
									
								
								tslint.json
									
									
									
									
									
								
							| @@ -1,115 +1,107 @@ | |||||||
| { | { | ||||||
|     "rules": { | 	"defaultSeverity": "warning", | ||||||
|         "ban": [ | 	"rules": { | ||||||
|             true, | 		"ban": [ | ||||||
|             [ | 			true, | ||||||
|                 "_", | 			[ | ||||||
|                 "extend" | 				"_", | ||||||
|             ], | 				"extend" | ||||||
|             [ | 			], | ||||||
|                 "_", | 			[ | ||||||
|                 "isNull" | 				"_", | ||||||
|             ], | 				"isNull" | ||||||
|             [ | 			], | ||||||
|                 "_", | 			[ | ||||||
|                 "isDefined" | 				"_", | ||||||
|             ] | 				"isDefined" | ||||||
|         ], | 			] | ||||||
|         "class-name": false, | 		], | ||||||
|         "comment-format": [ | 		"class-name": false, | ||||||
|             true, | 		"comment-format": [ | ||||||
|             "check-space" | 			true, | ||||||
|         ], | 			"check-space" | ||||||
|         "curly": true, | 		], | ||||||
|         "eofline": false, | 		"curly": true, | ||||||
|         "forin": false, | 		"eofline": false, | ||||||
|         "indent": [ | 		"forin": false, | ||||||
|             true, | 		"indent": [ | ||||||
|             4 | 			true, | ||||||
|         ], | 			4 | ||||||
|         "interface-name": [ | 		], | ||||||
|             true, | 		"interface-name": [ | ||||||
|             "never-prefix" | 			true, | ||||||
|         ], | 			"never-prefix" | ||||||
|         "jsdoc-format": true, | 		], | ||||||
|         "label-position": true, | 		"jsdoc-format": true, | ||||||
|         "label-undefined": true, | 		"label-position": true, | ||||||
|         "max-line-length": [ | 		"max-line-length": [ | ||||||
|             false, | 			false, | ||||||
|             140 | 			140 | ||||||
|         ], | 		], | ||||||
|         "no-arg": true, | 		"no-arg": true, | ||||||
|         "no-bitwise": false, | 		"no-bitwise": false, | ||||||
|         "no-console": [ | 		"no-console": [ | ||||||
|             true, | 			true, | ||||||
|             "debug", | 			"debug", | ||||||
|             "info", | 			"info", | ||||||
|             "time", | 			"time", | ||||||
|             "timeEnd", | 			"timeEnd", | ||||||
|             "trace" | 			"trace" | ||||||
|         ], | 		], | ||||||
|         "no-construct": true, | 		"no-construct": true, | ||||||
|         "no-debugger": true, | 		"no-debugger": true, | ||||||
|         "no-duplicate-key": true, | 		"no-duplicate-variable": true, | ||||||
|         "no-duplicate-variable": true, | 		"no-empty": true, | ||||||
|         "no-empty": true, | 		// "no-eval": true, | ||||||
|         // "no-eval": true, | 		"no-string-literal": false, | ||||||
|         "no-string-literal": false, | 		"no-trailing-whitespace": true, | ||||||
|         "no-trailing-comma": true, | 		"no-unused-expression": false, | ||||||
|         "no-trailing-whitespace": true, | 		"no-unused-variable": true, | ||||||
|         "no-unused-expression": false, | 		"no-use-before-declare": false, | ||||||
|         "no-unused-variable": true, | 		"one-line": [ | ||||||
|         "no-unreachable": true, | 			true, | ||||||
|         "no-use-before-declare": false, | 			"check-open-brace", | ||||||
|         "one-line": [ | 			"check-catch", | ||||||
|             true, | 			"check-else", | ||||||
|             "check-open-brace", | 			"check-whitespace" | ||||||
|             "check-catch", | 		], | ||||||
|             "check-else", | 		"quotemark": [ | ||||||
|             "check-whitespace" | 			true, | ||||||
|         ], | 			"double" | ||||||
|         "quotemark": [ | 		], | ||||||
|             true, | 		"radix": true, | ||||||
|             "double" | 		"semicolon": [ | ||||||
|         ], | 			true, | ||||||
|         "radix": true, | 			"always" | ||||||
|         "semicolon": [ | 		], | ||||||
|             true, | 		"triple-equals": [ | ||||||
|             "always" | 			true, | ||||||
|         ], | 			"allow-null-check" | ||||||
|         "triple-equals": [ | 		], | ||||||
|             true, | 		"typedef": [ | ||||||
|             "allow-null-check" | 			true, | ||||||
|         ], | 			"call-signature", | ||||||
|         "typedef": [ | 			"parameter", | ||||||
|             true, | 			"property-declaration", | ||||||
|             "call-signature", | 			"variable-declaration" | ||||||
|             "parameter", | 		], | ||||||
|             "property-declaration", | 		"typedef-whitespace": [ | ||||||
|             "variable-declaration" | 			true, | ||||||
|         ], | 			{ | ||||||
|         "typedef-whitespace": [ | 				"call-signature": "nospace" | ||||||
|             true, | 			}, | ||||||
|             { | 			{ | ||||||
|                 "call-signature": "nospace" | 				"index-signature": "space" | ||||||
|             }, | 			} | ||||||
|             { | 		], | ||||||
|                 "index-signature": "space" | 		"variable-name": false, | ||||||
|             } | 		"whitespace": [ | ||||||
|         ], | 			false, | ||||||
|         "use-strict": [ | 			"check-branch", | ||||||
|             true, | 			"check-decl", | ||||||
|             "check-module", | 			"check-operator", | ||||||
|             "check-function" | 			"check-separator", | ||||||
|         ], | 			"check-type" | ||||||
|         "variable-name": false, | 		] | ||||||
|         "whitespace": [ | 	} | ||||||
|             false, |  | ||||||
|             "check-branch", |  | ||||||
|             "check-decl", |  | ||||||
|             "check-operator", |  | ||||||
|             "check-separator", |  | ||||||
|             "check-type" |  | ||||||
|         ] |  | ||||||
|     } |  | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user