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 Il2CppSLZ.Marrow;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using RagdollToggle;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: MelonInfo(typeof(Mod), "RagdollToggle", "1.4.0", "mitch", null)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("RagdollToggle")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RagdollToggle")]
[assembly: AssemblyTitle("RagdollToggle")]
[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 RagdollToggle
{
public class Mod : MelonMod
{
public enum ControllerSide
{
Left,
Right,
Both
}
public enum RagdollMode
{
Limp,
ArmControl
}
public enum HeldMode
{
Drop,
Keep,
KeepGrip
}
private MelonPreferences_Category _prefs;
private MelonPreferences_Entry<bool> _enabled;
private MelonPreferences_Entry<ControllerSide> _side;
private MelonPreferences_Entry<RagdollMode> _mode;
private MelonPreferences_Entry<HeldMode> _heldMode;
private MelonPreferences_Entry<KeyCode> _keyboardFallback;
public override void OnInitializeMelon()
{
_prefs = MelonPreferences.CreateCategory("RagdollToggle");
_enabled = _prefs.CreateEntry<bool>("Enabled", true, (string)null, "Master on/off switch for the mod.", false, false, (ValueValidator)null, (string)null);
_side = _prefs.CreateEntry<ControllerSide>("Controller", ControllerSide.Right, (string)null, "Which thumbstick toggles ragdoll: Left, Right, or Both (either stick).", false, false, (ValueValidator)null, (string)null);
_mode = _prefs.CreateEntry<RagdollMode>("Mode", RagdollMode.Limp, (string)null, "Limp = full flop, no arm control. ArmControl = flop but keep arm control.", false, false, (ValueValidator)null, (string)null);
_heldMode = _prefs.CreateEntry<HeldMode>("HeldItems", HeldMode.Drop, (string)null, "Held items on ragdoll: Drop, Keep, or KeepGrip (keep hands awake to hold/release/regrab).", false, false, (ValueValidator)null, (string)null);
_keyboardFallback = _prefs.CreateEntry<KeyCode>("KeyboardFallback", (KeyCode)98, (string)null, "Desktop testing fallback key. Set to None to disable.", false, false, (ValueValidator)null, (string)null);
SetupBoneMenu();
((MelonBase)this).LoggerInstance.Msg($"RagdollToggle ready. Controller = {_side.Value}, Mode = {_mode.Value}");
}
private void SetupBoneMenu()
{
//IL_000a: 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_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
Page obj = Page.Root.CreatePage("RagDoll Toggle", Color.green, 0, true);
obj.CreateBool("Enabled", Color.yellow, _enabled.Value, (Action<bool>)OnSetEnabled);
obj.CreateEnum("Controller", Color.cyan, (Enum)_side.Value, (Action<Enum>)OnSetSide);
obj.CreateEnum("Mode", Color.red, (Enum)_mode.Value, (Action<Enum>)OnSetMode);
obj.CreateEnum("Held Items", Color.green, (Enum)_heldMode.Value, (Action<Enum>)OnSetHeldMode);
}
private void OnSetEnabled(bool v)
{
_enabled.Value = v;
_prefs.SaveToFile(false);
}
private void OnSetHeldMode(Enum v)
{
_heldMode.Value = (HeldMode)(object)v;
_prefs.SaveToFile(false);
}
private void OnSetSide(Enum v)
{
_side.Value = (ControllerSide)(object)v;
_prefs.SaveToFile(false);
}
private void OnSetMode(Enum v)
{
_mode.Value = (RagdollMode)(object)v;
_prefs.SaveToFile(false);
}
public override void OnUpdate()
{
if (!_enabled.Value)
{
return;
}
RigManager rigManager = Player.RigManager;
if (!Object.op_Implicit((Object)(object)rigManager) || Object.op_Implicit((Object)(object)rigManager.activeSeat) || !TogglePressed())
{
return;
}
PhysicsRig physicsRig = rigManager.physicsRig;
if (Object.op_Implicit((Object)(object)physicsRig))
{
if (physicsRig.torso.shutdown || !physicsRig.ballLocoEnabled)
{
Unragdoll(physicsRig);
}
else
{
Ragdoll(physicsRig);
}
}
}
private bool TogglePressed()
{
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
bool flag = false;
if (_side.Value != ControllerSide.Right && Object.op_Implicit((Object)(object)Player.LeftController))
{
flag |= Player.LeftController.GetThumbStickDown();
}
if (_side.Value != ControllerSide.Left && Object.op_Implicit((Object)(object)Player.RightController))
{
flag |= Player.RightController.GetThumbStickDown();
}
if ((int)_keyboardFallback.Value != 0 && Input.GetKeyDown(_keyboardFallback.Value))
{
flag = true;
}
return flag;
}
private void Ragdoll(PhysicsRig physRig)
{
if (_heldMode.Value == HeldMode.Drop)
{
if (Object.op_Implicit((Object)(object)physRig.leftHand) && physRig.leftHand.HasAttachedObject())
{
physRig.leftHand.DetachObject();
}
if (Object.op_Implicit((Object)(object)physRig.rightHand) && physRig.rightHand.HasAttachedObject())
{
physRig.rightHand.DetachObject();
}
}
if (_mode.Value == RagdollMode.Limp)
{
physRig.ShutdownRig();
}
physRig.RagdollRig();
if (_mode.Value == RagdollMode.ArmControl)
{
physRig.DisableBallLoco();
physRig.PhysicalLegs();
physRig.legLf.ShutdownLimb();
physRig.legRt.ShutdownLimb();
}
}
private void Unragdoll(PhysicsRig physRig)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
Transform transform = physRig.feet.transform;
Transform transform2 = physRig.knee.transform;
Transform transform3 = ((Component)((Rig)physRig).m_pelvis).transform;
physRig.TurnOnRig();
physRig.UnRagdollRig();
Vector3 position = transform3.position;
Quaternion rotation = transform3.rotation;
transform2.SetPositionAndRotation(position, rotation);
transform.SetPositionAndRotation(position, rotation);
}
}
}