Please disclose if any significant portion of your mod was created 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 REPO SOUNDBOARD v1.5.1
sonic.dll
Decompiled 12 hours agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using MenuLib; using MenuLib.MonoBehaviors; using MenuLib.Structs; using MonoMod.RuntimeDetour; using TMPro; using UnityEngine; 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("sonic")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("sonic")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("98f6da0c-f28e-4d99-a81d-92f0e99ae946")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace SingularitySoundboard; [BepInPlugin("com.soundboard", "Soundboard", "1.0.0")] [BepInDependency("nickklmao.menulib", "2.5.0")] public class SoundboardPlugin : BaseUnityPlugin { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static BuilderDelegate <>9__27_0; public static Func<PlayerAvatar, bool> <>9__32_0; public static Func<PlayerAvatar, bool> <>9__37_0; public static Func<Transform, bool> <>9__38_0; public static Func<Transform, float> <>9__38_1; public static Action<float> <>9__40_4; public static ScrollViewBuilderDelegate <>9__40_0; public static Action<float> <>9__40_5; public static ScrollViewBuilderDelegate <>9__40_1; public static Action<float> <>9__40_6; public static ScrollViewBuilderDelegate <>9__40_2; public static Func<PlayerAvatar, bool> <>9__40_8; public static Action<bool> <>9__40_7; public static ScrollViewBuilderDelegate <>9__40_3; public static ScrollViewBuilderDelegate <>9__42_0; public static ScrollViewBuilderDelegate <>9__42_1; public static Action<string> <>9__45_2; public static ScrollViewBuilderDelegate <>9__45_0; internal void <Awake>b__27_0(Transform parent) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, parent, new Vector2(126f, 86f)); } internal bool <PlayAudioClip>b__32_0(PlayerAvatar p) { return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine; } internal bool <StopPlayback>b__37_0(PlayerAvatar p) { return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine; } internal bool <MenuPageMain_StartHook>b__38_0(Transform t) { return ((Object)t).name.Contains("Menu Button"); } internal float <MenuPageMain_StartHook>b__38_1(Transform t) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return t.localPosition.y; } internal RectTransform <AddGlobalControls>b__40_0(Transform scrollView) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOSlider("Volume", "Loudness", (Action<float>)delegate(float v) { CurrentVolume = v; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.volume = v; } Instance.SaveConfig(); }, scrollView, Vector2.zero, 0f, 2f, 1, CurrentVolume, "", "", (BarBehavior)0)).rectTransform; } internal void <AddGlobalControls>b__40_4(float v) { CurrentVolume = v; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.volume = v; } Instance.SaveConfig(); } internal RectTransform <AddGlobalControls>b__40_1(Transform scrollView) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOSlider("Pitch", "Deepness", (Action<float>)delegate(float p) { CurrentPitch = p; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.pitch = p; } Instance.SaveConfig(); }, scrollView, Vector2.zero, 0.1f, 3f, 1, CurrentPitch, "", "", (BarBehavior)0)).rectTransform; } internal void <AddGlobalControls>b__40_5(float p) { CurrentPitch = p; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.pitch = p; } Instance.SaveConfig(); } internal RectTransform <AddGlobalControls>b__40_2(Transform scrollView) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOSlider("Bass", "Thick", (Action<float>)delegate(float b) { CurrentBass = b; Instance.SaveConfig(); }, scrollView, Vector2.zero, 0f, 1f, 1, CurrentBass, "", "", (BarBehavior)0)).rectTransform; } internal void <AddGlobalControls>b__40_6(float b) { CurrentBass = b; Instance.SaveConfig(); } internal RectTransform <AddGlobalControls>b__40_3(Transform scrollView) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOToggle("Loop Mode", (Action<bool>)delegate(bool l) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown IsLooping = l; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.loop = l; } PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine)); if ((Object)(object)val != (Object)null) { object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val); if (obj != null) { AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj); if ((Object)(object)val2 != (Object)null) { val2.loop = l; } } } Instance.SaveConfig(); }, scrollView, Vector2.zero, "ON", "OFF", IsLooping)).rectTransform; } internal void <AddGlobalControls>b__40_7(bool l) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown IsLooping = l; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.loop = l; } PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine)); if ((Object)(object)val != (Object)null) { object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val); if (obj != null) { AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj); if ((Object)(object)val2 != (Object)null) { val2.loop = l; } } } Instance.SaveConfig(); } internal bool <AddGlobalControls>b__40_8(PlayerAvatar p) { return (Object)(object)p.photonView == (Object)null || p.photonView.IsMine; } internal RectTransform <ToggleQuickMenu>b__42_0(Transform scrollView) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOButton("\ud83d\udd04 REFRESH LAYOUT", (Action)RefreshQuickLayout, scrollView, Vector2.zero)).rectTransform; } internal RectTransform <ToggleQuickMenu>b__42_1(Transform scrollView) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return ((REPOElement)MenuAPI.CreateREPOButton("STOP ALL", (Action)StopPlayback, scrollView, Vector2.zero)).rectTransform; } internal RectTransform <OpenFolder>b__45_0(Transform scrollView) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) REPOInputField val2 = MenuAPI.CreateREPOInputField("SEARCH SFX", (Action<string>)delegate(string val) { currentSearchFilter = val.ToLower().Trim(); }, scrollView, Vector2.zero, false, "Type here...", currentSearchFilter); return ((REPOElement)val2).rectTransform; } internal void <OpenFolder>b__45_2(string val) { currentSearchFilter = val.ToLower().Trim(); } } [CompilerGenerated] private sealed class <MonitorPlayback>d__36 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public AudioSource source; public AudioClip clip; public object recorder; private float <pitchedDuration>5__1; private Type <recType>5__2; private AudioClip <baked>5__3; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <MonitorPlayback>d__36(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <recType>5__2 = null; <baked>5__3 = null; <>1__state = -2; } private bool MoveNext() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <pitchedDuration>5__1 = clip.length / Mathf.Max(0.1f, CurrentPitch); break; case 1: <>1__state = -1; if (IsLooping && IsPlayingSound) { if (recorder != null) { <recType>5__2 = recorder.GetType(); <recType>5__2.GetMethod("StopRecording")?.Invoke(recorder, null); AccessTools.Property(<recType>5__2, "SourceType").SetValue(recorder, 0); AccessTools.Property(<recType>5__2, "SourceType").SetValue(recorder, 1); <baked>5__3 = (AudioClip)AccessTools.Property(<recType>5__2, "AudioClip").GetValue(recorder); AccessTools.Property(<recType>5__2, "AudioClip").SetValue(recorder, <baked>5__3); <recType>5__2.GetMethod("StartRecording")?.Invoke(recorder, null); <recType>5__2 = null; <baked>5__3 = null; } break; } StopPlayback(); return false; } if (IsPlayingSound) { <>2__current = (object)new WaitForSeconds(<pitchedDuration>5__1); <>1__state = 1; return true; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Dictionary<string, AssetBundle> _loadedBundles = new Dictionary<string, AssetBundle>(); public static float CurrentBass = 0f; private static ConfigEntry<float> configBass; public static bool IsPlayingSound = false; public static float CurrentVolume = 1f; public static float CurrentPitch = 1f; public static bool IsLooping = false; private static string currentSearchFilter = ""; private static float _currentClipLength = 0f; private static AudioSource _localHearSelfSource; private static REPOPopupPage _quickMenuPage; private static List<string> quickBoardSounds = new List<string>(); private static List<string> favouriteSounds = new List<string>(); private static List<string> repoSounds = new List<string>(); private static List<string> memeSounds = new List<string>(); private static List<string> otherSounds = new List<string>(); private static List<string> myInstantsSounds = new List<string>(); private static List<string> musicSounds = new List<string>(); private static ConfigEntry<string> configQuickBoard; private static ConfigEntry<float> configVolume; private static ConfigEntry<float> configPitch; private static ConfigEntry<bool> configLoop; private static ConfigEntry<string> configFavourites; public static SoundboardPlugin Instance { get; private set; } private void Awake() { //IL_03ee: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: Unknown result type (might be due to invalid IL or missing references) //IL_03f9: Expected O, but got Unknown //IL_03ae: Unknown result type (might be due to invalid IL or missing references) Instance = this; configVolume = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "Volume", 1f, "Default volume for soundboard."); configPitch = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "Pitch", 1f, "Default pitch for soundboard."); configLoop = ((BaseUnityPlugin)this).Config.Bind<bool>("Soundboard", "Loop", false, "Toggle if sounds should loop by default."); configFavourites = ((BaseUnityPlugin)this).Config.Bind<string>("Soundboard", "Favourites", "", "Comma-separated list of favourited sound names."); configQuickBoard = ((BaseUnityPlugin)this).Config.Bind<string>("Soundboard", "QuickBoard", "", "Sounds to show on screen."); configBass = ((BaseUnityPlugin)this).Config.Bind<float>("Soundboard", "BassBoost", 0f, "Default bass boost for soundboard."); CurrentBass = configBass.Value; if (!string.IsNullOrEmpty(configQuickBoard.Value)) { quickBoardSounds = configQuickBoard.Value.Split(new char[1] { ',' }).ToList(); } CurrentVolume = configVolume.Value; CurrentPitch = configPitch.Value; IsLooping = configLoop.Value; if (!string.IsNullOrEmpty(configFavourites.Value)) { favouriteSounds = configFavourites.Value.Split(new char[1] { ',' }).ToList(); } string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string[] files = Directory.GetFiles(directoryName); if (files.Length != 0) { string[] array = files; foreach (string text in array) { string text2 = Path.GetFileName(text).ToLower(); if (text2.EndsWith(".dll") || text2.EndsWith(".repobundle") || text2.EndsWith(".hhh") || text2.EndsWith(".md") || text2.EndsWith(".png") || text2.EndsWith(".bundle") || text2.EndsWith(".ini") || text2.EndsWith(".json")) { continue; } AssetBundle val = AssetBundle.LoadFromFile(text); if (!((Object)(object)val != (Object)null)) { continue; } string[] allAssetNames = val.GetAllAssetNames(); foreach (string path in allAssetNames) { _loadedBundles[Path.GetFileNameWithoutExtension(path).ToUpper()] = val; string text3 = Path.GetFileNameWithoutExtension(path).ToUpper(); if (text3.Contains("MYINSTANT") || text3.Contains("INSTANT")) { myInstantsSounds.Add(text3); } else if (text3.Contains("REPO") || text3.Contains("R E P O")) { repoSounds.Add(text3); } else if (text3.Contains("MEME")) { memeSounds.Add(text3); } else if (text3.StartsWith("MUSIC")) { musicSounds.Add(text3); } else { otherSounds.Add(text3); } } } } try { new Hook((MethodBase)AccessTools.Method(typeof(MenuPageMain), "Start", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageMain>, MenuPageMain>(MenuPageMain_StartHook)); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("Menu hook failed: " + ex.Message)); } object obj = <>c.<>9__27_0; if (obj == null) { BuilderDelegate val2 = delegate(Transform parent) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, parent, new Vector2(126f, 86f)); }; <>c.<>9__27_0 = val2; obj = (object)val2; } MenuAPI.AddElementToEscapeMenu((BuilderDelegate)obj); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Singularity Soundboard loaded!"); } private void Update() { if (Input.GetKeyDown((KeyCode)121)) { ToggleQuickMenu(); } } private void SaveConfig() { configVolume.Value = CurrentVolume; configPitch.Value = CurrentPitch; configLoop.Value = IsLooping; configFavourites.Value = string.Join(",", favouriteSounds); configQuickBoard.Value = string.Join(",", quickBoardSounds); } [HarmonyPatch(typeof(PlayerVoiceChat), "Update")] [HarmonyPrefix] private static void VoiceChatUpdatePrefix(object __instance) { //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown if (!IsPlayingSound || __instance == null) { return; } object value = AccessTools.Field(typeof(PlayerVoiceChat), "photonView").GetValue(__instance); if (value == null || !(bool)AccessTools.Property(value.GetType(), "IsMine").GetValue(value)) { return; } AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance); if ((Object)(object)val != (Object)null) { val.pitch = CurrentPitch; val.loop = IsLooping; } object value2 = AccessTools.Field(typeof(PlayerVoiceChat), "recorder").GetValue(__instance); if (value2 != null) { Type type = value2.GetType(); PropertyInfo property = type.GetProperty("Pitch"); if (property != null) { property.SetValue(value2, CurrentPitch); } AccessTools.Property(type, "TransmitEnabled").SetValue(value2, true); } AccessTools.Field(typeof(PlayerVoiceChat), "isTalking").SetValue(__instance, true); AccessTools.Field(typeof(PlayerVoiceChat), "overrideMuteTimer").SetValue(__instance, 1f); } [HarmonyPatch(typeof(PlayerVoiceChat), "LateUpdate")] [HarmonyPostfix] private static void VoiceChatLateUpdatePostfix(object __instance) { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Expected O, but got Unknown if (!IsPlayingSound || __instance == null) { return; } object value = AccessTools.Field(typeof(PlayerVoiceChat), "photonView").GetValue(__instance); if (value != null && (bool)AccessTools.Property(value.GetType(), "IsMine").GetValue(value)) { object value2 = AccessTools.Field(typeof(PlayerVoiceChat), "playerAvatar").GetValue(__instance); bool flag = (bool)AccessTools.Property(value2.GetType(), "isDisabled").GetValue(value2); AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance); if ((Object)(object)val != (Object)null && val.isPlaying && flag) { val.volume = 0.5f; } } } public static void PlayAudioClip(AudioClip clip) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown if ((Object)(object)clip == (Object)null) { return; } PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine)); if ((Object)(object)val == (Object)null) { return; } object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val); if (obj == null) { return; } AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj); object value = AccessTools.Field(typeof(PlayerVoiceChat), "recorder").GetValue(obj); if (!((Object)(object)val2 == (Object)null) && value != null) { StopPlayback(); AudioClip clip2 = CreatePitchedAndResampledClip(clip, CurrentPitch, clip.frequency); AudioClip value2 = CreatePitchedAndResampledClip(clip, CurrentPitch, 48000); val2.Stop(); val2.clip = clip2; val2.loop = IsLooping; val2.pitch = 1f; val2.spatialBlend = 0f; val2.Play(); Type type = value.GetType(); type.GetMethod("StopRecording")?.Invoke(value, null); AccessTools.Property(type, "SourceType").SetValue(value, 1); AccessTools.Property(type, "AudioClip").SetValue(value, value2); AccessTools.Property(type, "SamplingRate").SetValue(value, 48000); AccessTools.Property(type, "TransmitEnabled").SetValue(value, true); PropertyInfo property = type.GetProperty("Loop"); if (property != null) { property.SetValue(value, IsLooping); } type.GetMethod("StartRecording")?.Invoke(value, null); SetupLocalSource(val); if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.clip = clip2; _localHearSelfSource.pitch = 1f; _localHearSelfSource.volume = CurrentVolume; _localHearSelfSource.loop = IsLooping; _localHearSelfSource.Play(); } IsPlayingSound = true; ((MonoBehaviour)Instance).StartCoroutine(MonitorPlayback(val2, clip2, value)); } } private static AudioClip CreatePitchedAndResampledClip(AudioClip input, float pitch, int targetFreq) { float[] array = new float[input.samples * input.channels]; input.GetData(array, 0); int num = Mathf.RoundToInt((float)input.samples * ((float)targetFreq / (float)input.frequency) / pitch); float[] array2 = new float[num]; float num2 = 0f; float num3 = 0f; float num4 = 0f; float num5 = 0f; float num6 = 100f; float num7 = 0.8f; float num8 = CurrentBass * 30f; float num9 = Mathf.Pow(10f, num8 / 40f); float num10 = (float)Math.PI * 2f * num6 / (float)targetFreq; float num11 = Mathf.Sin(num10); float num12 = Mathf.Cos(num10); float num13 = num11 / (2f * num7); float num14 = Mathf.Sqrt(num9) * 2f * num13; float num15 = num9 * (num9 + 1f - (num9 - 1f) * num12 + num14); float num16 = 2f * num9 * (num9 - 1f - (num9 + 1f) * num12); float num17 = num9 * (num9 + 1f - (num9 - 1f) * num12 - num14); float num18 = num9 + 1f + (num9 - 1f) * num12 + num14; float num19 = -2f * (num9 - 1f + (num9 + 1f) * num12); float num20 = num9 + 1f + (num9 - 1f) * num12 - num14; for (int i = 0; i < num; i++) { float num21 = (float)i * ((float)input.frequency / (float)targetFreq) * pitch; int num22 = (int)num21; int num23 = num22 + 1; float num24 = 0f; if (num22 < input.samples - 1) { float num25 = num21 - (float)num22; num24 = ((input.channels != 2) ? Mathf.Lerp(array[num22], array[num23], num25) : ((Mathf.Lerp(array[num22 * 2], array[num23 * 2], num25) + Mathf.Lerp(array[num22 * 2 + 1], array[num23 * 2 + 1], num25)) / 2f)); } float num26 = num15 / num18 * num24 + num16 / num18 * num2 + num17 / num18 * num3 - num19 / num18 * num4 - num20 / num18 * num5; num3 = num2; num2 = num24; num5 = num4; num4 = num26; float num27 = (float)Math.Tanh(num26 * 0.9f); array2[i] = num27; } AudioClip val = AudioClip.Create(((Object)input).name + "_MegaBass", num, 1, targetFreq, false); val.SetData(array2, 0); return val; } private static AudioClip MakeMono(AudioClip stereoClip) { if (stereoClip.channels == 1) { return stereoClip; } float[] array = new float[stereoClip.samples * stereoClip.channels]; stereoClip.GetData(array, 0); float[] array2 = new float[stereoClip.samples]; for (int i = 0; i < array2.Length; i++) { array2[i] = (array[i * 2] + array[i * 2 + 1]) / 2f; } AudioClip val = AudioClip.Create(((Object)stereoClip).name + "_Mono", stereoClip.samples, 1, stereoClip.frequency, false); val.SetData(array2, 0); return val; } private static void SetupLocalSource(PlayerAvatar player) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown if (!((Object)(object)_localHearSelfSource != (Object)null) || !((Object)(object)((Component)_localHearSelfSource).transform.parent == (Object)(object)((Component)player).transform)) { if ((Object)(object)_localHearSelfSource != (Object)null) { Object.Destroy((Object)(object)((Component)_localHearSelfSource).gameObject); } GameObject val = new GameObject("SoundboardLocalOnly"); val.transform.SetParent(((Component)player).transform, false); _localHearSelfSource = val.AddComponent<AudioSource>(); _localHearSelfSource.spatialBlend = 0f; _localHearSelfSource.playOnAwake = false; _localHearSelfSource.volume = CurrentVolume; _localHearSelfSource.outputAudioMixerGroup = null; } } [IteratorStateMachine(typeof(<MonitorPlayback>d__36))] private static IEnumerator MonitorPlayback(AudioSource source, AudioClip clip, object recorder) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <MonitorPlayback>d__36(0) { source = source, clip = clip, recorder = recorder }; } public static void StopPlayback() { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.Stop(); } PlayerAvatar val = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine)); if ((Object)(object)val != (Object)null) { object obj = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val); AudioSource val2 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj); if ((Object)(object)val2 != (Object)null) { val2.Stop(); } } IsPlayingSound = false; ((MonoBehaviour)Instance).StopAllCoroutines(); } private static void MenuPageMain_StartHook(Action<MenuPageMain> orig, MenuPageMain self) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) REPOButton val = MenuAPI.CreateREPOButton("Soundboard", (Action)CreateSoundboardMenu, ((Component)self).transform, new Vector2(48.3f, 0f)); List<Transform> list = (from Transform t in (IEnumerable)((Component)self).transform where ((Object)t).name.Contains("Menu Button") orderby t.localPosition.y descending select t).ToList(); list.Insert(list.Count - 1, ((Component)val).transform); float num = 224f; foreach (Transform item in list) { item.localPosition = new Vector3(item.localPosition.x, num, item.localPosition.z); num -= 30f; } orig(self); } internal static void CreateSoundboardMenu() { //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Expected O, but got Unknown REPOPopupPage soundboardPage = MenuAPI.CreateREPOPopupPage("SOUNDBOARD", (PresetSide)0, false, true, 0f); soundboardPage.scrollView.scrollSpeed = 3f; soundboardPage.maskPadding = new Padding(0f, 35f, 0f, 25f); AddGlobalControls(soundboardPage); if (favouriteSounds.Count > 0) { AddCategory(soundboardPage, "FAVOURITES", favouriteSounds, isFavourite: true); } if (repoSounds.Count > 0) { AddCategory(soundboardPage, "REPO SFX", repoSounds); } if (memeSounds.Count > 0) { AddCategory(soundboardPage, "MEMES", memeSounds); } if (myInstantsSounds.Count > 0) { AddCategory(soundboardPage, "MYINSTANTS", myInstantsSounds); } if (otherSounds.Count > 0) { AddCategory(soundboardPage, "OTHER", otherSounds); } if (musicSounds.Count > 0) { AddCategory(soundboardPage, "MUSIC", musicSounds); } soundboardPage.AddElementToScrollView((ScrollViewBuilderDelegate)((Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("Show On Screen", (Action)delegate { soundboardPage.ClosePage(true); ToggleQuickMenu(); }, scrollView, Vector2.zero)).rectTransform), 0f, 0f); soundboardPage.AddElement((BuilderDelegate)delegate(Transform p) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) MenuAPI.CreateREPOButton("Back", (Action)delegate { soundboardPage.ClosePage(true); }, p, new Vector2(66f, 18f)); }); soundboardPage.OpenPage(false); } private static void AddGlobalControls(REPOPopupPage page) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Expected O, but got Unknown object obj = <>c.<>9__40_0; if (obj == null) { ScrollViewBuilderDelegate val = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Volume", "Loudness", (Action<float>)delegate(float v) { CurrentVolume = v; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.volume = v; } Instance.SaveConfig(); }, scrollView, Vector2.zero, 0f, 2f, 1, CurrentVolume, "", "", (BarBehavior)0)).rectTransform; <>c.<>9__40_0 = val; obj = (object)val; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f); object obj2 = <>c.<>9__40_1; if (obj2 == null) { ScrollViewBuilderDelegate val2 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Pitch", "Deepness", (Action<float>)delegate(float p) { CurrentPitch = p; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.pitch = p; } Instance.SaveConfig(); }, scrollView, Vector2.zero, 0.1f, 3f, 1, CurrentPitch, "", "", (BarBehavior)0)).rectTransform; <>c.<>9__40_1 = val2; obj2 = (object)val2; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 0f); object obj3 = <>c.<>9__40_2; if (obj3 == null) { ScrollViewBuilderDelegate val3 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOSlider("Bass", "Thick", (Action<float>)delegate(float b) { CurrentBass = b; Instance.SaveConfig(); }, scrollView, Vector2.zero, 0f, 1f, 1, CurrentBass, "", "", (BarBehavior)0)).rectTransform; <>c.<>9__40_2 = val3; obj3 = (object)val3; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj3, 0f, 0f); object obj4 = <>c.<>9__40_3; if (obj4 == null) { ScrollViewBuilderDelegate val4 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOToggle("Loop Mode", (Action<bool>)delegate(bool l) { //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown IsLooping = l; if ((Object)(object)_localHearSelfSource != (Object)null) { _localHearSelfSource.loop = l; } PlayerAvatar val5 = GameDirector.instance?.PlayerList?.FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => (Object)(object)p.photonView == (Object)null || p.photonView.IsMine)); if ((Object)(object)val5 != (Object)null) { object obj5 = typeof(PlayerAvatar).GetField("voiceChat", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(val5); if (obj5 != null) { AudioSource val6 = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(obj5); if ((Object)(object)val6 != (Object)null) { val6.loop = l; } } } Instance.SaveConfig(); }, scrollView, Vector2.zero, "ON", "OFF", IsLooping)).rectTransform; <>c.<>9__40_3 = val4; obj4 = (object)val4; } page.AddElementToScrollView((ScrollViewBuilderDelegate)obj4, 0f, 0f); } private static void RefreshQuickLayout() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_quickMenuPage == (Object)null)) { Canvas.ForceUpdateCanvases(); ((Component)_quickMenuPage).gameObject.SetActive(true); CanvasGroup component = ((Component)_quickMenuPage).GetComponent<CanvasGroup>(); if ((Object)(object)component != (Object)null) { component.alpha = 1f; component.interactable = true; component.blocksRaycasts = true; } ((Component)_quickMenuPage).transform.localScale = Vector3.one; VerticalLayoutGroup componentInChildren = ((Component)_quickMenuPage.scrollView).GetComponentInChildren<VerticalLayoutGroup>(); if ((Object)(object)componentInChildren != (Object)null) { ((LayoutGroup)componentInChildren).CalculateLayoutInputVertical(); ((LayoutGroup)componentInChildren).SetLayoutVertical(); LayoutRebuilder.ForceRebuildLayoutImmediate(((Component)componentInChildren).GetComponent<RectTransform>()); } } } private static void ToggleQuickMenu() { //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown if ((Object)(object)_quickMenuPage != (Object)null) { _quickMenuPage.ClosePage(false); Object.Destroy((Object)(object)((Component)_quickMenuPage).gameObject); _quickMenuPage = null; Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; return; } Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; _quickMenuPage = MenuAPI.CreateREPOPopupPage("Quick Board", (PresetSide)1, false, false, 5f); _quickMenuPage.scrollView.scrollSpeed = 3f; REPOPopupPage quickMenuPage = _quickMenuPage; object obj = <>c.<>9__42_0; if (obj == null) { ScrollViewBuilderDelegate val = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("\ud83d\udd04 REFRESH LAYOUT", (Action)RefreshQuickLayout, scrollView, Vector2.zero)).rectTransform; <>c.<>9__42_0 = val; obj = (object)val; } quickMenuPage.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 10f); REPOPopupPage quickMenuPage2 = _quickMenuPage; object obj2 = <>c.<>9__42_1; if (obj2 == null) { ScrollViewBuilderDelegate val2 = (Transform scrollView) => ((REPOElement)MenuAPI.CreateREPOButton("STOP ALL", (Action)StopPlayback, scrollView, Vector2.zero)).rectTransform; <>c.<>9__42_1 = val2; obj2 = (object)val2; } quickMenuPage2.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 10f); foreach (string audioToPlay in quickBoardSounds) { string cleanName = audioToPlay.Replace("REPO", "").Replace("MEME", "").Replace("_", " ") .Trim(); _quickMenuPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) REPOButton val3 = MenuAPI.CreateREPOButton(cleanName, (Action)delegate { PlayAudio(audioToPlay); }, scrollView, Vector2.zero); RectTransform rectTransform = ((REPOElement)val3).rectTransform; rectTransform.sizeDelta = new Vector2(200f, 35f); ((TMP_Text)val3.labelTMP).fontSize = 14f; return rectTransform; }, 0f, 5f); } _quickMenuPage.OpenPage(false); RefreshQuickLayout(); } private static void AddCategory(REPOPopupPage mainPage, string folderName, List<string> soundList, bool isFavourite = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown mainPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) REPOButton val = MenuAPI.CreateREPOButton(folderName, (Action)delegate { OpenFolder(folderName, soundList, isFavourite); }, scrollView, Vector2.zero); ((TMP_Text)val.labelTMP).fontStyle = (FontStyles)0; return ((REPOElement)val).rectTransform; }, 0f, 0f); } [HarmonyPatch(typeof(PlayerVoiceChat), "Update")] [HarmonyPostfix] private static void SyncRemotePitch(PlayerVoiceChat __instance) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown AudioSource val = (AudioSource)AccessTools.Field(typeof(PlayerVoiceChat), "audioSource").GetValue(__instance); if ((Object)(object)val != (Object)null && IsPlayingSound) { val.pitch = CurrentPitch; val.loop = IsLooping; } } private static void OpenFolder(string title, List<string> sounds, bool isFavouriteCategory = false) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Expected O, but got Unknown //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown MenuAPI.CloseAllPagesAddedOnTop(); REPOPopupPage folderPage = MenuAPI.CreateREPOPopupPage(title, (PresetSide)1, false, false, 5f); folderPage.scrollView.scrollSpeed = 3f; REPOPopupPage obj = folderPage; object obj2 = <>c.<>9__45_0; if (obj2 == null) { ScrollViewBuilderDelegate val2 = delegate(Transform scrollView) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) REPOInputField val6 = MenuAPI.CreateREPOInputField("SEARCH SFX", (Action<string>)delegate(string val) { currentSearchFilter = val.ToLower().Trim(); }, scrollView, Vector2.zero, false, "Type here...", currentSearchFilter); return ((REPOElement)val6).rectTransform; }; <>c.<>9__45_0 = val2; obj2 = (object)val2; } obj.AddElementToScrollView((ScrollViewBuilderDelegate)obj2, 0f, 15f); foreach (string sound in sounds) { string audioToPlay = sound; string cleanName = sound.Replace("REPO", "").Replace("MEME", "").Replace("_", " ") .Trim(); bool isFav = favouriteSounds.Contains(sound); if (!string.IsNullOrEmpty(currentSearchFilter) && !cleanName.ToLower().Contains(currentSearchFilter)) { continue; } folderPage.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform scrollView) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) REPOButton val3 = MenuAPI.CreateREPOButton(cleanName, (Action)delegate { PlayAudio(audioToPlay); }, scrollView, new Vector2(20f, 0f)); RectTransform rectTransform = ((REPOElement)val3).rectTransform; rectTransform.sizeDelta = new Vector2(150f, 28f); TMP_Text labelTMP = (TMP_Text)(object)val3.labelTMP; labelTMP.fontSize = 15f; labelTMP.alignment = (TextAlignmentOptions)513; labelTMP.rectTransform.offsetMin = new Vector2(5f, 0f); string text = (isFavouriteCategory ? "UNFAV" : (isFav ? "★" : "☆")); REPOButton val4 = MenuAPI.CreateREPOButton(text, (Action)delegate { if (favouriteSounds.Contains(audioToPlay)) { favouriteSounds.Remove(audioToPlay); } else { favouriteSounds.Add(audioToPlay); } Instance.SaveConfig(); folderPage.ClosePage(false); OpenFolder(title, sounds, isFavouriteCategory); }, ((Component)rectTransform).transform, new Vector2(95f, 0f)); val4.overrideButtonSize = new Vector2(isFavouriteCategory ? 45f : 25f, 25f); ((Graphic)val4.labelTMP).color = (isFav ? Color.yellow : Color.white); ((TMP_Text)val4.labelTMP).fontSize = 12f; REPOButton showBtn = null; showBtn = MenuAPI.CreateREPOButton("SHOW", (Action)delegate { //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (!quickBoardSounds.Contains(audioToPlay)) { quickBoardSounds.Add(audioToPlay); Instance.SaveConfig(); if ((Object)(object)showBtn != (Object)null) { ((Graphic)showBtn.labelTMP).color = Color.green; } } }, ((Component)rectTransform).transform, new Vector2(135f, 0f)); showBtn.overrideButtonSize = new Vector2(40f, 25f); ((TMP_Text)showBtn.labelTMP).fontSize = 10f; if (quickBoardSounds.Contains(audioToPlay)) { ((Graphic)showBtn.labelTMP).color = Color.green; } REPOButton val5 = MenuAPI.CreateREPOButton("HIDE", (Action)delegate { //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (quickBoardSounds.Contains(audioToPlay)) { quickBoardSounds.Remove(audioToPlay); Instance.SaveConfig(); if ((Object)(object)showBtn != (Object)null) { ((Graphic)showBtn.labelTMP).color = Color.white; } } }, ((Component)rectTransform).transform, new Vector2(175f, 0f)); val5.overrideButtonSize = new Vector2(40f, 25f); ((TMP_Text)val5.labelTMP).fontSize = 10f; return rectTransform; }, 0f, 4f); } folderPage.AddElement((BuilderDelegate)delegate(Transform p) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) MenuAPI.CreateREPOButton("Back", (Action)delegate { folderPage.ClosePage(true); CreateSoundboardMenu(); }, p, new Vector2(66f, 18f)); }); folderPage.OpenPage(true); } private static void PlayAudio(string assetName) { if (!_loadedBundles.ContainsKey(assetName)) { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)("Sound not found: " + assetName)); return; } StopPlayback(); AudioClip val = _loadedBundles[assetName].LoadAsset<AudioClip>(assetName); if ((Object)(object)val != (Object)null) { PlayAudioClip(val); } else { ((BaseUnityPlugin)Instance).Logger.LogWarning((object)("Could not load audio: " + assetName)); } } }