using System; using System.Diagnostics; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BoneLib; using BoneLib.BoneMenu; using Downed; using Il2CppSLZ.Bonelab; using Il2CppSLZ.Marrow; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using RagdollPlayer; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Core), "Downed", "1.0.2", "jorink", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Downed")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+772ef8e4e96584ee1f2cc44fb8ff421524400110")] [assembly: AssemblyProduct("Downed")] [assembly: AssemblyTitle("Downed")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 Downed { public class Core : MelonMod { private MelonPreferences_Category category; private MelonPreferences_Entry EnableModEntry; private MelonPreferences_Entry KnockedDurationEntry; private bool downed; private bool death; private float startTime; private static float lastTimeInput; private static bool ragdollNextButton; private const float DoubleTapTimer = 0.32f; public override void OnInitializeMelon() { SetupMelonPreferences(); SetupBoneMenu(); Hooking.OnLevelLoaded += OnLevelLoaded; Hooking.OnPlayerDamageReceived += OnPlayerDamageReceived; Hooking.OnPlayerDeath += OnPlayerDeath; } public override void OnDeinitializeMelon() { Hooking.OnLevelLoaded -= OnLevelLoaded; Hooking.OnPlayerDamageReceived -= OnPlayerDamageReceived; Hooking.OnPlayerDeath -= OnPlayerDeath; } 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) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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) Page obj = Page.Root.CreatePage("Jorink", Color.red, 0, true).CreatePage("Downed", Color.magenta, 0, true); obj.CreateBool("Enable Mod", Color.blue, EnableModEntry.Value, (Action)delegate(bool a) { EnableModEntry.Value = a; }); obj.CreateFloat("Knocked Duration", Color.yellow, KnockedDurationEntry.Value, 1f, 1f, 10f, (Action)delegate(float a) { KnockedDurationEntry.Value = a; }); obj.CreateFunction("Save Settings", Color.cyan, (Action)delegate { MelonPreferences.Save(); }); } private void SetupMelonPreferences() { category = MelonPreferences.CreateCategory("Downed"); EnableModEntry = category.CreateEntry("Enable Mod", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); KnockedDurationEntry = category.CreateEntry("Knocked Duration", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); MelonPreferences.Save(); category.SaveToFile(true); } private void OnLevelLoaded(LevelInfo levelInfo) { downed = false; death = false; } public override void OnUpdate() { if (!EnableModEntry.Value) { return; } RigManager rigManager = Player.RigManager; if (Object.op_Implicit((Object)(object)rigManager) && !Object.op_Implicit((Object)(object)rigManager.activeSeat) && !UIRig.Instance.popUpMenu.m_IsCursorShown && downed) { PhysicsRig physicsRig = Player.PhysicsRig; if (!physicsRig.torso.shutdown && physicsRig.ballLocoEnabled) { RagdollPlayerMod.RagdollRig(rigManager); } bool shutdown = physicsRig.shutdown; if (death && !shutdown) { physicsRig.ShutdownRig(); } } if (downed && !death && Time.time - startTime >= KnockedDurationEntry.Value) { downed = false; RagdollPlayerMod.UnragdollRig(rigManager); } BaseController controller = GetController(); if (Object.op_Implicit((Object)(object)controller) && GetInput(controller)) { PhysicsRig physicsRig2 = Player.PhysicsRig; if (physicsRig2.torso.shutdown || !physicsRig2.ballLocoEnabled) { downed = false; death = false; RagdollPlayerMod.UnragdollRig(rigManager); } } } private static BaseController GetController() { return Player.RightController; } private static bool GetInput(BaseController controller) { bool thumbStickDown = controller.GetThumbStickDown(); float time = Time.time; if (thumbStickDown && ragdollNextButton) { if (time - lastTimeInput <= 0.32f) { return true; } ragdollNextButton = false; lastTimeInput = 0f; } else if (thumbStickDown) { lastTimeInput = time; ragdollNextButton = true; } else if (time - lastTimeInput > 0.32f) { ragdollNextButton = false; lastTimeInput = 0f; } return false; } private void OnPlayerDamageReceived(RigManager rigManager, float damage) { if (EnableModEntry.Value && !(Player.RigManager.health.curr_Health > 0f)) { if (downed) { death = true; Player.RigManager.health.Dying(5f); } if (!downed && !death) { downed = true; TryInvokeLifeSavingDamgeDealt(Player.RigManager.health); Player.RigManager.health.curr_Health = Player.RigManager.health.max_Health * 0.25f; startTime = Time.time; } } } private void OnPlayerDeath(RigManager rigManager) { //IL_0036: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) if (EnableModEntry.Value) { RigManager rigManager2 = Player.RigManager; downed = false; death = false; RagdollPlayerMod.UnragdollRig(rigManager2); Vector3 val = Player.PhysicsRig.feet.transform.position + new Vector3(0f, 0.25f, 0f); rigManager2.Teleport(val, true); } } private static bool TryInvokeLifeSavingDamgeDealt(object health) { if (health == null) { return false; } try { object obj = health; if (!(obj is Player_Health)) { Component val = (Component)((health is Component) ? health : null); if (val != null) { obj = val.gameObject.GetComponent(); if (obj == null) { return false; } } } MethodInfo method = obj.GetType().GetMethod("LifeSavingDamgeDealt", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method == null) { return false; } method.Invoke(obj, null); return true; } catch (Exception ex) { MelonLogger.Warning("Error invoking LifeSavingDamgeDealt: " + ex.Message); return false; } } } }