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); }
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); })); }
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 static IEnumerator HandleLoadingText(ItemSpawnerV2 instance) { //First create the loading text Text text = CreateLoadingText(instance); //Now loop until all items are loaded, while updating the text float progress = LoaderStatus.GetLoaderProgress(); while (progress < 1) { string progressBar = new string('I', (int)(progress * 120)); text.text = "Loading Mods\n" + progressBar; yield return(new WaitForSeconds(1)); progress = LoaderStatus.GetLoaderProgress(); } //Finally destroy the text GameObject.Destroy(text.transform.parent.gameObject); }
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); } }