Decompiled source of HTFSlide v1.3.2

plugins/HTFSlide.dll

Decompiled an hour ago
using System;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using FishNet.Object;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("HTFSlide")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.3.2.0")]
[assembly: AssemblyInformationalVersion("1.3.2")]
[assembly: AssemblyProduct("HTFSlide")]
[assembly: AssemblyTitle("HTFSlide")]
[assembly: AssemblyVersion("1.3.2.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace HTFSlide
{
	[BepInPlugin("com.hatsuneexo.htfslide", "HTF Slide", "1.3.2")]
	[BepInProcess("How to Fish.exe")]
	public class Plugin : BaseUnityPlugin
	{
		public const string Guid = "com.hatsuneexo.htfslide";

		internal static ManualLogSource Log;

		internal static ConfigEntry<Key> SlideKey;

		internal static ConfigEntry<float> Duration;

		internal static ConfigEntry<float> StartSpeed;

		internal static ConfigEntry<float> EndSpeed;

		internal static ConfigEntry<float> Cooldown;

		internal static ConfigEntry<bool> RequireSprint;

		internal static ConfigEntry<float> SteerControl;

		internal static ConfigEntry<float> SlideJumpBoost;

		internal static ConfigEntry<float> RampLaunchBoost;

		internal static ConfigEntry<bool> KeepSpeedInAir;

		internal static ConfigEntry<float> FullSpeedTime;

		internal static ConfigEntry<float> AirGravityMultiplier;

		internal static ConfigEntry<bool> SprintToggle;

		internal static ConfigEntry<Key> SprintKey;

		internal static ConfigEntry<bool> StopSprintWhenIdle;

		internal static bool SprintLatched;

		private static float _slideRequestedAt = -99f;

		private const float SlideRequestWindow = 0.25f;

		private void Awake()
		{
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Expected O, but got Unknown
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Expected O, but got Unknown
			//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: Expected O, but got Unknown
			//IL_0131: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Expected O, but got Unknown
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: Expected O, but got Unknown
			//IL_01ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: Expected O, but got Unknown
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: Expected O, but got Unknown
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_024f: Expected O, but got Unknown
			//IL_0282: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Expected O, but got Unknown
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
			Log = ((BaseUnityPlugin)this).Logger;
			SlideKey = ((BaseUnityPlugin)this).Config.Bind<Key>("Slide", "SlideKey", (Key)55, "Tecla de deslizamiento. Es la misma de agacharse por defecto.");
			RequireSprint = ((BaseUnityPlugin)this).Config.Bind<bool>("Slide", "RequireSprint", true, "Exige estar esprintando para deslizarse. Si lo apagas, te deslizas desde caminar.");
			Duration = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "Duration", 1.5f, new ConfigDescription("Cuánto dura el deslizamiento, en segundos.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.2f, 3f), Array.Empty<object>()));
			StartSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "StartSpeed", 11f, new ConfigDescription("Velocidad al iniciar el deslizamiento.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(3f, 30f), Array.Empty<object>()));
			EndSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "EndSpeed", 4f, new ConfigDescription("Velocidad al terminar, antes de devolverte el control.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 15f), Array.Empty<object>()));
			Cooldown = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "Cooldown", 0.6f, new ConfigDescription("Segundos de espera entre deslizamientos.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 5f), Array.Empty<object>()));
			SteerControl = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "SteerControl", 0.25f, new ConfigDescription("Cuánto puedes girar mientras te deslizas. 0 = en línea recta, 1 = control total.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			SlideJumpBoost = ((BaseUnityPlugin)this).Config.Bind<float>("SlideJump", "SlideJumpBoost", 3.5f, new ConfigDescription("Impulso vertical extra al saltar mientras te deslizas. 0 lo desactiva.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 12f), Array.Empty<object>()));
			RampLaunchBoost = ((BaseUnityPlugin)this).Config.Bind<float>("SlideJump", "RampLaunchBoost", 2f, new ConfigDescription("Impulso vertical extra al despegar de un borde o rampa deslizándote, sin pulsar salto. 0 lo desactiva.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 12f), Array.Empty<object>()));
			KeepSpeedInAir = ((BaseUnityPlugin)this).Config.Bind<bool>("SlideJump", "KeepSpeedInAir", true, "Conserva la velocidad horizontal del deslizamiento durante todo el vuelo, en vez de frenarte en cuanto despegas. Puedes seguir girando: solo impide que pierdas impulso.");
			AirGravityMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("SlideJump", "AirGravityMultiplier", 0.45f, new ConfigDescription("Multiplica la gravedad extra del juego mientras vuelas con impulso. 1 = gravedad original, 0.45 = vuelo más largo y flotado, 0 = solo gravedad normal.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			FullSpeedTime = ((BaseUnityPlugin)this).Config.Bind<float>("Slide", "FullSpeedTime", 0.25f, new ConfigDescription("Segundos a velocidad máxima antes de empezar a frenar. El resto de la duración es la deceleración. 0 = empieza a frenar desde el primer instante.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 2f), Array.Empty<object>()));
			SprintToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "SprintToggle", true, "Correr con interruptor: pulsas una vez y sigues corriendo, en vez de mantener la tecla.");
			SprintKey = ((BaseUnityPlugin)this).Config.Bind<Key>("Sprint", "SprintKey", (Key)51, "Tecla de correr. Cámbiala si reasignaste los controles.");
			StopSprintWhenIdle = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "StopSprintWhenIdle", true, "Deja de correr solo al soltar el movimiento. Si lo apagas, sigues corriendo hasta que vuelvas a pulsar la tecla.");
			Harmony val = new Harmony("com.hatsuneexo.htfslide");
			val.PatchAll(Assembly.GetExecutingAssembly());
			string[] array = (from m in val.GetPatchedMethods()
				select m.Name).Distinct().ToArray();
			Log.LogInfo((object)((array.Length != 0) ? ("Enganchado a " + string.Join(", ", array) + ".") : "AVISO: no encuentro PlayerMovement. El mod no hará nada."));
		}

		internal static bool ConsumeSlideRequest()
		{
			if (Time.time - _slideRequestedAt > 0.25f)
			{
				return false;
			}
			_slideRequestedAt = -99f;
			return true;
		}

		private void Update()
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			Keyboard current = Keyboard.current;
			if (current == null)
			{
				return;
			}
			if (SprintToggle.Value)
			{
				KeyControl val = current[SprintKey.Value];
				if (val != null && ((ButtonControl)val).wasPressedThisFrame)
				{
					SprintLatched = !SprintLatched;
				}
			}
			KeyControl val2 = current[SlideKey.Value];
			if (val2 != null && ((ButtonControl)val2).wasPressedThisFrame)
			{
				_slideRequestedAt = Time.time;
			}
		}

		internal static bool KeyHeld(Key key)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Keyboard current = Keyboard.current;
			if (current == null)
			{
				return false;
			}
			KeyControl val = current[key];
			if (val != null)
			{
				return ((ButtonControl)val).isPressed;
			}
			return false;
		}

		internal static bool KeyPressedThisFrame(Key key)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Keyboard current = Keyboard.current;
			if (current == null)
			{
				return false;
			}
			KeyControl val = current[key];
			if (val != null)
			{
				return ((ButtonControl)val).wasPressedThisFrame;
			}
			return false;
		}
	}
	internal static class Movement
	{
		internal static PropertyInfo Velocity;

		internal static PropertyInfo Grounded;

		internal static PropertyInfo Sprinting;

		internal static FieldInfo CrouchInput;

		internal static FieldInfo SprintInput;

		internal static FieldInfo MoveInputField;

		internal static FieldInfo Rig;

		internal static FieldInfo CurMoveSpeed;

		internal static FieldInfo TargetMoveSpeed;

		internal static FieldInfo ExtraGravity;

		internal static Type Type;

		internal static bool Resolve()
		{
			if (Type != null)
			{
				if (Velocity != null)
				{
					return Grounded != null;
				}
				return false;
			}
			Type = AccessTools.TypeByName("PlayerMovement");
			if (Type == null)
			{
				return false;
			}
			Velocity = AccessTools.Property(Type, "Velocity");
			Grounded = AccessTools.Property(Type, "Grounded");
			Sprinting = AccessTools.Property(Type, "Sprinting");
			CrouchInput = AccessTools.Field(Type, "_crouchInput");
			SprintInput = AccessTools.Field(Type, "_sprintInput");
			MoveInputField = AccessTools.Field(Type, "_moveInput");
			Rig = AccessTools.Field(Type, "_rig");
			CurMoveSpeed = AccessTools.Field(Type, "_curMoveSpeed");
			TargetMoveSpeed = AccessTools.Field(Type, "_targetMoveSpeed");
			ExtraGravity = AccessTools.Field(Type, "_extraGravityForce");
			if (Velocity != null && Grounded != null)
			{
				return Velocity.CanWrite;
			}
			return false;
		}

		internal static bool IsLocal(object instance)
		{
			NetworkBehaviour val = (NetworkBehaviour)((instance is NetworkBehaviour) ? instance : null);
			if (val != null)
			{
				return val.IsOwner;
			}
			return true;
		}

		private static Rigidbody GetRig(object m)
		{
			object? obj = Rig?.GetValue(m);
			return (Rigidbody)((obj is Rigidbody) ? obj : null);
		}

		internal static Vector3 GetVelocity(object m)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			Rigidbody rig = GetRig(m);
			if ((Object)(object)rig != (Object)null)
			{
				return rig.linearVelocity;
			}
			return (Vector3)Velocity.GetValue(m);
		}

		internal static void SetVelocity(object m, Vector3 v)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			Rigidbody rig = GetRig(m);
			if ((Object)(object)rig != (Object)null)
			{
				rig.linearVelocity = v;
				if (Velocity != null && Velocity.CanWrite)
				{
					Velocity.SetValue(m, v);
				}
			}
			else
			{
				Velocity.SetValue(m, v);
			}
		}

		internal static bool IsGrounded(object m)
		{
			return (bool)Grounded.GetValue(m);
		}

		internal static void SetMoveSpeed(object m, float speed)
		{
			CurMoveSpeed?.SetValue(m, speed);
		}
	}
	[HarmonyPatch]
	internal static class SprintTogglePatch
	{
		private static MethodBase TargetMethod()
		{
			Type type = AccessTools.TypeByName("PlayerMovement");
			if (!(type == null))
			{
				return AccessTools.Method(type, "FixedUpdate", (Type[])null, (Type[])null);
			}
			return null;
		}

		private static bool Prepare()
		{
			if (!Movement.Resolve() || TargetMethod() == null)
			{
				return false;
			}
			if (Movement.SprintInput == null)
			{
				Plugin.Log.LogWarning((object)"No encuentro _sprintInput: el interruptor de correr queda desactivado.");
				return false;
			}
			return true;
		}

		private static void Prefix(object __instance)
		{
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			if (!Plugin.SprintToggle.Value || __instance == null || !Movement.IsLocal(__instance) || SlidePatch.IsSliding || !Plugin.SprintLatched)
			{
				return;
			}
			try
			{
				if (Plugin.StopSprintWhenIdle.Value && Movement.MoveInputField != null)
				{
					Vector2 val = (Vector2)Movement.MoveInputField.GetValue(__instance);
					if (((Vector2)(ref val)).sqrMagnitude < 0.01f)
					{
						Plugin.SprintLatched = false;
						return;
					}
				}
				Movement.SprintInput.SetValue(__instance, true);
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)("Interruptor de correr desactivado: " + ex.Message));
				Plugin.SprintToggle.Value = false;
			}
		}
	}
	[HarmonyPatch]
	internal static class SlidePatch
	{
		private static bool _sliding;

		private static float _elapsed;

		private static float _lastEnd = -99f;

		private static Vector3 _direction;

		private static float _currentSpeed;

		private static bool _airborne;

		private static float _airSpeed;

		private static Vector3 _airDirection;

		private static float _airStarted;

		private static float _originalGravity;

		private static bool _gravityChanged;

		private const float MaxAirMomentum = 4f;

		internal static bool IsSliding => _sliding;

		internal static Vector3 Direction => _direction;

		internal static float CurrentSpeed => _currentSpeed;

		private static MethodBase TargetMethod()
		{
			Type type = AccessTools.TypeByName("PlayerMovement");
			if (!(type == null))
			{
				return AccessTools.Method(type, "FixedUpdate", (Type[])null, (Type[])null);
			}
			return null;
		}

		private static bool Prepare()
		{
			if (!Movement.Resolve())
			{
				Plugin.Log.LogWarning((object)"PlayerMovement cambió: Velocity o Grounded no están donde esperaba.");
				return false;
			}
			return TargetMethod() != null;
		}

		internal static void EndSlide(object movement)
		{
			_sliding = false;
			_lastEnd = Time.time;
			if (movement != null)
			{
				Movement.SetMoveSpeed(movement, _currentSpeed);
			}
		}

		private static void Postfix(object __instance)
		{
			if (__instance == null || !Movement.IsLocal(__instance))
			{
				return;
			}
			try
			{
				Tick(__instance);
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)("Deslizamiento desactivado: " + ex.Message));
				_sliding = false;
			}
		}

		internal static void BeginAirMomentum(object movement, float speed, Vector3 direction)
		{
			//IL_0030: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			if (Plugin.KeepSpeedInAir.Value)
			{
				_airborne = true;
				_airSpeed = speed;
				_airDirection = ((((Vector3)(ref direction)).sqrMagnitude > 0.01f) ? ((Vector3)(ref direction)).normalized : Vector3.forward);
				_airStarted = Time.time;
				float value = Plugin.AirGravityMultiplier.Value;
				if (!(Movement.ExtraGravity == null) && !_gravityChanged && !(value >= 0.999f))
				{
					_originalGravity = (float)Movement.ExtraGravity.GetValue(movement);
					Movement.ExtraGravity.SetValue(movement, _originalGravity * value);
					_gravityChanged = true;
				}
			}
		}

		private static void EndAirMomentum(object movement)
		{
			_airborne = false;
			if (_gravityChanged && !(Movement.ExtraGravity == null))
			{
				Movement.ExtraGravity.SetValue(movement, _originalGravity);
				_gravityChanged = false;
			}
		}

		private static void Tick(object movement)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_0106: 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_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_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_020d: 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_021c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_022c: Unknown result type (might be due to invalid IL or missing references)
			bool flag = Movement.IsGrounded(movement);
			Vector3 velocity = Movement.GetVelocity(movement);
			Vector3 horizontal = default(Vector3);
			((Vector3)(ref horizontal))..ctor(velocity.x, 0f, velocity.z);
			if (_airborne)
			{
				if (flag || Time.time - _airStarted > 4f)
				{
					EndAirMomentum(movement);
				}
				else
				{
					Vector3 val = ((((Vector3)(ref horizontal)).sqrMagnitude > 0.01f) ? ((Vector3)(ref horizontal)).normalized : _airDirection);
					if (((Vector3)(ref horizontal)).magnitude < _airSpeed)
					{
						Movement.SetVelocity(movement, val * _airSpeed + Vector3.up * velocity.y);
					}
					Movement.SetMoveSpeed(movement, _airSpeed);
				}
			}
			if (!_sliding)
			{
				if (ShouldStart(movement, flag, horizontal))
				{
					_sliding = true;
					_elapsed = 0f;
					_direction = ((Vector3)(ref horizontal)).normalized;
					_currentSpeed = Plugin.StartSpeed.Value;
				}
				return;
			}
			if (!flag)
			{
				Launch(movement, velocity);
				return;
			}
			_elapsed += Time.fixedDeltaTime;
			if (!Plugin.KeyHeld(Plugin.SlideKey.Value) || _elapsed >= Plugin.Duration.Value)
			{
				EndSlide(movement);
				return;
			}
			float value = Plugin.SteerControl.Value;
			if (value > 0f && ((Vector3)(ref horizontal)).sqrMagnitude > 0.01f)
			{
				Vector3 val2 = Vector3.Slerp(_direction, ((Vector3)(ref horizontal)).normalized, value);
				_direction = ((Vector3)(ref val2)).normalized;
			}
			float num = Mathf.Clamp01(_elapsed / Plugin.Duration.Value);
			float num2 = Mathf.Clamp01(Plugin.FullSpeedTime.Value / Mathf.Max(0.01f, Plugin.Duration.Value));
			num2 = Mathf.Min(num2, 0.9f);
			float num3 = ((num <= num2) ? 0f : Mathf.InverseLerp(num2, 1f, num));
			float num4 = 1f - (1f - num3) * (1f - num3);
			_currentSpeed = Mathf.Lerp(Plugin.StartSpeed.Value, Plugin.EndSpeed.Value, num4);
			Movement.SetVelocity(movement, _direction * _currentSpeed + Vector3.up * velocity.y);
			Movement.SetMoveSpeed(movement, _currentSpeed);
			Movement.CrouchInput?.SetValue(movement, true);
		}

		private static void Launch(object movement, Vector3 velocity)
		{
			//IL_002f: 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_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: 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_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			float value = Plugin.RampLaunchBoost.Value;
			Vector3 val = (Vector3)(Plugin.KeepSpeedInAir.Value ? (_direction * _currentSpeed) : new Vector3(velocity.x, 0f, velocity.z));
			float num = velocity.y;
			if (value > 0f && num > -1f)
			{
				num += value;
			}
			Movement.SetVelocity(movement, val + Vector3.up * num);
			BeginAirMomentum(movement, _currentSpeed, _direction);
			EndSlide(movement);
		}

		private static bool ShouldStart(object movement, bool grounded, Vector3 horizontal)
		{
			if (!grounded)
			{
				return false;
			}
			if (Time.time - _lastEnd < Plugin.Cooldown.Value)
			{
				return false;
			}
			if (((Vector3)(ref horizontal)).sqrMagnitude < 0.5f)
			{
				return false;
			}
			if (Plugin.RequireSprint.Value && Movement.Sprinting != null && !(bool)Movement.Sprinting.GetValue(movement))
			{
				return false;
			}
			return Plugin.ConsumeSlideRequest();
		}
	}
	[HarmonyPatch]
	internal static class SlideJumpPatch
	{
		private static MethodBase TargetMethod()
		{
			Type type = AccessTools.TypeByName("PlayerMovement");
			if (!(type == null))
			{
				return AccessTools.Method(type, "Jump", (Type[])null, (Type[])null);
			}
			return null;
		}

		private static bool Prepare()
		{
			if (Movement.Resolve())
			{
				return TargetMethod() != null;
			}
			return false;
		}

		private static void Postfix(object __instance)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: 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_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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_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_007d: Unknown result type (might be due to invalid IL or missing references)
			if (!SlidePatch.IsSliding || __instance == null || !Movement.IsLocal(__instance))
			{
				return;
			}
			try
			{
				Vector3 velocity = Movement.GetVelocity(__instance);
				Vector3 val = (Vector3)(Plugin.KeepSpeedInAir.Value ? (SlidePatch.Direction * SlidePatch.CurrentSpeed) : new Vector3(velocity.x, 0f, velocity.z));
				Movement.SetVelocity(__instance, val + Vector3.up * (velocity.y + Plugin.SlideJumpBoost.Value));
				SlidePatch.BeginAirMomentum(__instance, SlidePatch.CurrentSpeed, SlidePatch.Direction);
				SlidePatch.EndSlide(__instance);
			}
			catch (Exception ex)
			{
				Plugin.Log.LogError((object)("Salto con impulso desactivado: " + ex.Message));
			}
		}
	}
}