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 LethalLadderMusic v1.0.0
Spantle.LethalLadderMusic.dll
Decompiled 2 years agousing System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [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("Spantle.LethalLadderMusic")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("A mod for Lethal Company that plays fitting music when you climb a ladder.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LethalLadderMusic")] [assembly: AssemblyTitle("Spantle.LethalLadderMusic")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.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 LethalLadderMusic { [BepInPlugin("Spantle.LethalLadderMusic", "LethalLadderMusic", "1.0.0")] public class LethalLadderMusicPlugin : BaseUnityPlugin { private readonly Harmony harmony = new Harmony("Spantle.LethalLadderMusic"); public static ManualLogSource logger; public static ConfigEntry<int> volume; public static ConfigEntry<bool> allPlayers; public static ConfigEntry<bool> music0Enable; public static ConfigEntry<bool> music1Enable; public static ConfigEntry<float> music1DownPitch; public static List<AudioClip> ladderMusic = new List<AudioClip>(); public static int ladderMusicIndex = 0; public static int music1Index = 1; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Expected O, but got Unknown logger = ((BaseUnityPlugin)this).Logger; volume = ((BaseUnityPlugin)this).Config.Bind<int>("Main settings", "Volume", 50, new ConfigDescription("The volume percentage that the music will play at.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>())); allPlayers = ((BaseUnityPlugin)this).Config.Bind<bool>("Main settings", "Applies to other players", true, new ConfigDescription("If set to true, then all players will play music when they are climbing a ladder. If set to false, only you will play music. This only affects your perspective.", (AcceptableValueBase)null, Array.Empty<object>())); music0Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Snake Eater", "Can be randomly chosen", true, new ConfigDescription("If set to true, then \"Snake Eater\" has a chance to play while climbing a ladder. (Randomly picked every time you land on a moon)", (AcceptableValueBase)null, Array.Empty<object>())); music1Enable = ((BaseUnityPlugin)this).Config.Bind<bool>("Can we get much higher? (Dark Fantasy)", "Can be randomly chosen", true, new ConfigDescription("If set to true, then \"Can we get much higher? (Dark Fantasy)\" has a chance to play while climbing a ladder. (Randomly picked every time you land on a moon)", (AcceptableValueBase)null, Array.Empty<object>())); music1DownPitch = ((BaseUnityPlugin)this).Config.Bind<float>("Can we get much higher? (Dark Fantasy)", "Going down pitch", 0.8f, new ConfigDescription("The pitch of the music while going down a ladder.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); AssetBundle val = AssetBundle.LoadFromMemory(Resources.Music); if (music0Enable.Value) { ladderMusic.Add(val.LoadAsset<AudioClip>("assets/snake eater.ogg")); } if (music1Enable.Value) { ladderMusic.Add(val.LoadAsset<AudioClip>("assets/higher.ogg")); music1Index = ladderMusic.Count - 1; } harmony.PatchAll(typeof(PlayerControllerB_Patch)); harmony.PatchAll(typeof(RoundManager_Patch)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Spantle.LethalLadderMusic is loaded!"); } } public class SnakeEater { private readonly PlayerControllerB player; private readonly AudioSource audioSource; private bool isPlaying; private bool isClimbingUp; private int isMoving; private float oldY; public SnakeEater(PlayerControllerB player) { audioSource = player.itemAudio; this.player = player; RefreshClip(); } public void RefreshClip() { if ((Object)(object)audioSource == (Object)null) { LethalLadderMusicPlugin.logger.LogWarning((object)"We've got an undefined audioSource on a player here! This isn't ideal but should be OK..."); return; } audioSource.clip = LethalLadderMusicPlugin.ladderMusic[LethalLadderMusicPlugin.ladderMusicIndex]; audioSource.loop = true; audioSource.volume = (float)LethalLadderMusicPlugin.volume.Value / 100f; } public void Update() { if (player.isClimbingLadder) { float y = player.oldPlayerPosition.y; float num = oldY - y; if ((double)Mathf.Abs(num) > 0.1) { isClimbingUp = Mathf.Sign(num) < 0f; isMoving = 10; } isMoving--; if (isMoving > 0) { IsClimbing(); } else { IsNotClimbing(); } oldY = y; } else { IsNotClimbing(); isMoving = 0; } } private void AdditionalMusicLogic() { if (LethalLadderMusicPlugin.ladderMusicIndex == LethalLadderMusicPlugin.music1Index) { if (isClimbingUp) { audioSource.pitch = 1f; } else { audioSource.pitch = 0.8f; } } } private void IsClimbing() { AdditionalMusicLogic(); if (!isPlaying) { isPlaying = true; audioSource.Play(); } } private void IsNotClimbing() { if (isPlaying) { isPlaying = false; audioSource.Pause(); } } } [HarmonyPatch(typeof(PlayerControllerB))] public static class PlayerControllerB_Patch { public static Dictionary<PlayerControllerB, SnakeEater> snakeEaters = new Dictionary<PlayerControllerB, SnakeEater>(); private static SnakeEater Solidify(PlayerControllerB __instance) { if (!snakeEaters.TryGetValue(__instance, out var value)) { value = new SnakeEater(__instance); snakeEaters.Add(__instance, value); } return value; } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "Start")] private static void Start(PlayerControllerB __instance) { Solidify(__instance); } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "OnDestroy")] private static void OnDestroy(PlayerControllerB __instance) { snakeEaters.Remove(__instance); } [HarmonyPostfix] [HarmonyPatch(typeof(PlayerControllerB), "Update")] private static void Update(PlayerControllerB __instance) { Solidify(__instance).Update(); } } [HarmonyPatch(typeof(RoundManager))] public static class RoundManager_Patch { [HarmonyPostfix] [HarmonyPatch(typeof(RoundManager), "InitializeRandomNumberGenerators")] private static void StartGame(RoundManager __instance) { LethalLadderMusicPlugin.ladderMusicIndex = __instance.LevelRandom.Next(0, LethalLadderMusicPlugin.ladderMusic.Count); LethalLadderMusicPlugin.logger.LogInfo((object)$"Random ladder music set to: {LethalLadderMusicPlugin.ladderMusicIndex}"); foreach (KeyValuePair<PlayerControllerB, SnakeEater> snakeEater in PlayerControllerB_Patch.snakeEaters) { snakeEater.Value.RefreshClip(); } } } [GeneratedCode("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [DebuggerNonUserCode] [CompilerGenerated] internal class Resources { private static ResourceManager resourceMan; private static CultureInfo resourceCulture; [EditorBrowsable(EditorBrowsableState.Advanced)] internal static ResourceManager ResourceManager { get { if (resourceMan == null) { resourceMan = new ResourceManager("LethalLadderMusic.Resources", typeof(Resources).Assembly); } return resourceMan; } } [EditorBrowsable(EditorBrowsableState.Advanced)] internal static CultureInfo Culture { get { return resourceCulture; } set { resourceCulture = value; } } internal static byte[] Music => (byte[])ResourceManager.GetObject("Music", resourceCulture); internal Resources() { } } public static class PluginInfo { public const string PLUGIN_GUID = "Spantle.LethalLadderMusic"; public const string PLUGIN_NAME = "LethalLadderMusic"; public const string PLUGIN_VERSION = "1.0.0"; } }