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(DownloadHotTask 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; 
 | 
            DownLoadAndDiscompressHotTask.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; 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |