Decompiled source of Crumble v2.0.0

Mods/Crumble.dll

Decompiled a month ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BoneLib;
using BoneLib.BoneMenu;
using Crumble;
using Il2CppSLZ.Marrow;
using MelonLoader;
using MelonLoader.Preferences;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle(null)]
[assembly: AssemblyDescription(null)]
[assembly: AssemblyCompany(null)]
[assembly: AssemblyProduct("Crumble")]
[assembly: AssemblyCopyright("Developed by Bread Soup")]
[assembly: AssemblyTrademark(null)]
[assembly: AssemblyFileVersion("1.1.0")]
[assembly: MelonInfo(typeof(Main), "Crumble", "1.1.0", "Bread Soup", null)]
[assembly: MelonColor(255, 255, 255, 255)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyVersion("1.1.0.0")]
namespace Crumble;

internal class Main : MelonMod
{
	internal const string Name = "Crumble";

	internal const string Description = null;

	internal const string Author = "Bread Soup";

	internal const string Company = null;

	internal const string Version = "1.1.0";

	internal const string DownloadLink = null;

	private PhysGrounder _feet;

	private bool _sceneLoaded;

	private bool _hasRagdolledFromCrumble;

	private bool _previousRagdollState;

	private bool _currentRagdollState;

	private bool _previousFrame;

	private bool _currentFrame;

	public static float Threshold = 7f;

	public static float Markiplier = 1.5f;

	public static float RagdollHealthPercentage = 25f;

	private static readonly Vector3 Add = new Vector3(0f, 0.5f, 0f);

	public override void OnInitializeMelon()
	{
		Hooking.OnLevelLoaded += delegate
		{
			OnSceneAwake();
		};
		Preferences.MelonPreferencesCreator();
		Preferences.BoneMenuCreator();
	}

	private void OnSceneAwake()
	{
		_sceneLoaded = true;
		_feet = Player.PhysicsRig.feet.GetComponent<PhysGrounder>();
		_previousRagdollState = Player.PhysicsRig._legsKinematic;
		_previousFrame = _feet.isGrounded;
	}

	public override void OnUpdate()
	{
		//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: 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_0148: 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)
		if (!Preferences.IsEnabled || !_sceneLoaded)
		{
			return;
		}
		float num = Player.RigManager.health.curr_Health / Player.RigManager.health.max_Health * 100f;
		if (num >= RagdollHealthPercentage && !Player.PhysicsRig._legsKinematic && Player.RigManager.health.curr_Health > 0f && _hasRagdolledFromCrumble)
		{
			Player.PhysicsRig.UnRagdollRig();
		}
		if (_hasRagdolledFromCrumble && Player.PhysicsRig._legsKinematic)
		{
			_hasRagdolledFromCrumble = false;
		}
		_currentRagdollState = Player.PhysicsRig._legsKinematic;
		if (!_previousRagdollState && _currentRagdollState && Preferences.RagdollFlingingFix)
		{
			Vector3 val = Player.PhysicsRig.feet.transform.position + Add;
			Player.RigManager.Teleport(val, true);
		}
		_previousRagdollState = _currentRagdollState;
		_currentFrame = _feet.isGrounded;
		if (_currentFrame && !_previousFrame && Player.PhysicsRig.wholeBodyVelocity.y < 0f - Threshold)
		{
			float num2 = Mathf.Abs(Player.PhysicsRig.wholeBodyVelocity.y + Threshold);
			num2 *= Markiplier;
			Player.RigManager.health.TAKEDAMAGE(num2);
			float num3 = Player.RigManager.health.curr_Health / Player.RigManager.health.max_Health * 100f;
			if (num3 <= RagdollHealthPercentage && Preferences.RagdollFromFallDamage)
			{
				Player.PhysicsRig.RagdollRig();
				_hasRagdolledFromCrumble = true;
			}
		}
		_previousFrame = _currentFrame;
	}
}
internal static class Preferences
{
	private static MelonPreferences_Category MelonPrefCategory { get; set; }

	private static MelonPreferences_Entry<bool> MelonPrefEnabled { get; set; }

	internal static bool IsEnabled { get; private set; }

	private static MelonPreferences_Entry<float> MelonPrefDamageThreshold { get; set; }

	private static MelonPreferences_Entry<float> MelonPrefDamageMultiplier { get; set; }

	private static MelonPreferences_Entry<float> MelonPrefRagdollPercentage { get; set; }

	private static MelonPreferences_Entry<bool> MelonPrefRagdollFromFallDamage { get; set; }

	public static bool RagdollFromFallDamage { get; private set; }

	private static MelonPreferences_Entry<bool> MelonPrefRagdollFlingingFix { get; set; }

	public static bool RagdollFlingingFix { get; private set; }

	internal static void MelonPreferencesCreator()
	{
		MelonPrefCategory = MelonPreferences.CreateCategory("Crumble");
		MelonPrefEnabled = MelonPrefCategory.CreateEntry<bool>("IsEnabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		IsEnabled = MelonPrefEnabled.Value;
		MelonPrefDamageThreshold = MelonPrefCategory.CreateEntry<float>("Damage Threshold", 7f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		MelonPrefDamageMultiplier = MelonPrefCategory.CreateEntry<float>("Damage Multiplier", 1.5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		MelonPrefRagdollPercentage = MelonPrefCategory.CreateEntry<float>("Ragdoll Percentage", 25f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		MelonPrefRagdollFromFallDamage = MelonPrefCategory.CreateEntry<bool>("Ragdoll From Fall Damage", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		RagdollFromFallDamage = MelonPrefRagdollFromFallDamage.Value;
		MelonPrefRagdollFlingingFix = MelonPrefCategory.CreateEntry<bool>("Ragdoll Flinging Fix", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
		RagdollFlingingFix = MelonPrefRagdollFlingingFix.Value;
	}

	internal static void BoneMenuCreator()
	{
		//IL_000b: 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_005e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0139: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: Unknown result type (might be due to invalid IL or missing references)
		Page val = Page.Root.CreatePage("<color=#ff2424>C</color><color=#ff2926>r</color><color=#ff2e28>u</color><color=#ff332a>m</color><color=#ff372c>b</color><color=#ff3a2e>l</color><color=#ff3e30>e</color>", Color.white, 0, true);
		val.CreateBool("Mod Toggle", new Color(1f, 0.3686f, 0f), IsEnabled, (Action<bool>)OnSetEnabled);
		val.CreateFloat("Damage Threshold", new Color(0.9882f, 0.1333f, 0.1059f), Main.Threshold, 1f, 0f, 100f, (Action<float>)delegate(float dt)
		{
			Main.Threshold = dt;
			MelonPrefDamageThreshold.Value = dt;
			MelonPrefCategory.SaveToFile(false);
		});
		val.CreateFloat("Damage Multiplier", new Color(0.9882f, 0.1333f, 0.1059f), Main.Markiplier, 0.1f, 0f, 100f, (Action<float>)delegate(float dm)
		{
			Main.Markiplier = dm;
			MelonPrefDamageMultiplier.Value = dm;
			MelonPrefCategory.SaveToFile(false);
		});
		val.CreateFloat("Ragdoll Percentage", Color.yellow, Main.RagdollHealthPercentage, 5f, 0f, 100f, (Action<float>)delegate(float rp)
		{
			Main.RagdollHealthPercentage = rp;
			MelonPrefRagdollPercentage.Value = rp;
			MelonPrefCategory.SaveToFile(false);
		});
		val.CreateBool("Ragdoll From Fall Damage", Color.yellow, RagdollFromFallDamage, (Action<bool>)OnRagdollFromFallDamage);
		val.CreateBool("Ragdoll Flinging Fix", Color.yellow, RagdollFlingingFix, (Action<bool>)OnRagdollFlingingFix);
	}

	private static void OnSetEnabled(bool value)
	{
		IsEnabled = value;
		MelonPrefEnabled.Value = value;
		MelonPrefCategory.SaveToFile(false);
	}

	private static void OnRagdollFromFallDamage(bool value)
	{
		RagdollFromFallDamage = value;
		MelonPrefRagdollFromFallDamage.Value = value;
		MelonPrefCategory.SaveToFile(false);
	}

	private static void OnRagdollFlingingFix(bool value)
	{
		RagdollFlingingFix = value;
		MelonPrefRagdollFlingingFix.Value = value;
		MelonPrefCategory.SaveToFile(false);
	}
}