Decompiled source of RTAutoSprintEx v2.2.3

RTAutoSprintEx.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using EntityStates;
using IL.RoR2.CameraModes;
using IL.RoR2.UI;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using Rewired;
using RoR2;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("RTAutoSprintEx")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("RTAutoSprintEx")]
[assembly: AssemblyTitle("RTAutoSprintEx")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace RTAutoSprintEx;

[BepInPlugin("com.johnedwa.RTAutoSprintEx", "RTAutoSprintEx", "2.2.3")]
public class RTAutoSprintEx : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<Instruction, bool> <>9__10_4;

		public static Manipulator <>9__10_2;

		public static Func<Instruction, bool> <>9__10_5;

		internal void <Awake>b__10_2(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			ILCursor val = new ILCursor(il);
			val.Index = 0;
			val.GotoNext(new Func<Instruction, bool>[1]
			{
				(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 1.3f)
			});
			val.Next.Operand = (float)SprintFOVMultiplier.Value;
		}

		internal bool <Awake>b__10_4(Instruction x)
		{
			return ILPatternMatchingExt.MatchLdcR4(x, 1.3f);
		}

		internal bool <Awake>b__10_5(Instruction x)
		{
			return ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "get_isSprinting");
		}
	}

	private static bool RT_enabled = true;

	private static bool RT_visuals = true;

	internal HashSet<string> stateSprintDisableList = new HashSet<string>();

	internal HashSet<string> stateAnimationDelayList = new HashSet<string>();

	public static ConfigFile conf;

	public static ConfigEntry<bool> SprintInAnyDirection { get; set; }

	public static ConfigEntry<bool> HoldSprintToWalk { get; set; }

	public static ConfigEntry<bool> HoldToSprint { get; set; }

	public static ConfigEntry<bool> DisableSprintingCrosshair { get; set; }

	public static ConfigEntry<bool> DisableFOVChange { get; set; }

	public static ConfigEntry<bool> DisableSpeedlines { get; set; }

	public static ConfigEntry<int> CustomFOV { get; set; }

	public static ConfigEntry<double> SprintFOVMultiplier { get; set; }

	public static ConfigEntry<bool> DisableAutoSprinting { get; set; }

	public static ConfigEntry<bool> DisableVisualChanges { get; set; }

	public static ConfigEntry<string> EntityStatesSprintingDisabled { get; set; }

	public static ConfigEntry<string> EntityStatesSprintingDelay { get; set; }

	public void RT_SprintDisableMessage(string state)
	{
		stateSprintDisableList.Add(state);
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Received RT_SprintDisableMessage for " + state));
	}

	public void RT_AnimationDelayMessage(string state)
	{
		stateAnimationDelayList.Add(state);
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Received RT_AnimationDelayMessage for " + state));
	}

	private bool RT_RegisterAnimationDelay(string state)
	{
		return stateAnimationDelayList.Add(state);
	}

	private bool RT_RegisterSprintDisable(string state)
	{
		return stateSprintDisableList.Add(state);
	}

	private double SprintDelayTime(CharacterBody targetBody)
	{
		float num = 0f;
		EntityStateMachine[] components = ((Component)targetBody).GetComponents<EntityStateMachine>();
		EntityStateMachine[] array = components;
		foreach (EntityStateMachine val in array)
		{
			EntityState state = val.state;
			if (state == null)
			{
				return num;
			}
			if (stateAnimationDelayList.Contains(((object)state).ToString()))
			{
				try
				{
					num = state.GetInstanceField<float>("duration");
				}
				catch
				{
				}
				return num;
			}
		}
		return num;
	}

	private bool ShouldSprintBeDisabledOnThisBody(CharacterBody targetBody)
	{
		EntityStateMachine[] components = ((Component)targetBody).GetComponents<EntityStateMachine>();
		bool result = false;
		EntityStateMachine[] array = components;
		foreach (EntityStateMachine val in array)
		{
			EntityState state = val.state;
			if (state == null)
			{
				return false;
			}
			if (stateSprintDisableList.Contains(((object)state).ToString()))
			{
				result = true;
			}
		}
		return result;
	}

	public void Awake()
	{
		//IL_0221: Unknown result type (might be due to invalid IL or missing references)
		//IL_022b: Expected O, but got Unknown
		//IL_020e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0218: Expected O, but got Unknown
		//IL_0258: Unknown result type (might be due to invalid IL or missing references)
		//IL_0262: Expected O, but got Unknown
		//IL_0240: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_024b: Expected O, but got Unknown
		double RT_timer = 0.0;
		double RT_animationCancelDelay = 0.15;
		bool RT_isSprinting = false;
		bool RT_animationCancel = false;
		SetupConfiguration();
		RT_RegisterSprintDisable("EntityStates.Toolbot.ToolbotDualWield");
		RT_RegisterSprintDisable("EntityStates.Toolbot.ToolbotDualWieldBase");
		RT_RegisterSprintDisable("EntityStates.Toolbot.ToolbotDualWieldStart");
		RT_RegisterSprintDisable("EntityStates.Toolbot.FireNailgun");
		RT_RegisterSprintDisable("EntityStates.Toolbot.AimStunDrone");
		RT_RegisterAnimationDelay("EntityStates.Toolbot.FireGrenadeLauncher");
		RT_RegisterSprintDisable("EntityStates.Mage.Weapon.Flamethrower");
		RT_RegisterSprintDisable("EntityStates.Mage.Weapon.PrepWall");
		RT_RegisterAnimationDelay("EntityStates.Mage.Weapon.FireFireBolt");
		RT_RegisterAnimationDelay("EntityStates.Mage.Weapon.FireLaserbolt");
		RT_RegisterSprintDisable("EntityStates.Bandit2.Weapon.BasePrepSidearmRevolverState");
		RT_RegisterSprintDisable("EntityStates.Bandit2.Weapon.PrepSidearmResetRevolver");
		RT_RegisterSprintDisable("EntityStates.Bandit2.Weapon.PrepSidearmSkullRevolver");
		RT_RegisterAnimationDelay("EntityStates.Bandit2.Weapon.Bandit2FirePrimaryBase");
		RT_RegisterAnimationDelay("EntityStates.Bandit2.Weapon.FireShotgun2");
		RT_RegisterAnimationDelay("EntityStates.Bandit2.Weapon.Bandit2FireRifle");
		RT_RegisterSprintDisable("EntityStates.Engi.EngiMissilePainter.Paint");
		RT_RegisterAnimationDelay("EntityStates.Engi.EngiWeapon.FireMines");
		RT_RegisterAnimationDelay("EntityStates.Engi.EngiWeapon.FireSeekerGrenades");
		RT_RegisterSprintDisable("EntityStates.Treebot.Weapon.AimMortar");
		RT_RegisterSprintDisable("EntityStates.Treebot.Weapon.AimMortar2");
		RT_RegisterSprintDisable("EntityStates.Treebot.Weapon.AimMortarRain");
		RT_RegisterAnimationDelay("EntityStates.Treebot.Weapon.FireSyringe");
		RT_RegisterSprintDisable("EntityStates.Captain.Weapon.SetupAirstrike");
		RT_RegisterSprintDisable("EntityStates.Captain.Weapon.SetupAirstrikeAlt");
		RT_RegisterSprintDisable("EntityStates.Captain.Weapon.SetupSupplyDrop");
		RT_RegisterAnimationDelay("EntityStates.Croco.Slash");
		RT_RegisterAnimationDelay("EntityStates.Commando.CommandoWeapon.FirePistol2");
		RT_RegisterAnimationDelay("EntityStates.Loader.SwingComboFist");
		RT_RegisterAnimationDelay("EntityStates.VoidSurvivor.Weapon.FireHandBeam");
		RT_RegisterAnimationDelay("EntityStates.VoidSurvivor.Weapon.ChargeCorruptHandBeam");
		RT_RegisterSprintDisable("EntityStates.VoidSurvivor.Weapon.FireCorruptHandBeam");
		RT_RegisterAnimationDelay("EntityStates.Railgunner.Weapon.FirePistol");
		RT_RegisterSprintDisable("EntityStates.Railgunner.Scope.WindUpScopeLight");
		RT_RegisterSprintDisable("EntityStates.Railgunner.Scope.ActiveScopeLight");
		RT_RegisterSprintDisable("EntityStates.Railgunner.Scope.WindUpScopeHeavy");
		RT_RegisterSprintDisable("EntityStates.Railgunner.Scope.ActiveScopeHeavy");
		if (RT_enabled)
		{
			PlayerCharacterMasterController.FixedUpdate += (hook_FixedUpdate)delegate(orig_FixedUpdate orig, PlayerCharacterMasterController self)
			{
				//IL_027b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0280: Unknown result type (might be due to invalid IL or missing references)
				//IL_0297: Unknown result type (might be due to invalid IL or missing references)
				//IL_029c: 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_02ba: Unknown result type (might be due to invalid IL or missing references)
				//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
				orig.Invoke(self);
				InputBankTest bodyInputs = self.bodyInputs;
				if (Object.op_Implicit((Object)(object)bodyInputs) && Object.op_Implicit((Object)(object)self.networkUser) && self.networkUser.localUser != null && !self.networkUser.localUser.isUIFocused)
				{
					CharacterBody body = self.body;
					if (Object.op_Implicit((Object)(object)body))
					{
						bool flag = ShouldSprintBeDisabledOnThisBody(body);
						Player inputPlayer = self.networkUser.localUser.inputPlayer;
						RT_isSprinting = body.isSprinting;
						if (!RT_isSprinting)
						{
							RT_timer += Time.deltaTime;
							if (RT_timer >= 0.05)
							{
								if (!RT_animationCancel)
								{
									RT_timer = 0.0 - SprintDelayTime(body);
								}
								if (RT_timer >= 0.0)
								{
									RT_isSprinting = !flag;
									RT_animationCancel = false;
									RT_timer = 0.0;
								}
							}
						}
						else
						{
							RT_timer = 0.0;
						}
						bool value = HoldSprintToWalk.Value;
						bool value2 = HoldToSprint.Value;
						bool button = (button = inputPlayer.GetButton("Sprint"));
						if (button)
						{
							if (RT_isSprinting && value)
							{
								RT_isSprinting = false;
							}
							if (!RT_isSprinting && flag)
							{
								RT_isSprinting = true;
							}
							RT_timer = 0.0;
						}
						if (!value && value2 && !flag)
						{
							RT_isSprinting = button;
						}
						if (!RT_animationCancel && RT_timer < 0.0 - RT_animationCancelDelay && !inputPlayer.GetButton("PrimarySkill") && !inputPlayer.GetButton("SecondarySkill") && !inputPlayer.GetButton("SpecialSkill") && !inputPlayer.GetButton("UtilitySkill"))
						{
							RT_timer = 0.0 - RT_animationCancelDelay;
							RT_animationCancel = true;
						}
						if (RT_isSprinting && !SprintInAnyDirection.Value)
						{
							Vector3 aimDirection = bodyInputs.aimDirection;
							aimDirection.y = 0f;
							((Vector3)(ref aimDirection)).Normalize();
							Vector3 moveVector = bodyInputs.moveVector;
							moveVector.y = 0f;
							((Vector3)(ref moveVector)).Normalize();
							if ((body.bodyFlags & 0x20) == 0 && Vector3.Dot(aimDirection, moveVector) < PlayerCharacterMasterController.sprintMinAimMoveDot)
							{
								RT_isSprinting = false;
							}
						}
						((ButtonState)(ref bodyInputs.sprint)).PushState(RT_isSprinting);
					}
				}
			};
		}
		CameraRigController.LateUpdate += (hook_LateUpdate)delegate(orig_LateUpdate orig, CameraRigController self)
		{
			orig.Invoke(self);
			if (RT_visuals)
			{
				if (CustomFOV.Value >= 1 && CustomFOV.Value <= 180)
				{
					self.baseFov = CustomFOV.Value;
				}
				else
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)"CustomFOV value out of range!");
				}
				if (DisableSpeedlines.Value && Object.op_Implicit((Object)(object)self.sprintingParticleSystem))
				{
					((Component)self.sprintingParticleSystem).gameObject.SetActive(false);
				}
			}
		};
		object obj = <>c.<>9__10_2;
		if (obj == null)
		{
			Manipulator val = delegate(ILContext il)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0008: Expected O, but got Unknown
				ILCursor val3 = new ILCursor(il);
				val3.Index = 0;
				val3.GotoNext(new Func<Instruction, bool>[1]
				{
					(Instruction x) => ILPatternMatchingExt.MatchLdcR4(x, 1.3f)
				});
				val3.Next.Operand = (float)SprintFOVMultiplier.Value;
			};
			<>c.<>9__10_2 = val;
			obj = (object)val;
		}
		CameraModePlayerBasic.UpdateInternal += (Manipulator)obj;
		CrosshairManager.UpdateCrosshair += (Manipulator)delegate(ILContext il)
		{
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0015: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			if (RT_visuals)
			{
				ILCursor val2 = new ILCursor(il);
				if (DisableSprintingCrosshair.Value)
				{
					((BaseUnityPlugin)this).Logger.LogInfo((object)"Disabling sprinting crosshair:");
					try
					{
						val2.Index = 0;
						val2.GotoNext((MoveType)2, new Func<Instruction, bool>[1]
						{
							(Instruction x) => ILPatternMatchingExt.MatchCallvirt<CharacterBody>(x, "get_isSprinting")
						});
						val2.Emit(OpCodes.Ldc_I4, 0);
						val2.Emit(OpCodes.And);
					}
					catch (Exception ex)
					{
						Debug.LogError((object)ex);
					}
				}
			}
		};
	}

	private void SetupConfiguration()
	{
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Expected O, but got Unknown
		//IL_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Expected O, but got Unknown
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0089: Expected O, but got Unknown
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c2: Expected O, but got Unknown
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Expected O, but got Unknown
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Expected O, but got Unknown
		//IL_0170: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Expected O, but got Unknown
		//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b3: Expected O, but got Unknown
		//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ec: Expected O, but got Unknown
		//IL_021b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0225: Expected O, but got Unknown
		string text = Paths.ConfigPath + "\\com.johnedwa.RTAutoSprintEx.cfg";
		conf = new ConfigFile(text, true);
		HoldSprintToWalk = conf.Bind<bool>("1) Movement", "HoldSprintToWalk", true, new ConfigDescription("Walk by holding down the sprint key. If disabled, makes the Sprint key toggle AutoSprinting functionality on and off.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		HoldToSprint = conf.Bind<bool>("1) Movement", "HoldToSprint", false, new ConfigDescription("Sprint by holding down the sprint key. Only works if HoldSprintToWalk is disabled.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		SprintInAnyDirection = conf.Bind<bool>("1) Movement", "SprintInAnyDirection", false, new ConfigDescription("Cheat, Allows you to sprint in any direction. Please don't use in multiplayer.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		DisableSprintingCrosshair = conf.Bind<bool>("2) Visual", "DisableSprintingCrosshair", true, new ConfigDescription("Disables the useless special sprinting chevron crosshair.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		CustomFOV = conf.Bind<int>("2) Visual", "FOVValue", 60, new ConfigDescription("Sets a custom (vertical) FOV. Game default 60V is roughly 90H.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 180), Array.Empty<object>()));
		SprintFOVMultiplier = conf.Bind<double>("2) Visual", "SprintFOVMultiplier", 1.3, new ConfigDescription("Sets the sprinting FOV multiplier. Set to 1 to disable.", (AcceptableValueBase)(object)new AcceptableValueRange<double>(0.1, 2.0), Array.Empty<object>()));
		DisableSpeedlines = conf.Bind<bool>("2) Visual", "DisableSpeedlines", false, new ConfigDescription("Disables the speedlines effect shown when sprinting.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		DisableAutoSprinting = conf.Bind<bool>("3) Misc", "DisabledAutoSprinting", false, new ConfigDescription("Disable the AutoSprinting part of the mod.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		DisableVisualChanges = conf.Bind<bool>("3) Misc", "DisableVisualChanges", false, new ConfigDescription("Disable the FOV and visual changes of the mod.", (AcceptableValueBase)(object)new AcceptableValueList<bool>(new bool[2] { true, false }), Array.Empty<object>()));
		RT_enabled = !DisableAutoSprinting.Value;
		RT_visuals = !DisableVisualChanges.Value;
		if (!RT_enabled && !RT_visuals)
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"DisabledAutoSprinting and DisableVisualChanges both True, the mod literally does nothing now.");
		}
	}
}
public static class Utils
{
	internal static bool TryParseBool(string input, out bool result)
	{
		if (bool.TryParse(input, out result))
		{
			return true;
		}
		if (int.TryParse(input, out var result2))
		{
			result = result2 > 0;
			return true;
		}
		return false;
	}

	internal static T GetInstanceField<T>(this object instance, string fieldName)
	{
		BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
		FieldInfo field = instance.GetType().GetField(fieldName, bindingAttr);
		return (T)field.GetValue(instance);
	}

	internal static void SetInstanceField<T>(this object instance, string fieldName, T value)
	{
		BindingFlags bindingAttr = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic;
		FieldInfo field = instance.GetType().GetField(fieldName, bindingAttr);
		field.SetValue(instance, value);
	}
}