using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BoneLib; using BoneLib.BoneMenu; using DeathBlackoutMod; using HarmonyLib; using Il2CppSLZ.Marrow; using MelonLoader; using MelonLoader.Preferences; using UnityEngine; using UnityEngine.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Death Blackout & Mute")] [assembly: AssemblyDescription("Blacks out screen and mutes audio instantly on local player death, Fusion compatible")] [assembly: AssemblyCompany("imalwaysbored")] [assembly: AssemblyProduct("DeathBlackoutMod")] [assembly: AssemblyCopyright("Created by imalwaysbored")] [assembly: AssemblyTrademark("imalwaysbored")] [assembly: AssemblyFileVersion("1.2.0")] [assembly: MelonInfo(typeof(Main), "Death Blackout & Mute", "1.2.0", "imalwaysbored", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.0.0")] [module: UnverifiableCode] namespace DeathBlackoutMod; public class Main : MelonMod { private static GameObject _blackoutRig; private static Material _blackoutMaterial; private static Camera _cachedCamera; private static float _savedVolume = 1f; private static MelonPreferences_Category _prefsCategory; private static MelonPreferences_Entry _prefsEnabled; private const float QuadSize = 4f; private const float NearPlaneMargin = 0.02f; public static bool IsDead { get; private set; } public static bool ModEnabled => _prefsEnabled?.Value ?? true; public override void OnInitializeMelon() { _prefsCategory = MelonPreferences.CreateCategory("DeathBlackoutMod", "Death Blackout & Mute"); _prefsEnabled = _prefsCategory.CreateEntry("Enabled", true, "Enable Mod", (string)null, false, false, (ValueValidator)null, (string)null); SetupBoneMenu(); MelonLogger.Msg("Death Blackout & Mute (Strictly Client-Side) loaded!"); ((MelonBase)this).HarmonyInstance.PatchAll(); } private void SetupBoneMenu() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) Page.Root.CreatePage("Death Blackout", Color.red, 0, true).CreateBool("Mod Enabled", Color.white, _prefsEnabled.Value, (Action)delegate(bool val) { _prefsEnabled.Value = val; _prefsCategory.SaveToFile(true); if (!val && IsDead) { TriggerRespawn(); } }); } public override void OnUpdate() { if (IsDead && ModEnabled) { EnsureRigExists(); AttachRigToCamera(); } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { _cachedCamera = null; _blackoutRig = null; IsDead = false; } public override void OnDeinitializeMelon() { if (IsDead) { AudioListener.volume = _savedVolume; } if ((Object)(object)_blackoutRig != (Object)null) { Object.Destroy((Object)(object)_blackoutRig); _blackoutRig = null; } if ((Object)(object)_blackoutMaterial != (Object)null) { Object.Destroy((Object)(object)_blackoutMaterial); _blackoutMaterial = null; } } public static void TriggerDeath() { if (!IsDead && ModEnabled) { IsDead = true; _savedVolume = AudioListener.volume; AudioListener.volume = 0f; EnsureRigExists(); AttachRigToCamera(); if ((Object)(object)_blackoutRig != (Object)null) { _blackoutRig.SetActive(true); } } } public static void TriggerRespawn() { if (IsDead) { IsDead = false; AudioListener.volume = _savedVolume; if ((Object)(object)_blackoutRig != (Object)null) { _blackoutRig.SetActive(false); } } } public static bool IsLocalPlayerHealth(Player_Health health) { if ((Object)(object)health == (Object)null) { return false; } RigManager rigManager = Player.RigManager; if ((Object)(object)rigManager == (Object)null) { return false; } RigManager componentInParent = ((Component)health).GetComponentInParent(); if ((Object)(object)componentInParent == (Object)null) { return false; } if ((Object)(object)componentInParent != (Object)(object)rigManager) { return false; } if ((Object)(object)rigManager.physicsRig != (Object)null && (Object)(object)((Rig)rigManager.physicsRig).m_head != (Object)null) { _ = ((Component)health).transform; _ = ((Component)((Rig)rigManager.physicsRig).m_head).transform; } return true; } private static void EnsureRigExists() { //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_blackoutRig != (Object)null) { return; } if ((Object)(object)_blackoutMaterial == (Object)null) { Shader val = FindBlackoutShader(); if ((Object)(object)val == (Object)null) { MelonLogger.Error("No usable blackout shader found."); return; } _blackoutMaterial = new Material(val); if (_blackoutMaterial.HasProperty("_Color")) { _blackoutMaterial.color = Color.black; } _blackoutMaterial.renderQueue = 4100; } _blackoutRig = new GameObject("DeathBlackoutRig"); CreateQuadChild(_blackoutRig.transform, 0f); CreateQuadChild(_blackoutRig.transform, 180f); _blackoutRig.SetActive(false); } private static void CreateQuadChild(Transform parent, float yRotationDegrees) { //IL_006f: 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) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) GameObject obj = GameObject.CreatePrimitive((PrimitiveType)5); ((Object)obj).name = "DeathBlackoutQuad_" + yRotationDegrees; Collider component = obj.GetComponent(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } MeshRenderer component2 = obj.GetComponent(); if ((Object)(object)component2 != (Object)null) { ((Renderer)component2).material = _blackoutMaterial; ((Renderer)component2).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)component2).receiveShadows = false; } obj.transform.SetParent(parent, false); obj.transform.localPosition = Vector3.zero; obj.transform.localRotation = Quaternion.Euler(0f, yRotationDegrees, 0f); obj.transform.localScale = new Vector3(4f, 4f, 1f); } private static Shader FindBlackoutShader() { string[] array = new string[3] { "Sprites/Default", "UI/Default", "Unlit/Color" }; for (int i = 0; i < array.Length; i++) { Shader val = Shader.Find(array[i]); if ((Object)(object)val != (Object)null) { return val; } } return null; } private static void AttachRigToCamera() { //IL_006f: 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) if ((Object)(object)_blackoutRig == (Object)null) { return; } Camera activeCamera = GetActiveCamera(); if (!((Object)(object)activeCamera == (Object)null)) { Transform transform = ((Component)activeCamera).transform; if ((Object)(object)_blackoutRig.transform.parent != (Object)(object)transform) { _blackoutRig.transform.SetParent(transform, false); } float num = activeCamera.nearClipPlane + 0.02f; _blackoutRig.transform.localPosition = new Vector3(0f, 0f, num); _blackoutRig.transform.localRotation = Quaternion.identity; } } private static Camera GetActiveCamera() { if ((Object)(object)_cachedCamera != (Object)null) { return _cachedCamera; } RigManager rigManager = Player.RigManager; if ((Object)(object)rigManager == (Object)null || (Object)(object)rigManager.physicsRig == (Object)null || (Object)(object)((Rig)rigManager.physicsRig).m_head == (Object)null) { return null; } Camera val = ((Component)((Rig)rigManager.physicsRig).m_head).GetComponentInChildren(); if ((Object)(object)val == (Object)null) { val = Camera.main; } _cachedCamera = val; return _cachedCamera; } } [HarmonyPatch(typeof(Player_Health), "Dying")] public static class DyingPatch { public static void Prefix(Player_Health __instance, float damage) { if (Main.ModEnabled && !Main.IsDead && Main.IsLocalPlayerHealth(__instance)) { Main.TriggerDeath(); } } } [HarmonyPatch(typeof(Player_Health), "Death")] public static class DeathPatch { public static void Prefix(Player_Health __instance) { if (Main.ModEnabled && !Main.IsDead && Main.IsLocalPlayerHealth(__instance)) { Main.TriggerDeath(); } } } [HarmonyPatch(typeof(Player_Health), "SetFullHealth")] public static class RespawnPatch { public static void Postfix(Player_Health __instance) { if (Main.IsDead && Main.IsLocalPlayerHealth(__instance)) { Main.TriggerRespawn(); } } }