public IEnumerator RegisterAssetLoadLate(string bundlePath, string bundleName, LoadOrderType loadOrder) { //In order to get this bundle to load later, we want to replace the file path for the already loaded FVRObject string bundleID = bundlePath.Replace(bundleName, "") + " : " + bundleName.Replace("late_", ""); OtherLoader.ManagedBundles[bundleID] = bundlePath; LoaderStatus.TrackLoader(bundleID, loadOrder); AnvilCallbackBase anvilCallbackBase; if (AnvilManager.m_bundles.TryGetValue(bundleID, out anvilCallbackBase)) { AnvilManager.m_bundles.m_lookup.Remove(bundleID); AnvilManager.m_bundles.m_loading.Remove(anvilCallbackBase); if (OtherLoader.LogLoading.Value) { OtherLogger.Log("Registered asset bundle to load later (" + bundlePath + ")", OtherLogger.LogType.General); OtherLogger.Log("This bundle will replace the data bundle (" + bundleID + ")", OtherLogger.LogType.Loading); } else { OtherLogger.Log("Registered asset bundle to load later (" + bundleName + ")", OtherLogger.LogType.General); OtherLogger.Log("This bundle will replace the data bundle (" + LoaderUtils.GetBundleNameFromUniqueID(bundleID) + ")", OtherLogger.LogType.Loading); } } else { OtherLogger.LogError("Tried to register bundle to load later, but pre-bundle had not yet been loaded! (" + bundleID + ")"); } yield return(null); }
private IEnumerator LoadAssetsFromPathAsync(string path, string bundleID, string guid, string[] dependancies, LoadOrderType loadOrder, bool allowUnload, IEnumerator afterLoad = null) { //Start tracking this bundle and then wait a frame for everything else to be tracked LoaderStatus.TrackLoader(bundleID, loadOrder); yield return(null); //If there are many active loaders at once, we should wait our turn bool overTime = false; while (!LoaderStatus.CanOrderedModLoad(bundleID)) { if (!overTime && Time.time - LoaderStatus.LastLoadEventTime > 30) { OtherLogger.Log("Bundle has been waiting a long time to load! (" + bundleID + ")", OtherLogger.LogType.General); LoaderStatus.PrintWaitingBundles(bundleID); overTime = true; } yield return(null); } //Begin the loading process LoaderStatus.AddActiveLoader(bundleID); if (OtherLoader.LogLoading.Value) { OtherLogger.Log("Beginning async loading of asset bundle (" + bundleID + ")", OtherLogger.LogType.General); } //Load the bundle and apply it's contents float time = Time.time; LoaderStatus.UpdateProgress(bundleID, UnityEngine.Random.Range(.1f, .3f)); AnvilCallback <AssetBundle> bundle = LoaderUtils.LoadAssetBundle(path); yield return(bundle); LoaderStatus.UpdateProgress(bundleID, 0.9f); yield return(ApplyLoadedAssetBundleAsync(bundle, bundleID).TryCatch(e => { OtherLogger.LogError("Failed to load mod (" + bundleID + ")"); OtherLogger.LogError(e.ToString()); LoaderStatus.UpdateProgress(bundleID, 1); LoaderStatus.RemoveActiveLoader(bundleID, true); })); //Log that the bundle is loaded if (OtherLoader.LogLoading.Value) { OtherLogger.Log($"[{(Time.time - time).ToString("0.000")} s] Completed loading bundle ({bundleID})", OtherLogger.LogType.General); } else { OtherLogger.Log($"[{(Time.time - time).ToString("0.000")} s] Completed loading bundle ({LoaderUtils.GetBundleNameFromUniqueID(bundleID)})", OtherLogger.LogType.General); } if (allowUnload && OtherLoader.OptimizeMemory.Value) { OtherLogger.Log("Unloading asset bundle (Optimize Memory is true)", OtherLogger.LogType.Loading); bundle.Result.Unload(false); } else { AnvilManager.m_bundles.Add(bundleID, bundle); } OtherLoader.ManagedBundles.Add(bundleID, path); LoaderStatus.UpdateProgress(bundleID, 1); LoaderStatus.RemoveActiveLoader(bundleID, !(OtherLoader.OptimizeMemory.Value && allowUnload)); if (afterLoad != null) { yield return(afterLoad); } }