Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Menu Music Control v1.0.0
MenuMusicControl.dll
Decompiled a year agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using TMPro; using UnityEngine; using UnityEngine.Audio; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Menu Music Control")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Atlas Playbook v0.4.1")] [assembly: AssemblyProduct("Menu Music Control")] [assembly: AssemblyCopyright("Copyright © Atlas Playbook v0.4.1 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("1655f3c0-5a59-4c70-b63a-1bf820828d48")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace MainMenuMusicVolumeMod; [BepInPlugin("seeya.MenuMusicControl", "Menu Music Control", "1.0.0")] public class MainMenuMusicVolumeMod : BaseUnityPlugin { [HarmonyPatch] private static class MenuMusicPatches { [HarmonyPatch(typeof(MenuManager), "Awake")] [HarmonyPrefix] public static void PreAwake(MenuManager __instance) { MainMenuMusicVolumeMod mainMenuMusicVolumeMod = Object.FindObjectOfType<MainMenuMusicVolumeMod>(); if ((Object)(object)mainMenuMusicVolumeMod == (Object)null) { return; } AudioSource[] components = ((Component)__instance).GetComponents<AudioSource>(); AudioSource[] array = components; foreach (AudioSource val in array) { val.volume = mainMenuMusicVolumeMod.volumeConfig.Value; if ((Object)(object)mainMenuMusicVolumeMod.menuMusicSource == (Object)null && val.isPlaying) { mainMenuMusicVolumeMod.menuMusicSource = val; } } Transform val2 = ((Component)__instance).transform.Find("Menu1"); if (!((Object)(object)val2 != (Object)null)) { return; } AudioSource component = ((Component)val2).GetComponent<AudioSource>(); if ((Object)(object)component != (Object)null) { component.volume = mainMenuMusicVolumeMod.volumeConfig.Value; if ((Object)(object)mainMenuMusicVolumeMod.menuMusicSource == (Object)null && component.isPlaying) { mainMenuMusicVolumeMod.menuMusicSource = component; } } } [HarmonyPatch(typeof(MenuManager), "Start")] [HarmonyPrefix] public static void PreStart(MenuManager __instance) { MainMenuMusicVolumeMod mainMenuMusicVolumeMod = Object.FindObjectOfType<MainMenuMusicVolumeMod>(); if ((Object)(object)mainMenuMusicVolumeMod == (Object)null) { return; } AudioSource[] components = ((Component)__instance).GetComponents<AudioSource>(); AudioSource[] array = components; foreach (AudioSource val in array) { val.volume = mainMenuMusicVolumeMod.volumeConfig.Value; if ((Object)(object)mainMenuMusicVolumeMod.menuMusicSource == (Object)null) { mainMenuMusicVolumeMod.menuMusicSource = val; } } Transform val2 = ((Component)__instance).transform.Find("Menu1"); if (!((Object)(object)val2 != (Object)null)) { return; } AudioSource component = ((Component)val2).GetComponent<AudioSource>(); if ((Object)(object)component != (Object)null) { component.volume = mainMenuMusicVolumeMod.volumeConfig.Value; if ((Object)(object)mainMenuMusicVolumeMod.menuMusicSource == (Object)null && component.isPlaying) { mainMenuMusicVolumeMod.menuMusicSource = component; } } } [HarmonyPatch(typeof(MenuManager), "Awake")] [HarmonyPostfix] public static void PatchMainMenuAwake(MenuManager __instance) { MainMenuMusicVolumeMod mainMenuMusicVolumeMod = Object.FindObjectOfType<MainMenuMusicVolumeMod>(); if ((Object)(object)mainMenuMusicVolumeMod == (Object)null || mainMenuMusicVolumeMod.disableSlider.Value) { return; } GameObject val = GameObject.Find("Canvas/MenuContainer"); if (!((Object)(object)val == (Object)null)) { Transform val2 = val.transform.Find("SettingsPanel"); if (!((Object)(object)val2 == (Object)null)) { mainMenuMusicVolumeMod.SetupVolumeSlider(val2); } } } [HarmonyPatch(typeof(AudioSource), "Play", new Type[] { })] [HarmonyPrefix] public static void PreAudioSourcePlay(AudioSource __instance) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) MainMenuMusicVolumeMod mainMenuMusicVolumeMod = Object.FindObjectOfType<MainMenuMusicVolumeMod>(); if ((Object)(object)mainMenuMusicVolumeMod == (Object)null) { return; } Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name == "MainMenu") { __instance.volume = mainMenuMusicVolumeMod.volumeConfig.Value; if (__instance.isPlaying && (Object)(object)mainMenuMusicVolumeMod.menuMusicSource != (Object)(object)__instance) { mainMenuMusicVolumeMod.menuMusicSource = __instance; } } } } public ConfigEntry<float> volumeConfig; public ConfigEntry<bool> disableSlider; private Slider volumeSlider; private Harmony harmony; private bool mainMenuSliderSetup = false; private AudioSource menuMusicSource; private AudioMixer audioMixer; private float pendingVolume = -1f; private bool isDraggingSlider = false; public void Awake() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown volumeConfig = ((BaseUnityPlugin)this).Config.Bind<float>("Main Menu Music", "Volume", 0.5f, new ConfigDescription("Main menu music volume (0.0 to 1.0)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); disableSlider = ((BaseUnityPlugin)this).Config.Bind<bool>("Main Menu Music", "DisableSlider", false, "Set to true to hide the volume slider in the main menu settings. Volume can then only be adjusted via this config file."); harmony = new Harmony("seeya.MenuMusicControl"); harmony.PatchAll(typeof(MenuMusicPatches)); SceneManager.activeSceneChanged += OnSceneChanged; audioMixer = Resources.Load<AudioMixer>("MainMixer"); ApplyVolumeToMenuMusic(volumeConfig.Value); } private void Start() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name == "MainMenu") { ApplyVolumeToMenuMusic(volumeConfig.Value); } } private void OnDestroy() { SceneManager.activeSceneChanged -= OnSceneChanged; } private void OnSceneChanged(Scene oldScene, Scene newScene) { if (((Scene)(ref newScene)).name != "MainMenu") { mainMenuSliderSetup = false; volumeSlider = null; if ((Object)(object)menuMusicSource != (Object)null && volumeConfig.Value == 0f) { menuMusicSource.Stop(); } else if ((Object)(object)menuMusicSource != (Object)null) { menuMusicSource.volume = volumeConfig.Value; } } if (((Scene)(ref newScene)).name == "MainMenu" || ((Scene)(ref newScene)).name == "SampleSceneRelay") { ApplyVolumeToMenuMusic(volumeConfig.Value); } } private void Update() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name == "MainMenu")) { return; } GameObject val = GameObject.Find("Canvas/MenuContainer"); if ((Object)(object)val != (Object)null) { Transform val2 = val.transform.Find("SettingsPanel"); if ((Object)(object)val2 != (Object)null && ((Component)val2).gameObject.activeInHierarchy && !disableSlider.Value) { if (!mainMenuSliderSetup) { SetupVolumeSlider(val2); mainMenuSliderSetup = true; } } else { mainMenuSliderSetup = false; } } if (!isDraggingSlider && pendingVolume >= 0f) { volumeConfig.Value = pendingVolume; ApplyVolumeToMenuMusic(pendingVolume); pendingVolume = -1f; } else if (!isDraggingSlider) { ApplyVolumeToMenuMusic(volumeConfig.Value); } } private void SetupVolumeSlider(Transform settingsPanel) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Expected O, but got Unknown //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_026a: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Expected O, but got Unknown //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0302: Expected O, but got Unknown if (disableSlider.Value) { return; } Transform val = settingsPanel.Find("VolumeSetting"); if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)((Component)val).gameObject); } Transform val2 = settingsPanel.Find("BrightnessSetting"); if ((Object)(object)val2 == (Object)null) { ((BaseUnityPlugin)this).Logger.LogError((object)"BrightnessSetting not found in SettingsPanel!"); return; } GameObject val3 = Object.Instantiate<GameObject>(((Component)val2).gameObject, settingsPanel); ((Object)val3).name = "VolumeSetting"; RectTransform component = val3.GetComponent<RectTransform>(); RectTransform component2 = ((Component)val2).GetComponent<RectTransform>(); Vector2 anchoredPosition = component2.anchoredPosition; component.anchoredPosition = new Vector2(anchoredPosition.x, anchoredPosition.y - 50f); Transform val4 = val3.transform.Find("Text (1)"); if ((Object)(object)val4 != (Object)null) { TMP_Text component3 = ((Component)val4).GetComponent<TMP_Text>(); if ((Object)(object)component3 != (Object)null) { component3.text = "Menu Volume:"; } else { ((BaseUnityPlugin)this).Logger.LogError((object)"TMP_Text component not found on Text (1)!"); } } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Text (1) GameObject not found in VolumeSetting!"); } Transform val5 = val3.transform.Find("Slider"); if ((Object)(object)val5 != (Object)null) { volumeSlider = ((Component)val5).GetComponent<Slider>(); if ((Object)(object)volumeSlider != (Object)null) { int persistentEventCount = ((UnityEventBase)volumeSlider.onValueChanged).GetPersistentEventCount(); if (persistentEventCount > 0) { ((UnityEventBase)volumeSlider.onValueChanged).SetPersistentListenerState(0, (UnityEventCallState)0); } ((UnityEventBase)volumeSlider.onValueChanged).RemoveAllListeners(); volumeSlider.minValue = 0f; volumeSlider.maxValue = 100f; volumeSlider.wholeNumbers = false; volumeSlider.value = volumeConfig.Value * 100f; ApplyVolumeToMenuMusic(volumeConfig.Value); EventTrigger val6 = ((Component)volumeSlider).gameObject.AddComponent<EventTrigger>(); Entry val7 = new Entry { eventID = (EventTriggerType)13 }; ((UnityEvent<BaseEventData>)(object)val7.callback).AddListener((UnityAction<BaseEventData>)delegate { isDraggingSlider = true; }); val6.triggers.Add(val7); Entry val8 = new Entry { eventID = (EventTriggerType)14 }; ((UnityEvent<BaseEventData>)(object)val8.callback).AddListener((UnityAction<BaseEventData>)delegate { isDraggingSlider = false; }); val6.triggers.Add(val8); ((UnityEvent<float>)(object)volumeSlider.onValueChanged).AddListener((UnityAction<float>)delegate(float value) { ApplyVolumeToMenuMusic(pendingVolume = value / 100f); }); Transform val9 = settingsPanel.Find("Confirm"); if ((Object)(object)val9 != (Object)null) { Button component4 = ((Component)val9).GetComponent<Button>(); if ((Object)(object)component4 != (Object)null) { ((UnityEvent)component4.onClick).AddListener((UnityAction)delegate { if ((Object)(object)volumeSlider != (Object)null) { volumeSlider.value = volumeConfig.Value * 100f; ApplyVolumeToMenuMusic(volumeConfig.Value); if ((Object)(object)menuMusicSource != (Object)null && volumeConfig.Value == 0f) { menuMusicSource.Stop(); } } }); } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Confirm GameObject found, but no Button component!"); } } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Confirm GameObject not found in SettingsPanel!"); } } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Slider component not found in VolumeSetting!"); } } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Slider GameObject not found in VolumeSetting!"); } } private void ApplyVolumeToMenuMusic(float volume) { bool flag = false; GameObject val = GameObject.Find("MenuManager"); if ((Object)(object)val != (Object)null) { Transform val2 = val.transform.Find("Menu1"); if ((Object)(object)val2 != (Object)null) { AudioSource component = ((Component)val2).GetComponent<AudioSource>(); if ((Object)(object)component != (Object)null) { component.volume = volume; flag = true; if ((Object)(object)menuMusicSource == (Object)null || (component.isPlaying && (Object)(object)menuMusicSource != (Object)(object)component)) { menuMusicSource = component; } } } AudioSource component2 = val.GetComponent<AudioSource>(); if ((Object)(object)component2 != (Object)null) { component2.volume = volume; flag = true; if ((Object)(object)menuMusicSource == (Object)null && component2.isPlaying) { menuMusicSource = component2; } } } GameObject[] array = (GameObject[])(object)new GameObject[4] { GameObject.Find("Music"), GameObject.Find("AudioManager"), GameObject.Find("SoundManager"), GameObject.Find("MenuMusic") }; GameObject[] array2 = array; foreach (GameObject val3 in array2) { if (!((Object)(object)val3 != (Object)null)) { continue; } AudioSource component3 = val3.GetComponent<AudioSource>(); if ((Object)(object)component3 != (Object)null) { component3.volume = volume; flag = true; if ((Object)(object)menuMusicSource == (Object)null && component3.isPlaying) { menuMusicSource = component3; } } } if ((Object)(object)menuMusicSource != (Object)null) { menuMusicSource.volume = volume; flag = true; } AudioSource[] array3 = Object.FindObjectsOfType<AudioSource>(); AudioSource[] array4 = array3; foreach (AudioSource val4 in array4) { if (val4.isPlaying && (Object)(object)val4 != (Object)(object)menuMusicSource) { val4.volume = volume; flag = true; } } if ((Object)(object)audioMixer != (Object)null) { float num = Mathf.Lerp(-80f, 0f, volume); if (audioMixer.SetFloat("MusicVolume", num)) { flag = true; } else if (audioMixer.SetFloat("MasterVolume", num)) { flag = true; } else if (audioMixer.SetFloat("MenuMusicVolume", num)) { flag = true; } else { ((BaseUnityPlugin)this).Logger.LogWarning((object)"Failed to apply volume to any AudioMixer group"); } } if (!flag) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"No relevant AudioSource or AudioMixer found to apply volume"); } } }