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 CustomBoomboxMusic v1.0.2
LTGVE.CustomBoomboxMusic.dll
Decompiled 2 days agousing System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text.RegularExpressions; using System.Web; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks.CompilerServices; using GameNetcodeStuff; using HarmonyLib; using LethalModUtils; using Microsoft.CodeAnalysis; using Newtonsoft.Json; using Unity.Netcode; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyVersion("0.0.0.0")] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } public class ConstValues { public const string RequestSongApiURL = "https://music.163.com/song/media/outer/url?id="; public const string SongInfoApi = "https://music.163.com/api/song/detail?ids="; } [HarmonyPatch(typeof(HUDManager), "EnableChat_performed")] public class HUDManager_OpenChatPatch { [HarmonyPrefix] public static void Prefix(HUDManager __instance) { __instance.chatTextField.characterLimit = int.MaxValue; } } public class NormalInfoData { public string name; public long id; } public class SingleSongInfoData : NormalInfoData { public List<NormalInfoData> artists; public string getAllArtists() { string[] array = new string[artists.Count]; int num = 0; foreach (NormalInfoData artist in artists) { if (num <= artists.Count - 1) { array[num] = artist.name; num++; } } return string.Join(",", array); } } public class RequestSongInfoData { public List<SingleSongInfoData> songs; } internal static class StringUtils { internal static string[] ToCommandLineArgs(this string str) { string[] array = str.Split(" "); bool flag = false; string text = ""; List<string> list = new List<string>(); for (int i = 0; i < array.Length; i++) { string text2 = array[i]; if (!flag) { if (text2.StartsWith("\"") && !text2.EndsWith("\"")) { flag = true; text = ""; text += text2; continue; } if (text2.StartsWith("\"") && text2.EndsWith("\"")) { text2 = text2.RemoveStartWith("\""); text2 = text2.RemoveEndWith("\""); } list.Add(text2); } else if (text2.EndsWith("\"") && !text2.StartsWith("\"")) { flag = false; text = text + " " + text2; text = text.RemoveEndWith("\""); text = text.RemoveStartWith("\""); list.Add(text); } else { text = text + " " + text2; } } return list.ToArray(); } internal static string RemoveEndWith(this string str, string endStr) { if (str.EndsWith(endStr)) { return str.Substring(0, str.Length - endStr.Length); } return str; } internal static string RemoveStartWith(this string str, string startStr) { if (str.StartsWith(startStr)) { return str.Substring(startStr.Length, str.Length - startStr.Length); } return str; } } public class URLData { public bool isHttp { get; private set; } public string Domain { get; private set; } public string Path { get; private set; } public List<QueryData> queryData { get; private set; } public URLData(bool isHttp, string domain, string path, List<QueryData> queryData) { this.isHttp = isHttp; Domain = domain; Path = path; this.queryData = queryData; } } public class QueryData { public string key { get; private set; } public string value { get; private set; } public QueryData(string key, string value) { this.key = key; this.value = value; } } public class URLProcess { public static URLData ProcessURL(string url) { Debug.Log((object)("Processing URL: " + url)); Uri uri = new Uri(url); bool isHttp = uri.Scheme == Uri.UriSchemeHttp; string host = uri.Host; string absolutePath = uri.AbsolutePath; NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(uri.Query); List<QueryData> list = new List<QueryData>(); for (int i = 0; i < nameValueCollection.Count; i++) { string key = nameValueCollection.AllKeys[i]; string value = nameValueCollection[i]; list.Add(new QueryData(key, value)); } return new URLData(isHttp, host, absolutePath, list); } } [CompilerGenerated] [EditorBrowsable(EditorBrowsableState.Never)] [GeneratedCode("Unity.MonoScriptGenerator.MonoScriptInfoGenerator", null)] internal class UnitySourceGeneratedAssemblyMonoScriptTypes_v1 { private struct MonoScriptData { public byte[] FilePathsData; public byte[] TypesData; public int TotalTypes; public int TotalFiles; public bool IsEditorOnly; } [MethodImpl(MethodImplOptions.AggressiveInlining)] private static MonoScriptData Get() { MonoScriptData result = default(MonoScriptData); result.FilePathsData = new byte[733] { 0, 0, 0, 1, 0, 0, 0, 48, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 65, 117, 100, 105, 111, 70, 105, 108, 101, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 51, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 65, 117, 100, 105, 111, 77, 97, 110, 97, 103, 101, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 61, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 104, 97, 116, 67, 111, 109, 109, 97, 110, 100, 73, 110, 116, 101, 103, 114, 97, 116, 105, 111, 110, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 111, 110, 115, 116, 86, 97, 108, 117, 101, 115, 46, 99, 115, 0, 0, 0, 4, 0, 0, 0, 57, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 63, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 72, 85, 68, 77, 97, 110, 97, 103, 101, 114, 95, 79, 112, 101, 110, 67, 104, 97, 116, 80, 97, 116, 99, 104, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 58, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 111, 100, 78, 101, 116, 119, 111, 114, 107, 66, 101, 104, 97, 118, 105, 111, 117, 114, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 51, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 77, 121, 80, 108, 117, 103, 105, 110, 73, 110, 102, 111, 46, 99, 115, 0, 0, 0, 3, 0, 0, 0, 53, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 78, 111, 114, 109, 97, 108, 73, 110, 102, 111, 68, 97, 116, 97, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 50, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 83, 116, 114, 105, 110, 103, 85, 116, 105, 108, 115, 46, 99, 115, 0, 0, 0, 2, 0, 0, 0, 46, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 82, 76, 68, 97, 116, 97, 46, 99, 115, 0, 0, 0, 1, 0, 0, 0, 49, 92, 65, 115, 115, 101, 116, 115, 92, 76, 101, 116, 104, 97, 108, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 66, 111, 120, 92, 83, 99, 114, 105, 112, 116, 115, 92, 85, 82, 76, 80, 114, 111, 99, 101, 115, 115, 46, 99, 115 }; result.TypesData = new byte[569] { 0, 0, 0, 0, 28, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 65, 117, 100, 105, 111, 70, 105, 108, 101, 0, 0, 0, 0, 31, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 65, 117, 100, 105, 111, 77, 97, 110, 97, 103, 101, 114, 0, 0, 0, 0, 33, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 66, 111, 111, 109, 98, 111, 120, 67, 111, 109, 109, 97, 110, 100, 0, 0, 0, 0, 12, 124, 67, 111, 110, 115, 116, 86, 97, 108, 117, 101, 115, 0, 0, 0, 0, 37, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 0, 0, 0, 0, 48, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 46, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 83, 116, 97, 114, 116, 80, 97, 116, 99, 104, 0, 0, 0, 0, 47, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 46, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 73, 110, 105, 116, 80, 97, 116, 99, 104, 0, 0, 0, 0, 54, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 46, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 66, 111, 111, 109, 98, 111, 120, 80, 108, 97, 121, 80, 97, 116, 99, 104, 0, 0, 0, 0, 25, 124, 72, 85, 68, 77, 97, 110, 97, 103, 101, 114, 95, 79, 112, 101, 110, 67, 104, 97, 116, 80, 97, 116, 99, 104, 0, 0, 0, 0, 38, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 77, 111, 100, 78, 101, 116, 119, 111, 114, 107, 66, 101, 104, 97, 118, 105, 111, 117, 114, 0, 0, 0, 0, 31, 67, 117, 115, 116, 111, 109, 66, 111, 111, 109, 98, 111, 120, 77, 117, 115, 105, 99, 124, 77, 121, 80, 108, 117, 103, 105, 110, 73, 110, 102, 111, 0, 0, 0, 0, 15, 124, 78, 111, 114, 109, 97, 108, 73, 110, 102, 111, 68, 97, 116, 97, 0, 0, 0, 0, 19, 124, 83, 105, 110, 103, 108, 101, 83, 111, 110, 103, 73, 110, 102, 111, 68, 97, 116, 97, 0, 0, 0, 0, 20, 124, 82, 101, 113, 117, 101, 115, 116, 83, 111, 110, 103, 73, 110, 102, 111, 68, 97, 116, 97, 0, 0, 0, 0, 12, 124, 83, 116, 114, 105, 110, 103, 85, 116, 105, 108, 115, 0, 0, 0, 0, 8, 124, 85, 82, 76, 68, 97, 116, 97, 0, 0, 0, 0, 10, 124, 81, 117, 101, 114, 121, 68, 97, 116, 97, 0, 0, 0, 0, 11, 124, 85, 82, 76, 80, 114, 111, 99, 101, 115, 115 }; result.TotalFiles = 12; result.TotalTypes = 18; result.IsEditorOnly = false; return result; } } namespace CustomBoomboxMusic { public sealed class AudioFile { public int? VanillaId { get; } public uint? Crc { get; } public AudioClip AudioClip { get; } public string FilePath { get; } public string Name => Path.GetFileNameWithoutExtension(FilePath); public AudioFile(uint crc, AudioClip audioClip, string filePath) { Crc = crc; AudioClip = audioClip; FilePath = filePath; } public AudioFile(int vanillaId, AudioClip audioClip) { VanillaId = vanillaId; AudioClip = audioClip; FilePath = $"Boombox {vanillaId + 1} (Lethal Company)"; } public override string ToString() { return "{ VanillaId: " + a(VanillaId) + ", Crc: " + a(Crc) + ", AudioClip: " + b(AudioClip) + ", FilePath: " + c(FilePath) + ", Name: " + c(Name) + " }"; static string a(object? e) { if (e != null) { return e.ToString(); } return "null"; } static string b(AudioClip e) { if (!((Object)(object)e == (Object)null) && Object.op_Implicit((Object)(object)e)) { return ((object)e).ToString(); } return "null"; } static string c(string? e) { if (e != null) { return "\"" + e.Replace("\\", "\\\\").Replace("\"", "\\\"").Replace("\n", "\\n") + "\""; } return "null"; } } } public static class AudioManager { private static List<AudioFile> audioClips = new List<AudioFile>(); internal const string VANILLA_AUDIO_CLIP_NAME = "Boombox {0} (Lethal Company)"; public static IReadOnlyList<AudioFile> AudioClips => audioClips; public static IReadOnlyList<AudioFile> VanillaAudioClips(BoomboxItem boombox) { return boombox.musicAudios.Select((AudioClip clip, int i) => new AudioFile(i, clip)).ToList(); } internal static void Reload() { CollectionExtensions.Do<AudioFile>((IEnumerable<AudioFile>)audioClips, (Action<AudioFile>)delegate(AudioFile f) { f.AudioClip.UnloadAudioData(); }); audioClips.Clear(); FS.IterateDirectories(new DirectoryInfo(Paths.BepInExRootPath), (Action<FileInfo>)ProcessFile, (Func<DirectoryInfo, ProcessFilter>)((DirectoryInfo i) => i.Name.Equals("CustomBoomboxMusic", StringComparison.CurrentCultureIgnoreCase) ? ((ProcessFilter)0) : ((ProcessFilter)2))); audioClips = audioClips.OrderBy((AudioFile f) => f.Crc).ToList(); CustomBoomboxMusic.BoomboxPlayPatch.rng = new ConditionalWeakTable<BoomboxItem, IEnumerator<AudioFile>>(); } internal static void ProcessFile(FileInfo file) { CustomBoomboxMusic.Logger.LogDebug((object)$">> ProcessFile(file: {file})"); try { UnityWebRequest val = default(UnityWebRequest); AudioClip audioClip = Audio.Load(new Uri(file.FullName), ref val, (TimeSpan?)CustomBoomboxMusic.Instance.LoadTimeOut); audioClips.Add(new AudioFile(Crc32.Calculate(val.downloadHandler.data), audioClip, file.FullName)); } catch (Exception arg) { CustomBoomboxMusic.Logger.LogWarning((object)$"Couldn't load file {file.FullName}: {arg}"); } } internal static void ProcessFile(FileInfo file, out AudioFile audioFile) { CustomBoomboxMusic.Logger.LogDebug((object)$">> ProcessFile(file: {file})"); audioFile = null; try { UnityWebRequest val = default(UnityWebRequest); AudioClip audioClip = Audio.Load(new Uri(file.FullName), ref val, (TimeSpan?)CustomBoomboxMusic.Instance.LoadTimeOut); audioFile = new AudioFile(Crc32.Calculate(val.downloadHandler.data), audioClip, file.FullName); audioClips.Add(audioFile); } catch (Exception arg) { CustomBoomboxMusic.Logger.LogWarning((object)$"Couldn't load file {file.FullName}: {arg}"); } } public static bool TryGetCrc(uint crc, out AudioFile audioClip) { return (audioClip = AudioClips.FirstOrDefault((AudioFile i) => i.Crc.HasValue && i.Crc.Value == crc)) != null; } public static bool TryGetVanillaId(BoomboxItem boombox, int vanillaId, out AudioFile audioClip) { return (audioClip = VanillaAudioClips(boombox).FirstOrDefault((AudioFile i) => i.VanillaId.HasValue && i.VanillaId.Value == vanillaId)) != null; } } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyWrapSafe] public class BoomboxCommand { public static MethodInfo GrabbaleObject_ActivateItemRpc = typeof(GrabbableObject).GetMethod("ActivateItemRpc", BindingFlags.Instance | BindingFlags.NonPublic); public static string error; [HarmonyPrefix] public static bool Prefix(HUDManager __instance) { //IL_067e: Unknown result type (might be due to invalid IL or missing references) //IL_061c: Unknown result type (might be due to invalid IL or missing references) //IL_05a3: Unknown result type (might be due to invalid IL or missing references) __instance.chatTextField.characterLimit = int.MaxValue; bool flag = (__instance.chatTextField.text.StartsWith("!") && __instance.chatTextField.text.StartsWith("!boombox") && __instance.chatTextField.text.Length > "!boombox ".Length) || (__instance.chatTextField.text.StartsWith("!") && __instance.chatTextField.text.StartsWith("!boo") && __instance.chatTextField.text.Length > "!boo ".Length); if (!flag) { return true; } string[] array = __instance.chatTextField.text.RemoveStartWith("!boombox ").RemoveStartWith("!boo ").ToCommandLineArgs(); error = ""; string text = ((array.Length != 0) ? array[0] : null); GrabbableObject val = GameNetworkManager.Instance?.localPlayerController?.currentlyHeldObjectServer; BoomboxItem val2 = null; bool flag2 = (Object)(object)val != (Object)null && ((Component)val).gameObject.TryGetComponent<BoomboxItem>(ref val2); switch (text) { default: switch (text) { case "list": case "l": { List<AudioFile> list = AudioManager.AudioClips.OrderBy((AudioFile i) => i.Name).ToList(); int count2 = list.Count; HUDManager.Instance.DisplayTip("Info", (count2 == 0) ? (a(count2) + " loaded") : (a(count2) + " loaded:\n> " + GeneralExtensions.Join<AudioFile>((IEnumerable<AudioFile>)list, (Func<AudioFile, string>)((AudioFile i) => i.Name), "\n> ")), false, false, "LC_Tip1"); CustomBoomboxMusic.Logger.LogInfo((object)$"Listing loaded tracks ({count2}):"); foreach (AudioFile item in list) { CustomBoomboxMusic.Logger.LogInfo((object)$"> {item.Name} - {item.FilePath} (CRC32: {item.Crc})"); } break; } case "play": case "p": error = "Invalid arguments"; if (array.Length < 2) { __instance.localPlayer.isTypingChat = false; break; } error = "You need to be holding a boombox"; if (!flag2) { __instance.localPlayer.isTypingChat = false; break; } error = "Track could not be found"; return Play(GeneralExtensions.Join<string>((IEnumerable<string>)array[1..], (Func<string, string>)null, " "), val2); case "nlink": case "nurl": { string text2 = ((array.Length > 1) ? array[1] : null); try { if (text2 == null) { error = "Invalid arguments"; break; } if (!flag2) { error = "You need to be holding a boombox"; __instance.localPlayer.isTypingChat = false; break; } string value = URLProcess.ProcessURL(text2).queryData.FirstOrDefault((QueryData i) => i.key == "id").value; ModNetworkBehaviour.Instance?.DownloadSong_Rpc(value, NetworkObjectReference.op_Implicit(((NetworkBehaviour)val2).NetworkObject)); } catch (Exception ex) { Debug.LogException(ex); } break; } case "dlink": case "durl": case "dl": { string text3 = ((array.Length > 1) ? array[1] : null); try { if (text3 == null) { error = "Invalid arguments"; } else if (!flag2) { error = "You need to be holding a boombox"; __instance.localPlayer.isTypingChat = false; } else { __instance.AddTextToChatOnServer("Your song has been started downloading.", -1); ModNetworkBehaviour.Instance?.DownloadDirectLinkSong_Rpc(text3, NetworkObjectReference.op_Implicit(((NetworkBehaviour)val2).NetworkObject)); } } catch (Exception ex2) { Debug.LogException(ex2); } break; } case "bypassReverb": case "br": if (array.Length < 2) { error = "Invalid arguments"; } else if (!flag2) { error = "You need to be holding a boombox"; __instance.localPlayer.isTypingChat = false; } else { bool bypass = bool.Parse(array[1]); ModNetworkBehaviour.Instance?.BoomBoxBypassReverb_Rpc(bypass, NetworkObjectReference.op_Implicit(((NetworkBehaviour)val2).NetworkObject)); __instance.AddTextToChatOnServer("Changed bypass reverb.", -1); } break; default: HUDManager.Instance.DisplayTip("Warn", "Invalid subcommand, use /help for usage information", true, false, "LC_Tip1"); break; } break; case "reload": case "r": HUDManager.Instance.DisplayTip("Info", "Reloading...", false, false, "LC_Tip1"); AudioManager.Reload(); HUDManager.Instance.DisplayTip("Info", "Done reloading, found " + a(AudioManager.AudioClips.Count), false, false, "LC_Tip1"); break; case "version": case "v": case null: HUDManager.Instance.DisplayTip("Info", "CustomBoomboxMusic v1.0.1\n" + a(AudioManager.AudioClips.Count) + " loaded", false, false, "LC_Tip1"); break; } if (flag) { __instance.chatTextField.text = ""; return true; } return true; static string a(int count) { if (count != 0) { return $"{count} track{b(count)}"; } return "No tracks"; } static string b(int count) { if (count != 1) { return "s"; } return string.Empty; } } private static bool Play(string identifier, BoomboxItem boombox) { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) IReadOnlyList<AudioFile> readOnlyList = AudioManager.AudioClips; if (CustomBoomboxMusic.Instance.IncludeVanilla || readOnlyList.Count == 0) { readOnlyList = readOnlyList.Concat(AudioManager.VanillaAudioClips(boombox)).ToList(); } List<AudioFile> list = new List<AudioFile>(); if (uint.TryParse(identifier, out var result) && AudioManager.TryGetCrc(result, out var audioClip)) { list.Add(audioClip); } if (list.Count == 0) { list.AddRange(readOnlyList.Where((AudioFile i) => string.Equals(i.Name, identifier, StringComparison.CurrentCultureIgnoreCase))); } if (list.Count == 0) { list.AddRange(readOnlyList.Where((AudioFile i) => i.Name.StartsWith(identifier, StringComparison.CurrentCultureIgnoreCase))); } if (list.Count == 0) { return false; } foreach (AudioFile item in list) { if (item == null) { continue; } if ((Object)(object)ModNetworkBehaviour.Instance != (Object)null) { if (item.VanillaId.HasValue) { ModNetworkBehaviour.Instance.StartPlayingVanillaMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boombox).NetworkObject), item.VanillaId.Value); } else { if (!item.Crc.HasValue) { CustomBoomboxMusic.Logger.LogWarning((object)$"AudioFile doesn't have CRC nor VanillaID: {item}"); continue; } ModNetworkBehaviour.Instance.StartPlayingMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boombox).NetworkObject), item.Crc.Value, item.Name); } return true; } if (!((GrabbableObject)boombox).isBeingUsed) { GrabbaleObject_ActivateItemRpc.Invoke(boombox, new object[2] { true, true }); } boombox.boomboxAudio.clip = item.AudioClip; boombox.boomboxAudio.pitch = 1f; boombox.boomboxAudio.Play(); ((GrabbableObject)boombox).isBeingUsed = (boombox.isPlayingMusic = true); CustomBoomboxMusic.AnnouncePlaying(item); return true; } return false; } } [BepInPlugin("LTGVE.CustomBoomboxMusic", "CustomBoomboxMusic", "1.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class CustomBoomboxMusic : BaseUnityPlugin { [HarmonyPatch(typeof(GameNetworkManager), "Start")] internal static class StartPatch { private static void Postfix() { Logger.LogDebug((object)$">> StartPatch() ClientSide:{Instance.ClientSide} networkPrefab:{a(networkPrefab)}"); if (!Instance.ClientSide && !((Object)(object)networkPrefab != (Object)null)) { networkPrefab = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, "modnetworkmanager")).LoadAsset<GameObject>("ModNetworkManager"); ((Object)networkPrefab).name = "LTGVE.CustomBoomboxMusic-ModNetworkManager"; networkPrefab.AddComponent<ModNetworkBehaviour>(); NetworkManager.Singleton.AddNetworkPrefab(networkPrefab); Logger.LogDebug((object)(" Registered network prefab " + a(networkPrefab))); } } } [HarmonyPatch(typeof(StartOfRound), "Awake")] internal static class InitPatch { private static void Postfix() { //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) Logger.LogDebug((object)$">> InitPatch() ClientSide:{Instance.ClientSide} IsHost:{NetworkManager.Singleton.IsHost} IsServer:{NetworkManager.Singleton.IsServer} networkPrefab:{a(networkPrefab)}"); if (Instance.ClientSide || (!NetworkManager.Singleton.IsHost && !NetworkManager.Singleton.IsServer) || (Object)(object)networkPrefab == (Object)null) { Logger.LogDebug((object)"<< InitPatch false"); return; } Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity).GetComponent<NetworkObject>().Spawn(true); Logger.LogDebug((object)"<< InitPatch true"); } } [HarmonyPatch(typeof(BoomboxItem), "StartMusic")] internal static class BoomboxPlayPatch { internal static ConditionalWeakTable<BoomboxItem, IEnumerator<AudioFile>> rng = new ConditionalWeakTable<BoomboxItem, IEnumerator<AudioFile>>(); private static IReadOnlyList<AudioFile> GetClips(BoomboxItem __instance) { IReadOnlyList<AudioFile> readOnlyList = AudioManager.AudioClips; if (Instance.IncludeVanilla || readOnlyList.Count == 0) { readOnlyList = readOnlyList.Concat(AudioManager.VanillaAudioClips(__instance)).ToList(); } return readOnlyList; } private static IEnumerator<AudioFile> RNG(BoomboxItem __instance) { IReadOnlyList<AudioFile> clips = GetClips(__instance); Logger.LogDebug((object)$">> RNG({__instance}) clips.Count: {clips.Count}"); List<int> clipIds = Enumerable.Range(0, clips.Count).ToList(); while (clipIds.Count > 0) { int index = __instance.musicRandomizer.Next(clipIds.Count); int num = clipIds[index]; clipIds.RemoveAt(index); Logger.LogDebug((object)$"Requested new RNG Value for {__instance}: {num} ({clipIds.Count} remaining)"); yield return clips[num]; } } private static AudioFile OldRNG(BoomboxItem __instance) { IReadOnlyList<AudioFile> clips = GetClips(__instance); Logger.LogDebug((object)$">> OldRNG({__instance}) clips.Count: {clips.Count}"); return clips[__instance.musicRandomizer.Next(clips.Count)]; } private static AudioFile GetNextClip(BoomboxItem __instance) { Logger.LogDebug((object)$">> GetNextClip({__instance})"); if (!Instance.NewRNG) { return OldRNG(__instance); } if (!rng.TryGetValue(__instance, out var enumerator)) { Logger.LogDebug((object)" Failed to obtain enumerator, creating new..."); create(); } AudioFile current = enumerator.Current; Logger.LogDebug((object)$" Got clip: {current}"); if (!enumerator.MoveNext()) { Logger.LogDebug((object)" Failed to advance RNG, creating new..."); create(); } return current; void create() { rng.AddOrUpdate(__instance, enumerator = RNG(__instance)); enumerator.MoveNext(); } } private static bool Prefix(ref BoomboxItem __instance, ref bool startMusic, ref bool pitchDown) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) if (!startMusic) { return true; } if (!Instance.ClientSide && !((NetworkBehaviour)__instance).IsOwner) { return false; } AudioFile nextClip = GetNextClip(__instance); if ((Object)(object)ModNetworkBehaviour.Instance != (Object)null) { if (nextClip.VanillaId.HasValue) { ModNetworkBehaviour.Instance.StartPlayingVanillaMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)__instance).NetworkObject), nextClip.VanillaId.Value); } else if (nextClip.Crc.HasValue) { ModNetworkBehaviour.Instance.StartPlayingMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)__instance).NetworkObject), nextClip.Crc.Value, nextClip.Name); } else { Logger.LogWarning((object)$"AudioFile doesn't have CRC nor VanillaID: {nextClip}"); } } else { __instance.boomboxAudio.clip = nextClip.AudioClip; __instance.boomboxAudio.pitch = 1f; __instance.boomboxAudio.Play(); BoomboxItem obj = __instance; BoomboxItem obj2 = __instance; bool num = startMusic; bool isBeingUsed = num; obj2.isPlayingMusic = num; ((GrabbableObject)obj).isBeingUsed = isBeingUsed; a(nextClip, __instance); } return false; } private static void a(AudioFile audioFile, BoomboxItem boombox) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) Logger.LogDebug((object)$">> BoomboxPlayPatch({audioFile}, {boombox}) IsOwner:{((NetworkBehaviour)boombox).IsOwner}"); if (!((Object)(object)GameNetworkManager.Instance?.localPlayerController == (Object)null) && (!GameNetworkManager.Instance.localPlayerController.isPlayerDead || GameNetworkManager.Instance.localPlayerController.hasBegunSpectating) && (Vector3.Distance(((Component)boombox.boomboxAudio).transform.position, GameNetworkManager.Instance.localPlayerController.isPlayerDead ? ((Component)GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript).transform.position : ((Component)GameNetworkManager.Instance.localPlayerController).transform.position) <= boombox.boomboxAudio.maxDistance || ((NetworkBehaviour)boombox).IsOwner || ((NetworkBehaviour)boombox).OwnerClientId == GameNetworkManager.Instance.localPlayerController.spectatedPlayerScript.actualClientId)) { AnnouncePlaying(audioFile); } } } public const string DIRECTORY_NAME = "CustomBoomboxMusic"; private ConfigEntry<float> loadTimeOut; private ConfigEntry<bool> displayNowPlaying; private ConfigEntry<bool> includeVanilla; private ConfigEntry<bool> newRNG; private ConfigEntry<bool> clientSide; private static GameObject networkPrefab; public static CustomBoomboxMusic Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } public static string PluginPath => Path.GetDirectoryName(typeof(CustomBoomboxMusic).Assembly.Location); public TimeSpan LoadTimeOut => TimeSpan.FromSeconds(loadTimeOut.Value); public bool DisplayNowPlaying => displayNowPlaying.Value; public bool IncludeVanilla => includeVanilla.Value; public bool NewRNG => newRNG.Value; public bool ClientSide { get; private set; } private void Awake() { //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; Instance = this; loadTimeOut = ((BaseUnityPlugin)this).Config.Bind<float>("General", "LoadTimeOut", 10f, "Maximum amount of time to wait for an audio file to load. Increase this value if you have giant files or are using a slow drive"); displayNowPlaying = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "DisplayNowPlaying", true, "Whether to display a popup about which song is currently playing"); includeVanilla = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IncludeVanilla", true, "Includes vanilla music (forced true if no custom music is present)"); includeVanilla.SettingChanged += delegate { BoomboxPlayPatch.rng = new ConditionalWeakTable<BoomboxItem, IEnumerator<AudioFile>>(); }; newRNG = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "NewRNG", true, "Enables an improved RNG which prevents repeats"); clientSide = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "ClientSide", false, "Enables or disables custom networking to more accurately sync which song is currently playing"); ClientSide = clientSide.Value; clientSide.SettingChanged += delegate { Logger.LogWarning((object)"ClientSide requires a restart of the game to apply"); }; Logger.LogInfo((object)("Client-side mode " + (ClientSide ? "enabled" : "disabled"))); AudioManager.Reload(); if (Harmony == null) { Harmony = new Harmony("LTGVE.CustomBoomboxMusic"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(); Logger.LogDebug((object)"Finished patching!"); Logger.LogInfo((object)"LTGVE.CustomBoomboxMusic v1.0.1 has loaded!"); } private static string a(GameObject? e) { if (!((Object)(object)e == (Object)null)) { return ((object)e).ToString(); } return "null"; } internal static void AnnouncePlaying(AudioFile audioFile) { string name = audioFile.Name; Logger.LogInfo((object)("Now playing: " + name)); if (Instance.DisplayNowPlaying) { HUDManager.Instance.DisplayTip("Now playing:", name ?? "", false, false, "LC_Tip1"); } } internal static void AnnounceMissing(string missingName) { Logger.LogWarning((object)("Missing audio for " + missingName)); HUDManager.Instance.DisplayTip("Missing audio:", missingName + " could not be played", true, false, "LC_Tip1"); } } public class ModNetworkBehaviour : NetworkBehaviour { [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <DownloadDirectLinkSongAsync>d__16 : IAsyncStateMachine { public int <>1__state; public AsyncUniTaskMethodBuilder <>t__builder; public string url; public ModNetworkBehaviour <>4__this; public BoomboxItem boomboxItem; private UnityWebRequest <www>5__2; private UnityWebRequestAsyncOperationAwaiter <>u__1; private void MoveNext() { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Expected O, but got Unknown //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Invalid comparison between Unknown and I4 //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModNetworkBehaviour modNetworkBehaviour = <>4__this; try { UnityWebRequestAsyncOperationAwaiter awaiter; if (num != 0) { <www>5__2 = new UnityWebRequest(url); <www>5__2.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); awaiter = UnityAsyncExtensions.GetAwaiter(<www>5__2.SendWebRequest()); if (!((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).IsCompleted) { num = (<>1__state = 0); <>u__1 = awaiter; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<UnityWebRequestAsyncOperationAwaiter, <DownloadDirectLinkSongAsync>d__16>(ref awaiter, ref this); return; } } else { awaiter = <>u__1; <>u__1 = default(UnityWebRequestAsyncOperationAwaiter); num = (<>1__state = -1); } UnityWebRequest result = ((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).GetResult(); string text = Path.Combine(CustomBoomboxMusic.PluginPath, "CustomBoomboxMusic"); if (!Directory.Exists(text)) { Directory.CreateDirectory(text); } string fileName = GetFileName(<www>5__2.GetResponseHeader("Content-Disposition")); if (result != null && (int)result.result == 1) { byte[] data = result.downloadHandler.data; string text2 = text + "/" + fileName.Replace("%", "_").Replace(":", "_").Replace("?", "_") .Replace("=", "_") .Replace("&", "_") .Replace("#", "_") .Replace("~", "_") .Replace("*", "_") .Replace("<", "_") .Replace(">", "_") .Replace("|", "_") + ((fileName.EndsWith(".mp3") || fileName.EndsWith(".wav")) ? "" : ".mp3"); File.WriteAllBytes(text2, data); FileInfo fileInfo = new FileInfo(text2); CustomBoomboxMusic.Logger.LogDebug((object)$"Downloaded Song! : {fileName} Size : {fileInfo.Length / 1024}KB"); AudioManager.ProcessFile(fileInfo, out var audioFile); if (audioFile != null) { if (((NetworkBehaviour)modNetworkBehaviour).NetworkManager.IsHost) { modNetworkBehaviour.StartPlayingMusicClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boomboxItem).NetworkObject), audioFile.Crc.Value); } else { modNetworkBehaviour.StartPlayingMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boomboxItem).NetworkObject), audioFile.Crc.Value); } } HUDManager.Instance.AddTextToChatOnServer("Song has been downloaded and added to the boombox! name : " + fileName, -1); } else { CustomBoomboxMusic.Logger.LogError((object)("Failed to download song! : " + fileName)); } } catch (Exception exception) { <>1__state = -2; <www>5__2 = null; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception); return; } <>1__state = -2; <www>5__2 = null; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult(); } void IAsyncStateMachine.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext this.MoveNext(); } [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) { ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine); } void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) { //ILSpy generated this explicit interface implementation from .override directive in SetStateMachine this.SetStateMachine(stateMachine); } } [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <DownloadSongAsync>d__14 : IAsyncStateMachine { public int <>1__state; public AsyncUniTaskMethodBuilder <>t__builder; public string songID; public ModNetworkBehaviour <>4__this; public BoomboxItem boomboxItem; private string <url>5__2; private string <fullName>5__3; private UnityWebRequestAsyncOperationAwaiter <>u__1; private void MoveNext() { //IL_0087: 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) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018e: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Invalid comparison between Unknown and I4 //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Expected O, but got Unknown //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Invalid comparison between Unknown and I4 //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Unknown result type (might be due to invalid IL or missing references) //IL_0304: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ModNetworkBehaviour modNetworkBehaviour = <>4__this; try { UnityWebRequestAsyncOperationAwaiter awaiter; if (num != 0) { if (num == 1) { awaiter = <>u__1; <>u__1 = default(UnityWebRequestAsyncOperationAwaiter); num = (<>1__state = -1); goto IL_019d; } <url>5__2 = "https://music.163.com/song/media/outer/url?id=" + songID + ".mp3"; awaiter = UnityAsyncExtensions.GetAwaiter(UnityWebRequest.Get("https://music.163.com/api/song/detail?ids=[" + songID + "]").SendWebRequest()); if (!((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).IsCompleted) { num = (<>1__state = 0); <>u__1 = awaiter; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<UnityWebRequestAsyncOperationAwaiter, <DownloadSongAsync>d__14>(ref awaiter, ref this); return; } } else { awaiter = <>u__1; <>u__1 = default(UnityWebRequestAsyncOperationAwaiter); num = (<>1__state = -1); } UnityWebRequest result = ((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).GetResult(); <fullName>5__3 = ""; if (result != null && (int)result.result == 1) { string text = result.downloadHandler.text; Debug.Log((object)"Get Song Info Success!"); RequestSongInfoData requestSongInfoData = JsonConvert.DeserializeObject<RequestSongInfoData>(text); string name = requestSongInfoData.songs[0].name; string allArtists = requestSongInfoData.songs[0].getAllArtists(); <fullName>5__3 = allArtists + " - " + name; Debug.Log((object)("Found Song! : " + <fullName>5__3)); awaiter = UnityAsyncExtensions.GetAwaiter(new UnityWebRequest(<url>5__2) { downloadHandler = (DownloadHandler)new DownloadHandlerBuffer() }.SendWebRequest()); if (!((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).IsCompleted) { num = (<>1__state = 1); <>u__1 = awaiter; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).AwaitUnsafeOnCompleted<UnityWebRequestAsyncOperationAwaiter, <DownloadSongAsync>d__14>(ref awaiter, ref this); return; } goto IL_019d; } goto end_IL_000e; IL_019d: UnityWebRequest result2 = ((UnityWebRequestAsyncOperationAwaiter)(ref awaiter)).GetResult(); string text2 = Path.Combine(CustomBoomboxMusic.PluginPath, "CustomBoomboxMusic"); if (!Directory.Exists(text2)) { Directory.CreateDirectory(text2); } if (result2 != null && (int)result2.result == 1) { byte[] data = result2.downloadHandler.data; string text3 = text2 + "/" + <fullName>5__3.Replace("%", "_").Replace(":", "_").Replace("?", "_") .Replace("=", "_") .Replace("&", "_") .Replace("#", "_") .Replace("~", "_") .Replace("*", "_") .Replace("<", "_") .Replace(">", "_") .Replace("|", "_") + ".mp3"; File.WriteAllBytes(text3, data); FileInfo fileInfo = new FileInfo(text3); CustomBoomboxMusic.Logger.LogDebug((object)$"Downloaded Song! : {<fullName>5__3} Size : {fileInfo.Length / 1024}KB"); AudioManager.ProcessFile(fileInfo, out var audioFile); if (audioFile != null) { if (((NetworkBehaviour)modNetworkBehaviour).NetworkManager.IsHost) { modNetworkBehaviour.StartPlayingMusicClientRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boomboxItem).NetworkObject), audioFile.Crc.Value); } else { modNetworkBehaviour.StartPlayingMusicServerRpc(NetworkObjectReference.op_Implicit(((NetworkBehaviour)boomboxItem).NetworkObject), audioFile.Crc.Value); } } HUDManager.Instance.AddTextToChatOnServer("Song has been downloaded and added to the boombox! name : " + <fullName>5__3, -1); } else { CustomBoomboxMusic.Logger.LogError((object)("Failed to download song! : " + <fullName>5__3)); } end_IL_000e:; } catch (Exception exception) { <>1__state = -2; <url>5__2 = null; <fullName>5__3 = null; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetException(exception); return; } <>1__state = -2; <url>5__2 = null; <fullName>5__3 = null; ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetResult(); } void IAsyncStateMachine.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext this.MoveNext(); } [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) { ((AsyncUniTaskMethodBuilder)(ref <>t__builder)).SetStateMachine(stateMachine); } void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) { //ILSpy generated this explicit interface implementation from .override directive in SetStateMachine this.SetStateMachine(stateMachine); } } public static ModNetworkBehaviour? Instance { get; private set; } public override void OnNetworkSpawn() { CustomBoomboxMusic.Logger.LogDebug((object)(">> OnNetworkSpawn() Instance:" + (((object)Instance)?.ToString() ?? "null"))); if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { ModNetworkBehaviour? instance = Instance; if (instance != null) { NetworkObject component = ((Component)instance).gameObject.GetComponent<NetworkObject>(); if (component != null) { component.Despawn(true); } } } Instance = this; ((NetworkBehaviour)this).OnNetworkSpawn(); } public static bool IsInBoomboxRange(BoomboxItem? boombox) { //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = StartOfRound.Instance?.localPlayerController; CustomBoomboxMusic.Logger.LogDebug((object)$">> IsInBoomboxRange(boombox: {boombox}) localPlayer:{val} isPLayerDead:{val?.isPlayerDead} spectatedPlayerScript:{val?.spectatedPlayerScript}"); bool flag = boombox != null && boombox.boomboxAudio != null; if (flag) { bool flag2 = ((val != null && (!val.isPlayerDead || val.spectatedPlayerScript != null)) ? true : false); flag = flag2; } if (flag) { if (!(Vector3.Distance(((Component)boombox.boomboxAudio).transform.position, val.isPlayerDead ? ((Component)val.spectatedPlayerScript).transform.position : ((Component)val).transform.position) <= boombox.boomboxAudio.maxDistance) && !((NetworkBehaviour)boombox).IsOwner) { return ((NetworkBehaviour)boombox).OwnerClientId == val.spectatedPlayerScript.actualClientId; } return true; } return false; } public override void OnNetworkDespawn() { CustomBoomboxMusic.Logger.LogDebug((object)string.Format(">> OnNetworkDespawn() Instance:{0} ==this:{1}", ((object)Instance)?.ToString() ?? "null", (Object)(object)Instance == (Object)(object)this)); if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } ((NetworkBehaviour)this).OnNetworkDespawn(); } private static void Play(BoomboxItem boombox, AudioFile clip) { CustomBoomboxMusic.Logger.LogDebug((object)$">> Play({boombox}, {clip}) IsOwner:{((NetworkBehaviour)boombox).IsOwner}"); boombox.boomboxAudio.clip = clip.AudioClip; boombox.boomboxAudio.pitch = 1f; boombox.boomboxAudio.Play(); ((GrabbableObject)boombox).isBeingUsed = (boombox.isPlayingMusic = true); if (!((Object)(object)GameNetworkManager.Instance?.localPlayerController == (Object)null) && (!GameNetworkManager.Instance.localPlayerController.isPlayerDead || GameNetworkManager.Instance.localPlayerController.hasBegunSpectating) && IsInBoomboxRange(boombox)) { CustomBoomboxMusic.AnnouncePlaying(clip); } } private static void PlayFallback(BoomboxItem boombox, string missingName) { CustomBoomboxMusic.Logger.LogDebug((object)$">> PlayFallback({boombox}, {missingName}) IsOwner:{((NetworkBehaviour)boombox).IsOwner}"); boombox.boomboxAudio.clip = boombox.musicAudios[boombox.musicRandomizer.Next(boombox.musicAudios.Length)]; boombox.boomboxAudio.pitch = 1f; boombox.boomboxAudio.Play(); ((GrabbableObject)boombox).isBeingUsed = (boombox.isPlayingMusic = true); if (!((Object)(object)GameNetworkManager.Instance?.localPlayerController == (Object)null) && (!GameNetworkManager.Instance.localPlayerController.isPlayerDead || GameNetworkManager.Instance.localPlayerController.hasBegunSpectating) && IsInBoomboxRange(boombox)) { CustomBoomboxMusic.AnnounceMissing(missingName); } } [ServerRpc(RequireOwnership = false)] public void StartPlayingMusicServerRpc(NetworkObjectReference boomboxObjectReference, uint crc, string? clipName = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_0159: 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(216803380u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, crc); bool flag = clipName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(clipName, false); } ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 216803380u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; CustomBoomboxMusic.Logger.LogDebug((object)$">> StartPlayingMusicServerRpc({boomboxObjectReference}, {crc})"); NetworkObject val3 = default(NetworkObject); if (((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val3, (NetworkManager)null)) { StartPlayingMusicClientRpc(boomboxObjectReference, crc, clipName); } else { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingMusicServerRpc] Boombox object could not be found, dropping request"); } } } [ClientRpc] public void StartPlayingMusicClientRpc(NetworkObjectReference boomboxObjectReference, uint crc, string? clipName = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: 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.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(3131806306u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, crc); bool flag = clipName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(clipName, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 3131806306u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } base.__rpc_exec_stage = (__RpcExecStage)0; CustomBoomboxMusic.Logger.LogDebug((object)$">> StartPlayingMusicClientRpc({boomboxObjectReference}, {crc}, {clipName})"); NetworkObject val3 = default(NetworkObject); if (!((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val3, (NetworkManager)null)) { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingMusicClientRpc] Boombox object could not be found, dropping request"); return; } CustomBoomboxMusic.Logger.LogDebug((object)$" {val3}"); BoomboxItem val4 = default(BoomboxItem); if (!((Component)val3).TryGetComponent<BoomboxItem>(ref val4)) { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingMusicClientRpc] Boombox component could not be found, dropping request"); return; } CustomBoomboxMusic.Logger.LogDebug((object)$" {val4}"); if (!AudioManager.TryGetCrc(crc, out var audioClip)) { CustomBoomboxMusic.Logger.LogWarning((object)$"Couldn't find AudioClip with crc32 {crc}, playing fallback"); PlayFallback(val4, $"{clipName} (CRC32: {crc})"); } else { CustomBoomboxMusic.Logger.LogDebug((object)$" {audioClip}"); Play(val4, audioClip); } } [ServerRpc(RequireOwnership = false)] public void StartPlayingVanillaMusicServerRpc(NetworkObjectReference boomboxObjectReference, int vanillaId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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) 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(3312431966u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, vanillaId); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 3312431966u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1 && (networkManager.IsServer || networkManager.IsHost)) { base.__rpc_exec_stage = (__RpcExecStage)0; CustomBoomboxMusic.Logger.LogDebug((object)$">> StartPlayingVanillaMusicServerRpc({boomboxObjectReference}, {vanillaId})"); NetworkObject val3 = default(NetworkObject); if (((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val3, (NetworkManager)null)) { StartPlayingVanillaMusicClientRpc(boomboxObjectReference, vanillaId); } else { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingVanillaMusicServerRpc] Boombox object could not be found, dropping request"); } } } [ClientRpc] public void StartPlayingVanillaMusicClientRpc(NetworkObjectReference boomboxObjectReference, int vanillaId) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: 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.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(623513330u, val, (RpcDelivery)0); ((FastBufferWriter)(ref val2)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); BytePacker.WriteValueBitPacked(val2, vanillaId); ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 623513330u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsClient && !networkManager.IsHost)) { return; } base.__rpc_exec_stage = (__RpcExecStage)0; CustomBoomboxMusic.Logger.LogDebug((object)$">> StartPlayingVanillaMusicClientRpc({boomboxObjectReference}, {vanillaId})"); NetworkObject val3 = default(NetworkObject); if (!((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val3, (NetworkManager)null)) { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingVanillaMusicClientRpc] Boombox object could not be found, dropping request"); return; } CustomBoomboxMusic.Logger.LogDebug((object)$" {val3}"); BoomboxItem val4 = default(BoomboxItem); if (!((Component)val3).TryGetComponent<BoomboxItem>(ref val4)) { CustomBoomboxMusic.Logger.LogWarning((object)"[StartPlayingMusicClientRpc] Boombox component could not be found, dropping request"); return; } CustomBoomboxMusic.Logger.LogDebug((object)$" {val4}"); if (!AudioManager.TryGetVanillaId(val4, vanillaId, out var audioClip)) { CustomBoomboxMusic.Logger.LogWarning((object)$"Couldn't find AudioClip with vanillaId {vanillaId}, playing fallback"); PlayFallback(val4, $"Boombox {vanillaId + 1} (Lethal Company)"); } else { CustomBoomboxMusic.Logger.LogDebug((object)$" {audioClip}"); Play(val4, audioClip); } } [Rpc(/*Could not decode attribute arguments.*/)] internal void DownloadSong_Rpc(string songID, NetworkObjectReference boomboxObjectReference) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Invalid comparison between Unknown and I4 //IL_0043: 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: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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) //IL_011c: 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) { RpcAttributeParams val = default(RpcAttributeParams); RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(2829645196u, val2, val, (SendTo)6, (RpcDelivery)0); bool flag = songID != null; ((FastBufferWriter)(ref val3)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val3)).WriteValueSafe(songID, false); } ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendRpc(ref val3, 2829645196u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); BoomboxItem boomboxItem = default(BoomboxItem); if (((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val4, (NetworkManager)null) && ((Component)val4).TryGetComponent<BoomboxItem>(ref boomboxItem)) { UniTaskExtensions.Forget(DownloadSongAsync(songID, boomboxItem)); } } } [AsyncStateMachine(typeof(<DownloadSongAsync>d__14))] private UniTask DownloadSongAsync(string songID, BoomboxItem boomboxItem) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) <DownloadSongAsync>d__14 <DownloadSongAsync>d__ = default(<DownloadSongAsync>d__14); <DownloadSongAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create(); <DownloadSongAsync>d__.<>4__this = this; <DownloadSongAsync>d__.songID = songID; <DownloadSongAsync>d__.boomboxItem = boomboxItem; <DownloadSongAsync>d__.<>1__state = -1; ((AsyncUniTaskMethodBuilder)(ref <DownloadSongAsync>d__.<>t__builder)).Start<<DownloadSongAsync>d__14>(ref <DownloadSongAsync>d__); return ((AsyncUniTaskMethodBuilder)(ref <DownloadSongAsync>d__.<>t__builder)).Task; } [Rpc(/*Could not decode attribute arguments.*/)] internal void DownloadDirectLinkSong_Rpc(string url, NetworkObjectReference boomboxObjectReference) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Invalid comparison between Unknown and I4 //IL_0043: 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: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: 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) //IL_011c: 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) { RpcAttributeParams val = default(RpcAttributeParams); RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(3475648198u, val2, val, (SendTo)6, (RpcDelivery)0); bool flag = url != null; ((FastBufferWriter)(ref val3)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val3)).WriteValueSafe(url, false); } ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendRpc(ref val3, 3475648198u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); BoomboxItem boomboxItem = default(BoomboxItem); if (((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val4, (NetworkManager)null) && ((Component)val4).TryGetComponent<BoomboxItem>(ref boomboxItem)) { UniTaskExtensions.Forget(DownloadDirectLinkSongAsync(url, boomboxItem)); } } } [AsyncStateMachine(typeof(<DownloadDirectLinkSongAsync>d__16))] private UniTask DownloadDirectLinkSongAsync(string url, BoomboxItem boomboxItem) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) <DownloadDirectLinkSongAsync>d__16 <DownloadDirectLinkSongAsync>d__ = default(<DownloadDirectLinkSongAsync>d__16); <DownloadDirectLinkSongAsync>d__.<>t__builder = AsyncUniTaskMethodBuilder.Create(); <DownloadDirectLinkSongAsync>d__.<>4__this = this; <DownloadDirectLinkSongAsync>d__.url = url; <DownloadDirectLinkSongAsync>d__.boomboxItem = boomboxItem; <DownloadDirectLinkSongAsync>d__.<>1__state = -1; ((AsyncUniTaskMethodBuilder)(ref <DownloadDirectLinkSongAsync>d__.<>t__builder)).Start<<DownloadDirectLinkSongAsync>d__16>(ref <DownloadDirectLinkSongAsync>d__); return ((AsyncUniTaskMethodBuilder)(ref <DownloadDirectLinkSongAsync>d__.<>t__builder)).Task; } [Rpc(/*Could not decode attribute arguments.*/)] internal void BoomBoxBypassReverb_Rpc(bool bypass, NetworkObjectReference boomboxObjectReference) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Invalid comparison between Unknown and I4 //IL_0043: 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: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: 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: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: 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) //IL_00db: 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) { RpcAttributeParams val = default(RpcAttributeParams); RpcParams val2 = default(RpcParams); FastBufferWriter val3 = ((NetworkBehaviour)this).__beginSendRpc(4232062437u, val2, val, (SendTo)6, (RpcDelivery)0); ((FastBufferWriter)(ref val3)).WriteValueSafe<bool>(ref bypass, default(ForPrimitives)); ((FastBufferWriter)(ref val3)).WriteValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); ((NetworkBehaviour)this).__endSendRpc(ref val3, 4232062437u, val2, val, (SendTo)6, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 1) { base.__rpc_exec_stage = (__RpcExecStage)0; NetworkObject val4 = default(NetworkObject); BoomboxItem val5 = default(BoomboxItem); if (((NetworkObjectReference)(ref boomboxObjectReference)).TryGet(ref val4, (NetworkManager)null) && ((Component)val4).TryGetComponent<BoomboxItem>(ref val5)) { Debug.Log((object)("BoomBoxBypassReverb_Rpc called! value : " + bypass)); val5.boomboxAudio.bypassReverbZones = bypass; val5.boomboxAudio.bypassEffects = bypass; val5.boomboxAudio.bypassListenerEffects = bypass; ((Behaviour)((Component)val4).GetComponent<AudioLowPassFilter>()).enabled = !bypass; } } } private static string GetFileName(string contentDisposition) { if (string.IsNullOrEmpty(contentDisposition)) { return DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".mp3"; } Match match = Regex.Match(contentDisposition, "filename\\*=UTF-8''([^;]+)"); if (match.Success) { return Uri.UnescapeDataString(match.Groups[1].Value); } match = Regex.Match(contentDisposition, "filename=\"?([^\";]+)\"?"); if (match.Success) { return match.Groups[1].Value; } return DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".mp3"; } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } protected override void __initializeRpcs() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown ((NetworkBehaviour)this).__registerRpc(216803380u, new RpcReceiveHandler(__rpc_handler_216803380), "StartPlayingMusicServerRpc"); ((NetworkBehaviour)this).__registerRpc(3131806306u, new RpcReceiveHandler(__rpc_handler_3131806306), "StartPlayingMusicClientRpc"); ((NetworkBehaviour)this).__registerRpc(3312431966u, new RpcReceiveHandler(__rpc_handler_3312431966), "StartPlayingVanillaMusicServerRpc"); ((NetworkBehaviour)this).__registerRpc(623513330u, new RpcReceiveHandler(__rpc_handler_623513330), "StartPlayingVanillaMusicClientRpc"); ((NetworkBehaviour)this).__registerRpc(2829645196u, new RpcReceiveHandler(__rpc_handler_2829645196), "DownloadSong_Rpc"); ((NetworkBehaviour)this).__registerRpc(3475648198u, new RpcReceiveHandler(__rpc_handler_3475648198), "DownloadDirectLinkSong_Rpc"); ((NetworkBehaviour)this).__registerRpc(4232062437u, new RpcReceiveHandler(__rpc_handler_4232062437), "BoomBoxBypassReverb_Rpc"); ((NetworkBehaviour)this).__initializeRpcs(); } private static void __rpc_handler_216803380(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_005d: 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_0094: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); uint crc = default(uint); ByteUnpacker.ReadValueBitPacked(reader, ref crc); bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string clipName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref clipName, false); } target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).StartPlayingMusicServerRpc(boomboxObjectReference, crc, clipName); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3131806306(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003e: 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_005d: 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_0094: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); uint crc = default(uint); ByteUnpacker.ReadValueBitPacked(reader, ref crc); bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string clipName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref clipName, false); } target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).StartPlayingMusicClientRpc(boomboxObjectReference, crc, clipName); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3312431966(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); int vanillaId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref vanillaId); target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).StartPlayingVanillaMusicServerRpc(boomboxObjectReference, vanillaId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_623513330(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); int vanillaId = default(int); ByteUnpacker.ReadValueBitPacked(reader, ref vanillaId); target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).StartPlayingVanillaMusicClientRpc(boomboxObjectReference, vanillaId); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_2829645196(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) //IL_008b: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string songID = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref songID, false); } NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).DownloadSong_Rpc(songID, boomboxObjectReference); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_3475648198(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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) //IL_008b: 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) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string url = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref url, false); } NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).DownloadDirectLinkSong_Rpc(url, boomboxObjectReference); target.__rpc_exec_stage = (__RpcExecStage)0; } } private static void __rpc_handler_4232062437(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool bypass = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref bypass, default(ForPrimitives)); NetworkObjectReference boomboxObjectReference = default(NetworkObjectReference); ((FastBufferReader)(ref reader)).ReadValueSafe<NetworkObjectReference>(ref boomboxObjectReference, default(ForNetworkSerializable)); target.__rpc_exec_stage = (__RpcExecStage)1; ((ModNetworkBehaviour)(object)target).BoomBoxBypassReverb_Rpc(bypass, boomboxObjectReference); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "ModNetworkBehaviour"; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LTGVE.CustomBoomboxMusic"; public const string PLUGIN_NAME = "CustomBoomboxMusic"; public const string PLUGIN_VERSION = "1.0.1"; } } namespace __GEN { internal class NetworkVariableSerializationHelper { [RuntimeInitializeOnLoadMethod] internal static void InitializeSerialization() { } } }