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 BoomboxMod v1.0.5
BepInEx/plugins/BoomboxMod.dll
Decompiled a year 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.Versioning; using BepInEx; using BepInEx.Logging; using BoomboxMod.NetcodePatcher; using GameNetcodeStuff; using HarmonyLib; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("BoomboxMod")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("BoomboxMod")] [assembly: AssemblyTitle("BoomboxMod")] [assembly: AssemblyVersion("1.0.0.0")] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace BoomboxMod { public class AudioEnhancement : MonoBehaviour { public static void ApplyAudioEnhancements() { BoomboxItem val = Object.FindObjectOfType<BoomboxItem>(); if ((Object)(object)val == (Object)null || (Object)(object)val.boomboxAudio == (Object)null) { Debug.LogError((object)"[ApplyAudioEnhancements] No BoomboxItem or AudioSource found!"); return; } AudioSource boomboxAudio = val.boomboxAudio; AudioLowPassFilter val2 = ((Component)val).gameObject.GetComponent<AudioLowPassFilter>(); if ((Object)(object)val2 == (Object)null) { val2 = ((Component)val).gameObject.AddComponent<AudioLowPassFilter>(); } val2.cutoffFrequency = 200f; val2.lowpassResonanceQ = 1f; boomboxAudio.volume = Mathf.Clamp(BoomboxMod.volumeClient * 2.2f, 0f, 2.2f); boomboxAudio.spatialBlend = 1f; boomboxAudio.dopplerLevel = 0f; boomboxAudio.minDistance = 3f; boomboxAudio.maxDistance = 25f; boomboxAudio.spread = 180f; boomboxAudio.rolloffMode = (AudioRolloffMode)1; boomboxAudio.SetCustomCurve((AudioSourceCurveType)0, CreateFadeOutCurve()); boomboxAudio.bypassEffects = false; boomboxAudio.bypassListenerEffects = false; boomboxAudio.bypassReverbZones = false; } private static AnimationCurve CreateFadeOutCurve() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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 Keyframe[] array = (Keyframe[])(object)new Keyframe[3] { new Keyframe(5f, 1f), new Keyframe(35f, 0.6f), new Keyframe(50f, 0f) }; return new AnimationCurve(array); } } [HarmonyPatch(typeof(GrabbableObject))] internal class BoomboxDropPatch { [HarmonyPrefix] [HarmonyPatch("DiscardItem")] private static void Prefix(GrabbableObject __instance) { BoomboxItem val = (BoomboxItem)(object)((__instance is BoomboxItem) ? __instance : null); if (val != null) { AudioSource boomboxAudio = val.boomboxAudio; if (!((Object)(object)boomboxAudio == (Object)null) && !boomboxAudio.isPlaying) { boomboxAudio.Stop(); BoomNetworkManager.instance.StopDroppedBoomboxServerRpc(); } } } } [HarmonyPatch(typeof(BoomboxItem))] internal class BoomboxPatch { public static string[] musicFiles; private static string musicDirectory; public static int trackIndex = 0; private static ManualLogSource logger = Logger.CreateLogSource("BoomboxPatch"); [HarmonyPrefix] [HarmonyPatch("ItemActivate")] private static bool ItemActivatePatch(BoomboxItem __instance, bool used, bool buttonDown) { if (!buttonDown) { return true; } ((GrabbableObject)__instance).itemProperties.batteryUsage = 1E+09f; AudioSource boomboxAudio = __instance.boomboxAudio; if ((Object)(object)boomboxAudio == (Object)null) { logger.LogError((object)"BoomboxItem has no AudioSource! Check if an AudioSource is attached."); return true; } if (boomboxAudio.isPlaying) { boomboxAudio.Pause(); return false; } if ((Object)(object)boomboxAudio.clip == (Object)null) { ((MonoBehaviour)__instance).StartCoroutine(PlayNextTrack(boomboxAudio, trackIndex)); } else { boomboxAudio.Play(); } return false; } public static IEnumerator PlayNextTrack(AudioSource audioSource, int trackIndex) { if (musicFiles == null || musicFiles.Length == 0) { InitializeMusicDirectory(); } if (musicFiles.Length == 0) { logger.LogError((object)"No files found! Please add songs to the BoomboxMusic directory."); yield break; } if ((Object)(object)audioSource == (Object)null) { logger.LogError((object)"No files! Please add songs to the BoomboxMusic directory."); yield break; } string filePath = "file://" + musicFiles[trackIndex]; if (!File.Exists(musicFiles[trackIndex])) { yield break; } AudioType audioType = (AudioType)13; if (musicFiles[trackIndex].EndsWith(".ogg", StringComparison.OrdinalIgnoreCase)) { audioType = (AudioType)14; } UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, audioType); ((DownloadHandlerAudioClip)www.downloadHandler).streamAudio = true; yield return www.SendWebRequest(); if ((int)www.result != 1) { Debug.LogError((object)("Failed to load track: " + www.error)); yield break; } AudioClip clip = DownloadHandlerAudioClip.GetContent(www); if (!((Object)(object)clip == (Object)null)) { audioSource.spatialize = false; audioSource.spatializePostEffects = false; audioSource.clip = clip; audioSource.volume = BoomboxMod.volumeClient; AudioEnhancement.ApplyAudioEnhancements(); yield return (object)new WaitForSeconds(0.5f); BoomNetworkManager.instance.ClientReadyServerRpc(NetworkManager.Singleton.LocalClientId); } } private static void InitializeMusicDirectory() { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); musicDirectory = Path.Combine(directoryName, "BoomboxMusic"); if (!Directory.Exists(musicDirectory)) { logger.LogWarning((object)("Music directory does not exist. Creating at: " + musicDirectory)); Directory.CreateDirectory(musicDirectory); } musicFiles = (from file in Directory.GetFiles(musicDirectory, "*.*", SearchOption.TopDirectoryOnly) where file.EndsWith(".mp3", StringComparison.OrdinalIgnoreCase) || file.EndsWith(".ogg", StringComparison.OrdinalIgnoreCase) select file).ToArray(); } } [BepInPlugin("BoomboxMod", "BoomboxMod", "1.0.5")] public class BoomboxMod : BaseUnityPlugin { private const string ModGUID = "BoomboxMod"; private const string ModName = "BoomboxMod"; private const string ModVersion = "1.0.5"; public readonly Harmony harmony = new Harmony("BoomboxMod"); public static BoomboxMod instance; private InputAction nextTrackAction; public GameObject netManagerPrefab; public GameObject landmineAudioPrefab; public ManualLogSource logger; public static float volumeClient = 1f; private InputAction volumeUpAction; private InputAction volumeDownAction; private void Awake() { //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Expected O, but got Unknown //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Expected O, but got Unknown //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Expected O, but got Unknown Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } if ((Object)(object)instance == (Object)null) { instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } else { Debug.LogError((object)"[BoomboxMod] Duplicate instance detected! Destroying new instance."); Object.Destroy((Object)(object)((Component)this).gameObject); } logger = ((BaseUnityPlugin)this).Logger; logger.LogInfo((object)"BoomboxMod initialized!"); string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "boomasset"); AssetBundle val = AssetBundle.LoadFromFile(text); if ((Object)(object)val == (Object)null) { logger.LogError((object)"Failed to load custom assets. Ensure 'boomasset' is with the .dll file"); return; } netManagerPrefab = val.LoadAsset<GameObject>("assets/boomnetworkmanager.prefab"); netManagerPrefab.AddComponent<BoomNetworkManager>(); landmineAudioPrefab = val.LoadAsset<GameObject>("assets/landminestop.prefab"); harmony.PatchAll(); logger.LogInfo((object)"BoomboxMod patched and networked successfully."); nextTrackAction = new InputAction("NextTrack", (InputActionType)0, "<Keyboard>/rightArrow", (string)null, (string)null, (string)null); nextTrackAction.performed += delegate { SkipTrack(); }; nextTrackAction.Enable(); volumeUpAction = new InputAction("VolumeUp", (InputActionType)1, "<Keyboard>/upArrow", (string)null, (string)null, (string)null); volumeUpAction.performed += delegate { VolumeUp(); }; volumeUpAction.Enable(); volumeDownAction = new InputAction("VolumeDown", (InputActionType)1, "<Keyboard>/downArrow", (string)null, (string)null, (string)null); volumeDownAction.performed += delegate { VolumeDown(); }; volumeDownAction.Enable(); } private void VolumeUp() { volumeClient = Mathf.Clamp(volumeClient + 0.1f, 0f, 1f); volumeClient = Mathf.Round(volumeClient * 10f) / 10f; ApplyVolumeChange(); } private void VolumeDown() { volumeClient = Mathf.Clamp(volumeClient - 0.1f, 0f, 1f); volumeClient = Mathf.Round(volumeClient * 10f) / 10f; ApplyVolumeChange(); } private void ApplyVolumeChange() { BoomboxItem val = Object.FindObjectOfType<BoomboxItem>(); if (!((Object)(object)val == (Object)null) && !((Object)(object)val.boomboxAudio == (Object)null)) { val.boomboxAudio.volume = volumeClient; logger.LogInfo((object)("Volume: " + volumeClient.ToString("0.0"))); } } private void SkipTrack() { BoomboxItem[] array = Object.FindObjectsOfType<BoomboxItem>(); if (array.Length == 0) { return; } PlayerControllerB[] array2 = Object.FindObjectsOfType<PlayerControllerB>(); PlayerControllerB val = null; BoomboxItem val2 = null; BoomboxItem[] array3 = array; foreach (BoomboxItem val3 in array3) { GrabbableObject componentInParent = ((Component)val3).GetComponentInParent<GrabbableObject>(); if ((Object)(object)componentInParent == (Object)null || (Object)(object)componentInParent.playerHeldBy == (Object)null) { logger.LogInfo((object)"You must be holding the Boombox to skip tracks!"); continue; } PlayerControllerB[] array4 = array2; foreach (PlayerControllerB val4 in array4) { if ((Object)(object)componentInParent.playerHeldBy == (Object)(object)val4) { val = val4; val2 = val3; break; } } } if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null) { return; } if (((NetworkBehaviour)val).OwnerClientId != NetworkManager.Singleton.LocalClientId) { logger.LogInfo((object)"You must be holding the Boombox to skip tracks!"); return; } if (BoomboxPatch.musicFiles == null || BoomboxPatch.musicFiles.Length == 0) { logger.LogError((object)"No music files available! Cannot skip track. Press play maybe."); return; } int num = (BoomboxPatch.trackIndex + 1) % BoomboxPatch.musicFiles.Length; AudioSource boomboxAudio = val2.boomboxAudio; if ((Object)(object)BoomNetworkManager.instance != (Object)null) { BoomNetworkManager.instance.SkipTrackServerRpc(num); } else { ((MonoBehaviour)val2).StartCoroutine(BoomboxPatch.PlayNextTrack(boomboxAudio, num)); } } public void Unload() { if (harmony != null) { harmony.UnpatchSelf(); } BoomboxPatch.musicFiles = null; } } public class BoomNetworkManager : NetworkBehaviour { public static BoomNetworkManager instance; private HashSet<ulong> readyClients = new HashSet<ulong>(); private AudioClip preloadedClip = null; private int preloadedTrackIndex = -1; private bool isPreloading = false; private float lastSkipTime = 0f; private float skipCooldown = 2f; private void Awake() { instance = this; } [ServerRpc(RequireOwnership = false)] public void StopDroppedBoomboxServerRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager != null && networkManager.IsListening) { if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2408351092u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2408351092u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { StopDroppedBoomboxClientRpc(); } } } [ClientRpc] public void StopDroppedBoomboxClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(121205134u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 121205134u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { BoomboxItem val3 = Object.FindObjectOfType<BoomboxItem>(); if ((Object)(object)val3 != (Object)null && (Object)(object)val3.boomboxAudio != (Object)null) { val3.boomboxAudio.Stop(); } } } [ServerRpc(RequireOwnership = false)] public void SkipTrackServerRpc(int newTrackIndex) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(4080895232u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, newTrackIndex); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 4080895232u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost)) { return; } float time = Time.time; if (time - lastSkipTime < skipCooldown) { Debug.LogWarning((object)"[BoomboxMod] Track skipping too fast! Ignoring request."); return; } lastSkipTime = time; BoomboxPatch.trackIndex = newTrackIndex; readyClients.Clear(); BoomboxItem val3 = Object.FindObjectOfType<BoomboxItem>(); if ((Object)(object)val3 != (Object)null && (Object)(object)val3.boomboxAudio != (Object)null) { val3.boomboxAudio.Stop(); } SkipTrackClientRpc(newTrackIndex); } [ServerRpc(RequireOwnership = false)] public void ClientReadyServerRpc(ulong clientId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(1705947175u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, clientId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 1705947175u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { readyClients.Add(clientId); if (readyClients.Count >= NetworkManager.Singleton.ConnectedClientsList.Count) { PlayTrackClientRpc(); } } } [ClientRpc] public void PlayTrackClientRpc() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3685604824u, val, (RpcDelivery)0); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3685604824u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { BoomboxItem val3 = Object.FindObjectOfType<BoomboxItem>(); if ((Object)(object)val3 == (Object)null || (Object)(object)val3.boomboxAudio == (Object)null || (Object)(object)val3.boomboxAudio.clip == (Object)null) { Debug.LogError((object)"[PlayTrack] No valid audio source or clip found!"); } else { val3.boomboxAudio.Play(); } } } [ClientRpc] public void SkipTrackClientRpc(int newTrackIndex) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Invalid comparison between Unknown and I4 //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(1801367408u, val, (RpcDelivery)0); BytePacker.WriteValueBitPacked(val2, newTrackIndex); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 1801367408u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 2 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } if (BoomboxPatch.musicFiles == null || BoomboxPatch.musicFiles.Length == 0) { Debug.LogError((object)"[SkipTrack] No music files available! Cannot skip track."); return; } BoomboxPatch.trackIndex = newTrackIndex; BoomboxMod.instance.logger.LogInfo((object)"Skipping track!"); BoomboxItem val3 = Object.FindObjectOfType<BoomboxItem>(); if (!((Object)(object)val3 == (Object)null) && !((Object)(object)val3.boomboxAudio == (Object)null)) { AudioSource boomboxAudio = val3.boomboxAudio; if ((Object)(object)preloadedClip != (Object)null && preloadedTrackIndex == newTrackIndex) { boomboxAudio.clip = preloadedClip; boomboxAudio.volume = BoomboxMod.volumeClient; AudioEnhancement.ApplyAudioEnhancements(); ClientReadyServerRpc(NetworkManager.Singleton.LocalClientId); preloadedClip = null; } else { ((MonoBehaviour)val3).StartCoroutine(LoadTrack(boomboxAudio, newTrackIndex)); } int trackIndex = (newTrackIndex + 1) % BoomboxPatch.musicFiles.Length; StartPreloadTrack(trackIndex); } } private IEnumerator LoadTrack(AudioSource audioSource, int trackIndex) { string filePath = "file://" + BoomboxPatch.musicFiles[trackIndex]; if (!File.Exists(BoomboxPatch.musicFiles[trackIndex])) { yield break; } AudioType audioType = (AudioType)13; if (BoomboxPatch.musicFiles[trackIndex].EndsWith(".ogg", StringComparison.OrdinalIgnoreCase)) { audioType = (AudioType)14; } UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, audioType); ((DownloadHandlerAudioClip)www.downloadHandler).streamAudio = true; yield return www.SendWebRequest(); if ((int)www.result != 1) { Debug.LogError((object)("[BoomboxMod] Failed to load audio clip: " + www.error)); yield break; } AudioClip clip = DownloadHandlerAudioClip.GetContent(www); if (!((Object)(object)clip == (Object)null)) { audioSource.clip = clip; audioSource.volume = BoomboxMod.volumeClient; AudioEnhancement.ApplyAudioEnhancements(); ClientReadyServerRpc(NetworkManager.Singleton.LocalClientId); } } private void StartPreloadTrack(int trackIndex) { if (!isPreloading) { ((MonoBehaviour)this).StartCoroutine(PreloadTrack(trackIndex)); } } private IEnumerator PreloadTrack(int trackIndex) { isPreloading = true; string filePath = "file://" + BoomboxPatch.musicFiles[trackIndex]; if (!File.Exists(BoomboxPatch.musicFiles[trackIndex])) { isPreloading = false; yield break; } AudioType audioType = (AudioType)13; if (BoomboxPatch.musicFiles[trackIndex].EndsWith(".ogg", StringComparison.OrdinalIgnoreCase)) { audioType = (AudioType)14; } UnityWebRequest www = UnityWebRequestMultimedia.GetAudioClip(filePath, audioType); ((DownloadHandlerAudioClip)www.downloadHandler).streamAudio = true; www.SendWebRequest(); while (!www.isDone) { yield return null; } if ((int)www.result != 1) { Debug.LogError((object)("[PreloadTrack] Failed to load audio clip: " + www.error)); isPreloading = false; yield break; } AudioClip clip = DownloadHandlerAudioClip.GetContent(www); if ((Object)(object)clip == (Object)null) { isPreloading = false; yield break; } preloadedClip = clip; preloadedTrackIndex = trackIndex; isPreloading = false; } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_BoomNetworkManager() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(2408351092u, new RpcReceiveHandler(__rpc_handler_2408351092)); NetworkManager.__rpc_func_table.Add(121205134u, new RpcReceiveHandler(__rpc_handler_121205134)); NetworkManager.__rpc_func_table.Add(4080895232u, new RpcReceiveHandler(__rpc_handler_4080895232)); NetworkManager.__rpc_func_table.Add(1705947175u, new RpcReceiveHandler(__rpc_handler_1705947175)); NetworkManager.__rpc_func_table.Add(3685604824u, new RpcReceiveHandler(__rpc_handler_3685604824)); NetworkManager.__rpc_func_table.Add(1801367408u, new RpcReceiveHandler(__rpc_handler_1801367408)); } private static void __rpc_handler_2408351092(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)1; ((BoomNetworkManager)(object)target).StopDroppedBoomboxServerRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_121205134(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((BoomNetworkManager)(object)target).StopDroppedBoomboxClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4080895232(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int newTrackIndex = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref newTrackIndex); target.__rpc_exec_stage = (__RpcExecStage)1; ((BoomNetworkManager)(object)target).SkipTrackServerRpc(newTrackIndex); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1705947175(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { ulong clientId = default(ulong); ByteUnpacker.ReadValueBitPacked(reader, ref clientId); target.__rpc_exec_stage = (__RpcExecStage)1; ((BoomNetworkManager)(object)target).ClientReadyServerRpc(clientId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3685604824(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { target.__rpc_exec_stage = (__RpcExecStage)2; ((BoomNetworkManager)(object)target).PlayTrackClientRpc(); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_1801367408(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { int newTrackIndex = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref newTrackIndex); target.__rpc_exec_stage = (__RpcExecStage)2; ((BoomNetworkManager)(object)target).SkipTrackClientRpc(newTrackIndex); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "BoomNetworkManager"; } } [HarmonyPatch(typeof(AudioSource))] internal class DebugAudioPatch { [HarmonyPrefix] [HarmonyPatch("Play", new Type[] { })] private static bool RedirectLandmineAudio(AudioSource __instance) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) if (((Object)((Component)__instance).gameObject).name.Contains("Landmine") && __instance.spatialize && string.IsNullOrEmpty(AudioSettings.GetSpatializerPluginName())) { GameObject landmineAudioPrefab = BoomboxMod.instance.landmineAudioPrefab; if ((Object)(object)landmineAudioPrefab == (Object)null) { return true; } GameObject val = Object.Instantiate<GameObject>(landmineAudioPrefab, ((Component)__instance).transform.position, Quaternion.identity); val.transform.SetParent(((Component)__instance).transform); ((Object)val).name = "LandmineAudioRedirect"; AudioSource component = val.GetComponent<AudioSource>(); component.clip = __instance.clip; component.Play(); return false; } return true; } } [HarmonyPatch(typeof(GameNetworkManager))] internal class GameNetworkManagerPatcher { [HarmonyPostfix] [HarmonyPatch("Start")] private static void AddToPrefabs(ref GameNetworkManager __instance) { ((Component)__instance).GetComponent<NetworkManager>().AddNetworkPrefab(BoomboxMod.instance.netManagerPrefab); } [HarmonyPostfix] [HarmonyPatch("StartDisconnect")] private static void DisconnectFromServer() { try { StopAllBoomboxes(); if (NetworkManager.Singleton.IsServer) { StartOfRoundPatcher.DestroyNetworkManager(); } } catch (Exception arg) { Debug.LogError((object)$"[BoomboxMod] Failed to clean up properly! Error: {arg}"); } } private static void StopAllBoomboxes() { BoomboxItem[] array = Object.FindObjectsOfType<BoomboxItem>(); BoomboxItem[] array2 = array; foreach (BoomboxItem val in array2) { if ((Object)(object)val.boomboxAudio != (Object)null && val.boomboxAudio.isPlaying) { val.boomboxAudio.Stop(); } } } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRoundPatcher { private static GameObject BoomBoxNetworkManager; [HarmonyPostfix] [HarmonyPatch("Start")] public static void AwakePatch(StartOfRound __instance) { if (!NetworkManager.Singleton.IsServer) { BoomboxMod.instance.logger.LogWarning((object)"Skipping NetworkObject spawn - not the server."); return; } BoomBoxNetworkManager = Object.Instantiate<GameObject>(BoomboxMod.instance.netManagerPrefab); BoomBoxNetworkManager.GetComponent<NetworkObject>().Spawn(false); } public static void DestroyNetworkManager() { if ((Object)(object)BoomBoxNetworkManager != (Object)null) { Object.Destroy((Object)(object)BoomBoxNetworkManager); BoomBoxNetworkManager = null; } } } } namespace BoomboxMod.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }