using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib;
using BoneLib.BoneMenu;
using BoneLib.Notifications;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSLZ.Marrow;
using Il2CppSLZ.Marrow.AI;
using Il2CppSLZ.Marrow.PuppetMasta;
using MelonLoader;
using MelonLoader.Preferences;
using UltimateRagdoll;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(UltimateRagdollMod), "Ultimate Ragdoll", "4.4.6", "Int_Void", null)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("UltimateRagdoll")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("UltimateRagdoll")]
[assembly: AssemblyTitle("UltimateRagdoll")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace UltimateRagdoll;
public class UltimateRagdollMod : MelonMod
{
public enum RagdollMode
{
Limp,
ArmControl
}
public enum ControllerSide
{
Left,
Right,
Both
}
public enum InputMode
{
ThumbstickPress,
DoubleTapB
}
public const string Version = "4.4.6";
private static MelonPreferences_Category _cat;
public static MelonPreferences_Entry<bool> PrefEnabled;
public static MelonPreferences_Entry<RagdollMode> PrefMode;
public static MelonPreferences_Entry<ControllerSide> PrefSide;
public static MelonPreferences_Entry<InputMode> PrefInputMode;
public static MelonPreferences_Entry<KeyCode> PrefKeyboardKey;
public static MelonPreferences_Entry<bool> PrefDropItems;
public static MelonPreferences_Entry<bool> PrefFastExit;
public static MelonPreferences_Entry<float> PrefRagdollCooldown;
public static MelonPreferences_Entry<bool> PrefPreventUnragdollMoving;
public static MelonPreferences_Entry<float> PrefUnragdollMaxVelocity;
public static MelonPreferences_Entry<bool> PrefResetCooldownOnDamage;
public static MelonPreferences_Entry<float> PrefMaxRagdollTime;
public static MelonPreferences_Entry<bool> PrefTwoTapDamage;
public static MelonPreferences_Entry<float> PrefTwoTapTimeWindow;
public static MelonPreferences_Entry<bool> PrefDownedEnabled;
public static MelonPreferences_Entry<float> PrefDownedDuration;
public static MelonPreferences_Entry<bool> PrefStayRagdolledOnDeath;
public static MelonPreferences_Entry<bool> PrefFallEnabled;
public static MelonPreferences_Entry<float> PrefFallThresh;
public static MelonPreferences_Entry<bool> PrefImpactEnabled;
public static MelonPreferences_Entry<float> PrefImpactThresh;
public static MelonPreferences_Entry<bool> PrefLaunchEnabled;
public static MelonPreferences_Entry<float> PrefLaunchThresh;
public static MelonPreferences_Entry<bool> PrefSlipEnabled;
public static MelonPreferences_Entry<float> PrefSlipFriction;
public static MelonPreferences_Entry<float> PrefSlipVelocity;
public static MelonPreferences_Entry<bool> PrefWallPushEnabled;
public static MelonPreferences_Entry<float> PrefWallPushVelocity;
public static MelonPreferences_Entry<bool> PrefImpactDamageEnabled;
public static MelonPreferences_Entry<float> PrefImpactDamageMultiplier;
public static MelonPreferences_Entry<float> PrefImpactDamageThreshold;
public static MelonPreferences_Entry<bool> PrefDragEnabled;
public static MelonPreferences_Entry<float> PrefDragStrength;
public static MelonPreferences_Entry<bool> PrefFloppyLeftArm;
public static MelonPreferences_Entry<bool> PrefFloppyRightArm;
public static MelonPreferences_Entry<bool> PrefFixEnabled;
public static MelonPreferences_Entry<bool> PrefFixFly;
public static MelonPreferences_Entry<bool> PrefFixVel;
public static MelonPreferences_Entry<float> PrefFixVelLimit;
private Vector3 _lastVelocity;
private Vector3 _prevVelocity;
private float _nextRagdollTime;
private float _unragdollTime;
private bool _isDowned;
private bool _isDead;
private float _deathTime;
private float _downedStartTime;
private float _lastInputTime;
private bool _doubleTapReady;
private bool _wasRagdolled;
private float _ragdollStartTime;
private bool _levelLoaded;
private int _damageHits;
private float _lastDamageTime;
private float _safeDamageTime;
private float _safeRagdollTime;
private bool _cachedSupported;
private float _cachedFriction;
private int _cachedGroundFrame;
private const int GROUND_CHECK_INTERVAL = 3;
private int _framesSinceUnragdoll;
private bool _fixPending;
private Vector3 _savedPelvisPos;
private Quaternion _savedPelvisRot;
private float _savedPelvisY;
private float _lastImpactDamageTime;
private const float IMPACT_DAMAGE_IMMUNITY = 0.5f;
private static readonly Vector3[] _sphereDirections;
private static Dictionary<int, float> _savedWeights;
private BoolElement _uiEnabled;
private BoolElement _uiDropItems;
private BoolElement _uiFastExit;
private EnumElement _uiMode;
private EnumElement _uiInputMode;
private EnumElement _uiSide;
private FloatElement _uiRagdollCooldown;
private FloatElement _uiUnragdollMaxVelocity;
private FloatElement _uiMaxRagdollTime;
private BoolElement _uiPreventUnragdollMoving;
private BoolElement _uiResetCooldownOnDamage;
private BoolElement _uiTwoTapDamage;
private BoolElement _uiDownedEnabled;
private BoolElement _uiStayRagdolledOnDeath;
private FloatElement _uiTwoTapTimeWindow;
private FloatElement _uiDownedDuration;
private BoolElement _uiFallEnabled;
private BoolElement _uiImpactEnabled;
private BoolElement _uiLaunchEnabled;
private BoolElement _uiSlipEnabled;
private BoolElement _uiWallPushEnabled;
private FloatElement _uiFallThresh;
private FloatElement _uiImpactThresh;
private FloatElement _uiLaunchThresh;
private FloatElement _uiSlipFriction;
private FloatElement _uiSlipVelocity;
private FloatElement _uiWallPushVelocity;
private BoolElement _uiImpactDamageEnabled;
private FloatElement _uiImpactDamageMultiplier;
private FloatElement _uiImpactDamageThreshold;
private BoolElement _uiDragEnabled;
private BoolElement _uiFloppyLeft;
private BoolElement _uiFloppyRight;
private BoolElement _uiFixEnabled;
private BoolElement _uiFixFly;
private BoolElement _uiFixVel;
private FloatElement _uiDragStrength;
private FloatElement _uiFixVelLimit;
private static int _groundLayerMask;
public override void OnInitializeMelon()
{
SetupPreferences();
BuildBoneMenu();
Hooking.OnLevelLoaded += OnLevelLoaded;
Hooking.OnPlayerDamageReceived += OnPlayerDamageReceived;
Hooking.OnPlayerDeath += OnPlayerDeath;
_groundLayerMask = -1025;
((MelonBase)this).LoggerInstance.Msg("UltimateRagdoll 4.4.6 Loaded!");
}
public override void OnApplicationQuit()
{
Hooking.OnLevelLoaded -= OnLevelLoaded;
Hooking.OnPlayerDamageReceived -= OnPlayerDamageReceived;
Hooking.OnPlayerDeath -= OnPlayerDeath;
}
private void SetupPreferences()
{
_cat = MelonPreferences.CreateCategory("UltimateRagdoll");
PrefEnabled = _cat.CreateEntry<bool>("Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefMode = _cat.CreateEntry<RagdollMode>("RagdollMode", RagdollMode.Limp, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefSide = _cat.CreateEntry<ControllerSide>("ControllerSide", ControllerSide.Right, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefInputMode = _cat.CreateEntry<InputMode>("InputMode", InputMode.ThumbstickPress, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefKeyboardKey = _cat.CreateEntry<KeyCode>("KeyboardFallbackKey", (KeyCode)306, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefDropItems = _cat.CreateEntry<bool>("DropItemsOnRagdoll", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFastExit = _cat.CreateEntry<bool>("FastExitVehicles", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefRagdollCooldown = _cat.CreateEntry<float>("RagdollCooldown", 1.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefPreventUnragdollMoving = _cat.CreateEntry<bool>("PreventUnragdollMoving", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefUnragdollMaxVelocity = _cat.CreateEntry<float>("UnragdollMaxVelocity", 2.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefResetCooldownOnDamage = _cat.CreateEntry<bool>("ResetCooldownOnDamage", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefMaxRagdollTime = _cat.CreateEntry<float>("MaxRagdollTime", 8f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefTwoTapDamage = _cat.CreateEntry<bool>("TwoTapDamage", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefTwoTapTimeWindow = _cat.CreateEntry<float>("TwoTapTimeWindow", 4f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefDownedEnabled = _cat.CreateEntry<bool>("DownedEnabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefDownedDuration = _cat.CreateEntry<float>("DownedDuration", 6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefStayRagdolledOnDeath = _cat.CreateEntry<bool>("StayRagdolledOnDeath", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFallEnabled = _cat.CreateEntry<bool>("FallEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFallThresh = _cat.CreateEntry<float>("FallThreshold", 9f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefImpactEnabled = _cat.CreateEntry<bool>("ImpactEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefImpactThresh = _cat.CreateEntry<float>("ImpactThreshold", 3.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefLaunchEnabled = _cat.CreateEntry<bool>("LaunchEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefLaunchThresh = _cat.CreateEntry<float>("LaunchThreshold", 6f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefSlipEnabled = _cat.CreateEntry<bool>("SlipEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefSlipFriction = _cat.CreateEntry<float>("SlipFriction", 0.25f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefSlipVelocity = _cat.CreateEntry<float>("SlipVelocity", 2.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefWallPushEnabled = _cat.CreateEntry<bool>("WallPushEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefWallPushVelocity = _cat.CreateEntry<float>("WallPushVelocity", 2.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefImpactDamageEnabled = _cat.CreateEntry<bool>("ImpactDamageEnabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefImpactDamageMultiplier = _cat.CreateEntry<float>("ImpactDamageMultiplier", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefImpactDamageThreshold = _cat.CreateEntry<float>("ImpactDamageThreshold", 20f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefDragEnabled = _cat.CreateEntry<bool>("DragEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefDragStrength = _cat.CreateEntry<float>("DragStrength", 3f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFloppyLeftArm = _cat.CreateEntry<bool>("FloppyLeftArm", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFloppyRightArm = _cat.CreateEntry<bool>("FloppyRightArm", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFixEnabled = _cat.CreateEntry<bool>("RagdollFixEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFixFly = _cat.CreateEntry<bool>("RagdollFixFly", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFixVel = _cat.CreateEntry<bool>("RagdollFixVelocity", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
PrefFixVelLimit = _cat.CreateEntry<float>("RagdollFixVelLimit", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
}
private void ResetToDefault()
{
PrefEnabled.Value = true;
PrefMode.Value = RagdollMode.Limp;
PrefSide.Value = ControllerSide.Right;
PrefInputMode.Value = InputMode.ThumbstickPress;
PrefKeyboardKey.Value = (KeyCode)306;
PrefDropItems.Value = true;
PrefFastExit.Value = true;
PrefRagdollCooldown.Value = 1.5f;
PrefPreventUnragdollMoving.Value = true;
PrefUnragdollMaxVelocity.Value = 2.5f;
PrefResetCooldownOnDamage.Value = true;
PrefMaxRagdollTime.Value = 8f;
PrefTwoTapDamage.Value = false;
PrefTwoTapTimeWindow.Value = 4f;
PrefDownedEnabled.Value = false;
PrefDownedDuration.Value = 6f;
PrefStayRagdolledOnDeath.Value = true;
PrefFallEnabled.Value = true;
PrefFallThresh.Value = 9f;
PrefImpactEnabled.Value = true;
PrefImpactThresh.Value = 3.5f;
PrefLaunchEnabled.Value = true;
PrefLaunchThresh.Value = 6f;
PrefSlipEnabled.Value = true;
PrefSlipFriction.Value = 0.25f;
PrefSlipVelocity.Value = 2.5f;
PrefWallPushEnabled.Value = true;
PrefWallPushVelocity.Value = 2.5f;
PrefImpactDamageEnabled.Value = false;
PrefImpactDamageMultiplier.Value = 5f;
PrefImpactDamageThreshold.Value = 20f;
PrefDragEnabled.Value = true;
PrefDragStrength.Value = 3f;
PrefFloppyLeftArm.Value = false;
PrefFloppyRightArm.Value = false;
PrefFixEnabled.Value = true;
PrefFixFly.Value = true;
PrefFixVel.Value = true;
PrefFixVelLimit.Value = 5f;
_cat.SaveToFile(false);
((MelonBase)this).LoggerInstance.Msg("Settings reset to default.");
}
private void BuildBoneMenu()
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: 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)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_0239: Unknown result type (might be due to invalid IL or missing references)
//IL_0287: Unknown result type (might be due to invalid IL or missing references)
//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
//IL_0314: Unknown result type (might be due to invalid IL or missing references)
//IL_0352: Unknown result type (might be due to invalid IL or missing references)
//IL_0366: Unknown result type (might be due to invalid IL or missing references)
//IL_03a5: Unknown result type (might be due to invalid IL or missing references)
//IL_03f3: Unknown result type (might be due to invalid IL or missing references)
//IL_0432: Unknown result type (might be due to invalid IL or missing references)
//IL_0480: Unknown result type (might be due to invalid IL or missing references)
//IL_04cd: Unknown result type (might be due to invalid IL or missing references)
//IL_04f2: Unknown result type (might be due to invalid IL or missing references)
//IL_0532: Unknown result type (might be due to invalid IL or missing references)
//IL_0581: Unknown result type (might be due to invalid IL or missing references)
//IL_05ce: Unknown result type (might be due to invalid IL or missing references)
//IL_05e3: Unknown result type (might be due to invalid IL or missing references)
//IL_05f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0639: Unknown result type (might be due to invalid IL or missing references)
//IL_0688: Unknown result type (might be due to invalid IL or missing references)
//IL_06c8: Unknown result type (might be due to invalid IL or missing references)
//IL_0716: Unknown result type (might be due to invalid IL or missing references)
//IL_072c: Unknown result type (might be due to invalid IL or missing references)
//IL_076c: Unknown result type (might be due to invalid IL or missing references)
//IL_07bb: Unknown result type (might be due to invalid IL or missing references)
//IL_080a: Unknown result type (might be due to invalid IL or missing references)
//IL_084a: Unknown result type (might be due to invalid IL or missing references)
//IL_0898: Unknown result type (might be due to invalid IL or missing references)
//IL_08ae: Unknown result type (might be due to invalid IL or missing references)
//IL_08ee: Unknown result type (might be due to invalid IL or missing references)
//IL_093b: Unknown result type (might be due to invalid IL or missing references)
//IL_0951: Unknown result type (might be due to invalid IL or missing references)
//IL_0991: Unknown result type (might be due to invalid IL or missing references)
//IL_09de: Unknown result type (might be due to invalid IL or missing references)
//IL_09f3: Unknown result type (might be due to invalid IL or missing references)
//IL_0a11: Unknown result type (might be due to invalid IL or missing references)
//IL_0a2f: Unknown result type (might be due to invalid IL or missing references)
//IL_0a4d: Unknown result type (might be due to invalid IL or missing references)
//IL_0a6a: Unknown result type (might be due to invalid IL or missing references)
//IL_0a80: Unknown result type (might be due to invalid IL or missing references)
//IL_0ac0: Unknown result type (might be due to invalid IL or missing references)
//IL_0b00: Unknown result type (might be due to invalid IL or missing references)
//IL_0b40: Unknown result type (might be due to invalid IL or missing references)
//IL_0b8f: Unknown result type (might be due to invalid IL or missing references)
//IL_0bbc: Unknown result type (might be due to invalid IL or missing references)
Page val = Page.Root.CreatePage("Ultimate Ragdoll", Color.green, 0, true);
val.CreateFunction("RESET ALL TO DEFAULT", Color.red, (Action)ResetToDefault);
_uiEnabled = val.CreateBool("Mod Enabled", Color.green, PrefEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefEnabled.Value = v;
_cat.SaveToFile(false);
});
Page val2 = val.CreatePage("1. General Controls", Color.white, 0, true);
_uiMode = val2.CreateEnum("Ragdoll Mode", Color.white, (Enum)PrefMode.Value, (Action<Enum>)delegate(Enum v)
{
PrefMode.Value = (RagdollMode)(object)v;
_cat.SaveToFile(false);
});
_uiInputMode = val2.CreateEnum("Button Mode", Color.white, (Enum)PrefInputMode.Value, (Action<Enum>)delegate(Enum v)
{
PrefInputMode.Value = (InputMode)(object)v;
_cat.SaveToFile(false);
});
_uiSide = val2.CreateEnum("Controller Side", Color.white, (Enum)PrefSide.Value, (Action<Enum>)delegate(Enum v)
{
PrefSide.Value = (ControllerSide)(object)v;
_cat.SaveToFile(false);
});
_uiDropItems = val2.CreateBool("Drop Items On Ragdoll", Color.white, PrefDropItems.Value, (Action<bool>)delegate(bool v)
{
PrefDropItems.Value = v;
_cat.SaveToFile(false);
});
_uiFastExit = val2.CreateBool("Fast Exit Vehicles", Color.white, PrefFastExit.Value, (Action<bool>)delegate(bool v)
{
PrefFastExit.Value = v;
_cat.SaveToFile(false);
});
Page val3 = val.CreatePage("2. Cooldowns & StandUp", Color.yellow, 0, true);
_uiRagdollCooldown = val3.CreateFloat("StandUp Cooldown (Sec)", Color.white, PrefRagdollCooldown.Value, 0.1f, 0f, 10f, (Action<float>)delegate(float v)
{
PrefRagdollCooldown.Value = v;
_cat.SaveToFile(false);
});
_uiMaxRagdollTime = val3.CreateFloat("MAX Ragdoll Time (Force Stand)", Color.red, PrefMaxRagdollTime.Value, 1f, 2f, 30f, (Action<float>)delegate(float v)
{
PrefMaxRagdollTime.Value = v;
_cat.SaveToFile(false);
});
_uiPreventUnragdollMoving = val3.CreateBool("Freeze Timer In Air/Moving", Color.yellow, PrefPreventUnragdollMoving.Value, (Action<bool>)delegate(bool v)
{
PrefPreventUnragdollMoving.Value = v;
_cat.SaveToFile(false);
});
_uiUnragdollMaxVelocity = val3.CreateFloat("Max Velocity To StandUp", Color.white, PrefUnragdollMaxVelocity.Value, 0.5f, 0.1f, 10f, (Action<float>)delegate(float v)
{
PrefUnragdollMaxVelocity.Value = v;
_cat.SaveToFile(false);
});
_uiResetCooldownOnDamage = val3.CreateBool("Reset Timer On Damage", Color.red, PrefResetCooldownOnDamage.Value, (Action<bool>)delegate(bool v)
{
PrefResetCooldownOnDamage.Value = v;
_cat.SaveToFile(false);
});
Page val4 = val.CreatePage("3. Damage & Health", Color.red, 0, true);
_uiTwoTapDamage = val4.CreateBool("Two-Tap Damage Ragdoll", Color.white, PrefTwoTapDamage.Value, (Action<bool>)delegate(bool v)
{
PrefTwoTapDamage.Value = v;
_cat.SaveToFile(false);
});
_uiTwoTapTimeWindow = val4.CreateFloat("Two-Tap Time Window (Sec)", Color.white, PrefTwoTapTimeWindow.Value, 0.1f, 1f, 10f, (Action<float>)delegate(float v)
{
PrefTwoTapTimeWindow.Value = v;
_cat.SaveToFile(false);
});
_uiDownedEnabled = val4.CreateBool("Downed (Injured) Enabled", Color.red, PrefDownedEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefDownedEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiDownedDuration = val4.CreateFloat("Downed Duration", Color.red, PrefDownedDuration.Value, 1f, 1f, 15f, (Action<float>)delegate(float v)
{
PrefDownedDuration.Value = v;
_cat.SaveToFile(false);
});
_uiStayRagdolledOnDeath = val4.CreateBool("Stay Ragdolled On Death", Color.red, PrefStayRagdolledOnDeath.Value, (Action<bool>)delegate(bool v)
{
PrefStayRagdolledOnDeath.Value = v;
_cat.SaveToFile(false);
});
Page val5 = val4.CreatePage("Impact Damage (Fling-style)", new Color(1f, 0.65f, 0f), 0, true);
_uiImpactDamageEnabled = val5.CreateBool("Impact Damage Enabled (OFF=default)", new Color(1f, 0.65f, 0f), PrefImpactDamageEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefImpactDamageEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiImpactDamageMultiplier = val5.CreateFloat("Damage Multiplier", Color.white, PrefImpactDamageMultiplier.Value, 0.5f, 1f, 50f, (Action<float>)delegate(float v)
{
PrefImpactDamageMultiplier.Value = v;
_cat.SaveToFile(false);
});
_uiImpactDamageThreshold = val5.CreateFloat("Damage Threshold", Color.white, PrefImpactDamageThreshold.Value, 1f, 1f, 100f, (Action<float>)delegate(float v)
{
PrefImpactDamageThreshold.Value = v;
_cat.SaveToFile(false);
});
Page val6 = val.CreatePage("4. Auto-Ragdoll Physics", Color.cyan, 0, true);
Page val7 = val6.CreatePage("Fall & Impact", Color.white, 0, true);
_uiFallEnabled = val7.CreateBool("Fall Enabled", Color.white, PrefFallEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefFallEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiFallThresh = val7.CreateFloat("Fall Velocity (higher=longer fall)", Color.white, PrefFallThresh.Value, 0.5f, 1f, 30f, (Action<float>)delegate(float v)
{
PrefFallThresh.Value = v;
_cat.SaveToFile(false);
});
_uiImpactEnabled = val7.CreateBool("Impact Enabled", Color.white, PrefImpactEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefImpactEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiImpactThresh = val7.CreateFloat("Impact Threshold (lower=easier)", Color.white, PrefImpactThresh.Value, 0.5f, 1f, 40f, (Action<float>)delegate(float v)
{
PrefImpactThresh.Value = v;
_cat.SaveToFile(false);
});
Page val8 = val6.CreatePage("Slip & Launch", Color.white, 0, true);
_uiSlipEnabled = val8.CreateBool("Slip Enabled", Color.blue, PrefSlipEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefSlipEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiSlipFriction = val8.CreateFloat("Slip Friction", Color.blue, PrefSlipFriction.Value, 0.01f, 0f, 1f, (Action<float>)delegate(float v)
{
PrefSlipFriction.Value = v;
_cat.SaveToFile(false);
});
_uiSlipVelocity = val8.CreateFloat("Slip Velocity", Color.blue, PrefSlipVelocity.Value, 0.5f, 1f, 10f, (Action<float>)delegate(float v)
{
PrefSlipVelocity.Value = v;
_cat.SaveToFile(false);
});
_uiLaunchEnabled = val8.CreateBool("Launch Enabled", Color.magenta, PrefLaunchEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefLaunchEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiLaunchThresh = val8.CreateFloat("Launch Threshold", Color.magenta, PrefLaunchThresh.Value, 0.5f, 1f, 50f, (Action<float>)delegate(float v)
{
PrefLaunchThresh.Value = v;
_cat.SaveToFile(false);
});
Page val9 = val6.CreatePage("Wall Crashes", Color.white, 0, true);
_uiWallPushEnabled = val9.CreateBool("Wall Crash Enabled", Color.gray, PrefWallPushEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefWallPushEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiWallPushVelocity = val9.CreateFloat("Wall Crash Velocity", Color.gray, PrefWallPushVelocity.Value, 0.5f, 1f, 20f, (Action<float>)delegate(float v)
{
PrefWallPushVelocity.Value = v;
_cat.SaveToFile(false);
});
Page val10 = val.CreatePage("5. Crawl (Drag) System", Color.magenta, 0, true);
_uiDragEnabled = val10.CreateBool("Crawl Enabled", Color.cyan, PrefDragEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefDragEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiDragStrength = val10.CreateFloat("Crawl Strength", Color.cyan, PrefDragStrength.Value, 0.5f, 1f, 20f, (Action<float>)delegate(float v)
{
PrefDragStrength.Value = v;
_cat.SaveToFile(false);
});
Page val11 = val.CreatePage("6. NPC Ragdoll Tools", Color.yellow, 0, true);
val11.CreateFunction("Ragdoll Nearest NPC", Color.cyan, (Action)RagdollNearestNPC);
val11.CreateFunction("Restore Nearest NPC", Color.green, (Action)RestoreNearestNPC);
val11.CreateFunction("Ragdoll All NPCs", Color.red, (Action)RagdollAllNPCs);
val11.CreateFunction("Restore All NPCs", Color.green, (Action)RestoreAllNPCs);
Page val12 = val.CreatePage("7. Bug Fixes & Visuals", Color.blue, 0, true);
_uiFixEnabled = val12.CreateBool("Ragdoll Fix Enabled", Color.green, PrefFixEnabled.Value, (Action<bool>)delegate(bool v)
{
PrefFixEnabled.Value = v;
_cat.SaveToFile(false);
});
_uiFixFly = val12.CreateBool("Flight Fix (Recommended: ON)", Color.white, PrefFixFly.Value, (Action<bool>)delegate(bool v)
{
PrefFixFly.Value = v;
_cat.SaveToFile(false);
});
_uiFixVel = val12.CreateBool("Velocity Fix (Recommended: ON)", Color.white, PrefFixVel.Value, (Action<bool>)delegate(bool v)
{
PrefFixVel.Value = v;
_cat.SaveToFile(false);
});
_uiFixVelLimit = val12.CreateFloat("Velocity Limit", Color.yellow, PrefFixVelLimit.Value, 1f, 0f, 200f, (Action<float>)delegate(float v)
{
PrefFixVelLimit.Value = v;
_cat.SaveToFile(false);
});
_uiFloppyLeft = val12.CreateBool("Floppy Left Arm", Color.white, PrefFloppyLeftArm.Value, (Action<bool>)delegate(bool v)
{
PrefFloppyLeftArm.Value = v;
_cat.SaveToFile(false);
ApplyFloppyArms();
});
_uiFloppyRight = val12.CreateBool("Floppy Right Arm", Color.white, PrefFloppyRightArm.Value, (Action<bool>)delegate(bool v)
{
PrefFloppyRightArm.Value = v;
_cat.SaveToFile(false);
ApplyFloppyArms();
});
}
private void ApplyFloppyArms()
{
try
{
if (!((Object)(object)Player.PhysicsRig == (Object)null))
{
if ((Object)(object)Player.PhysicsRig.leftHand != (Object)null && (Object)(object)Player.PhysicsRig.leftHand.physHand != (Object)null)
{
Player.PhysicsRig.leftHand.physHand._forceMultiplier = (PrefFloppyLeftArm.Value ? 0f : 1f);
}
if ((Object)(object)Player.PhysicsRig.rightHand != (Object)null && (Object)(object)Player.PhysicsRig.rightHand.physHand != (Object)null)
{
Player.PhysicsRig.rightHand.physHand._forceMultiplier = (PrefFloppyRightArm.Value ? 0f : 1f);
}
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("ApplyFloppyArms: " + ex.Message);
}
}
private void OnLevelLoaded(LevelInfo info)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
_isDowned = false;
_isDead = false;
_wasRagdolled = false;
_nextRagdollTime = 0f;
_unragdollTime = 0f;
_lastVelocity = Vector3.zero;
_prevVelocity = Vector3.zero;
_damageHits = 0;
_lastDamageTime = 0f;
_levelLoaded = true;
_cachedGroundFrame = -100;
_savedWeights.Clear();
_fixPending = false;
_framesSinceUnragdoll = 0;
_savedPelvisPos = Vector3.zero;
_savedPelvisY = 0f;
_lastImpactDamageTime = 0f;
_safeDamageTime = Time.time + 3f;
_safeRagdollTime = Time.time + 3f;
}
private bool IsLocalPlayer()
{
try
{
if ((Object)(object)Player.RigManager == (Object)null)
{
return false;
}
RigManager rigManager = Player.RigManager;
Component component = ((Component)rigManager).GetComponent("Fusion.NetworkObject");
if ((Object)(object)component != (Object)null)
{
PropertyInfo property = ((object)component).GetType().GetProperty("IsProxy");
if (property != null && (bool)property.GetValue(component))
{
return false;
}
}
return true;
}
catch
{
return true;
}
}
private bool CheckSupported360(PhysicsRig phys, out float friction)
{
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
int frameCount = Time.frameCount;
if (frameCount - _cachedGroundFrame < 3)
{
friction = _cachedFriction;
return _cachedSupported;
}
friction = 1f;
bool flag = false;
if ((Object)(object)phys == (Object)null || (Object)(object)((Rig)phys).m_pelvis == (Object)null)
{
_cachedSupported = false;
_cachedFriction = 1f;
_cachedGroundFrame = frameCount;
return false;
}
Vector3 position = ((Rig)phys).m_pelvis.position;
Transform root = ((Component)phys).transform.root;
Collider[] array = Il2CppArrayBase<Collider>.op_Implicit((Il2CppArrayBase<Collider>)(object)Physics.OverlapSphere(position, 0.6f, _groundLayerMask, (QueryTriggerInteraction)1));
if (array != null)
{
foreach (Collider val in array)
{
if (!((Object)(object)val == (Object)null) && !((Object)(object)((Component)val).transform.root == (Object)(object)root))
{
flag = true;
if ((Object)(object)val.sharedMaterial != (Object)null)
{
friction = val.sharedMaterial.dynamicFriction;
}
break;
}
}
}
if (!flag)
{
RaycastHit val2 = default(RaycastHit);
for (int j = 0; j < _sphereDirections.Length; j++)
{
if (Physics.Raycast(position, _sphereDirections[j], ref val2, 1f, _groundLayerMask, (QueryTriggerInteraction)1) && (Object)(object)((Component)((RaycastHit)(ref val2)).collider).transform.root != (Object)(object)root)
{
flag = true;
if ((Object)(object)((RaycastHit)(ref val2)).collider.sharedMaterial != (Object)null)
{
friction = ((RaycastHit)(ref val2)).collider.sharedMaterial.dynamicFriction;
}
break;
}
}
}
if (!flag && (Object)(object)phys.feet != (Object)null)
{
Vector3 position2 = phys.feet.transform.position;
RaycastHit val3 = default(RaycastHit);
if (Physics.Raycast(position2, Vector3.down, ref val3, 0.8f, _groundLayerMask, (QueryTriggerInteraction)1) && (Object)(object)((Component)((RaycastHit)(ref val3)).collider).transform.root != (Object)(object)root)
{
flag = true;
if ((Object)(object)((RaycastHit)(ref val3)).collider.sharedMaterial != (Object)null)
{
friction = ((RaycastHit)(ref val3)).collider.sharedMaterial.dynamicFriction;
}
}
}
_cachedSupported = flag;
_cachedFriction = friction;
_cachedGroundFrame = frameCount;
return flag;
}
private bool CheckGroundBelow(PhysicsRig phys)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0105: Unknown result type (might be due to invalid IL or missing references)
//IL_010a: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)phys == (Object)null || (Object)(object)((Rig)phys).m_pelvis == (Object)null)
{
return false;
}
Vector3 position = ((Rig)phys).m_pelvis.position;
Transform root = ((Component)phys).transform.root;
RaycastHit val = default(RaycastHit);
if (Physics.Raycast(position, Vector3.down, ref val, 1.2f, _groundLayerMask, (QueryTriggerInteraction)1) && (Object)(object)((Component)((RaycastHit)(ref val)).collider).transform.root != (Object)(object)root)
{
return true;
}
Vector3[] array = new Vector3[4];
Vector3 val2 = new Vector3(0.5f, -1f, 0f);
array[0] = ((Vector3)(ref val2)).normalized;
val2 = new Vector3(-0.5f, -1f, 0f);
array[1] = ((Vector3)(ref val2)).normalized;
val2 = new Vector3(0f, -1f, 0.5f);
array[2] = ((Vector3)(ref val2)).normalized;
val2 = new Vector3(0f, -1f, -0.5f);
array[3] = ((Vector3)(ref val2)).normalized;
Vector3[] array2 = (Vector3[])(object)array;
RaycastHit val3 = default(RaycastHit);
for (int i = 0; i < array2.Length; i++)
{
if (Physics.Raycast(position, array2[i], ref val3, 1f, _groundLayerMask, (QueryTriggerInteraction)1) && (Object)(object)((Component)((RaycastHit)(ref val3)).collider).transform.root != (Object)(object)root)
{
return true;
}
}
return false;
}
private bool IsHoldingNimbus(PhysicsRig phys)
{
try
{
if ((Object)(object)phys.leftHand != (Object)null && (Object)(object)phys.leftHand.m_CurrentAttachedGO != (Object)null && ((Object)phys.leftHand.m_CurrentAttachedGO).name.IndexOf("nimbus", StringComparison.OrdinalIgnoreCase) >= 0)
{
return true;
}
if ((Object)(object)phys.rightHand != (Object)null && (Object)(object)phys.rightHand.m_CurrentAttachedGO != (Object)null && ((Object)phys.rightHand.m_CurrentAttachedGO).name.IndexOf("nimbus", StringComparison.OrdinalIgnoreCase) >= 0)
{
return true;
}
}
catch
{
}
return false;
}
private static AIBrain GetClosestBrain(Il2CppArrayBase<AIBrain> brains, Vector3 playerPos)
{
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
AIBrain result = null;
float num = float.MaxValue;
if (brains == null)
{
return null;
}
foreach (AIBrain brain in brains)
{
if (!((Object)(object)brain == (Object)null) && !((Object)(object)brain.puppetMaster == (Object)null) && ((Component)brain).gameObject.activeInHierarchy)
{
float num2 = Vector3.Distance(playerPos, ((Component)brain).transform.position);
if (num2 < num)
{
num = num2;
result = brain;
}
}
}
return result;
}
private static void RagdollBrain(AIBrain brain)
{
if ((Object)(object)brain == (Object)null || (Object)(object)brain.puppetMaster == (Object)null)
{
return;
}
PuppetMaster puppetMaster = brain.puppetMaster;
int instanceID = ((Object)puppetMaster).GetInstanceID();
if (!_savedWeights.ContainsKey(instanceID))
{
_savedWeights[instanceID] = puppetMaster.muscleWeight;
}
puppetMaster.muscleWeight = 0f;
Il2CppArrayBase<Behaviour> componentsInChildren = ((Component)((Component)brain).transform.root).GetComponentsInChildren<Behaviour>(true);
if (componentsInChildren == null)
{
return;
}
foreach (Behaviour item in componentsInChildren)
{
if ((Object)(object)item != (Object)null && ((object)item).GetType().Name.Contains("Animator"))
{
item.enabled = false;
}
}
}
private static void RestoreBrain(AIBrain brain)
{
if ((Object)(object)brain == (Object)null || (Object)(object)brain.puppetMaster == (Object)null)
{
return;
}
PuppetMaster puppetMaster = brain.puppetMaster;
int instanceID = ((Object)puppetMaster).GetInstanceID();
if (_savedWeights.TryGetValue(instanceID, out var value))
{
puppetMaster.muscleWeight = value;
_savedWeights.Remove(instanceID);
}
else
{
puppetMaster.muscleWeight = 1f;
}
Il2CppArrayBase<Behaviour> componentsInChildren = ((Component)((Component)brain).transform.root).GetComponentsInChildren<Behaviour>(true);
if (componentsInChildren == null)
{
return;
}
foreach (Behaviour item in componentsInChildren)
{
if ((Object)(object)item != (Object)null && ((object)item).GetType().Name.Contains("Animator"))
{
item.enabled = true;
}
}
}
private static void RagdollNearestNPC()
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: 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)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Expected O, but got Unknown
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: 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)
//IL_0088: 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_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Expected O, but got Unknown
try
{
if (!((Object)(object)Player.RigManager == (Object)null) && !((Object)(object)Player.RigManager.physicsRig == (Object)null))
{
Vector3 position = ((Rig)Player.RigManager.physicsRig).m_pelvis.position;
Il2CppArrayBase<AIBrain> brains = Object.FindObjectsOfType<AIBrain>();
AIBrain closestBrain = GetClosestBrain(brains, position);
if ((Object)(object)closestBrain != (Object)null)
{
RagdollBrain(closestBrain);
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit("Ragdolled!"),
Type = (NotificationType)3,
PopupLength = 2f
});
}
else
{
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit("No NPCs."),
Type = (NotificationType)1,
PopupLength = 2f
});
}
}
}
catch (Exception ex)
{
MelonLogger.Warning("RagdollNearestNPC: " + ex.Message);
}
}
private static void RestoreNearestNPC()
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: 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)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Expected O, but got Unknown
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: 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)
//IL_0088: 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_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: Expected O, but got Unknown
try
{
if (!((Object)(object)Player.RigManager == (Object)null) && !((Object)(object)Player.RigManager.physicsRig == (Object)null))
{
Vector3 position = ((Rig)Player.RigManager.physicsRig).m_pelvis.position;
Il2CppArrayBase<AIBrain> brains = Object.FindObjectsOfType<AIBrain>();
AIBrain closestBrain = GetClosestBrain(brains, position);
if ((Object)(object)closestBrain != (Object)null)
{
RestoreBrain(closestBrain);
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit("Restored!"),
Type = (NotificationType)3,
PopupLength = 2f
});
}
else
{
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit("No NPCs."),
Type = (NotificationType)1,
PopupLength = 2f
});
}
}
}
catch (Exception ex)
{
MelonLogger.Warning("RestoreNearestNPC: " + ex.Message);
}
}
private static void RagdollAllNPCs()
{
//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_0027: 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_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: 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_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Expected O, but got Unknown
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_010d: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Expected O, but got Unknown
try
{
Il2CppArrayBase<AIBrain> val = Object.FindObjectsOfType<AIBrain>();
if (val == null || val.Count == 0)
{
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit("No NPCs."),
Type = (NotificationType)1,
PopupLength = 2f
});
return;
}
int num = 0;
foreach (AIBrain item in val)
{
if ((Object)(object)item != (Object)null && (Object)(object)item.puppetMaster != (Object)null && ((Component)item).gameObject.activeInHierarchy)
{
RagdollBrain(item);
num++;
}
}
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit($"Ragdolled {num}!"),
Type = (NotificationType)3,
PopupLength = 2f
});
}
catch (Exception ex)
{
MelonLogger.Warning("RagdollAllNPCs: " + ex.Message);
}
}
private static void RestoreAllNPCs()
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Unknown result type (might be due to invalid IL or missing references)
//IL_008d: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Expected O, but got Unknown
try
{
Il2CppArrayBase<AIBrain> val = Object.FindObjectsOfType<AIBrain>();
if (val == null || val.Count == 0)
{
return;
}
int num = 0;
foreach (AIBrain item in val)
{
if ((Object)(object)item != (Object)null && (Object)(object)item.puppetMaster != (Object)null)
{
RestoreBrain(item);
num++;
}
}
_savedWeights.Clear();
Notifier.Send(new Notification
{
Title = NotificationText.op_Implicit("NPC"),
Message = NotificationText.op_Implicit($"Restored {num}!"),
Type = (NotificationType)3,
PopupLength = 2f
});
}
catch (Exception ex)
{
MelonLogger.Warning("RestoreAllNPCs: " + ex.Message);
}
}
private bool CheckJumpInput()
{
if (Input.GetKeyDown((KeyCode)32))
{
return true;
}
if (Input.GetKeyDown((KeyCode)332))
{
return true;
}
return false;
}
public override void OnUpdate()
{
//IL_013d: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
if (!PrefEnabled.Value || !_levelLoaded || !IsLocalPlayer() || (Object)(object)Player.RigManager == (Object)null)
{
return;
}
RigManager rigManager = Player.RigManager;
PhysicsRig physicsRig = rigManager.physicsRig;
if ((Object)(object)physicsRig == (Object)null)
{
return;
}
bool flag = IsRagdolled(physicsRig);
if ((Object)(object)rigManager.health != (Object)null && (_isDead || _isDowned) && rigManager.health.curr_Health >= rigManager.health.max_Health * 0.9f && (!_isDead || !(Time.time - _deathTime < 4f)))
{
_isDead = false;
_isDowned = false;
_unragdollTime = 0f;
_safeDamageTime = Time.time + 3f;
_safeRagdollTime = Time.time + 3f;
if ((Object)(object)physicsRig != (Object)null)
{
_lastVelocity = physicsRig.wholeBodyVelocity;
_prevVelocity = physicsRig.wholeBodyVelocity;
}
if (flag)
{
UnragdollRig(rigManager);
}
}
if (_isDead)
{
return;
}
bool flag2 = CheckInput();
bool flag3 = CheckJumpInput();
if (flag2)
{
if ((Object)(object)rigManager.activeSeat != (Object)null && PrefFastExit.Value)
{
try
{
rigManager.activeSeat.EgressRig(true);
}
catch
{
}
if (Time.time >= _nextRagdollTime)
{
ExecuteRagdoll(rigManager);
}
}
else
{
if ((Object)(object)rigManager.activeSeat != (Object)null)
{
return;
}
if (flag)
{
if (CanUnragdoll(physicsRig))
{
UnragdollRig(rigManager);
}
}
else if (Time.time >= _nextRagdollTime)
{
ExecuteRagdoll(rigManager);
}
}
}
else if (flag3 && flag)
{
if (CanUnragdoll(physicsRig))
{
UnragdollRig(rigManager);
}
}
else if (!((Object)(object)rigManager.activeSeat != (Object)null) && _isDowned && Time.time - _downedStartTime >= PrefDownedDuration.Value && CanUnragdoll(physicsRig))
{
UnragdollRig(rigManager);
}
}
public override void OnFixedUpdate()
{
//IL_009a: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
if (!PrefEnabled.Value || !_levelLoaded || !IsLocalPlayer() || (Object)(object)Player.RigManager == (Object)null)
{
return;
}
RigManager rigManager = Player.RigManager;
PhysicsRig physicsRig = rigManager.physicsRig;
if ((Object)(object)physicsRig == (Object)null || (Object)(object)rigManager.activeSeat != (Object)null)
{
return;
}
bool flag = IsRagdolled(physicsRig);
HandleRagdollFix(rigManager, physicsRig, flag);
if (flag)
{
Vector3 wholeBodyVelocity = physicsRig.wholeBodyVelocity;
Vector3 val = wholeBodyVelocity - _lastVelocity;
_prevVelocity = _lastVelocity;
_lastVelocity = wholeBodyVelocity;
if (_isDead)
{
return;
}
TryApplyImpactDamage(rigManager, ((Vector3)(ref val)).magnitude);
if (PrefDragEnabled.Value)
{
HandleDrag(physicsRig);
}
if (!PrefPreventUnragdollMoving.Value)
{
return;
}
float num = Time.time - _ragdollStartTime;
if (num < PrefMaxRagdollTime.Value)
{
float friction;
bool flag2 = CheckSupported360(physicsRig, out friction);
float magnitude = ((Vector3)(ref wholeBodyVelocity)).magnitude;
if (!flag2 || magnitude > PrefUnragdollMaxVelocity.Value)
{
float num2 = Time.time + PrefRagdollCooldown.Value;
float num3 = _ragdollStartTime + PrefMaxRagdollTime.Value;
_unragdollTime = Mathf.Min(num2, num3);
}
}
}
else if (Time.time >= _nextRagdollTime && !_isDead)
{
HandleAutoRagdoll(rigManager, physicsRig);
_prevVelocity = _lastVelocity;
_lastVelocity = physicsRig.wholeBodyVelocity;
}
}
private bool CanUnragdoll(PhysicsRig phys)
{
if (_isDead)
{
return false;
}
float num = Time.time - _ragdollStartTime;
if (num >= PrefMaxRagdollTime.Value)
{
return true;
}
if (Time.time < _unragdollTime)
{
return false;
}
return true;
}
private bool IsRagdolled(PhysicsRig phys)
{
try
{
if ((Object)(object)phys == (Object)null)
{
return false;
}
bool flag = (Object)(object)phys.torso != (Object)null && phys.torso.shutdown;
bool flag2 = !phys.ballLocoEnabled;
return flag || flag2;
}
catch
{
return false;
}
}
private void HandleRagdollFix(RigManager rig, PhysicsRig phys, bool isRagdolled)
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Unknown result type (might be due to invalid IL or missing references)
//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01bf: Unknown result type (might be due to invalid IL or missing references)
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_0123: Unknown result type (might be due to invalid IL or missing references)
//IL_012f: Unknown result type (might be due to invalid IL or missing references)
//IL_0134: Unknown result type (might be due to invalid IL or missing references)
//IL_0217: Unknown result type (might be due to invalid IL or missing references)
//IL_023b: Unknown result type (might be due to invalid IL or missing references)
//IL_024f: Unknown result type (might be due to invalid IL or missing references)
//IL_0254: Unknown result type (might be due to invalid IL or missing references)
//IL_0259: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_0284: Unknown result type (might be due to invalid IL or missing references)
//IL_0291: Unknown result type (might be due to invalid IL or missing references)
if (!_wasRagdolled && isRagdolled)
{
_ragdollStartTime = Time.time;
_fixPending = false;
_framesSinceUnragdoll = 0;
}
else if (_wasRagdolled && !isRagdolled)
{
float num = Time.time - _ragdollStartTime;
bool flag = num > 0.5f;
Vector3 wholeBodyVelocity = phys.wholeBodyVelocity;
bool flag2 = ((Vector3)(ref wholeBodyVelocity)).magnitude > PrefFixVelLimit.Value;
if (PrefFixEnabled.Value)
{
bool value = PrefFixFly.Value;
bool value2 = PrefFixVel.Value;
bool flag3 = false;
if (value && value2 && flag && !flag2)
{
flag3 = true;
}
else if (value2 && !value && !flag2)
{
flag3 = true;
}
else if (value && !value2 && flag)
{
flag3 = true;
}
else if (!value2 && !value)
{
flag3 = true;
}
if (flag3)
{
_savedPelvisPos = ((Rig)phys).m_pelvis.position;
_savedPelvisRot = ((Rig)phys).m_pelvis.rotation;
_savedPelvisY = _savedPelvisPos.y;
_fixPending = true;
_framesSinceUnragdoll = 0;
}
}
}
if (_fixPending)
{
_framesSinceUnragdoll++;
if (_framesSinceUnragdoll >= 1 && _framesSinceUnragdoll <= 4)
{
Vector3 position = ((Rig)phys).m_pelvis.position;
Vector3 wholeBodyVelocity2 = phys.wholeBodyVelocity;
bool flag4 = false;
if (PrefFixFly.Value && position.y > _savedPelvisY + 0.8f)
{
flag4 = true;
}
if (PrefFixVel.Value && ((Vector3)(ref wholeBodyVelocity2)).magnitude > PrefFixVelLimit.Value)
{
flag4 = true;
}
if (PrefFixFly.Value && wholeBodyVelocity2.y > 3f)
{
flag4 = true;
}
if (flag4)
{
Vector3 val = _savedPelvisPos + new Vector3(0f, 0.5f, 0f);
rig.Teleport(val, true);
try
{
Rigidbody component = ((Component)((Rig)phys).m_pelvis).GetComponent<Rigidbody>();
if ((Object)(object)component != (Object)null)
{
component.velocity = Vector3.zero;
component.angularVelocity = Vector3.zero;
}
}
catch
{
}
_fixPending = false;
}
}
if (_framesSinceUnragdoll > 4)
{
_fixPending = false;
}
}
_wasRagdolled = isRagdolled;
}
private void HandleAutoRagdoll(RigManager rig, PhysicsRig phys)
{
//IL_034b: Unknown result type (might be due to invalid IL or missing references)
//IL_034c: Unknown result type (might be due to invalid IL or missing references)
//IL_035b: Unknown result type (might be due to invalid IL or missing references)
//IL_0360: Unknown result type (might be due to invalid IL or missing references)
//IL_036e: Unknown result type (might be due to invalid IL or missing references)
//IL_0370: Unknown result type (might be due to invalid IL or missing references)
//IL_0372: Unknown result type (might be due to invalid IL or missing references)
//IL_0377: 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_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: 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_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: 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)
//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0247: Unknown result type (might be due to invalid IL or missing references)
//IL_0248: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0185: Unknown result type (might be due to invalid IL or missing references)
if (Time.time < _safeRagdollTime || IsHoldingNimbus(phys))
{
return;
}
Vector3 wholeBodyVelocity = phys.wholeBodyVelocity;
Vector3 val = wholeBodyVelocity - _lastVelocity;
float y = wholeBodyVelocity.y;
float magnitude = ((Vector3)(ref val)).magnitude;
bool flag = CheckGroundBelow(phys);
float friction;
bool flag2 = CheckSupported360(phys, out friction);
if (PrefFallEnabled.Value && !flag && y < 0f - PrefFallThresh.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude);
return;
}
Vector3 val2 = wholeBodyVelocity - _prevVelocity;
float magnitude2 = ((Vector3)(ref val2)).magnitude;
if (magnitude > 0.3f)
{
if (PrefImpactEnabled.Value && ((Vector3)(ref _lastVelocity)).sqrMagnitude > 0.01f)
{
float num = Vector3.Dot(((Vector3)(ref val)).normalized, ((Vector3)(ref _lastVelocity)).normalized);
if (num < -0.05f && magnitude > PrefImpactThresh.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude);
return;
}
}
if (PrefLaunchEnabled.Value)
{
float num2 = ((((Vector3)(ref wholeBodyVelocity)).sqrMagnitude > 0.01f) ? Vector3.Dot(((Vector3)(ref val)).normalized, ((Vector3)(ref wholeBodyVelocity)).normalized) : 0f);
if ((num2 > 0.4f || val.y > 0.4f) && magnitude > PrefLaunchThresh.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude);
return;
}
}
}
if (PrefImpactEnabled.Value && magnitude2 > PrefImpactThresh.Value * 1.3f && ((Vector3)(ref _lastVelocity)).sqrMagnitude > 0.5f)
{
float num3 = Vector3.Angle(_lastVelocity, wholeBodyVelocity);
if (num3 > 80f)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude2);
return;
}
}
if (PrefSlipEnabled.Value && flag2)
{
Vector3 val3 = wholeBodyVelocity;
val3.y = 0f;
bool flag3 = Mathf.Abs(val.y) > 3f && y < -1.5f;
if ((friction < PrefSlipFriction.Value && ((Vector3)(ref val3)).magnitude > PrefSlipVelocity.Value) || (friction < PrefSlipFriction.Value && flag3))
{
ExecuteRagdoll(rig);
return;
}
}
if (PrefWallPushEnabled.Value)
{
bool flag4 = false;
try
{
flag4 = ((Object)(object)phys.leftHand != (Object)null && (Object)(object)phys.leftHand.physHand != (Object)null && phys.leftHand.physHand._colliding) || ((Object)(object)phys.rightHand != (Object)null && (Object)(object)phys.rightHand.physHand != (Object)null && phys.rightHand.physHand._colliding);
}
catch
{
}
Vector3 val4 = wholeBodyVelocity;
val4.y = 0f;
Vector3 lastVelocity = _lastVelocity;
lastVelocity.y = 0f;
Vector3 val5 = val4 - lastVelocity;
float magnitude3 = ((Vector3)(ref val5)).magnitude;
if (flag4 && !flag2 && ((Vector3)(ref val4)).magnitude > PrefWallPushVelocity.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, ((Vector3)(ref val4)).magnitude);
}
else if (flag4 && magnitude3 > 1.2f && ((Vector3)(ref lastVelocity)).magnitude > PrefWallPushVelocity.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude3);
}
else if (magnitude3 > 3f && ((Vector3)(ref lastVelocity)).magnitude > PrefWallPushVelocity.Value)
{
ExecuteRagdoll(rig);
TryApplyImpactDamage(rig, magnitude3);
}
}
}
private void TryApplyImpactDamage(RigManager rig, float velocityDelta)
{
if (!PrefImpactDamageEnabled.Value || (Object)(object)rig == (Object)null || (Object)(object)rig.health == (Object)null || _isDead || Time.time < _safeDamageTime || velocityDelta < 1f || Time.time - _lastImpactDamageTime < 0.5f)
{
return;
}
float num = velocityDelta * PrefImpactDamageMultiplier.Value;
float num2 = num - PrefImpactDamageThreshold.Value;
if (!(num2 > 0f))
{
return;
}
try
{
rig.health.TAKEDAMAGE(num2);
_lastImpactDamageTime = Time.time;
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("ImpactDamage: " + ex.Message);
}
}
private void HandleDrag(PhysicsRig phys)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0223: Unknown result type (might be due to invalid IL or missing references)
//IL_021a: Unknown result type (might be due to invalid IL or missing references)
//IL_0228: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Unknown result type (might be due to invalid IL or missing references)
//IL_0234: Unknown result type (might be due to invalid IL or missing references)
//IL_0242: Unknown result type (might be due to invalid IL or missing references)
//IL_0290: Unknown result type (might be due to invalid IL or missing references)
//IL_0292: Unknown result type (might be due to invalid IL or missing references)
//IL_0298: Unknown result type (might be due to invalid IL or missing references)
//IL_029d: Unknown result type (might be due to invalid IL or missing references)
//IL_029f: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
//IL_02af: Unknown result type (might be due to invalid IL or missing references)
//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
//IL_02b8: Unknown result type (might be due to invalid IL or missing references)
//IL_0281: Unknown result type (might be due to invalid IL or missing references)
//IL_0286: Unknown result type (might be due to invalid IL or missing references)
//IL_0288: Unknown result type (might be due to invalid IL or missing references)
//IL_028d: Unknown result type (might be due to invalid IL or missing references)
//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
//IL_02f5: Unknown result type (might be due to invalid IL or missing references)
//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
//IL_0312: Unknown result type (might be due to invalid IL or missing references)
//IL_0319: Unknown result type (might be due to invalid IL or missing references)
//IL_0335: Unknown result type (might be due to invalid IL or missing references)
//IL_033c: Unknown result type (might be due to invalid IL or missing references)
//IL_0358: Unknown result type (might be due to invalid IL or missing references)
//IL_035f: Unknown result type (might be due to invalid IL or missing references)
Vector2 val = Vector2.zero;
try
{
BaseController val2 = ((PrefSide.Value == ControllerSide.Left) ? Player.LeftController : Player.RightController);
if (PrefSide.Value == ControllerSide.Both && (Object)(object)Player.RightController != (Object)null)
{
val2 = Player.RightController;
}
if ((Object)(object)val2 != (Object)null)
{
val = val2.GetThumbStickAxis();
}
}
catch
{
}
if (((Vector2)(ref val)).magnitude <= 0.1f)
{
if (Input.GetKey((KeyCode)119) || Input.GetKey((KeyCode)273))
{
val.y += 1f;
}
if (Input.GetKey((KeyCode)115) || Input.GetKey((KeyCode)274))
{
val.y -= 1f;
}
if (Input.GetKey((KeyCode)100) || Input.GetKey((KeyCode)275))
{
val.x += 1f;
}
if (Input.GetKey((KeyCode)97) || Input.GetKey((KeyCode)276))
{
val.x -= 1f;
}
val = ((Vector2)(ref val)).normalized;
}
if (((Vector2)(ref val)).magnitude <= 0.1f)
{
return;
}
try
{
Rigidbody val3 = (((Object)(object)((Rig)phys).m_pelvis != (Object)null) ? ((Component)((Rig)phys).m_pelvis).GetComponent<Rigidbody>() : null);
if (!((Object)(object)val3 == (Object)null))
{
Rigidbody val4 = (((Object)(object)((Rig)phys).m_chest != (Object)null) ? ((Component)((Rig)phys).m_chest).GetComponent<Rigidbody>() : null);
Rigidbody val5 = (((Object)(object)phys.leftHand != (Object)null) ? ((Component)phys.leftHand).GetComponent<Rigidbody>() : null);
Rigidbody val6 = (((Object)(object)phys.rightHand != (Object)null) ? ((Component)phys.rightHand).GetComponent<Rigidbody>() : null);
Transform val7 = (((Object)(object)Player.RigManager != (Object)null && (Object)(object)Player.RigManager.ControllerRig != (Object)null) ? ((Rig)Player.RigManager.ControllerRig).m_head : null);
Vector3 val8 = (((Object)(object)val7 != (Object)null) ? val7.forward : Vector3.forward);
Vector3 val9 = (((Object)(object)val7 != (Object)null) ? val7.right : Vector3.right);
val8.y = 0f;
((Vector3)(ref val8)).Normalize();
val9.y = 0f;
((Vector3)(ref val9)).Normalize();
if (((Vector3)(ref val8)).sqrMagnitude < 0.01f)
{
val8 = Vector3.forward;
val9 = Vector3.right;
}
Vector3 val10 = val8 * val.y + val9 * val.x;
Vector3 normalized = ((Vector3)(ref val10)).normalized;
float friction;
bool flag = !CheckSupported360(phys, out friction);
float num = PrefDragStrength.Value * 15f;
if (flag)
{
num *= 1.5f;
}
Vector3 val11 = normalized * num;
val3.AddForce(val11, (ForceMode)5);
if ((Object)(object)val4 != (Object)null)
{
val4.AddForce(val11 * 0.8f, (ForceMode)5);
}
if ((Object)(object)val5 != (Object)null)
{
val5.AddForce(val11 * 0.4f, (ForceMode)5);
}
if ((Object)(object)val6 != (Object)null)
{
val6.AddForce(val11 * 0.4f, (ForceMode)5);
}
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("HandleDrag: " + ex.Message);
}
}
private void OnPlayerDamageReceived(RigManager rigManager, float damage)
{
if (!PrefEnabled.Value || _isDead || (Object)(object)rigManager == (Object)null || (Object)(object)rigManager.physicsRig == (Object)null)
{
return;
}
PhysicsRig physicsRig = rigManager.physicsRig;
if (IsRagdolled(physicsRig))
{
if (PrefResetCooldownOnDamage.Value)
{
float num = Time.time + PrefRagdollCooldown.Value;
float num2 = _ragdollStartTime + PrefMaxRagdollTime.Value;
_unragdollTime = Mathf.Min(num, num2);
}
return;
}
if (PrefTwoTapDamage.Value)
{
if (Time.time - _lastDamageTime < PrefTwoTapTimeWindow.Value)
{
_damageHits++;
}
else
{
_damageHits = 1;
}
_lastDamageTime = Time.time;
if (_damageHits >= 2)
{
_damageHits = 0;
ExecuteRagdoll(rigManager);
return;
}
}
if (damage >= 30f)
{
ExecuteRagdoll(rigManager);
}
else
{
if (!PrefDownedEnabled.Value)
{
return;
}
try
{
if (rigManager.health.curr_Health <= 0f)
{
HandleDownedOrDeath(rigManager);
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("Damage: " + ex.Message);
}
}
}
private void HandleDownedOrDeath(RigManager rigManager)
{
if (_isDowned)
{
_isDead = true;
_deathTime = Time.time;
try
{
rigManager.health.Dying(5f);
return;
}
catch
{
return;
}
}
if (!_isDead)
{
_isDowned = true;
_downedStartTime = Time.time;
try
{
TryInvokeLifeSavingDamageDealt(rigManager.health);
rigManager.health.curr_Health = rigManager.health.max_Health * 0.25f;
}
catch
{
}
ExecuteRagdoll(rigManager);
}
}
private void OnPlayerDeath(RigManager rigManager)
{
if (!PrefEnabled.Value)
{
return;
}
_isDowned = false;
_isDead = true;
_deathTime = Time.time;
if (PrefStayRagdolledOnDeath.Value)
{
if ((Object)(object)rigManager != (Object)null && (Object)(object)rigManager.physicsRig != (Object)null && !IsRagdolled(rigManager.physicsRig))
{
ExecuteRagdoll(rigManager);
}
_unragdollTime = float.MaxValue;
}
else if ((Object)(object)rigManager != (Object)null)
{
UnragdollRig(rigManager);
}
}
private void ExecuteRagdoll(RigManager rig)
{
if ((Object)(object)rig == (Object)null)
{
return;
}
try
{
PhysicsRig physicsRig = rig.physicsRig;
if ((Object)(object)physicsRig == (Object)null)
{
return;
}
if (PrefDropItems.Value)
{
ForceDrop(physicsRig.leftHand);
ForceDrop(physicsRig.rightHand);
}
if (PrefMode.Value == RagdollMode.Limp)
{
physicsRig.ShutdownRig();
}
physicsRig.RagdollRig();
if (PrefMode.Value == RagdollMode.ArmControl)
{
physicsRig.DisableBallLoco();
physicsRig.PhysicalLegs();
if ((Object)(object)physicsRig.legLf != (Object)null)
{
physicsRig.legLf.ShutdownLimb();
}
if ((Object)(object)physicsRig.legRt != (Object)null)
{
physicsRig.legRt.ShutdownLimb();
}
}
_ragdollStartTime = Time.time;
_nextRagdollTime = Time.time + 1f;
_unragdollTime = Time.time + PrefRagdollCooldown.Value;
_fixPending = false;
_framesSinceUnragdoll = 0;
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("ExecuteRagdoll: " + ex.Message);
}
}
private void ForceDrop(Hand hand)
{
try
{
if ((Object)(object)hand == (Object)null || !hand.HasAttachedObject())
{
return;
}
HandReciever attachedReceiver = hand.AttachedReceiver;
if (!((Object)(object)attachedReceiver == (Object)null))
{
Grip val = ((Il2CppObjectBase)attachedReceiver).TryCast<Grip>();
if ((Object)(object)val != (Object)null)
{
val.ForceDetach(true);
}
else
{
hand.DetachObject();
}
}
}
catch
{
}
}
private void UnragdollRig(RigManager rig)
{
//IL_0047: 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_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)rig == (Object)null)
{
return;
}
try
{
PhysicsRig physicsRig = rig.physicsRig;
if (!((Object)(object)physicsRig == (Object)null))
{
Vector3 val = (((Object)(object)((Rig)physicsRig).m_pelvis != (Object)null) ? ((Rig)physicsRig).m_pelvis.position : Vector3.zero);
Quaternion val2 = (((Object)(object)((Rig)physicsRig).m_pelvis != (Object)null) ? ((Rig)physicsRig).m_pelvis.rotation : Quaternion.identity);
physicsRig.TurnOnRig();
physicsRig.UnRagdollRig();
if (!physicsRig.ballLocoEnabled)
{
physicsRig.EnableBallLoco();
}
if ((Object)(object)physicsRig.knee != (Object)null && (Object)(object)physicsRig.feet != (Object)null)
{
physicsRig.knee.transform.SetPositionAndRotation(val, val2);
physicsRig.feet.transform.SetPositionAndRotation(val, val2);
}
ApplyFloppyArms();
_nextRagdollTime = Time.time + 1f;
_unragdollTime = 0f;
_fixPending = false;
_framesSinceUnragdoll = 0;
_isDowned = false;
_isDead = false;
}
}
catch (Exception ex)
{
((MelonBase)this).LoggerInstance.Warning("UnragdollRig: " + ex.Message);
}
}
private bool CheckInput()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown(PrefKeyboardKey.Value))
{
return true;
}
bool flag = false;
try
{
BaseController rightController = Player.RightController;
BaseController leftController = Player.LeftController;
if (PrefInputMode.Value == InputMode.ThumbstickPress)
{
if ((PrefSide.Value == ControllerSide.Right || PrefSide.Value == ControllerSide.Both) && (Object)(object)rightController != (Object)null)
{
flag |= rightController.GetThumbStickDown();
}
if ((PrefSide.Value == ControllerSide.Left || PrefSide.Value == ControllerSide.Both) && (Object)(object)leftController != (Object)null)
{
flag |= leftController.GetThumbStickDown();
}
}
else if (PrefInputMode.Value == InputMode.DoubleTapB)
{
bool flag2 = false;
if ((PrefSide.Value == ControllerSide.Right || PrefSide.Value == ControllerSide.Both) && (Object)(object)rightController != (Object)null)
{
flag2 |= rightController.GetBButtonDown();
}
if ((PrefSide.Value == ControllerSide.Left || PrefSide.Value == ControllerSide.Both) && (Object)(object)leftController != (Object)null)
{
flag2 |= leftController.GetBButtonDown();
}
float unscaledTime = Time.unscaledTime;
if (flag2 && _doubleTapReady)
{
if (unscaledTime - _lastInputTime <= 0.35f)
{
flag = true;
}
_doubleTapReady = false;
_lastInputTime = 0f;
}
else if (flag2)
{
_lastInputTime = unscaledTime;
_doubleTapReady = true;
}
else if (unscaledTime - _lastInputTime > 0.35f)
{
_doubleTapReady = false;
_lastInputTime = 0f;
}
}
}
catch
{
}
return flag;
}
private static void TryInvokeLifeSavingDamageDealt(object health)
{
try
{
if (health != null)
{
MethodInfo method = health.GetType().GetMethod("LifeSavingDamgeDealt", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
if (method != null)
{
method.Invoke(health, null);
}
}
}
catch
{
}
}
static UltimateRagdollMod()
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000e: 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_001a: 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_0026: 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_0032: 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_003e: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: 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_0060: 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_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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)
//IL_0088: 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)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0117: 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)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_015a: Unknown result type (might be due to invalid IL or missing references)
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
Vector3[] obj = new Vector3[14]
{
Vector3.down,
Vector3.up,
Vector3.left,
Vector3.right,
Vector3.forward,
Vector3.back,
default(Vector3),
default(Vector3),
default(Vector3),
default(Vector3),
default(Vector3),
default(Vector3),
default(Vector3),
default(Vector3)
};
Vector3 val = new Vector3(0.7f, -0.7f, 0f);
obj[6] = ((Vector3)(ref val)).normalized;
val = new Vector3(-0.7f, -0.7f, 0f);
obj[7] = ((Vector3)(ref val)).normalized;
val = new Vector3(0f, -0.7f, 0.7f);
obj[8] = ((Vector3)(ref val)).normalized;
val = new Vector3(0f, -0.7f, -0.7f);
obj[9] = ((Vector3)(ref val)).normalized;
val = new Vector3(0.5f, -0.7f, 0.5f);
obj[10] = ((Vector3)(ref val)).normalized;
val = new Vector3(-0.5f, -0.7f, 0.5f);
obj[11] = ((Vector3)(ref val)).normalized;
val = new Vector3(0.5f, -0.7f, -0.5f);
obj[12] = ((Vector3)(ref val)).normalized;
val = new Vector3(-0.5f, -0.7f, -0.5f);
obj[13] = ((Vector3)(ref val)).normalized;
_sphereDirections = (Vector3[])(object)obj;
_savedWeights = new Dictionary<int, float>();
}
}