using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Photon.Voice.Unity; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("R.E.P.O.pad")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("R.E.P.O.pad")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("1950e5d2-7bce-414a-9e82-81c09d27e76c")] [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 REPOpad; [BepInPlugin("com.renat.customsoundboard", "REPOpad", "3.10.6")] public class SoundboardPlugin : BaseUnityPlugin { public static SoundboardPlugin Instance; public static ManualLogSource Log; public ConfigEntry openMenuKey; public ConfigEntry stopSoundKey; public string soundsDirectory; private static bool managerCreated; private void Awake() { Instance = this; Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"R.E.P.O. Custom Soundboard v1.0.1 initializing..."); soundsDirectory = Path.Combine(Paths.PluginPath, "CustomSoundboard", "Sounds"); if (!Directory.Exists(soundsDirectory)) { Directory.CreateDirectory(soundsDirectory); } openMenuKey = ((BaseUnityPlugin)this).Config.Bind("UI Settings", "Open Menu Key", (KeyCode)287, "Hotkey to open/close the soundboard menu"); stopSoundKey = ((BaseUnityPlugin)this).Config.Bind("UI Settings", "Stop Sound Key", (KeyCode)0, "Hotkey to force stop the currently playing sound"); SceneManager.sceneLoaded += OnSceneLoaded; Log.LogInfo((object)"R.E.P.O. Custom Soundboard core initialized successfully!"); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown if (!managerCreated) { GameObject val = new GameObject("R.E.P.O.SoundboardManager"); Object.DontDestroyOnLoad((Object)val); val.AddComponent(); managerCreated = true; Log.LogInfo((object)"SoundboardManager successfully spawned in active scene context!"); } } } public class SoundboardManager : MonoBehaviour { private class SoundTrack { public string FileName { get; set; } public string FilePath { get; set; } public KeyCode Key { get; set; } public AudioClip Clip { get; set; } } private bool showMenu; private List tracks = new List(); private AudioSource audioSource; private SoundTrack bindingTrack; private Recorder cachedRecorder; private void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown GameObject val = new GameObject("R.E.P.O.AudioSource"); audioSource = val.AddComponent(); Object.DontDestroyOnLoad((Object)(object)val); ReloadSoundsFolder(); } public void ReloadSoundsFolder() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) tracks.Clear(); string soundsDirectory = SoundboardPlugin.Instance.soundsDirectory; if (!Directory.Exists(soundsDirectory)) { return; } string[] files = Directory.GetFiles(soundsDirectory, "*.wav"); int num = 0; string[] array = files; foreach (string text in array) { AudioClip val = LoadWav(text); if ((Object)(object)val != (Object)null) { KeyCode key = (KeyCode)0; switch (num) { case 0: key = (KeyCode)257; break; case 1: key = (KeyCode)258; break; case 2: key = (KeyCode)259; break; case 3: key = (KeyCode)260; break; case 4: key = (KeyCode)261; break; } tracks.Add(new SoundTrack { FileName = Path.GetFileName(text), FilePath = text, Key = key, Clip = val }); num++; } } SoundboardPlugin.Log.LogInfo((object)$"Loaded {tracks.Count} sound tracks."); } private AudioClip LoadWav(string filePath) { try { byte[] array = File.ReadAllBytes(filePath); int num = BitConverter.ToInt16(array, 22); int num2 = BitConverter.ToInt32(array, 24); int num3 = BitConverter.ToInt16(array, 34); int i; for (i = 12; i < array.Length - 8; i++) { if (array[i] == 100 && array[i + 1] == 97 && array[i + 2] == 116 && array[i + 3] == 97) { i += 8; break; } } int num4 = array.Length - i; int num5 = num3 / 8; if (num5 == 0) { num5 = 2; } int num6 = num4 / num5; int num7 = num6 / num; float[] array2 = new float[num6]; int num8 = ((num3 == 8) ? 128 : 32767); int num9 = i; for (int j = 0; j < num6; j++) { if (num9 + num5 > array.Length) { break; } short num10 = BitConverter.ToInt16(array, num9); array2[j] = (float)num10 / (float)num8; num9 += num5; } AudioClip obj = AudioClip.Create(Path.GetFileName(filePath), num7, num, num2, false); obj.SetData(array2, 0); return obj; } catch (Exception ex) { SoundboardPlugin.Log.LogError((object)("Error loading WAV file: " + ex.Message)); return null; } } private void PlayTrack(SoundTrack track) { if (!((Object)(object)audioSource == (Object)null) && !((Object)(object)track.Clip == (Object)null)) { audioSource.Stop(); audioSource.clip = track.Clip; audioSource.Play(); SoundboardPlugin.Log.LogInfo((object)("Playing track: " + track.FileName)); if ((Object)(object)cachedRecorder == (Object)null) { cachedRecorder = Object.FindObjectOfType(); } if ((Object)(object)cachedRecorder != (Object)null) { cachedRecorder.SourceType = (InputSourceType)1; cachedRecorder.AudioClip = track.Clip; cachedRecorder.TransmitEnabled = true; ((MonoBehaviour)this).CancelInvoke("RestoreMicrophone"); ((MonoBehaviour)this).Invoke("RestoreMicrophone", track.Clip.length + 0.1f); } } } private void StopCurrentSound() { if ((Object)(object)audioSource != (Object)null && audioSource.isPlaying) { audioSource.Stop(); ((MonoBehaviour)this).CancelInvoke("RestoreMicrophone"); RestoreMicrophone(); SoundboardPlugin.Log.LogInfo((object)"Sound stopped manually by hotkey."); } } private void RestoreMicrophone() { if ((Object)(object)cachedRecorder != (Object)null) { cachedRecorder.SourceType = (InputSourceType)0; cachedRecorder.AudioClip = null; } } private void Update() { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_0101: 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_00a5: Invalid comparison between Unknown and I4 //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) int num = ((SoundboardPlugin.Instance.openMenuKey == null) ? 287 : ((int)SoundboardPlugin.Instance.openMenuKey.Value)); KeyCode val = (KeyCode)((SoundboardPlugin.Instance.stopSoundKey != null) ? ((int)SoundboardPlugin.Instance.stopSoundKey.Value) : 0); if (Input.GetKeyDown((KeyCode)num)) { showMenu = !showMenu; } if ((int)val != 0 && Input.GetKeyDown(val)) { StopCurrentSound(); } if (bindingTrack != null && Input.anyKeyDown) { foreach (KeyCode value in Enum.GetValues(typeof(KeyCode))) { if (Input.GetKeyDown(value)) { if ((int)value != 27) { bindingTrack.Key = value; } bindingTrack = null; break; } } } if (showMenu || bindingTrack != null) { return; } foreach (SoundTrack track in tracks) { if ((int)track.Key != 0 && Input.GetKeyDown(track.Key)) { PlayTrack(track); } } } private void OnGUI() { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) if (!showMenu) { return; } KeyCode val = (KeyCode)((SoundboardPlugin.Instance.openMenuKey == null) ? 287 : ((int)SoundboardPlugin.Instance.openMenuKey.Value)); GUI.Box(new Rect((float)(Screen.width / 2 - 250), (float)(Screen.height / 2 - 220), 500f, 440f), "R.E.P.O. SOUNDBOARD"); float num = Screen.height / 2 - 170; if (GUI.Button(new Rect((float)(Screen.width / 2 - 230), num, 225f, 35f), "OPEN SOUNDS FOLDER")) { try { Process.Start("explorer.exe", SoundboardPlugin.Instance.soundsDirectory); } catch { } } if (GUI.Button(new Rect((float)(Screen.width / 2 + 5), num, 225f, 35f), "RELOAD SOUNDS")) { ReloadSoundsFolder(); } num += 45f; for (int i = 0; i < tracks.Count; i++) { SoundTrack soundTrack = tracks[i]; GUI.Label(new Rect((float)(Screen.width / 2 - 230), num + (float)(i * 40), 280f, 30f), $"{i + 1}. {soundTrack.FileName}"); string text = ((bindingTrack == soundTrack) ? "PRESS ANY KEY..." : $"[{soundTrack.Key}]"); if (GUI.Button(new Rect((float)(Screen.width / 2 + 60), num + (float)(i * 40), 170f, 30f), text)) { bindingTrack = soundTrack; } } GUI.Label(new Rect((float)(Screen.width / 2 - 230), num + 320f, 460f, 30f), $"Press [{val}] to close. Click hotkey box to rebind."); } }