コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }