using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BoneLib;
using BoneLib.BoneMenu;
using BoneLib.BoneMenu.Elements;
using Fling;
using MelonLoader;
using MelonLoader.Preferences;
using SLZ.VRMK;
using SLZ.Vehicle;
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(Main), "Fling", "1.1.0", "Bailout", null)]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: AssemblyTitle("Fling")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Fling")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("dcbb8334-dc6f-4833-8cd6-ad1cedf2ff30")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Fling;
public static class BuildInfo
{
public const string Name = "Fling";
public const string Author = "Bailout";
public const string Version = "1.1.0";
}
public class Main : MelonMod
{
private bool SceneLoaded = false;
private bool RagdollState = false;
private Vector3 PreviousVelocity;
private Vector3 CurrentVelocity;
private Vector3 VehicleVelocity;
private float StartTime;
private float EndTime;
public static float DynRagTime;
public static float SpeedThreshold = 3f;
public static float MassMultiplier = 1f;
public static float RagdollTime = 5f;
public static float ImmunityTime = 2f;
public static float DamageMultiplier = 5f;
public static float DamageThreshold = 20f;
public static float ForceMultiplier = 1f;
public override void OnInitializeMelon()
{
Hooking.OnLevelInitialized += delegate
{
OnSceneAwake();
};
Preferences.BonemenuCreator();
}
public void OnSceneAwake()
{
SceneLoaded = true;
}
public override void OnUpdate()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: 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_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
//IL_0345: Unknown result type (might be due to invalid IL or missing references)
//IL_034a: Unknown result type (might be due to invalid IL or missing references)
//IL_019c: 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_0322: Unknown result type (might be due to invalid IL or missing references)
//IL_032c: Unknown result type (might be due to invalid IL or missing references)
//IL_0336: Unknown result type (might be due to invalid IL or missing references)
if (!Preferences.IsEnabled || !SceneLoaded)
{
return;
}
CurrentVelocity = Player.physicsRig.wholeBodyVelocity;
if (Time.time - StartTime >= (Preferences.SpeedEffectsRagdoll ? DynRagTime : RagdollTime) && RagdollState && Preferences.IsRagdollEnabled)
{
RagdollState = false;
Player.physicsRig.UnRagdollRig();
EndTime = Time.time;
}
RaycastHit val = default(RaycastHit);
if (Preferences.AirborneOnly && Physics.Raycast(((Component)Player.physicsRig.feet.GetComponent<PhysGrounder>()).transform.position, new Vector3(0f, -1f, 0f), ref val, Player.rigManager.avatar._height / 3f))
{
PreviousVelocity = CurrentVelocity;
return;
}
if ((double)Mathf.Abs(((Vector3)(ref CurrentVelocity)).magnitude - ((Vector3)(ref PreviousVelocity)).magnitude) >= (double)SpeedThreshold * (Preferences.AvatarMass ? ((double)(MassMultiplier * Player.rigManager.avatar._massTotal) / 81.48) : 1.0) && Time.time - EndTime >= ImmunityTime)
{
if (Preferences.IsRagdollEnabled)
{
if (Preferences.IsVehicleEnabled && Object.op_Implicit((Object)(object)Player.rigManager.activeSeat))
{
VehicleVelocity = PreviousVelocity;
Player.rigManager.activeSeat.seatState = (SeatState)2;
}
if (Preferences.SpeedEffectsRagdoll)
{
DynRagTime = Mathf.Clamp(4f * (Mathf.Abs(((Vector3)(ref CurrentVelocity)).magnitude - ((Vector3)(ref PreviousVelocity)).magnitude) - SpeedThreshold * (Preferences.AvatarMass ? (MassMultiplier * Player.rigManager.avatar._massTotal / 82f) : 1f)), 0f, 2f * RagdollTime);
}
Ragdoll();
StartTime = Time.time;
}
if (Preferences.IsDamageEnabled && Mathf.Abs((((Vector3)(ref CurrentVelocity)).magnitude - ((Vector3)(ref PreviousVelocity)).magnitude) * DamageMultiplier) > DamageThreshold)
{
Player.rigManager.health.TAKEDAMAGE(Mathf.Abs((((Vector3)(ref CurrentVelocity)).magnitude - ((Vector3)(ref PreviousVelocity)).magnitude) * DamageMultiplier) - DamageThreshold);
}
}
if ((double)(Time.time - StartTime) >= 0.5 && Time.time - StartTime <= 1f && !Player.physicsRig._legsKinematic && Preferences.IsVehicleEnabled)
{
Ragdoll();
if (Preferences.CarryVehicleForces)
{
Player.physicsRig.torso.rbChest.velocity = VehicleVelocity * ForceMultiplier / 3f;
}
}
PreviousVelocity = CurrentVelocity;
}
public void Ragdoll()
{
RagdollState = true;
Player.physicsRig.RagdollRig();
if (Preferences.KeepArmControl)
{
Player.physicsRig.leftHand.physHand.forceMultiplier = 1f;
Player.physicsRig.rightHand.physHand.forceMultiplier = 1f;
}
}
}
public class Preferences : MelonMod
{
public static MelonPreferences_Category MelonPrefCategory { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefEnabled { get; private set; }
public static bool IsEnabled { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefAirborneOnly { get; private set; }
public static bool AirborneOnly { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefSpeedThreshold { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefAvatarMass { get; private set; }
public static bool AvatarMass { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefMassMultiplier { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefRagdollEnabled { get; private set; }
public static bool IsRagdollEnabled { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefSpeedEffects { get; private set; }
public static bool SpeedEffectsRagdoll { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefRagdollTime { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefImmunityTime { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefArmControl { get; private set; }
public static bool KeepArmControl { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefDamageEnabled { get; private set; }
public static bool IsDamageEnabled { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefDamageThreshold { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefDamageMutiplier { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefVehicleEnabled { get; private set; }
public static bool IsVehicleEnabled { get; private set; }
public static MelonPreferences_Entry<bool> MelonPrefVehicleForces { get; private set; }
public static bool CarryVehicleForces { get; private set; }
public static MelonPreferences_Entry<float> MelonPrefForceMutiplier { get; private set; }
public static void BonemenuCreator()
{
MelonPrefCategory = MelonPreferences.CreateCategory("Fling");
MelonPrefEnabled = MelonPrefCategory.CreateEntry<bool>("Mod Enabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
IsEnabled = MelonPrefEnabled.Value;
MelonPrefAirborneOnly = MelonPrefCategory.CreateEntry<bool>("Airborne Only", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
AirborneOnly = MelonPrefAirborneOnly.Value;
MelonPrefSpeedThreshold = MelonPrefCategory.CreateEntry<float>("Speed Threshold", 3f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefAvatarMass = MelonPrefCategory.CreateEntry<bool>("Avatar Mass Effects Fling", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
AvatarMass = MelonPrefAvatarMass.Value;
MelonPrefMassMultiplier = MelonPrefCategory.CreateEntry<float>("Avatar Mass Multiplyer", 1f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefRagdollEnabled = MelonPrefCategory.CreateEntry<bool>("Ragdoll Enabled", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
IsRagdollEnabled = MelonPrefRagdollEnabled.Value;
MelonPrefSpeedEffects = MelonPrefCategory.CreateEntry<bool>("Dynamic Ragdoll Time", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
SpeedEffectsRagdoll = MelonPrefSpeedEffects.Value;
MelonPrefRagdollTime = MelonPrefCategory.CreateEntry<float>("Ragdoll Time", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefImmunityTime = MelonPrefCategory.CreateEntry<float>("Immunity Time", 2f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefArmControl = MelonPrefCategory.CreateEntry<bool>("Keep Arm Control", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
KeepArmControl = MelonPrefArmControl.Value;
MelonPrefDamageEnabled = MelonPrefCategory.CreateEntry<bool>("Damage Enabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
IsDamageEnabled = MelonPrefDamageEnabled.Value;
MelonPrefDamageThreshold = MelonPrefCategory.CreateEntry<float>("Damage Threshold", 20f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefDamageMutiplier = MelonPrefCategory.CreateEntry<float>("Damage Multiplier", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MelonPrefVehicleEnabled = MelonPrefCategory.CreateEntry<bool>("Vehicle Enabled", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
IsVehicleEnabled = MelonPrefVehicleEnabled.Value;
MelonPrefVehicleForces = MelonPrefCategory.CreateEntry<bool>("Carry Vehicle Forces", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
CarryVehicleForces = MelonPrefVehicleForces.Value;
MelonPrefForceMutiplier = MelonPrefCategory.CreateEntry<float>("Vehicle Force Multiplier", 1f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
MenuCategory val = MenuManager.CreateCategory("Fling", "#6279b8");
val.CreateBoolElement("Mod Toggle", "#6279b8", IsEnabled, (Action<bool>)OnSetEnabled);
SubPanelElement val2 = val.CreateSubPanel("Trigger", "#8ea4d2");
val2.CreateBoolElement("Airborne Only", "#49516f", AirborneOnly, (Action<bool>)OnSetAirborneOnly);
val2.CreateFloatElement("Speed Threshold", "#49516f", Main.SpeedThreshold, 1f, 1f, 100f, (Action<float>)delegate(float st)
{
Main.SpeedThreshold = st;
MelonPrefSpeedThreshold.Value = st;
MelonPrefCategory.SaveToFile(true);
});
val2.CreateBoolElement("Mass Effects Fling", "#49516f", AvatarMass, (Action<bool>)OnSetAvatarMass);
val2.CreateFloatElement("Mass Multiplier", "#49516f", Main.SpeedThreshold, 1f, 1f, 100f, (Action<float>)delegate(float mm)
{
Main.MassMultiplier = mm;
MelonPrefMassMultiplier.Value = mm;
MelonPrefCategory.SaveToFile(true);
});
SubPanelElement val3 = val.CreateSubPanel("Ragdoll", "#8ea4d2");
val3.CreateBoolElement("Ragdoll Toggle", "#49516f", IsRagdollEnabled, (Action<bool>)OnSetRagdollEnabled);
val3.CreateBoolElement("Dynamic Ragdoll Time", "#49516f", SpeedEffectsRagdoll, (Action<bool>)OnSetSpeedEffects);
val3.CreateFloatElement("Manual Ragdoll Time", "#49516f", Main.RagdollTime, 1f, 1f, 100f, (Action<float>)delegate(float rt)
{
Main.RagdollTime = rt;
MelonPrefRagdollTime.Value = rt;
MelonPrefCategory.SaveToFile(true);
});
val3.CreateFloatElement("Immunity Time", "#49516f", Main.ImmunityTime, 1f, 1f, 100f, (Action<float>)delegate(float it)
{
Main.ImmunityTime = it;
MelonPrefImmunityTime.Value = it;
MelonPrefCategory.SaveToFile(true);
});
val3.CreateBoolElement("Keep Arm Control", "#49516f", KeepArmControl, (Action<bool>)OnSetArmControl);
SubPanelElement val4 = val.CreateSubPanel("Damage", "#8ea4d2");
val4.CreateBoolElement("Damage Toggle", "#49516f", IsDamageEnabled, (Action<bool>)OnSetDamageEnabled);
val4.CreateFloatElement("Damage Multiplier", "#49516f", Main.DamageMultiplier, 1f, 1f, 100f, (Action<float>)delegate(float dm)
{
Main.DamageMultiplier = dm;
MelonPrefDamageMutiplier.Value = dm;
MelonPrefCategory.SaveToFile(true);
});
val4.CreateFloatElement("Damage Threshold", "#49516f", Main.DamageThreshold, 1f, 1f, 100f, (Action<float>)delegate(float dt)
{
Main.DamageThreshold = dt;
MelonPrefDamageThreshold.Value = dt;
MelonPrefCategory.SaveToFile(true);
});
SubPanelElement val5 = val.CreateSubPanel("Vehicle", "#8ea4d2");
val5.CreateBoolElement("Vehicle Toggle", "#49516f", IsVehicleEnabled, (Action<bool>)OnSetVehicleEnabled);
val5.CreateBoolElement("Carry Forces", "#49516f", CarryVehicleForces, (Action<bool>)OnSetVehicleForces);
val5.CreateFloatElement("Force Multiplier", "#49516f", Main.ForceMultiplier, 1f, 1f, 100f, (Action<float>)delegate(float fm)
{
Main.ForceMultiplier = fm;
MelonPrefForceMutiplier.Value = fm;
MelonPrefCategory.SaveToFile(true);
});
}
public static void OnSetEnabled(bool value)
{
IsEnabled = value;
MelonPrefEnabled.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetAirborneOnly(bool value)
{
AirborneOnly = value;
MelonPrefAirborneOnly.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetAvatarMass(bool value)
{
AvatarMass = value;
MelonPrefAvatarMass.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetRagdollEnabled(bool value)
{
IsRagdollEnabled = value;
MelonPrefRagdollEnabled.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetSpeedEffects(bool value)
{
SpeedEffectsRagdoll = value;
MelonPrefSpeedEffects.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetArmControl(bool value)
{
KeepArmControl = value;
MelonPrefArmControl.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetDamageEnabled(bool value)
{
IsDamageEnabled = value;
MelonPrefDamageEnabled.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetVehicleEnabled(bool value)
{
IsVehicleEnabled = value;
MelonPrefVehicleEnabled.Value = value;
MelonPrefCategory.SaveToFile(true);
}
public static void OnSetVehicleForces(bool value)
{
CarryVehicleForces = value;
MelonPrefVehicleForces.Value = value;
MelonPrefCategory.SaveToFile(true);
}
}