public ModsCheckResult CheckRequiredMods() { if (requiredMods == null || requiredMods.Count == 0) { return(new ModsCheckResult() { satisfied = true }); } ModsCheckResult result = new ModsCheckResult(); result.missingMods = new List <ModEntry>(); result.oudatedMods = new List <ModEntry>(); result.satisfiedMods = new List <ModEntry>(); result.satisfied = true; foreach (var reqMod in requiredMods) { var mod = IllusionInjector.PluginManager.Plugins.FirstOrDefault(x => x.Name == reqMod.name); if (mod != null) { SemVer.Version version = new SemVer.Version(mod.Version); SemVer.Range range = new SemVer.Range(reqMod.version); if (range.IsSatisfied(version)) { result.satisfiedMods.Add(reqMod); } else { result.oudatedMods.Add(reqMod); result.satisfied = false; } } else { result.missingMods.Add(reqMod); result.satisfied = false; } } return(result); }
private IEnumerator LoadLevelCoroutine(LevelInfo info) { isLoadingLevel = true; loadingProgress = 0f; currentLevel = info; currentStage = 0; if (_loadedAssetBundles.Count > 0) { UnloadAssets(); } ModsCheckResult check = info.metadata.CheckRequiredMods(); if (!check.satisfied) { Console.WriteLine("Unable to load level! Mods requirements not satisfied:"); if (check.missingMods.Count > 0) { Console.WriteLine("Missing mods:"); foreach (var missingMod in check.missingMods) { Console.WriteLine(missingMod); } } if (check.oudatedMods.Count > 0) { Console.WriteLine("Outdated mods:"); foreach (var outdatedMod in check.oudatedMods) { Console.WriteLine(outdatedMod); } } loadingProgress = 0f; isLoadingLevel = false; yield break; } if (_loadingCamera == null) { CreateLoadingCamera(currentLevel.cover); } var task = HashSystem.RecalculateHashForLevel(info); yield return(new WaitUntil(() => task.IsCompleted)); loadingProgress = 0.05f; FileStream stream = File.OpenRead(info.path); stream.Position = info.assetsArchiveOffset; ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read); var assetsManifestRequest = AssetBundle.LoadFromStreamAsync(archive.GetEntry(info.metadata.levelId).ExtractToStream()); while (!assetsManifestRequest.isDone) { loadingProgress = 0.05f + assetsManifestRequest.progress * 0.05f; yield return(null); } loadingProgress = 0.1f; if (assetsManifestRequest.assetBundle == null) { Console.WriteLine("Failed to load AssetBundle!"); loadingProgress = 0f; isLoadingLevel = false; if (_loadingCamera != null) { Destroy(_loadingCamera.gameObject); } yield break; } _loadedAssetBundles.Add(assetsManifestRequest.assetBundle); var manifest = assetsManifestRequest.assetBundle.LoadAsset <AssetBundleManifest>("assetbundlemanifest"); List <string> foundScenes = new List <string>(); int totalBundles = manifest.GetAllAssetBundles().Length; int currentBundle = 0; foreach (var assetBundleName in manifest.GetAllAssetBundles()) { var assetBundleRequest = AssetBundle.LoadFromStreamAsync(archive.Entries.First(x => x.Name.ToLower() == assetBundleName).ExtractToStream()); while (!assetBundleRequest.isDone) { loadingProgress = 0.1f + ((currentBundle + assetBundleRequest.progress) / totalBundles * 0.15f); yield return(null); } if (assetBundleRequest.assetBundle != null) { _loadedAssetBundles.Add(assetBundleRequest.assetBundle); var scenes = assetBundleRequest.assetBundle.GetAllScenePaths(); if (scenes.Length != 0) { foundScenes.AddRange(scenes); Console.WriteLine($"Found {scenes.Length} scenes!"); } } } if (foundScenes.Count == 0) { Console.WriteLine("No scenes found!"); loadingProgress = 0f; isLoadingLevel = false; if (_loadingCamera != null) { Destroy(_loadingCamera.gameObject); } yield break; } Console.WriteLine("Loading scenes..."); var sceneLoadingOperation = SceneManager.LoadSceneAsync(info.metadata.stages[0], LoadSceneMode.Single); while (!sceneLoadingOperation.isDone) { loadingProgress = 0.25f + sceneLoadingOperation.progress * 0.5f; yield return(null); } Console.WriteLine("Loaded custom scene!"); SpawnPrefabs(); }