| using System.Collections; | 
| using System.Collections.Generic; | 
| using System; | 
| using UnityEngine; | 
| using System.IO; | 
| using System.Threading; | 
| using System.Linq; | 
|   | 
| public class AssetVersionUtility | 
| { | 
|   | 
|     public static string assetVersionsLocalMd5 | 
|     { | 
|         get { return LocalSave.GetString("AssetVersionsLocalMd5"); } | 
|         set { LocalSave.SetString("AssetVersionsLocalMd5", value); } | 
|     } | 
|   | 
|     static bool m_HasDownLoadFullAsset = LocalSave.GetBool("HasDownLoadFullAsset"); | 
|     public static bool hasDownLoadFullAsset | 
|     { | 
|         get { return m_HasDownLoadFullAsset; } | 
|         set { LocalSave.SetBool("HasDownLoadFullAsset", value); } | 
|     } | 
|   | 
|     static bool m_PriorAssetDownLoadDone = false; | 
|     public static bool priorAssetDownLoadDone | 
|     { | 
|         get | 
|         { | 
|             if (VersionUtility.Instance.NeedDownAsset()) | 
|             { | 
|                 return m_PriorAssetDownLoadDone; | 
|             } | 
|             else | 
|             { | 
|                 return true; | 
|             } | 
|         } | 
|     } | 
|   | 
|     static bool m_UnPriorAssetDownLoadDone = false; | 
|     public static bool unPriorAssetDownLoadDone | 
|     { | 
|         get | 
|         { | 
|             if (VersionUtility.Instance.NeedDownAsset()) | 
|             { | 
|                 return m_UnPriorAssetDownLoadDone; | 
|             } | 
|             else | 
|             { | 
|                 return true; | 
|             } | 
|         } | 
|     } | 
|   | 
|     public static DateTime assetsBuildTime = DateTime.MinValue; | 
|   | 
|     static Dictionary<string, AssetVersion> assetVersions = new Dictionary<string, AssetVersion>(); | 
|     //本地LogicBytes文件和 assetVersions 比较是否需要下载 | 
|     static Dictionary<string, AssetVersion> localAssetVersions = new Dictionary<string, AssetVersion>(); | 
|     static List<AssetVersion> priorDownLoadAssetVersions = new List<AssetVersion>(); | 
|     static List<AssetVersion> unpriorDownLoadAssetVersions = new List<AssetVersion>(); | 
|     public static bool checkAssetCompleted { get; private set; } | 
|     private static string assetVerUrl; | 
|     public static void Init() | 
|     { | 
|   | 
|     } | 
|   | 
|     public static void OnDownLoadPriorBundle(DownloadTask task) | 
|     { | 
|         if (task.IsDone) | 
|         { | 
|             //  TODO YYL | 
|             // PriorBundleConfig.Init(true); | 
|             GetAssetVersionFile(); | 
|         } | 
|         else | 
|         { | 
|             //一直尝试下载 | 
|             task.BeginDownload(OnDownLoadPriorBundle); | 
|             Debug.Log("OnDownLoadPriorBundle fail - before AssetVersion"); | 
|         } | 
|     } | 
|   | 
|     public static void GetAssetVersionFile() | 
|     { | 
|         checkAssetCompleted = false; | 
|         Debug.LogFormat("开始获取资源版本文件:时间 {0}", DateTime.Now); | 
|         var assetVersionUrl = StringUtility.Contact(VersionUtility.Instance.versionInfo.GetResourcesURL(VersionConfig.Get().branch), Language.fixPath, "/AssetsVersion.txt"); | 
|         assetVerUrl = assetVersionUrl; | 
|         Debug.Log("http地址:assetVersionUrl  " + assetVersionUrl); | 
|         HttpRequest.Instance.UnityWebRequestGet(assetVersionUrl, 5, OnGetAssetVersionFile); | 
|     } | 
|   | 
|     private static void OnGetAssetVersionFile(bool _ok, string _result) | 
|     { | 
|         Debug.LogFormat("获取资源版本文件结果:时间 {0},结果 {1}, 文件大小 {2}", DateTime.Now, _ok, _result.Length); | 
|         if (_ok) | 
|         { | 
|             assetVersionsLocalMd5 = FileExtersion.GetStringMD5Hash(_result); | 
|             var assetVersions = UpdateAssetVersions(_result); | 
|             BeginCheckAssets(); | 
|         } | 
|         else | 
|         { | 
|             Debug.Log("http 数据通讯: AssetVersionUtility:" + assetVerUrl + "  result:" + _result); | 
|             Clock.AlarmAt(DateTime.Now + new TimeSpan(TimeSpan.TicksPerSecond * 3), GetAssetVersionFile); | 
|         } | 
|     } | 
|   | 
|     private static void BeginCheckAssets() | 
|     { | 
|         bool checkStream = true; | 
| #if UNITY_EDITOR | 
|         if (InGameDownTestUtility.enable && !InGameDownTestUtility.isReadStreamingAssets) | 
|             checkStream = false; | 
| #endif | 
|   | 
|         ThreadPool.QueueUserWorkItem( | 
|             (object aaa) => | 
|             { | 
|                 foreach (var assetVersion in assetVersions.Values) | 
|                 { | 
|                     bool checkReuslt; | 
|                     if (checkStream) | 
|                     { | 
|                         AssetVersion localAssetVersion = null; | 
|                         localAssetVersions.TryGetValue(assetVersion.relativePath, out localAssetVersion); | 
|                         checkReuslt = assetVersion.CheckLocalFileValid(localAssetVersion); | 
|                     } | 
|                     else | 
|                     { | 
|                         checkReuslt = assetVersion.CheckLocalFileValid(false); | 
|                     } | 
|                     if (!checkReuslt) | 
|                     { | 
|                         if (assetVersion.IsPriorAsset()) | 
|                         { | 
|                             priorDownLoadAssetVersions.Add(assetVersion); | 
|                         } | 
|                         else | 
|                         { | 
|                             unpriorDownLoadAssetVersions.Add(assetVersion); | 
|                         } | 
|   | 
|                         assetVersion.localValid = false; | 
|                     } | 
|                     else | 
|                     { | 
|                         assetVersion.localValid = true; | 
|                     } | 
|                 } | 
|   | 
|                 m_PriorAssetDownLoadDone = priorDownLoadAssetVersions.Count <= 0; | 
|                 m_UnPriorAssetDownLoadDone = unpriorDownLoadAssetVersions.Count <= 0; | 
|   | 
|                 checkAssetCompleted = true; | 
|             } | 
|             ); | 
|     } | 
|   | 
|     public static void BeginDownLoadTask(bool _prior) | 
|     { | 
|         if (_prior) | 
|         { | 
|             m_PriorAssetDownLoadDone = false; | 
|             DownLoadAndDiscompressTask.Instance.Prepare(priorDownLoadAssetVersions, () => { m_PriorAssetDownLoadDone = true; }); | 
|         } | 
|         else | 
|         { | 
|             m_UnPriorAssetDownLoadDone = false; | 
|             InGameDownLoad.Instance.AssignTasks(unpriorDownLoadAssetVersions, () => | 
|             { | 
|                 m_UnPriorAssetDownLoadDone = true; | 
|                 hasDownLoadFullAsset = true; | 
|             }); | 
|         } | 
|     } | 
|   | 
|     public static Dictionary<string, AssetVersion> UpdateAssetVersions(string _assetVersionFile) | 
|     { | 
|         InitPackageVersionInfo(); | 
|         var lines = _assetVersionFile.Split(new string[] { FileExtersion.lineSplit }, StringSplitOptions.RemoveEmptyEntries); | 
|         assetVersions.Clear(); | 
|         for (int i = 0; i < lines.Length; i++) | 
|         { | 
|             var assetVersion = new AssetVersion(lines[i]); | 
|             assetVersions[assetVersion.relativePath] = assetVersion; | 
|         } | 
|         return assetVersions; | 
|     } | 
|   | 
|     static void InitPackageVersionInfo() | 
|     { | 
|         var text = Resources.Load<TextAsset>("AssetsVersionCmp"); | 
|         if (text != null) | 
|         { | 
|             var lines = text.text.Split(new string[] { FileExtersion.lineSplit }, StringSplitOptions.RemoveEmptyEntries); | 
|             localAssetVersions.Clear(); | 
|             for (int i = 0; i < lines.Length; i++) | 
|             { | 
|                 var assetVersion = new AssetVersion(lines[i]); | 
|                 localAssetVersions[assetVersion.relativePath] = assetVersion; | 
|             } | 
|         } | 
|     } | 
|   | 
|     public static AssetVersion GetAssetVersion(string assetKey) | 
|     { | 
|         if (assetVersions.ContainsKey(assetKey)) | 
|         { | 
|             return assetVersions[assetKey]; | 
|         } | 
|         else | 
|         { | 
|             return null; | 
|         } | 
|     } | 
|   | 
|     public static Dictionary<string, AssetVersion> GetVersionsInfo() | 
|     { | 
|         return assetVersions; | 
|     } | 
|   | 
|     public static bool IsAssetValid(string assetKey) | 
|     { | 
|         assetKey = EncodeFileName(assetKey); | 
|         if (assetVersions.ContainsKey(assetKey)) | 
|         { | 
|             return assetVersions[assetKey].localValid; | 
|         } | 
|         else | 
|         { | 
|             if (VersionUtility.Instance.NeedDownAsset()) | 
|             { | 
|                 return false; | 
|             } | 
|             else | 
|             { | 
|                 return true; | 
|             } | 
|         } | 
|     } | 
|   | 
|     public static bool IsSceneAssetValid(int mapId, int lineId) | 
|     { | 
|         // if (AssetSource.sceneFromEditor || mapId < 100) | 
|         // { | 
|         //     return true; | 
|         // } | 
|   | 
|         // var dataMapId = MapUtility.GetDataMapId(mapId); | 
|         // lineId = MapUtility.GetLineId(mapId, lineId); | 
|         // var mapResConfig = MapResourcesConfig.GetConfig(dataMapId, lineId); | 
|         // if (mapResConfig == null) | 
|         // { | 
|         //     return false; | 
|         // } | 
|   | 
|         // if (!IsAssetValid(StringUtility.Contact("maps/", mapResConfig.MapResources.ToLower()))) | 
|         // { | 
|         //     return false; | 
|         // } | 
|   | 
|         // if (dataMapId != 10010) | 
|         // { | 
|         //     ActorShowConfig actorShowConfig = null; | 
|         //     if (ActorShowConfig.GetActoreShowConfigByMapIdAndLineId(dataMapId, lineId, out actorShowConfig)) | 
|         //     { | 
|         //         var npcs = actorShowConfig.showNpcs; | 
|         //         foreach (var item in npcs) | 
|         //         { | 
|         //             if (item == 1) | 
|         //             { | 
|         //                 continue; | 
|         //             } | 
|   | 
|         //             var npcConfig = NPCConfig.Get(item); | 
|         //             if (npcConfig != null) | 
|         //             { | 
|         //                 var assetbundleName = StringUtility.Contact("prefab_race_", npcConfig.MODE.ToLower()); | 
|         //                 if (!IsAssetValid(StringUtility.Contact("gmodels/", assetbundleName))) | 
|         //                 { | 
|         //                     return false; | 
|         //                 } | 
|         //             } | 
|         //         } | 
|         //     } | 
|         // } | 
|   | 
|         return true; | 
|     } | 
|   | 
|     //将文件名倒序,加上_aop后缀 | 
|     public static string EncodeFileName(string name) | 
|     { | 
|         return name; | 
|         //name = name.Replace("\\", "/"); | 
|         //int index = name.LastIndexOf("/"); | 
|         //string headString; | 
|         //if (index >= 0) | 
|         //{ | 
|         //    int dotLastIndex = name.LastIndexOf("."); | 
|         //    if (dotLastIndex == -1) | 
|         //    { | 
|         //        headString = name.Substring(0, index); | 
|         //        name = name.Substring(index + 1); | 
|         //        return StringUtility.Contact(headString, "/", new string(name.Reverse().ToArray()), "_aop"); | 
|         //    } | 
|         //    else | 
|         //    { | 
|         //        headString = name.Substring(0, index); | 
|         //        var ext = name.Substring(dotLastIndex); | 
|         //        name = name.Substring(index + 1, dotLastIndex - index - 1); | 
|         //        return StringUtility.Contact(headString, "/", new string(name.Reverse().ToArray()), "_aop", ext); | 
|         //    } | 
|         //} | 
|         //else | 
|         //{ | 
|         //    int dotLastIndex = name.LastIndexOf("."); | 
|         //    if (dotLastIndex == -1) | 
|         //        return StringUtility.Contact(new string(name.Reverse().ToArray()), "_aop"); | 
|         //    else | 
|         //    { | 
|         //        var ext = name.Substring(dotLastIndex); | 
|         //        name = name.Substring(0, dotLastIndex); | 
|         //        return StringUtility.Contact(new string(name.Reverse().ToArray()), "_aop", ext); | 
|         //    } | 
|         //} | 
|   | 
|     } | 
|   | 
|     public static string DecodeFileName(string name) | 
|     { | 
|         return name; | 
|         //name = name.Replace("\\", "/"); | 
|         //int index = name.LastIndexOf("/"); | 
|         //string headString; | 
|         //if (index >= 0) | 
|         //{ | 
|         //    int dotLastIndex = name.LastIndexOf("."); | 
|         //    if (dotLastIndex == -1) | 
|         //    { | 
|         //        headString = name.Substring(0, index); | 
|         //        name = name.Substring(index + 1); | 
|         //        return StringUtility.Contact(headString, "/", new string(name.Replace("_aop", "").Reverse().ToArray())); | 
|         //    } | 
|         //    else | 
|         //    { | 
|         //        headString = name.Substring(0, index); | 
|         //        var ext = name.Substring(dotLastIndex); | 
|         //        name = name.Substring(index + 1, dotLastIndex - index - 1); | 
|         //        return StringUtility.Contact(headString, "/", new string(name.Replace("_aop", "").Reverse().ToArray()), ext); | 
|         //    } | 
|         //} | 
|         //else | 
|         //{ | 
|         //    int dotLastIndex = name.LastIndexOf("."); | 
|         //    if (dotLastIndex == -1) | 
|         //        return new string(name.Replace("_aop", "").Reverse().ToArray()); | 
|         //    else | 
|         //    { | 
|         //        var ext = name.Substring(dotLastIndex); | 
|         //        name = name.Substring(0, dotLastIndex); | 
|         //        return new string(name.Replace("_aop", "").Reverse().ToArray()) + ext; | 
|         //    } | 
|         //} | 
|     } | 
|   | 
|   | 
|     public static string GetAssetFilePath(string _assetKey, bool reverse = true) | 
|     { | 
|         if (reverse) | 
|             _assetKey = EncodeFileName(_assetKey); | 
|         var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); | 
|         if (!File.Exists(path)) | 
|         { | 
|             path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); | 
|         } | 
|   | 
|         return path; | 
|     } | 
|   | 
|     public static string GetBuiltInAssetFilePath(string _assetKey, bool reverse = true) | 
|     { | 
|         if (reverse) | 
|             _assetKey = EncodeFileName(_assetKey); | 
|         var path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, _assetKey); | 
|         if (!File.Exists(path)) | 
|         { | 
|             path = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, _assetKey); | 
|         } | 
|   | 
|         return path; | 
|     } | 
|   | 
|     public static bool IsUnpriorAssetDownLoadOk() | 
|     { | 
|         if (VersionUtility.Instance.NeedDownAsset()) | 
|         { | 
|             return unPriorAssetDownLoadDone; | 
|         } | 
|         else | 
|         { | 
|             return true; | 
|         } | 
|     } | 
|   | 
|   | 
| } |