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 LCKartHornMod v1.1.0
BepInEx/plugins/LCKartHornMod.dll
Decompiled 2 years agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LCKartHornMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Horn mod for Lethal Company, based on SRB2K's horn mods.")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+ef89076311b5a53bd39619ae6f65d0ed847750d5")] [assembly: AssemblyProduct("LCKartHornMod")] [assembly: AssemblyTitle("LCKartHornMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LCKartHornMod { public class HornMaster { public static List<AudioClip> Horns = new List<AudioClip>(); public static List<AudioClip> HornsFar = new List<AudioClip>(); public static void LoadHorns() { string[] directories = Directory.GetDirectories(Paths.PluginPath, "LCKartHorns", SearchOption.AllDirectories); Array.Sort(directories, (string a, string b) => string.Compare(a, b, StringComparison.Ordinal)); string[] array = directories; foreach (string text in array) { string[] files = Directory.GetFiles(text, "*.ogg"); if (files.Length == 0) { Plugin.HornLog.LogInfo((object)"No horns found!"); return; } Plugin.HornLog.LogInfo((object)$"Attempting to load {files.Length} horns from {text}..."); string[] array2 = files; for (int j = 0; j < array2.Length; j++) { AudioClip val = LoadAudioFile(array2[j]); if ((Object)(object)val != (Object)null) { Horns.Add(val); HornsFar.Add(LowerVolumeByFactor(val, Plugin.Instance.FarVolumeReductionFactor.Value)); } } } Horns.Sort((AudioClip a, AudioClip b) => string.Compare(((Object)a).name, ((Object)b).name, StringComparison.Ordinal)); HornsFar.Sort((AudioClip a, AudioClip b) => string.Compare(((Object)a).name, ((Object)b).name, StringComparison.Ordinal)); } private static AudioClip LoadAudioFile(string path) { UnityWebRequest audioClip = UnityWebRequestMultimedia.GetAudioClip(path, (AudioType)14); audioClip.SendWebRequest(); while (!audioClip.isDone) { } if (audioClip.error != null) { Plugin.HornLog.LogError((object)("Failed to load audio file " + path + ": " + audioClip.error)); return null; } AudioClip content = DownloadHandlerAudioClip.GetContent(audioClip); ((Object)content).name = Path.GetFileNameWithoutExtension(path) + Guid.NewGuid(); return content; } private static AudioClip LowerVolumeByFactor(AudioClip originalClip, float factor) { AudioClip val = AudioClip.Create(((Object)originalClip).name, originalClip.samples, originalClip.channels, originalClip.frequency, false); float[] array = new float[originalClip.samples * originalClip.channels]; originalClip.GetData(array, 0); for (int i = 0; i < array.Length; i++) { array[i] *= factor; } val.SetData(array, 0); return val; } } [BepInPlugin("LCKartHornMod", "LCKartHornMod", "1.1.0")] [BepInProcess("Lethal Company.exe")] public class Plugin : BaseUnityPlugin { public static Plugin Instance; public ConfigEntry<float> FarVolumeReductionFactor; public static ManualLogSource HornLog => ((BaseUnityPlugin)Instance).Logger; private void Awake() { if ((Object)(object)Instance == (Object)null) { Instance = this; } FarVolumeReductionFactor = ((BaseUnityPlugin)this).Config.Bind<float>("General", "FarVolumeReductionFactor", 0.05f, "The factor by which the volume of the far audio is reduced. 0.05 means 5% of the original volume. Use 0 to disable far audio."); ((Object)((Component)Instance).gameObject).hideFlags = (HideFlags)61; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin LCKartHornMod is loading!"); HornMaster.LoadHorns(); if (HornMaster.Horns.Count > 0) { Harmony.CreateAndPatchAll(typeof(Plugin), (string)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin LCKartHornMod loaded succesfully!"); } else { ((BaseUnityPlugin)this).Logger.LogError((object)"Disabling plugin since no horns were found..."); Object.Destroy((Object)(object)this); } } [HarmonyPatch(typeof(NoisemakerProp), "Start")] [HarmonyPostfix] private static void ReplaceNoisemakerAudio(ref NoisemakerProp __instance) { if ((Object)(object)__instance != (Object)null && (Object)(object)((GrabbableObject)__instance).itemProperties != (Object)null && ((Object)((GrabbableObject)__instance).itemProperties).name == "ClownHorn") { HornLog.LogDebug((object)"Clown horn spawned! Waiting for NetworkObject ID..."); ((MonoBehaviour)Instance).StartCoroutine(Instance.WaitUntilNetworkObjectIDAvailable(__instance)); HornLog.LogDebug((object)"Coroutine started!"); } } public IEnumerator WaitUntilNetworkObjectIDAvailable(NoisemakerProp noisemakerProp) { HornLog.LogDebug((object)"Waiting for NetworkObject ID..."); while ((Object)(object)((NetworkBehaviour)noisemakerProp).NetworkObject == (Object)null) { yield return (object)new WaitForSeconds(0.05f); } HornLog.LogDebug((object)"NetworkObject available!"); ulong networkObjectId; for (networkObjectId = ((NetworkBehaviour)noisemakerProp).NetworkObject.NetworkObjectId; networkObjectId == 0; networkObjectId = ((NetworkBehaviour)noisemakerProp).NetworkObject.NetworkObjectId) { yield return (object)new WaitForSeconds(0.05f); } HornLog.LogDebug((object)("noisemakerProp NetworkObjectId: " + networkObjectId)); ReplaceClownhornAudio(noisemakerProp, networkObjectId); } private void ReplaceClownhornAudio(NoisemakerProp noiseProp, ulong id) { HornLog.LogDebug((object)"Replacing clownhorn audio..."); HornLog.LogDebug((object)("noiseProp: " + (object)noiseProp)); HornLog.LogDebug((object)("id: " + id)); int index = new Random(Convert.ToInt32(id)).Next(0, HornMaster.Horns.Count); HornLog.LogInfo((object)("Replaced clownhorn audio with " + ((Object)HornMaster.Horns[index]).name + "!")); noiseProp.noiseSFX[0] = HornMaster.Horns[index]; noiseProp.noiseSFXFar[0] = HornMaster.HornsFar[index]; } } public static class PluginInfo { public const string PLUGIN_GUID = "LCKartHornMod"; public const string PLUGIN_NAME = "LCKartHornMod"; public const string PLUGIN_VERSION = "1.1.0"; } }