コード例 #1
0
 internal MutationContext(DiContainer container, SceneDecoratorContext decoratorContext, List <MonoBehaviour> monoBehaviourList)
 {
     Container         = container;
     _decoratorContext = decoratorContext;
     if (decoratorContext != null)
     {
         _monoBehaviourList = Accessors.Injectables(ref decoratorContext);
     }
     else
     {
         _monoBehaviourList = monoBehaviourList;
     }
 }
コード例 #2
0
        private void OneSceneChanged(Scene oldScene, Scene newScene)
        {
            Object.Destroy(Resources.FindObjectsOfTypeAll <UIElementsCreator>().FirstOrDefault()?.gameObject);
            if (newScene.name == MenuSceneName)
            {
                if (_resetNoFail)
                {
                    var resultsViewController =
                        Resources.FindObjectsOfTypeAll <ResultsViewController>().FirstOrDefault();
                    if (resultsViewController != null)
                    {
                        resultsViewController.continueButtonPressedEvent +=
                            ResultsViewControllerOnContinueButtonPressedEvent;
                    }
                }

                if (SpeedSettingsObject != null)
                {
                    return;
                }

                var volumeSettings = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault();

                if (volumeSettings == null)
                {
                    return;
                }

                volumeSettings.gameObject.SetActive(false);
                SpeedSettingsObject = Object.Instantiate(volumeSettings.gameObject);
                SpeedSettingsObject.SetActive(false);
                volumeSettings.gameObject.SetActive(true);

                if (SpeedSettingsObject == null)
                {
                    return;
                }

                var volume = SpeedSettingsObject.GetComponent <VolumeSettingsController>();
                ReflectionUtil.CopyComponent(volume, typeof(IncDecSettingsController),
                                             typeof(SpeedSettingsController), SpeedSettingsObject);
                Object.DestroyImmediate(volume);

                SpeedSettingsObject.GetComponentInChildren <TMP_Text>().text = "SPEED";
                Object.DontDestroyOnLoad(SpeedSettingsObject);


                //NJS Object
                if (NjsSettingsObject != null)
                {
                    return;
                }

                var volumeSettings2 = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault();

                if (volumeSettings2 == null)
                {
                    return;
                }

                volumeSettings2.gameObject.SetActive(false);
                NjsSettingsObject = Object.Instantiate(volumeSettings2.gameObject);
                NjsSettingsObject.SetActive(false);
                volumeSettings2.gameObject.SetActive(true);

                if (NjsSettingsObject == null)
                {
                    return;
                }

                var volume2 = NjsSettingsObject.GetComponent <VolumeSettingsController>();
                ReflectionUtil.CopyComponent(volume2, typeof(IncDecSettingsController),
                                             typeof(NjsSettingsController), NjsSettingsObject);
                Object.DestroyImmediate(volume2);

                NjsSettingsObject.GetComponentInChildren <TMP_Text>().text = "NJS";
                Object.DontDestroyOnLoad(NjsSettingsObject);


                //Spawn Offset Object
                if (SpawnOffsetSettingsObject != null)
                {
                    return;
                }

                var volumeSettings3 = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault();

                if (volumeSettings3 == null)
                {
                    return;
                }

                volumeSettings3.gameObject.SetActive(false);
                SpawnOffsetSettingsObject = Object.Instantiate(volumeSettings3.gameObject);
                SpawnOffsetSettingsObject.SetActive(false);
                volumeSettings3.gameObject.SetActive(true);

                if (SpawnOffsetSettingsObject == null)
                {
                    return;
                }

                var volume3 = SpawnOffsetSettingsObject.GetComponent <VolumeSettingsController>();
                ReflectionUtil.CopyComponent(volume3, typeof(IncDecSettingsController),
                                             typeof(SpawnOffsetController), SpawnOffsetSettingsObject);
                Object.DestroyImmediate(volume3);

                SpawnOffsetSettingsObject.GetComponentInChildren <TMP_Text>().text = "Spawn Offset";
                Object.DontDestroyOnLoad(SpawnOffsetSettingsObject);
            }
            else if (newScene.name == GameSceneName)
            {
                CustomEffectPoolsInstaller customEffectPoolsInstaller = null;
                var effectPoolsInstaller = Resources.FindObjectsOfTypeAll <EffectPoolsInstaller>().FirstOrDefault();
                if (effectPoolsInstaller != null)
                {
                    customEffectPoolsInstaller = (CustomEffectPoolsInstaller)ReflectionUtil.CopyComponent(effectPoolsInstaller,
                                                                                                          typeof(EffectPoolsInstaller), typeof(CustomEffectPoolsInstaller), effectPoolsInstaller.gameObject);
                }

                SceneContext          sceneContext          = null;
                SceneDecoratorContext sceneDecoratorContext = null;
                try
                {
                    Console.WriteLine("Custom effect Pool Installer Made");
                    foreach (var gameObject in newScene.GetRootGameObjects())
                    {
                        if (sceneContext == null)
                        {
                            sceneContext = gameObject.GetComponentInChildren <SceneContext>(true);
                        }
                    }

                    foreach (var gameObject in SceneManager.GetSceneByName(ContextSceneName).GetRootGameObjects())
                    {
                        if (sceneDecoratorContext == null)
                        {
                            sceneDecoratorContext = gameObject.GetComponentInChildren <SceneDecoratorContext>(true);
                        }
                    }


                    if (sceneContext != null && sceneDecoratorContext != null)
                    {
                        var prop           = typeof(Context).GetField("_installers", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                        var installersList = (List <MonoInstaller>)prop.GetValue(sceneDecoratorContext);
                        installersList.Remove(effectPoolsInstaller);
                        Object.DestroyImmediate(effectPoolsInstaller);
                        installersList.Add(customEffectPoolsInstaller);
                        Console.WriteLine("Custom effect Pool Installer Added");
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }


                if (_levelData == null)
                {
                    _levelData = Resources.FindObjectsOfTypeAll <StandardLevelSceneSetupDataSO>().FirstOrDefault();
                    if (_levelData == null)
                    {
                        return;
                    }
                    _levelData.didFinishEvent += MainGameSceneSetupDataOnDidFinishEvent;
                }

                if (_spawnController == null)
                {
                    _spawnController = Resources.FindObjectsOfTypeAll <BeatmapObjectSpawnController>().FirstOrDefault();
                }


                if (_lastLevelId != _levelData.difficultyBeatmap.level.levelID &&
                    !string.IsNullOrEmpty(_lastLevelId))
                {
                    PlayingNewSong      = true;
                    HasTimeScaleChanged = false;
                    TimeScale           = 1;
                    _lastLevelId        = _levelData.difficultyBeatmap.level.levelID;
                }
                else
                {
                    PlayingNewSong = false;
                }

                if (IsEqualToOne(TimeScale))
                {
                    HasTimeScaleChanged = false;
                }

                _lastLevelId        = _levelData.difficultyBeatmap.level.levelID;
                _gameCoreSceneSetup = Resources.FindObjectsOfTypeAll <GameplayCoreSceneSetup>().FirstOrDefault();
                AudioTimeSync       = Resources.FindObjectsOfTypeAll <AudioTimeSyncController>().FirstOrDefault();
                _songAudio          = AudioTimeSync.GetPrivateField <AudioSource>("_audioSource");
                _mixer       = _gameCoreSceneSetup.GetPrivateField <AudioMixerSO>("_audioMixer");
                PracticeMode = (_levelData.gameplayCoreSetupData.practiceSettings != null && !BS_Utils.Gameplay.Gamemode.IsIsolatedLevel);
                //Check if Multiplayer is active, disable accordingly
                if (PluginManager.Plugins.Any(x => x.Name == "Beat Saber Multiplayer"))
                {
                    GameObject client = GameObject.Find("MultiplayerClient");
                    if (client != null)
                    {
                        Console.WriteLine("[PracticePlugin] Found MultiplayerClient game object!");
                        multiActive = true;
                    }
                    else
                    {
                        Console.WriteLine("[PracticePlugin] MultiplayerClient game object not found!");
                    }
                }
                if (multiActive == true)
                {
                    PracticeMode = false;
                }


                if (!PracticeMode)
                {
                    TimeScale = Mathf.Clamp(TimeScale, 1, SpeedMaxSize);
                }
                if (PracticeMode)
                {
                    if (_levelData.gameplayCoreSetupData.practiceSettings.songSpeedMul != 1f)
                    {
                        _timeScale = _levelData.gameplayCoreSetupData.practiceSettings.songSpeedMul;
                    }
                    else
                    {
                        _timeScale = _levelData.gameplayCoreSetupData.gameplayModifiers.songSpeedMul;
                    }
                    SharedCoroutineStarter.instance.StartCoroutine(DelayedUI());
                }
            }
        }
コード例 #3
0
ファイル: ZenjectManager.cs プロジェクト: Auros/Bepinject
        public static void Install(Context context, Scene scene)
        {
            if (zenjectors.Count() == 0)
            {
                return;
            }

            List <Zenjector> zenjectorsToInstall = new List <Zenjector>();
            bool             isDecorator         = context is SceneDecoratorContext;
            bool             isProject           = context is ProjectContext;
            bool             isScene             = context is SceneContext;

            SceneDecoratorContext sdc = (context as SceneDecoratorContext) !;
            ProjectContext        pc  = (context as ProjectContext) !;
            SceneContext          sc  = (context as SceneContext) !;

            if (isProject)
            {
                context.Container.Bind <BepInLogManager>().AsSingle();
                context.Container.Bind <BepInConfigManager>().AsSingle();
                context.Container.Bind <BepInPluginManager>().AsSingle();
                context.Container.Bind <BepInLog>().AsTransient().OnInstantiated <BepInLog>((ctx, bepinLogger) =>
                {
                    var logManager = ctx.Container.Resolve <BepInLogManager>();
                    var logger     = logManager.LoggerFromAssembly(ctx.ObjectType.Assembly);
                    bepinLogger.Setup(logger.logger);
                });
                context.Container.Bind <BepInConfig>().AsTransient().OnInstantiated <BepInConfig>((ctx, bepinConfig) =>
                {
                    var configManager = ctx.Container.Resolve <BepInConfigManager>();
                    var config        = configManager.ConfigFromAssembly(ctx.ObjectType.Assembly);
                    bepinConfig.Setup(config.config);
                });
                context.Container.Bind <BepInPluginInfo>().AsTransient().OnInstantiated <BepInPluginInfo>((ctx, bepinPlugin) =>
                {
                    var pluginManager = ctx.Container.Resolve <BepInPluginManager>();
                    var plugin        = pluginManager.PluginFromAssembly(ctx.ObjectType.Assembly);
                    bepinPlugin.Setup(plugin.plugin);
                });
            }

            foreach (var zenjector in zenjectors)
            {
                if (zenjector.binder.conditionalCallback != null && !zenjector.binder.conditionalCallback.Invoke())
                {
                    continue;
                }

                if (isProject && zenjector.binder.onProject)
                {
                    zenjectorsToInstall.Add(zenjector);
                    continue;
                }

                if (isDecorator && zenjector.binder.contractNames != null && sdc.DecoratedContractName != null && zenjector.binder.contractNames.Contains(sdc.DecoratedContractName))
                {
                    zenjectorsToInstall.Add(zenjector);
                    continue;
                }

                if (zenjector.binder.sceneNames != null && zenjector.binder.sceneNames.Contains(scene.name))
                {
                    zenjectorsToInstall.Add(zenjector);
                    continue;
                }
            }

            if (zenjectorsToInstall.Count == 0)
            {
                return;
            }

            var rootGameObjects = context.GetRootGameObjects();
            var collectiveAdditiveGameObjects = rootGameObjects.SelectMany(go => go.GetComponents <Behaviour>());

            foreach (var zenjector in zenjectorsToInstall)
            {
                if (zenjector.binder.pseudoCallback != null)
                {
                    zenjector.binder.pseudoCallback?.Invoke(context, context.Container);
                }

                if (zenjector.binder.rootInjectionTypes != null && isScene)
                {
                    foreach (var rootObjectType in zenjector.binder.rootInjectionTypes)
                    {
                        var mb = collectiveAdditiveGameObjects.FirstOrDefault(mb => mb != null && mb.GetType() == rootObjectType);
                        if (mb != null)
                        {
                            if (!context.Container !.HasBinding(rootObjectType))
                            {
                                context.Container.Bind(rootObjectType).FromInstance(mb).AsSingle();
                            }
                        }
                        else
                        {
                            Plugin.Log.LogWarning($"While installing an installer from '{zenjector.owner.FullName}', there was no root component with the type of '{rootObjectType.Name}', so it can't be binded to the container.");
                        }
                    }
                }

                List <IInstaller> constructedInstallers = new List <IInstaller>();
                if (zenjector.binder.installerTypes != null)
                {
                    foreach (var installerType in zenjector.binder.installerTypes)
                    {
                        if (installerType.IsSubclassOf(typeof(MonoInstallerBase)))
                        {
                            var monoInstallers = context.Installers.ToList();
                            monoInstallers.Add(context.gameObject.AddComponent(installerType) as MonoInstaller);
                            context.Installers = monoInstallers;
                        }
                        else if (installerType.IsSubclassOf(typeof(InstallerBase)))
                        {
                            context !.AddNormalInstallerType(installerType);
                        }
                        else
                        {
                            Assert.CreateException($"Provided type is not an installer type '{installerType.FullName}'.");
                        }
                    }
                }
            }
        }
コード例 #4
0
        private void SceneManagerOnSceneLoaded(Scene scene, LoadSceneMode mode)
        {
            if (scene.name == MenuSceneName)
            {
                if (_resetNoFail)
                {
                    var resultsViewController =
                        Resources.FindObjectsOfTypeAll <ResultsViewController>().FirstOrDefault();
                    if (resultsViewController != null)
                    {
                        resultsViewController.continueButtonPressedEvent +=
                            ResultsViewControllerOnContinueButtonPressedEvent;
                    }
                }

                if (SettingsObject != null)
                {
                    return;
                }

                var volumeSettings = Resources.FindObjectsOfTypeAll <VolumeSettingsController>().FirstOrDefault();

                if (volumeSettings == null)
                {
                    return;
                }

                volumeSettings.gameObject.SetActive(false);
                SettingsObject = Object.Instantiate(volumeSettings.gameObject);
                SettingsObject.SetActive(false);
                volumeSettings.gameObject.SetActive(true);

                if (SettingsObject == null)
                {
                    return;
                }

                var volume = SettingsObject.GetComponent <VolumeSettingsController>();
                ReflectionUtil.CopyComponent(volume, typeof(IncDecSettingsController),
                                             typeof(SpeedSettingsController), SettingsObject);
                Object.DestroyImmediate(volume);

                SettingsObject.GetComponentInChildren <TMP_Text>().text = "SPEED";
                Object.DontDestroyOnLoad(SettingsObject);
            }
            else if (scene.name == GameSceneName)
            {
                CustomEffectPoolsInstaller customEffectPoolsInstaller = null;
                var effectPoolsInstaller = Resources.FindObjectsOfTypeAll <EffectPoolsInstaller>().FirstOrDefault();
                if (effectPoolsInstaller != null)
                {
                    customEffectPoolsInstaller = (CustomEffectPoolsInstaller)ReflectionUtil.CopyComponent(effectPoolsInstaller,
                                                                                                          typeof(EffectPoolsInstaller), typeof(CustomEffectPoolsInstaller), effectPoolsInstaller.gameObject);
                }

                SceneContext          sceneContext          = null;
                SceneDecoratorContext sceneDecoratorContext = null;

                foreach (var gameObject in scene.GetRootGameObjects())
                {
                    if (sceneContext == null)
                    {
                        sceneContext = gameObject.GetComponentInChildren <SceneContext>(true);
                    }
                }

                foreach (var gameObject in SceneManager.GetSceneByName(ContextSceneName).GetRootGameObjects())
                {
                    if (sceneDecoratorContext == null)
                    {
                        sceneDecoratorContext = gameObject.GetComponentInChildren <SceneDecoratorContext>(true);
                    }
                }


                if (sceneContext != null && sceneDecoratorContext != null)
                {
                    var prop           = typeof(Context).GetField("_installers", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
                    var installersList = (List <MonoInstaller>)prop.GetValue(sceneDecoratorContext);
                    installersList.Remove(effectPoolsInstaller);
                    Object.DestroyImmediate(effectPoolsInstaller);
                    installersList.Add(customEffectPoolsInstaller);
                }

                if (_mainGameSceneSetupData == null)
                {
                    _mainGameSceneSetupData = Resources.FindObjectsOfTypeAll <MainGameSceneSetupData>().FirstOrDefault();
                    if (_mainGameSceneSetupData == null)
                    {
                        return;
                    }
                    _mainGameSceneSetupData.didFinishEvent += MainGameSceneSetupDataOnDidFinishEvent;
                }

                if (_lastLevelId != _mainGameSceneSetupData.difficultyLevel.level.levelID &&
                    !string.IsNullOrEmpty(_lastLevelId))
                {
                    PlayingNewSong      = true;
                    HasTimeScaleChanged = false;
                    TimeScale           = 1;
                    _lastLevelId        = _mainGameSceneSetupData.difficultyLevel.level.levelID;
                }
                else
                {
                    PlayingNewSong = false;
                }

                if (IsEqualToOne(TimeScale))
                {
                    HasTimeScaleChanged = false;
                }

                _lastLevelId = _mainGameSceneSetupData.difficultyLevel.level.levelID;

                AudioTimeSync = Resources.FindObjectsOfTypeAll <AudioTimeSyncController>().FirstOrDefault();
                _songAudio    = AudioTimeSync.GetPrivateField <AudioSource>("_audioSource");
                NoFail        = !_mainGameSceneSetupData.gameplayOptions.validForScoreUse;

                if (!NoFail)
                {
                    TimeScale = Mathf.Clamp(TimeScale, 1, MaxSize);
                }

                var canvas = Resources.FindObjectsOfTypeAll <HorizontalLayoutGroup>()
                             .FirstOrDefault(x => x.name == "Buttons")
                             ?.transform.parent;

                if (canvas == null)
                {
                    return;
                }

                _uiElementsCreator = canvas.gameObject.AddComponent <UIElementsCreator>();
                _uiElementsCreator.ValueChangedEvent += UIElementsCreatorOnValueChangedEvent;
                _uiElementsCreator.Init();
                TimeScale = TimeScale;
            }
        }
コード例 #5
0
ファイル: MutationContext.cs プロジェクト: nicoco007/SiraUtil
 internal MutationContext(DiContainer container, SceneDecoratorContext decoratorContext)
 {
     Container         = container;
     _decoratorContext = decoratorContext;
 }