The BepInEx console will not appear when launching like it does for other games on Thunderstore (you can turn it back on in your BepInEx.cfg file). If your PEAK crashes on startup, add -dx12 to your launch parameters.
Decompiled source of Bugler v1.0.3
BuglerMod.dll
Decompiled a month agousing System; using System.Collections; 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 HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("BuglerMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BuglerMod")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4630658f-0bc4-4c7c-ae68-670e5cc9430f")] [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")] [BepInPlugin("com.yourname.buglereplace", "Bugle Multi-Sound Replacer", "1.0.0")] public class BuglerMod : BaseUnityPlugin { [CompilerGenerated] private sealed class <LoadClipFromWWW>d__3 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public WWW www; public int index; public BuglerMod <>4__this; public string fileName; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadClipFromWWW>d__3(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; BuglerMod buglerMod = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = www; <>1__state = 1; return true; case 1: { <>1__state = -1; AudioClip audioClip = www.GetAudioClip(false, false, (AudioType)20); if ((Object)(object)audioClip != (Object)null) { customBugleClips[index] = audioClip; ((BaseUnityPlugin)buglerMod).Logger.LogInfo((object)$"[BuglerMod] Loaded replacement for Bugle {index + 1} from {fileName}"); } else { ((BaseUnityPlugin)buglerMod).Logger.LogError((object)("[BuglerMod] Failed to load audio clip: " + fileName)); } 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 readonly Dictionary<int, AudioClip> customBugleClips = new Dictionary<int, AudioClip>(); private void Awake() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown ((BaseUnityPlugin)this).Logger.LogInfo((object)"[BuglerMod] Initializing Harmony patch..."); Harmony val = new Harmony("com.yourname.buglereplace"); Type type = AccessTools.TypeByName("BugleSFX"); if (type == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[BuglerMod] Could not find BugleSFX type!"); return; } MethodInfo method = type.GetMethod("Update", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo methodInfo = AccessTools.Method(typeof(BuglerMod), "UpdatePostfix", (Type[])null, (Type[])null); if (method == null || methodInfo == null) { ((BaseUnityPlugin)this).Logger.LogError((object)"[BuglerMod] Failed to find method for patching."); return; } val.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(methodInfo), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[BuglerMod] Harmony patch applied successfully."); LoadCustomClips(); } private void LoadCustomClips() { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Expected O, but got Unknown string path = Path.Combine(Paths.PluginPath, "EmpsTeam-Bugler"); foreach (KeyValuePair<int, string> item in new Dictionary<int, string> { { 0, "Fanfare.wav" }, { 1, "Reveille.wav" }, { 2, "Taps.wav" }, { 3, "YankeeDoodle.wav" } }) { string text = Path.Combine(path, item.Value); if (!File.Exists(text)) { ((BaseUnityPlugin)this).Logger.LogWarning((object)("[BuglerMod] Sound file not found: " + text)); continue; } WWW www = new WWW("file://" + text); ((MonoBehaviour)this).StartCoroutine(LoadClipFromWWW(item.Key, www, item.Value)); } } [IteratorStateMachine(typeof(<LoadClipFromWWW>d__3))] private IEnumerator LoadClipFromWWW(int index, WWW www, string fileName) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadClipFromWWW>d__3(0) { <>4__this = this, index = index, www = www, fileName = fileName }; } private static void UpdatePostfix(object __instance) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown Type type = __instance.GetType(); FieldInfo fieldInfo = AccessTools.Field(type, "hold"); FieldInfo fieldInfo2 = AccessTools.Field(type, "bugle"); FieldInfo fieldInfo3 = AccessTools.Field(type, "buglePlayer"); FieldInfo fieldInfo4 = AccessTools.Field(type, "currentClip"); if (!(fieldInfo == null) && !(fieldInfo2 == null) && !(fieldInfo3 == null) && !(fieldInfo4 == null)) { bool num = (bool)fieldInfo.GetValue(__instance); AudioSource val = (AudioSource)fieldInfo3.GetValue(__instance); int key = (int)fieldInfo4.GetValue(__instance); if (num && (Object)(object)val != (Object)null && customBugleClips.TryGetValue(key, out var value) && (Object)(object)val.clip != (Object)(object)value) { val.clip = value; val.Play(); } } } }