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 DumbWaysToDie v1.1.2
DumbWaysToDie.dll
Decompiled 2 years ago#define DEBUG using System; using System.Collections; 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 GameNetcodeStuff; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TestAccount666.DumbWaysToDie")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Plays Dumb Ways To Die on certain deaths")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: AssemblyInformationalVersion("1.1.2")] [assembly: AssemblyProduct("DumbWaysToDie")] [assembly: AssemblyTitle("TestAccount666.DumbWaysToDie")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.2.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.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; } } [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 DumbWaysToDie { public class ConfigHandler { [CompilerGenerated] [DebuggerBrowsable(DebuggerBrowsableState.Never)] private ConfigFile <config>P; internal ConfigEntry<bool> playAtLandmineDeath; internal ConfigEntry<bool> playAtTurretDeath; internal ConfigEntry<bool> playAtShotgunNutcrackerDeath; internal ConfigEntry<bool> playAtShotgunMurderDeath; internal ConfigEntry<bool> playAtShotgunAccidentDeath; internal ConfigEntry<bool> playAtDropShipDeath; internal ConfigEntry<bool> playAtAnyDeath; internal ConfigEntry<int> volume; public ConfigHandler(ConfigFile config) { <config>P = config; playAtLandmineDeath = null; playAtTurretDeath = null; playAtShotgunNutcrackerDeath = null; playAtShotgunMurderDeath = null; playAtShotgunAccidentDeath = null; playAtDropShipDeath = null; playAtAnyDeath = null; volume = null; base..ctor(); } internal void HandleConfig() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Expected O, but got Unknown //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Expected O, but got Unknown //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected O, but got Unknown //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Expected O, but got Unknown //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Expected O, but got Unknown playAtLandmineDeath = <config>P.Bind<bool>("General", "Play at landmine death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by a landmine", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); playAtTurretDeath = <config>P.Bind<bool>("General", "Play at turret death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by a turret", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); playAtShotgunNutcrackerDeath = <config>P.Bind<bool>("General", "Play at nutcracker shotgun death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by a nutcracker's shotgun", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); playAtShotgunMurderDeath = <config>P.Bind<bool>("General", "Play at murder shotgun death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by a player's shotgun", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); playAtShotgunAccidentDeath = <config>P.Bind<bool>("General", "Play at accident shotgun death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by a shotgun misfire", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); playAtDropShipDeath = <config>P.Bind<bool>("General", "Play at dropship death", true, new ConfigDescription("If true, will play Dumb Ways To Die at death by the dropship", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); volume = <config>P.Bind<int>("General", "Volume", 100, new ConfigDescription("Set the volume", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 100), Array.Empty<object>())); playAtAnyDeath = <config>P.Bind<bool>("Special", "Play at any death", false, new ConfigDescription("If true, will always play Dumb Ways To Die no matter the death cause", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { false, true }), Array.Empty<object>())); } } [BepInPlugin("TestAccount666.DumbWaysToDie", "DumbWaysToDie", "1.1.2")] public class DumbWaysToDie : BaseUnityPlugin { public static DumbWaysToDie Instance { get; private set; } internal static ManualLogSource Logger { get; private set; } internal static Harmony? Harmony { get; set; } internal static AudioClip AudioClip { get; private set; } internal static ConfigHandler ConfigHandler { get; private set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Instance = this; string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); Debug.Assert(directoryName != null, "assemblyLocation != null"); string uriString = Path.Combine(directoryName, "song.wav"); ((MonoBehaviour)this).StartCoroutine(LoadAudioClipFromFile(new Uri(uriString), "DumbWaysToDie")); ConfigHandler = new ConfigHandler(((BaseUnityPlugin)this).Config); ConfigHandler.HandleConfig(); Patch(); Logger.LogInfo((object)"TestAccount666.DumbWaysToDie v1.1.2 has loaded!"); } private static void Patch() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown if (Harmony == null) { Harmony = new Harmony("TestAccount666.DumbWaysToDie"); } Logger.LogDebug((object)"Patching..."); Harmony.PatchAll(); Logger.LogDebug((object)"Finished patching!"); } private static IEnumerator LoadAudioClipFromFile(Uri filePath, string name) { UnityWebRequest unityWebRequest = UnityWebRequestMultimedia.GetAudioClip(filePath, (AudioType)20); try { yield return unityWebRequest.SendWebRequest(); if ((int)unityWebRequest.result != 1) { Logger.LogError((object)("Failed to load AudioClip: " + unityWebRequest.error)); yield break; } AudioClip = DownloadHandlerAudioClip.GetContent(unityWebRequest); ((Object)AudioClip).name = name; Logger.LogInfo((object)("Loaded clip '" + name + "'!")); } finally { ((IDisposable)unityWebRequest)?.Dispose(); } } } [HarmonyPatch] public static class PlayerDeathPatch { private const float MAX_BULLET_FLY_DISTANCE = 31f; [HarmonyPatch(typeof(PlayerControllerB), "KillPlayer")] [HarmonyPostfix] public static void OnPlayerDeath(PlayerControllerB __instance) { if (!DumbWaysToDie.ConfigHandler.playAtAnyDeath.Value) { return; } RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null) { return; } StartOfRound playersManager = instance.playersManager; if (!((Object)(object)playersManager == (Object)null)) { PlayerControllerB localPlayerController = playersManager.localPlayerController; if (!((Object)(object)localPlayerController == (Object)null) && localPlayerController.isPlayerDead && !((Object)(object)localPlayerController != (Object)(object)__instance)) { PlaySound(); } } } [HarmonyPatch(typeof(Landmine), "SpawnExplosion")] [HarmonyPostfix] public static void OnMineExplosion(Vector3 explosionPosition, float killRange, float damageRange) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Invalid comparison between Unknown and I4 //IL_0078: 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) if (DumbWaysToDie.ConfigHandler.playAtAnyDeath.Value) { return; } RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null) { return; } StartOfRound playersManager = instance.playersManager; if ((Object)(object)playersManager == (Object)null) { return; } PlayerControllerB localPlayerController = playersManager.localPlayerController; if (!((Object)(object)localPlayerController == (Object)null) && localPlayerController.isPlayerDead && (int)localPlayerController.causeOfDeath == 3) { float num = Vector3.Distance(explosionPosition, localPlayerController.oldPlayerPosition); if ((!(num > killRange) || !(num > damageRange)) && DumbWaysToDie.ConfigHandler.playAtLandmineDeath.Value) { PlaySound(); } } } [HarmonyPatch(typeof(ShotgunItem), "ShootGun")] [HarmonyPostfix] public static void OnPlayerMurder(ShotgunItem __instance) { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Invalid comparison between Unknown and I4 //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) if (DumbWaysToDie.ConfigHandler.playAtAnyDeath.Value) { return; } RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null) { return; } StartOfRound playersManager = instance.playersManager; if ((Object)(object)playersManager == (Object)null) { return; } PlayerControllerB localPlayerController = playersManager.localPlayerController; if ((Object)(object)localPlayerController == (Object)null || !localPlayerController.isPlayerDead || (int)localPlayerController.causeOfDeath != 7) { return; } float num = Vector3.Distance(((Component)__instance).gameObject.transform.position, localPlayerController.oldPlayerPosition); if (!(num > 31f)) { if (((GrabbableObject)__instance).isHeldByEnemy && DumbWaysToDie.ConfigHandler.playAtShotgunNutcrackerDeath.Value) { PlaySound(); } else if ((!((GrabbableObject)__instance).isHeld || __instance.misfireTimer <= 0f) && DumbWaysToDie.ConfigHandler.playAtShotgunAccidentDeath.Value) { PlaySound(); } else if (DumbWaysToDie.ConfigHandler.playAtShotgunMurderDeath.Value) { PlaySound(); } } } [HarmonyPatch(typeof(KillLocalPlayer), "KillPlayer")] [HarmonyPostfix] public static void OnDropShipDeath(PlayerControllerB playerWhoTriggered) { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Invalid comparison between Unknown and I4 if (DumbWaysToDie.ConfigHandler.playAtAnyDeath.Value) { return; } RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null) { return; } StartOfRound playersManager = instance.playersManager; if (!((Object)(object)playersManager == (Object)null)) { PlayerControllerB localPlayerController = playersManager.localPlayerController; if (!((Object)(object)localPlayerController == (Object)null) && !((Object)(object)localPlayerController != (Object)(object)playerWhoTriggered) && localPlayerController.isPlayerDead && (int)localPlayerController.causeOfDeath == 8 && DumbWaysToDie.ConfigHandler.playAtDropShipDeath.Value) { PlaySound(); } } } [HarmonyPatch(typeof(Turret), "Update")] [HarmonyPostfix] public static void OnTurretDeath(Turret __instance) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Invalid comparison between Unknown and I4 //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Invalid comparison between Unknown and I4 //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Invalid comparison between Unknown and I4 //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if (DumbWaysToDie.ConfigHandler.playAtAnyDeath.Value) { return; } RoundManager instance = RoundManager.Instance; if ((Object)(object)instance == (Object)null) { return; } StartOfRound playersManager = instance.playersManager; if ((Object)(object)playersManager == (Object)null) { return; } PlayerControllerB localPlayerController = playersManager.localPlayerController; if (!((Object)(object)localPlayerController == (Object)null) && localPlayerController.isPlayerDead && (int)localPlayerController.causeOfDeath == 7 && ((int)__instance.turretMode == 2 || (int)__instance.turretMode == 3)) { float num = Vector3.Distance(((Component)__instance).gameObject.transform.position, localPlayerController.oldPlayerPosition); if (!(num > 31f) && DumbWaysToDie.ConfigHandler.playAtTurretDeath.Value) { PlaySound(); } } } private static void PlaySound() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown if (!ReviveTrackerPatch.PlayedThisRound) { ReviveTrackerPatch.PlayedThisRound = true; GameObject val = new GameObject("TemporaryAudio"); AudioSource val2 = val.AddComponent<AudioSource>(); val2.clip = DumbWaysToDie.AudioClip; val2.volume = (float)DumbWaysToDie.ConfigHandler.volume.Value / 100f; val2.Play(); Object.Destroy((Object)(object)val, DumbWaysToDie.AudioClip.length); } } } [HarmonyPatch] public class ReviveTrackerPatch { public static bool PlayedThisRound { get; internal set; } [HarmonyPatch(typeof(StartOfRound), "AllPlayersHaveRevivedClientRpc")] [HarmonyPostfix] public static void OnRevive() { PlayedThisRound = false; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "TestAccount666.DumbWaysToDie"; public const string PLUGIN_NAME = "DumbWaysToDie"; public const string PLUGIN_VERSION = "1.1.2"; } }