Decompiled source of ToggleMovementMod v1.4.0

ToggleMovementMod.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;
using Valheim.SettingsGui;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("ToggleMovementMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ToggleMovementMod")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("f1b958a9-3b6f-4a6a-b27f-71f24ecff0c8")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ValheimMovementMods;

[BepInPlugin("afilbert.ValheimToggleMovementMod", "Valheim - Toggle Movement Mod", "1.4.0")]
[BepInProcess("valheim.exe")]
public class ToggleMovementMod : BaseUnityPlugin
{
	[HarmonyPatch(typeof(Player), "SetControls")]
	private class ToggleMovement
	{
		private static void Prefix(ref Player __instance, ref Vector3 movedir, ref bool attack, ref bool run, ref bool crouch, ref Vector3 ___m_lookDir, ref Vector3 ___m_moveDir, ref bool ___m_autoRun, ref bool ___m_crouchToggled, ref string ___m_actionAnimation, ref List<MinorActionData> ___m_actionQueue)
		{
			//IL_03ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_03f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0393: Unknown result type (might be due to invalid IL or missing references)
			//IL_0398: Unknown result type (might be due to invalid IL or missing references)
			//IL_03af: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03be: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cd: Unknown result type (might be due to invalid IL or missing references)
			_plugin.PrivateUpdate();
			if (!EnableToggle.Value)
			{
				return;
			}
			if (!Object.op_Implicit((Object)(object)__instance) || _plugin.IsInMenu() || ((Character)__instance).InPlaceMode() || __instance.InRepairMode() || (!AllowAutorunInInventory.Value && _plugin.IsInInventory()))
			{
				___m_autoRun = false;
				AutorunSet = false;
				return;
			}
			if (!Started)
			{
				Started = true;
			}
			if (!SprintSet)
			{
				StaminaRefilling = false;
			}
			_plugin.MaybeUpdateConfigurableInput();
			if ((SprintToggle.Value || SprintToggleOnAutorun.Value) && !_plugin.IsInChat() && !_plugin.IsInInventory())
			{
				run = ZInput.GetButton("Run") || ZInput.GetButton("JoyRun");
				if (SprintToggleAlternate.Value && !run)
				{
					run = ZInput.GetButtonUp("Sprint");
				}
			}
			bool flag = ZInput.GetButton("Forward") || ZInput.GetButton("JoyForward");
			bool flag2 = ZInput.GetButton("Backward") || ZInput.GetButton("JoyBackward");
			bool flag3 = ZInput.GetButton("Left") || ZInput.GetButton("JoyLeft");
			bool flag4 = ZInput.GetButton("Right") || ZInput.GetButton("JoyRight");
			bool flag5 = ZInput.GetButton("Attack") || ZInput.GetButton("JoyAttack");
			bool flag6 = false;
			if (ReequipWeaponAfterSwimming.Value && EquippedItem != null && EquippedItem.m_shared.m_name != "Unarmed" && ((Character)__instance).IsSwimming())
			{
				ReequipItem = EquippedItem;
			}
			else if (ReequipWeaponAfterSwimming.Value && ReequipItem != null && !((Character)__instance).IsSwimming())
			{
				((Humanoid)__instance).EquipItem(ReequipItem, true);
				ReequipItem = null;
			}
			EquippedItem = ((Humanoid)__instance).GetCurrentWeapon();
			if (!_plugin.IsInChat() && !_plugin.IsInInventory())
			{
				flag6 = ((!AutorunStrafe.Value) ? (flag || flag2 || flag3 || flag4) : (flag2 || (AutorunStrafeForwardDisables.Value && flag)));
			}
			if (ZInput.ToggleRun && !SprintTogglePersistsOnHalt.Value && ((Vector3)(ref ___m_moveDir)).magnitude == 0f)
			{
				SprintSet = false;
			}
			if (!ZInput.ToggleRun && (SprintToggle.Value || SprintToggleOnAutorun.Value) && !SprintTogglePersistsOnHalt.Value && ((Vector3)(ref ___m_moveDir)).magnitude == 0f)
			{
				SprintSet = false;
			}
			bool flag7 = true;
			if (AutorunOverride.Value)
			{
				___m_autoRun = false;
			}
			bool flag8 = ___m_actionAnimation != null;
			if (___m_actionQueue.Exists((MinorActionData item) => (int)item.m_type == 0 || (int)item.m_type == 1))
			{
				flag8 = true;
			}
			if (AutorunSet && AutorunOverride.Value && flag6)
			{
				AutorunSet = false;
			}
			if (DisableStamLimitOnManualCntrl.Value && flag6 && StaminaRefilling)
			{
				StaminaRefilling = false;
			}
			if (((Humanoid)__instance).GetCurrentWeapon() != null && ((Humanoid)__instance).GetCurrentWeapon().m_shared.m_name == "$item_crossbow_arbalest")
			{
				flag7 = ((Humanoid)__instance).IsWeaponLoaded();
			}
			if (AutorunSet && !___m_autoRun && !flag8)
			{
				___m_autoRun = true;
			}
			if (___m_autoRun && AutorunOverride.Value && !ZInput.GetButton("FreeLook"))
			{
				if (AutorunStrafe.Value)
				{
					Vector3 val = ___m_lookDir;
					val.y = 0f;
					((Vector3)(ref val)).Normalize();
					___m_moveDir = val + movedir.x * Vector3.Cross(Vector3.up, val);
					if (((Vector3)(ref ___m_moveDir)).magnitude > 1f)
					{
						((Vector3)(ref ___m_moveDir)).Normalize();
					}
				}
				else
				{
					___m_moveDir = ___m_lookDir;
					___m_moveDir.y = 0f;
					((Vector3)(ref ___m_moveDir)).Normalize();
				}
			}
			if (AutorunSafeguardStamina.Value && ((Character)__instance).GetStaminaPercentage() < StamRefillThreshold && !flag6)
			{
				StaminaRefilling = true;
			}
			if (AutoJump.Value && AutoJumpSet && ((Character)__instance).GetStaminaPercentage() == 0f)
			{
				JumpStamRefilling = true;
			}
			if (AutoPrimaryAttack.Value && AutoPrimaryAttackSet && (double)((Character)__instance).GetStaminaPercentage() <= 0.01)
			{
				AttackStamRefilling = true;
			}
			if (((Character)__instance).GetStaminaPercentage() == 1f)
			{
				StaminaRefilling = false;
				JumpStamRefilling = false;
				AttackStamRefilling = false;
			}
			if (Crouching)
			{
				run = false;
				___m_crouchToggled = true;
				crouch = false;
				if (StaminaRefilling && AutorunSet && StopSneakMovementToggle.Value)
				{
					___m_autoRun = false;
				}
			}
			else
			{
				if (((Character)__instance).GetHealthPercentage() < SprintHealthThreshold && SafeguardStaminaOnLowHealth.Value)
				{
					SprintSet = false;
				}
				if (!SprintToggle.Value && !SprintToggleOnAutorun.Value && ZInput.ToggleRun && StaminaRefilling)
				{
					run = false;
				}
				if (SprintSet && (!StaminaRefilling || (flag && DisableStamLimitOnManualCntrl.Value)) && flag7 && !flag8)
				{
					run = true;
					crouch = false;
				}
				if (AutoJump.Value && AutoJumpSet && !JumpStamRefilling)
				{
					((Character)__instance).Jump(false);
				}
				if (AutoPrimaryAttack.Value && AutoPrimaryAttackSet && !AttackStamRefilling)
				{
					attack = true;
				}
			}
			if (SprintSet && ((Character)__instance).GetStaminaPercentage() == 0f)
			{
				ElapsedTimeAtZeroStam += Time.deltaTime;
			}
			else
			{
				ElapsedTimeAtZeroStam = 0f;
			}
			if (TrackElapsedZeroStamToggle.Value && SprintSet && ElapsedTimeAtZeroStam > TrackElapsedZeroStamTime.Value)
			{
				SprintSet = false;
			}
			if (DetoggleSprintAtLowStamWhenAttacking.Value && SprintSet && ((Character)__instance).GetStaminaPercentage() <= DetoggleSprintAtLowStamWhenAttackingThreshold.Value && flag5)
			{
				SprintSet = false;
			}
		}
	}

	[HarmonyPatch(typeof(ZInput), "Load")]
	private class ZInput_PatchLoad
	{
		private static void Postfix(ZInput __instance, Dictionary<string, ButtonDef> ___m_buttons)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			_inputInstance = __instance;
			_buttonsDict = ___m_buttons;
			Key val = (Key)Enum.Parse(typeof(Key), "Escape");
			_inputInstance.AddButton("Esc", ZInput.KeyToPath(val), false, true, false, 0f, 0f);
			_plugin.UpdateBindings();
		}
	}

	[HarmonyPatch(typeof(GameplaySettings), "LoadSettings")]
	private class GameplaySettings_PatchLoadSettings
	{
		private static void Postfix(GameplaySettings __instance, Toggle ___m_toggleRun, TMP_Text ___m_language)
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			if (EnableToggle.Value && AddAutorunMenuLabels.Value && (Object)(object)__instance != (Object)null && (Object)(object)___m_toggleRun != (Object)null)
			{
				_plugin.SetCustomToggleLabelText(___m_language, new Vector2(0f, -62f));
			}
		}
	}

	[HarmonyPatch(typeof(AccessibilitySettings), "LoadSettings")]
	private class AccessibilitySettings_PatchLoadSettings
	{
		private static void Postfix(GameplaySettings __instance, Toggle ___m_toggleRun, TMP_Text ___m_guiScaleText)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			logger.LogInfo((object)"Loading settings");
			if (EnableToggle.Value && AddAutorunMenuLabels.Value && (Object)(object)__instance != (Object)null && (Object)(object)___m_toggleRun != (Object)null)
			{
				_plugin.SetCustomToggleLabelText(___m_guiScaleText, new Vector2(-260f, -59f));
			}
		}
	}

	[HarmonyPatch(typeof(Game), "Logout")]
	private class Game_PatchLogout
	{
		private static void Postfix()
		{
			Started = false;
		}
	}

	[HarmonyPatch(typeof(Hud), "UpdateStamina")]
	private class Hud_UpdateStamina
	{
		private static void Postfix(Hud __instance, ref Player player, ref TMP_Text ___m_staminaText, ref RectTransform ___m_staminaBar2Root, ref GuiBar ___m_staminaBar2Slow, ref GuiBar ___m_staminaBar2Fast)
		{
			//IL_0065: 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_0045: Unknown result type (might be due to invalid IL or missing references)
			if (EnableToggle.Value && VisuallyIndicateSprintState.Value && SprintSet)
			{
				___m_staminaBar2Fast.SetColor(new Color(1f, 0.64f, 0f));
				if (StaminaRefilling)
				{
					___m_staminaBar2Fast.SetColor(Color.blue);
				}
				if (ElapsedTimeAtZeroStam > 1f)
				{
					__instance.StaminaBarEmptyFlash();
				}
			}
			else
			{
				___m_staminaBar2Fast.SetColor(Color.yellow);
			}
		}
	}

	private const string pluginGUID = "afilbert.ValheimToggleMovementMod";

	private const string pluginName = "Valheim - Toggle Movement Mod";

	private const string pluginVersion = "1.4.0";

	private const string freeLookKey = "FreeLook";

	private const string sprintKey = "Sprint";

	public static ManualLogSource logger;

	private readonly Harmony _harmony = new Harmony("afilbert.ValheimToggleMovementMod");

	public static ToggleMovementMod _plugin;

	public static ZInput _inputInstance;

	public static Dictionary<string, ButtonDef> _buttonsDict;

	public static bool Started;

	public static ConfigEntry<bool> EnableToggle;

	public static ConfigEntry<bool> SprintToggle;

	public static ConfigEntry<bool> SprintToggleAlternate;

	public static ConfigEntry<string> SprintToggleAlternateKey;

	public static ConfigEntry<bool> SprintToggleOnAutorun;

	public static ConfigEntry<bool> SprintTogglePersistsOnHalt;

	public static ConfigEntry<bool> DisableStamLimitOnManualCntrl;

	public static ConfigEntry<bool> AutorunOverride;

	public static ConfigEntry<string> AutorunFreelookKey;

	public static ConfigEntry<bool> AutorunStrafe;

	public static ConfigEntry<bool> AutorunStrafeForwardDisables;

	public static ConfigEntry<bool> AutorunDisableOnEsc;

	public static ConfigEntry<bool> AutorunSafeguardStamina;

	public static ConfigEntry<bool> AutoJump;

	public static ConfigEntry<bool> AutoPrimaryAttack;

	public static ConfigEntry<bool> ReequipWeaponAfterSwimming;

	public static ConfigEntry<bool> RunToCrouchToggle;

	public static ConfigEntry<bool> StopSneakMovementToggle;

	public static ConfigEntry<float> MinStamRefillPercent;

	public static ConfigEntry<bool> SafeguardStaminaOnLowHealth;

	public static ConfigEntry<float> SprintHealthOverride;

	public static ConfigEntry<bool> TrackElapsedZeroStamToggle;

	public static ConfigEntry<float> TrackElapsedZeroStamTime;

	public static ConfigEntry<bool> AllowAutorunWhileInMap;

	public static ConfigEntry<bool> VisuallyIndicateSprintState;

	public static ConfigEntry<bool> AllowAutorunInInventory;

	public static ConfigEntry<bool> DetoggleSprintAtLowStamWhenAttacking;

	public static ConfigEntry<float> DetoggleSprintAtLowStamWhenAttackingThreshold;

	public static ConfigEntry<bool> AddAutorunMenuLabels;

	public static string InitialSprintToggleAlternateKey;

	public static string InitialAutorunFreelookKey;

	public static bool StaminaRefilling;

	public static bool JumpStamRefilling;

	public static bool SprintSet;

	public static bool AutorunSet;

	public static bool RunToCrouch;

	public static bool Crouching;

	public static bool GameplaySettingAutorun;

	public static bool AutoJumpSet;

	public static bool AttackStamRefilling;

	public static bool AutoPrimaryAttackSet;

	public static float ElapsedTimeAtZeroStam;

	public static float StamRefillThreshold;

	public static float SprintHealthThreshold;

	public static ItemData EquippedItem;

	public static ItemData ReequipItem;

	private void Awake()
	{
		_plugin = this;
		logger = ((BaseUnityPlugin)this).Logger;
		EnableToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Mod Config", "Enable", true, "Enable this mod");
		SprintToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "SprintToggle", true, "Sprint works like a toggle when true");
		SprintToggleOnAutorun = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "OnlyToggleWhenAutorunning", false, "Sprint only works like a toggle when auto-running");
		SprintTogglePersistsOnHalt = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "SprintTogglePersistsOnHalt", false, "Sprint stays toggled even after character halts");
		SprintToggleAlternate = ((BaseUnityPlugin)this).Config.Bind<bool>("Sprint", "SprintToggleAlternate", false, "Sprint is toggled through use of another key/button");
		SprintToggleAlternateKey = ((BaseUnityPlugin)this).Config.Bind<string>("Sprint", "SprintToggleAlternateKey", "T", "Used in conjunction with SprintToggleAlternate. This is the key used to toggle sprint on/off");
		AutorunOverride = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunToggle", true, "Fixes auto-run to follow look direction");
		AutorunFreelookKey = ((BaseUnityPlugin)this).Config.Bind<string>("Auto-run", "AutorunFreelookKey", "CapsLock", "Overrides look direction in auto-run while pressed");
		AutorunStrafe = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunStrafe", true, "Enable strafing while in auto-run/crouch");
		AutorunStrafeForwardDisables = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunStrafeForwardDisables", false, "Disable autorun if Forward key/button pressed while AutorunStrafe enabled");
		AutorunDisableOnEsc = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunDisableOnEsc", true, "Disable autorun if Esc key pressed");
		AutorunSafeguardStamina = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunSafeguardStamina", true, "Enables stam safeguards that prevent stamina from running to zero");
		AutoJump = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-jump", "AutoJumpToggle", false, "Enables character jump input to function as a toggle with stamina safeguards");
		AllowAutorunWhileInMap = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunInMap", true, "Keep running while viewing map");
		AllowAutorunInInventory = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AutorunInInventory", false, "Keep running while viewing inventory");
		AddAutorunMenuLabels = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-run", "AddAutorunMenuLabels", true, "Adds helpful label to vanilla Auto-run toggle in both Gameplay and Accessibility settings menus");
		AutoPrimaryAttack = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-attack", "AutoPrimaryAttackToggle", false, "Enables character primary attack input to function as a toggle with stamina safeguards");
		ReequipWeaponAfterSwimming = ((BaseUnityPlugin)this).Config.Bind<bool>("Swim", "ReequipWeaponAfterSwimming", true, "Any weapon stowed in order to swim will reequip once out of swimming state");
		RunToCrouchToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-sneak", "RunToCrouchToggle", true, "Allows going from full run to crouch with a click of the crouch button (and vice versa)");
		StopSneakMovementToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Auto-sneak", "StopSneakOnNoStam", true, "Stops sneak movement if no stamina available. Stock behavior is to pop out of sneak into walk");
		MinStamRefillPercent = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "MinStamRefillPercentValue", 20f, "Percentage to stop running and let stamina refill");
		DisableStamLimitOnManualCntrl = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "StopStamLimitOnManualInputToggle", true, "Stops the wait for 100% stam fill to resume sprinting on manual Forward input");
		StamRefillThreshold = MinStamRefillPercent.Value / 100f;
		SafeguardStaminaOnLowHealth = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "SafeguardStaminaOnLowHealthToggle", true, "Allow stamina to recover on low health by automatically detoggling sprint");
		SprintHealthOverride = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "SprintHealthOverridePercentValue", 30f, "Percentage of health to detoggle sprint so stamina can start to recover");
		SprintHealthThreshold = SprintHealthOverride.Value / 100f;
		TrackElapsedZeroStamToggle = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "TrackElapsedZeroStamToggle", true, "Automatically toggle off sprint after elapsed time spent at zero stamina");
		TrackElapsedZeroStamTime = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "TrackElapsedZeroStamTime", 5f, "Seconds to wait at zero stamina before toggling off sprint");
		VisuallyIndicateSprintState = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "ChangeStamColorOnSprint", true, "Changes stamina bar color to orange when draining and sprint enabled, and blue when stam regenerating. Flashes empty bar if stam drained fully while sprinting");
		DetoggleSprintAtLowStamWhenAttacking = ((BaseUnityPlugin)this).Config.Bind<bool>("Stamina", "DetoggleSprintAtLowStamWhenAttacking", true, "Detoggles sprint if attacking at low stamina");
		DetoggleSprintAtLowStamWhenAttackingThreshold = ((BaseUnityPlugin)this).Config.Bind<float>("Stamina", "DetoggleSprintAtLowStamWhenAttackingThreshold", 0.04f, "Threshold at which stamina will detoggle sprint if also attacking");
		InitialSprintToggleAlternateKey = SprintToggleAlternateKey.Value;
		InitialAutorunFreelookKey = AutorunFreelookKey.Value;
		_harmony.PatchAll();
	}

	private void SetCustomToggleLabelText(TMP_Text textToClone, Vector2 position)
	{
		//IL_0012: 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_0049: 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)
		TMP_Text obj = Object.Instantiate<TMP_Text>(textToClone, textToClone.transform);
		obj.rectTransform.anchoredPosition = position;
		obj.text = "Causes Run control to function as a toggle";
		obj.font = textToClone.font;
		obj.fontSize = textToClone.fontSize;
		((Graphic)obj).color = ((Graphic)textToClone).color;
		obj.alignment = textToClone.alignment;
		obj.rectTransform.sizeDelta = textToClone.rectTransform.sizeDelta;
	}

	private void MaybeUpdateConfigurableInput()
	{
		if (InitialSprintToggleAlternateKey != SprintToggleAlternateKey.Value || InitialAutorunFreelookKey != AutorunFreelookKey.Value)
		{
			_buttonsDict.Remove("Sprint");
			_buttonsDict.Remove("FreeLook");
			if (UpdateBindings())
			{
				InitialSprintToggleAlternateKey = SprintToggleAlternateKey.Value;
				InitialAutorunFreelookKey = AutorunFreelookKey.Value;
			}
		}
	}

	private bool UpdateBindings()
	{
		//IL_0019: 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_0029: Unknown result type (might be due to invalid IL or missing references)
		//IL_005a: Unknown result type (might be due to invalid IL or missing references)
		//IL_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		try
		{
			Key val = (Key)Enum.Parse(typeof(Key), AutorunFreelookKey.Value);
			_inputInstance.AddButton("FreeLook", ZInput.KeyToPath(val), false, true, false, 0f, 0f);
			val = (Key)Enum.Parse(typeof(Key), SprintToggleAlternateKey.Value);
			_inputInstance.AddButton("Sprint", ZInput.KeyToPath(val), false, true, false, 0f, 0f);
			logger.LogInfo((object)("Bindings - Free look: " + AutorunFreelookKey.Value + ". Toggle alternate: " + SprintToggleAlternateKey.Value));
			return true;
		}
		catch (ArgumentException ex)
		{
			logger.LogError((object)("Error binding input buttons: " + ex.Message));
			return false;
		}
	}

	private void OnDestroy()
	{
		_harmony.UnpatchSelf();
	}

	private bool IsInMenu()
	{
		if ((!AutorunDisableOnEsc.Value || !ZInput.GetButtonDown("Esc")) && !ZInput.GetButtonDown("JoyMenu") && (AllowAutorunWhileInMap.Value || !Minimap.IsOpen()) && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog() && !StoreGui.IsVisible() && !Hud.IsPieceSelectionVisible() && !UnifiedPopup.IsVisible() && !GameCamera.InFreeFly())
		{
			return PlayerCustomizaton.IsBarberGuiVisible();
		}
		return true;
	}

	private bool IsInInventory()
	{
		return InventoryGui.IsVisible();
	}

	private bool IsInChat()
	{
		if (Object.op_Implicit((Object)(object)Chat.instance))
		{
			return Chat.instance.HasFocus();
		}
		return false;
	}

	private void PrivateUpdate()
	{
		if (!Started || !EnableToggle.Value || IsInMenu() || IsInChat() || IsInInventory())
		{
			return;
		}
		bool flag = false;
		if (SprintToggle.Value || SprintToggleOnAutorun.Value || ZInput.ToggleRun)
		{
			flag = ZInput.GetButtonUp("Run") || ZInput.GetButtonUp("JoyRun");
			if (SprintToggleAlternate.Value)
			{
				flag = ZInput.GetButtonUp("Sprint");
			}
		}
		bool buttonDown = ZInput.GetButtonDown("Attack");
		bool num = ZInput.GetButtonDown("Crouch") || ZInput.GetButtonDown("JoyCrouch");
		bool buttonDown2 = ZInput.GetButtonDown("AutoRun");
		bool buttonDown3 = ZInput.GetButtonDown("Jump");
		bool flag2 = ZInput.GetButton("Backward") || ZInput.GetButton("JoyBackward");
		if (!AutorunOverride.Value)
		{
			AutorunSet = false;
		}
		if (!RunToCrouchToggle.Value)
		{
			RunToCrouch = false;
		}
		if (!SprintToggle.Value && !SprintToggleOnAutorun.Value && !ZInput.ToggleRun)
		{
			SprintSet = false;
		}
		if (buttonDown2 && AutorunOverride.Value)
		{
			AutorunSet = !AutorunSet;
		}
		if (!AutorunSet && SprintToggleOnAutorun.Value)
		{
			SprintSet = false;
		}
		if (flag && (SprintToggle.Value || SprintToggleOnAutorun.Value || ZInput.ToggleRun))
		{
			if (!SprintToggleOnAutorun.Value || ZInput.ToggleRun)
			{
				SprintSet = !SprintSet;
			}
			if (SprintToggleOnAutorun.Value && AutorunSet)
			{
				SprintSet = !SprintSet;
			}
		}
		if (num && RunToCrouchToggle.Value)
		{
			Crouching = !Crouching;
		}
		if (buttonDown3 && AutoJump.Value)
		{
			AutoJumpSet = !AutoJumpSet;
		}
		if (buttonDown && AutoPrimaryAttack.Value)
		{
			AutoPrimaryAttackSet = !AutoPrimaryAttackSet;
		}
		if (AutorunSet && flag2)
		{
			AutorunSet = false;
		}
	}
}