internal MutationContext(DiContainer container, SceneDecoratorContext decoratorContext, List <MonoBehaviour> monoBehaviourList) { Container = container; _decoratorContext = decoratorContext; if (decoratorContext != null) { _monoBehaviourList = Accessors.Injectables(ref decoratorContext); } else { _monoBehaviourList = monoBehaviourList; } }
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()); } } }
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}'."); } } } } }
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; } }
internal MutationContext(DiContainer container, SceneDecoratorContext decoratorContext) { Container = container; _decoratorContext = decoratorContext; }