public IEnumerator StartAssetLoad(FileSystemInfo handle, LoadOrderType loadOrder, bool allowUnload) { FileInfo file = handle.ConsumeFile(); string bundleID = file.FullName.Replace(file.Name, "") + " : " + file.Name; return(LoadAssetsFromPathAsync(file.FullName, bundleID, "", new string[] { }, loadOrder, allowUnload).TryCatch(e => { OtherLogger.LogError("Failed to load mod (" + bundleID + ")"); OtherLogger.LogError(e.ToString()); LoaderStatus.UpdateProgress(bundleID, 1); LoaderStatus.RemoveActiveLoader(bundleID, true); })); }
public void LoadLegacyAssets(CoroutineStarter starter) { if (!Directory.Exists(OtherLoader.MainLegacyDirectory)) { Directory.CreateDirectory(OtherLoader.MainLegacyDirectory); } OtherLogger.Log("Plugins folder found (" + Paths.PluginPath + ")", OtherLogger.LogType.General); List <string> legacyPaths = Directory.GetDirectories(Paths.PluginPath, "LegacyVirtualObjects", SearchOption.AllDirectories).ToList(); legacyPaths.Add(OtherLoader.MainLegacyDirectory); foreach (string legacyPath in legacyPaths) { OtherLogger.Log("Legacy folder found (" + legacyPath + ")", OtherLogger.LogType.General); foreach (string bundlePath in Directory.GetFiles(legacyPath, "*", SearchOption.AllDirectories)) { //Only allow files without file extensions to be loaded (assumed to be an asset bundle) if (Path.GetFileName(bundlePath) != Path.GetFileNameWithoutExtension(bundlePath)) { continue; } string bundleID = bundlePath.Replace(Path.GetFileName(bundlePath), "") + " : " + Path.GetFileName(bundlePath); IEnumerator routine = LoadAssetsFromPathAsync(bundlePath, bundleID, "", new string[] { }, LoadOrderType.LoadUnordered, true).TryCatch <Exception>(e => { OtherLogger.LogError("Failed to load mod (" + bundleID + ")"); OtherLogger.LogError(e.ToString()); LoaderStatus.UpdateProgress(bundleID, 1); LoaderStatus.RemoveActiveLoader(bundleID, true); }); starter(routine); } } }
public IEnumerator StartAssetLoadDirect(string folderPath, string bundleName, string guid, string[] dependancies, LoadOrderType loadOrder, bool allowUnload) { OtherLogger.Log("Direct Loading Bundle (" + bundleName + ")", OtherLogger.LogType.General); string bundlePath = Path.Combine(folderPath, bundleName); string lateName = "late_" + bundleName; string latePath = Path.Combine(folderPath, lateName); string bundleID = bundlePath.Replace(bundleName, "") + " : " + bundleName; IEnumerator afterLoad = null; if (File.Exists(latePath)) { afterLoad = RegisterAssetLoadLate(latePath, lateName, loadOrder); } return(LoadAssetsFromPathAsync(bundlePath, bundleID, guid, dependancies, loadOrder, allowUnload, afterLoad).TryCatch(e => { OtherLogger.LogError("Failed to load mod (" + bundleID + ")"); OtherLogger.LogError(e.ToString()); LoaderStatus.UpdateProgress(bundleID, 1); LoaderStatus.RemoveActiveLoader(bundleID, 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); } }