using System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BoneLib; using BoneLib.BoneMenu; using BoneLib.Notifications; using HarmonyLib; using Il2CppSLZ.Marrow; using Il2CppSLZ.Marrow.Interaction; using LabFusion.Data; using LabFusion.Network; using LabFusion.Patching; using LabFusion.Player; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using StayDown; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Mod), "StayDown", "1.1.1", "ElectroDynamic", null)] [assembly: MelonGame("Stress Level Zero", "BONELAB")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("StayDown")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("StayDown")] [assembly: AssemblyTitle("StayDown")] [assembly: AssemblyVersion("1.0.0.0")] [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 StayDown { public class Mod : MelonMod { public static MelonPreferences_Category Cat; public static MelonPreferences_Entry Enabled; public static MelonPreferences_Entry HandControl; public static MelonPreferences_Entry StickMode; public static bool HeldDown; private static bool _handsLive; private static bool _prevLeft; private static bool _prevRight; public static Instance Log { get; private set; } public override void OnInitializeMelon() { Log = ((MelonBase)this).LoggerInstance; Cat = MelonPreferences.CreateCategory("StayDown"); Enabled = Cat.CreateEntry("Enabled", true, "Stay knocked down until you click a thumbstick", (string)null, false, false, (ValueValidator)null, (string)null); HandControl = Cat.CreateEntry("HandControl", true, "Keep control of your hands while held down", (string)null, false, false, (ValueValidator)null, (string)null); StickMode = Cat.CreateEntry("StickMode", 0, "Stand-up stick: 0=either, 1=left, 2=right", (string)null, false, false, (ValueValidator)null, (string)null); Cat.SaveToFile(false); BuildMenu(); Hooking.OnLevelLoaded += delegate { ResetState(); }; Log.Msg("StayDown loaded."); } public override void OnUpdate() { if (!HeldDown) { return; } if (!NetworkInfo.HasServer || !RigData.HasPlayer) { ResetState(); } else if (!LocalRagdoll.KnockedOut) { if (HandControl.Value && !_handsLive) { WakeHands(); } else if (!HandControl.Value && _handsLive) { SleepHands(); } if (StickClicked()) { StandUp(notify: true); } } } private static bool StickClicked() { bool flag = false; bool flag2 = false; try { BaseController leftController = Player.LeftController; BaseController rightController = Player.RightController; flag = (Object)(object)leftController != (Object)null && leftController.GetThumbStickDown(); flag2 = (Object)(object)rightController != (Object)null && rightController.GetThumbStickDown(); } catch { } bool flag3 = flag && !_prevLeft; bool flag4 = flag2 && !_prevRight; _prevLeft = flag; _prevRight = flag2; return StickMode.Value switch { 1 => flag3, 2 => flag4, _ => flag3 || flag4, }; } public static void StandUp(bool notify) { HeldDown = false; _handsLive = false; try { if (RigData.HasPlayer) { LocalRagdoll.ToggleRagdoll(false); } } catch (Exception ex) { Log.Warning("Stand up failed: " + ex.Message); } if (notify) { Notify("Back on your feet!", (NotificationType)3); } } private static void WakeHands() { try { PhysicsRig physicsRig = RigData.Refs.RigManager.physicsRig; if (!((Object)(object)physicsRig == (Object)null)) { PhysicsRigPatches.ForceAllowUnragdoll = true; physicsRig.TurnOnRig(); PhysicsRigPatches.ForceAllowUnragdoll = false; physicsRig.ResetHands((Handedness)3); _handsLive = true; Notify("Hands are live — drag yourself around.", (NotificationType)0); } } catch (Exception ex) { Log.Warning("Hand control failed: " + ex.Message); _handsLive = true; } } private static void SleepHands() { _handsLive = false; try { PhysicsRig physicsRig = RigData.Refs.RigManager.physicsRig; if (physicsRig != null) { physicsRig.ShutdownRig(); } } catch { } } public static void DropHold() { ResetState(); } private static void ResetState() { HeldDown = false; _handsLive = false; } private static void BuildMenu() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) Page obj = Page.Root.CreatePage("StayDown", new Color(1f, 0.35f, 0.25f), 0, true); obj.CreateBool("StayDown Active", Color.green, Enabled.Value, (Action)delegate(bool v) { Enabled.Value = v; Cat.SaveToFile(false); if (!v && HeldDown) { StandUp(notify: false); } Notify(v ? "StayDown on — knockouts keep you down." : "StayDown off.", (NotificationType)0); }); obj.CreateBool("Hand Control While Down", Color.cyan, HandControl.Value, (Action)delegate(bool v) { HandControl.Value = v; Cat.SaveToFile(false); Notify(v ? "Hands stay live while you're down." : "Hands go limp while you're down.", (NotificationType)0); }); obj.CreateInt("Stand-Up Stick (0=Both 1=L 2=R)", Color.yellow, StickMode.Value, 1, 0, 2, (Action)delegate(int v) { StickMode.Value = Mathf.Clamp(v, 0, 2); Cat.SaveToFile(false); }); obj.CreateFunction("Get Up Now (failsafe)", Color.red, (Action)delegate { if (HeldDown) { StandUp(notify: true); } else { Notify("You're not being held down.", (NotificationType)0); } }); obj.CreateFunction(" - knocked out? stay down, click stick to rise", new Color(0.6f, 0.6f, 0.6f), (Action)delegate { }); } private static void Notify(string message, NotificationType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002c: 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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown try { Notifier.Send(new Notification { Title = NotificationText.op_Implicit("StayDown"), Message = NotificationText.op_Implicit(message), PopupLength = 2.5f, Type = type }); } catch { } } } [HarmonyPatch(typeof(LocalRagdoll), "Knockout", new Type[] { typeof(float), typeof(bool) })] public static class StayDown_Knockout_Patch { public static bool Prefix() { if (Mod.Enabled.Value) { return !Mod.HeldDown; } return true; } public static void Postfix() { if (Mod.Enabled.Value && RigData.HasPlayer && !Mod.HeldDown) { Mod.HeldDown = true; Mod.Log.Msg("Knocked out — holding you down until a stick click."); } } } [HarmonyPatch(typeof(LocalRagdoll), "ToggleRagdoll")] public static class StayDown_ToggleRagdoll_Patch { public static bool Prefix(bool ragdolled) { if (ragdolled) { return true; } if (!Mod.Enabled.Value || !Mod.HeldDown) { return true; } return false; } } [HarmonyPatch(typeof(PhysicsRig), "UnRagdollRig")] public static class StayDown_UnRagdollRig_Patch { public static void Postfix() { if (Mod.HeldDown) { Mod.DropHold(); } } } }