private static bool LoadModdedBundlesPatch(string bundle, ref AnvilCallback <AssetBundle> __result) { if (ManagedBundles.ContainsKey(bundle)) { //If this is a modded bundle, we should first check if the bundle is already loaded AnvilCallbackBase anvilCallbackBase; if (AnvilManager.m_bundles.TryGetValue(bundle, out anvilCallbackBase)) { OtherLogger.Log("Tried to load modded asset bundle, and it's already loaded : " + bundle, OtherLogger.LogType.Loading); __result = anvilCallbackBase as AnvilCallback <AssetBundle>; return(false); } //If the bundle is not already loaded, then load it else { OtherLogger.Log("Tried to load modded asset bundle, and it's not yet loaded : " + bundle, OtherLogger.LogType.Loading); AnvilCallback <AssetBundle> mainCallback = LoaderUtils.LoadAssetBundle(ManagedBundles[bundle]); List <BundleInfo> dependencies = LoaderStatus.GetBundleDependencies(bundle); if (dependencies.Count > 0) { OtherLogger.Log("Dependencies:", OtherLogger.LogType.Loading); dependencies.ForEach(o => OtherLogger.Log(ManagedBundles[o.BundleID], OtherLogger.LogType.Loading)); //Start with the last dependency, and loop through from second to last dep up to the first dep //The first dep in the list is the dependency for all other dependencies, so it is the deepest AnvilCallback <AssetBundle> dependency = LoaderUtils.LoadAssetBundle(ManagedBundles[dependencies.Last().BundleID]); mainCallback.m_dependancy = dependency; AnvilManager.m_bundles.Add(dependencies.Last().BundleID, dependency); for (int i = dependencies.Count - 2; i >= 0; i--) { dependency.m_dependancy = LoaderUtils.LoadAssetBundle(ManagedBundles[dependencies[i].BundleID]); dependency = dependency.m_dependancy; AnvilManager.m_bundles.Add(dependencies[i].BundleID, dependency); } } __result = mainCallback; AnvilManager.m_bundles.Add(bundle, __result); return(false); } } return(true); }
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); } }