Decompiled source of HuntLematCarbine v1.0.2

HuntLematCarbine.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using BitWizrd.Revolver;
using BitWizrd.Speedloader;
using FistVR;
using HarmonyLib;
using OtherLoader;
using UnityEditor;
using UnityEngine;

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace BitWizrd.HuntLematCarbine
{
	[BepInPlugin("BitWizrd.HuntLematCarbine", "HuntLematCarbine", "1.0.2")]
	[BepInProcess("h3vr.exe")]
	[Description("Built with MeatKit")]
	[BepInDependency("h3vr.otherloader", "1.3.0")]
	public class HuntLematCarbinePlugin : BaseUnityPlugin
	{
		private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);

		internal static ManualLogSource Logger;

		private void Awake()
		{
			Logger = ((BaseUnityPlugin)this).Logger;
			LoadAssets();
		}

		private void LoadAssets()
		{
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "BitWizrd.HuntLematCarbine");
			OtherLoader.RegisterDirectLoad(BasePath, "BitWizrd.HuntLematCarbine", "", "lemat carbine", "", "");
		}
	}
}
public class BloodBondSR : MonoBehaviour
{
	private void Awake()
	{
		string name = "Ammo_69_CashMoney_D100(Clone)";
		((Object)((Component)this).gameObject).name = name;
		Collider[] componentsInChildren = ((Component)this).GetComponentsInChildren<Collider>(true);
		for (int i = 0; i < componentsInChildren.Length; i++)
		{
			((Object)((Component)componentsInChildren[i]).gameObject).name = name;
		}
	}
}
namespace BitWizrd.Revolver
{
	public class Chain : FVRFireArm
	{
		[Header("Chain Revolver")]
		public ChainCylinder ChainCylinder;

		public Transform Hammer;

		public Transform LoadingGate;

		public Transform Trigger;

		public Transform HammerFanDir;

		public Transform PoseSpinHolder;

		public Transform Pose_Main;

		public Transform Pose_Toggled;

		public float Hammer_Rot_Uncocked;

		public float Hammer_Rot_Halfcocked;

		public float Hammer_Rot_Cocked;

		public float LoadingGate_Rot_Closed;

		public float LoadingGate_Rot_Open;

		public float Trigger_Rot_Forward;

		public float Trigger_Rot_Rearward;

		public bool StateToggles = true;

		public float TriggerThreshold = 0.9f;

		public bool CanSpin = true;

		public bool HasTransferBarSafety;

		public bool IsAccessTwoChambersBack;

		public Transform ChainHolder;

		public bool AllChambersAccessible = false;

		private int m_curChamber;

		private float m_curChamberLerp;

		private float m_tarChamberLerp;

		private bool m_isSpinning;

		private bool m_isStateToggled;

		private float m_triggerFloat;

		private bool m_isHammerCocking;

		private bool m_isHammerCocked;

		private float m_hammerCockLerp;

		private float m_hammerCockSpeed = 10f;

		private float xSpinRot;

		private float xSpinVel;

		private float timeSinceColFire;

		private float m_chainHolderBaseAngle;

		private float m_chainHolderCurAngle;

		private float m_chainHolderTargetAngle;

		private float m_chainHolderLerp;

		private float m_chainHolderLerpDuration = 0.1f;

		public int CurChamber
		{
			get
			{
				return m_curChamber;
			}
			set
			{
				m_curChamber = value;
				if (m_curChamber < 0)
				{
					m_curChamber += ChainCylinder.NumChambers;
				}
				m_curChamber %= ChainCylinder.NumChambers;
			}
		}

		public int NextChamber => (m_curChamber - 1 + ChainCylinder.NumChambers) % ChainCylinder.NumChambers;

		public int PrevChamber => (m_curChamber + 1) % ChainCylinder.NumChambers;

		public int PrevChamber2 => (m_curChamber + 2) % ChainCylinder.NumChambers;

		public override void Awake()
		{
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).Awake();
			base.FChambers.Clear();
			FVRFireArmChamber[] chambers = ChainCylinder.Chambers;
			foreach (FVRFireArmChamber item in chambers)
			{
				base.FChambers.Add(item);
			}
			m_chainHolderBaseAngle = 0f;
			m_chainHolderCurAngle = 0f;
			m_chainHolderTargetAngle = 0f;
			m_chainHolderLerp = 1f;
			if ((Object)(object)ChainCylinder != (Object)null && ChainCylinder.LerpSpeed > 0f)
			{
				m_chainHolderLerpDuration = 1f / ChainCylinder.LerpSpeed;
			}
			if ((Object)(object)((FVRInteractiveObject)this).PoseOverride_Touch != (Object)null)
			{
				Pose_Main.localPosition = ((FVRInteractiveObject)this).PoseOverride_Touch.localPosition;
				Pose_Main.localRotation = ((FVRInteractiveObject)this).PoseOverride_Touch.localRotation;
			}
		}

		public override void BeginInteraction(FVRViveHand hand)
		{
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).BeginInteraction(hand);
			if (((FVRPhysicalObject)this).IsAltHeld)
			{
				return;
			}
			if (!m_isStateToggled)
			{
				((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Main.localPosition;
				((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Main.localRotation;
				if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
				{
					((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Main.localPosition;
					((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Main.localRotation;
				}
			}
			else
			{
				((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Toggled.localPosition;
				((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Toggled.localRotation;
				if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
				{
					((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Toggled.localPosition;
					((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Toggled.localRotation;
				}
			}
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_0304: Unknown result type (might be due to invalid IL or missing references)
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			((FVRPhysicalObject)this).UpdateInteraction(hand);
			m_isSpinning = false;
			if (!((FVRPhysicalObject)this).IsAltHeld)
			{
				if (!m_isStateToggled)
				{
					if (hand.Input.TouchpadPressed && !hand.IsInStreamlinedMode && Vector2.Angle(hand.Input.TouchpadAxes, Vector2.up) < 45f)
					{
						m_isSpinning = true;
					}
					if (hand.IsInStreamlinedMode)
					{
						if (hand.Input.AXButtonDown)
						{
							CockHammer(5f);
						}
						if (hand.Input.BYButtonDown && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
						}
					}
					else if (hand.Input.TouchpadDown)
					{
						if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.down) < 45f)
						{
							CockHammer(5f);
						}
						else if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) < 45f && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
						}
					}
				}
				else
				{
					if (hand.IsInStreamlinedMode)
					{
						if (hand.Input.AXButtonDown)
						{
							AdvanceCylinder();
						}
						if (hand.Input.BYButtonDown && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
						}
					}
					else if (hand.Input.TouchpadDown)
					{
						if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) < 45f && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)18, 1f);
						}
						else if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.right) < 45f)
						{
							AdvanceCylinder();
						}
					}
					if (hand.Input.TriggerDown)
					{
						EjectPrevCylinder();
					}
				}
			}
			UpdateTriggerHammer(hand);
			UpdateCylinderRot();
			if (!((FVRInteractiveObject)this).IsHeld)
			{
				m_isSpinning = false;
			}
			if (m_chainHolderLerp < 1f)
			{
				m_chainHolderLerp += Time.deltaTime / m_chainHolderLerpDuration;
				if (m_chainHolderLerp > 1f)
				{
					m_chainHolderLerp = 1f;
				}
				float z = Mathf.Lerp(m_chainHolderCurAngle, m_chainHolderTargetAngle, m_chainHolderLerp);
				if ((Object)(object)ChainHolder != (Object)null)
				{
					Vector3 localEulerAngles = ChainHolder.localEulerAngles;
					localEulerAngles.z = z;
					ChainHolder.localEulerAngles = localEulerAngles;
				}
			}
			else if ((Object)(object)ChainHolder != (Object)null)
			{
				Vector3 localEulerAngles2 = ChainHolder.localEulerAngles;
				localEulerAngles2.z = m_chainHolderTargetAngle;
				ChainHolder.localEulerAngles = localEulerAngles2;
			}
		}

		public override void EndInteraction(FVRViveHand hand)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			m_triggerFloat = 0f;
			((FVRFireArm)this).EndInteraction(hand);
			((FVRPhysicalObject)this).RootRigidbody.AddRelativeTorque(new Vector3(xSpinVel, 0f, 0f), (ForceMode)1);
		}

		public override void FVRFixedUpdate()
		{
			UpdateSpinning();
			if (timeSinceColFire < 3f)
			{
				timeSinceColFire += Time.deltaTime;
			}
			((FVRFireArm)this).FVRFixedUpdate();
		}

		private void UpdateTriggerHammer(FVRViveHand hand)
		{
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: 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_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: 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_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_0099: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			ChainCylinder.CurrentChamberIndex = CurChamber;
			if (((FVRInteractiveObject)this).IsHeld && !m_isStateToggled && !m_isHammerCocked && !m_isHammerCocking && (Object)(object)hand.OtherHand != (Object)null)
			{
				Vector3 velLinearWorld = hand.OtherHand.Input.VelLinearWorld;
				float num = Vector3.Distance(hand.OtherHand.PalmTransform.position, HammerFanDir.position);
				if (num < 0.15f && Vector2.Angle(Vector2.op_Implicit(velLinearWorld), Vector2.op_Implicit(HammerFanDir.forward)) < 60f && ((Vector3)(ref velLinearWorld)).magnitude > 1f)
				{
					CockHammer(10f);
				}
			}
			if (m_isHammerCocking)
			{
				if (m_hammerCockLerp < 1f)
				{
					m_hammerCockLerp += Time.deltaTime * m_hammerCockSpeed;
				}
				else
				{
					m_hammerCockLerp = 1f;
					m_isHammerCocking = false;
					m_isHammerCocked = true;
					CurChamber--;
					m_curChamberLerp = 0f;
					m_tarChamberLerp = 0f;
				}
			}
			if (!m_isStateToggled)
			{
				Hammer.localEulerAngles = new Vector3(Mathf.Lerp(Hammer_Rot_Uncocked, Hammer_Rot_Cocked, m_hammerCockLerp), 0f, 0f);
			}
			else
			{
				Hammer.localEulerAngles = new Vector3(Hammer_Rot_Halfcocked, 0f, 0f);
			}
			if ((Object)(object)LoadingGate != (Object)null)
			{
				if (!m_isStateToggled)
				{
					LoadingGate.localEulerAngles = new Vector3(0f, 0f, LoadingGate_Rot_Closed);
				}
				else
				{
					LoadingGate.localEulerAngles = new Vector3(0f, 0f, LoadingGate_Rot_Open);
				}
			}
			m_triggerFloat = 0f;
			if (((FVRInteractiveObject)this).m_hasTriggeredUpSinceBegin && !m_isSpinning && !m_isStateToggled)
			{
				m_triggerFloat = hand.Input.TriggerFloat;
			}
			Trigger.localEulerAngles = new Vector3(Mathf.Lerp(Trigger_Rot_Forward, Trigger_Rot_Rearward, m_triggerFloat), 0f, 0f);
			if (m_triggerFloat > TriggerThreshold)
			{
				DropHammer();
			}
		}

		private void DropHammer()
		{
			if (m_isHammerCocked)
			{
				m_isHammerCocked = false;
				m_isHammerCocking = false;
				m_hammerCockLerp = 0f;
				Fire();
			}
		}

		private void AdvanceCylinder()
		{
			CurChamber--;
			((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)15, 1f);
			ChainCylinder.CurrentLerpDuration = 1f / ((!(ChainCylinder.LerpSpeed > 0f)) ? 10f : ChainCylinder.LerpSpeed);
			ChainCylinder.Advance();
			m_chainHolderTargetAngle = (m_chainHolderCurAngle = m_chainHolderTargetAngle) - 72f;
			m_chainHolderLerp = 0f;
		}

		public void EjectPrevCylinder()
		{
			//IL_0057: 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_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			if (m_isStateToggled)
			{
				int num = PrevChamber;
				if (IsAccessTwoChambersBack)
				{
					num = PrevChamber2;
				}
				FVRFireArmChamber val = ChainCylinder.Chambers[num];
				if (val.IsFull)
				{
					((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)29, 1f);
				}
				val.EjectRound(((Component)val).transform.position + ((Component)val).transform.forward * 0.0025f, -((Component)val).transform.forward, Vector3.zero, false);
			}
		}

		private void Fire()
		{
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
			if (base.FChambers[CurChamber].Fire())
			{
				FVRFireArmChamber val = base.FChambers[CurChamber];
				((FVRFireArm)this).Fire(val, ((FVRFireArm)this).GetMuzzle(), true, 1f, -1f);
				((FVRFireArm)this).FireMuzzleSmoke();
				bool flag = ((FVRFireArm)this).IsTwoHandStabilized();
				bool flag2 = (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null;
				bool flag3 = ((FVRFireArm)this).IsShoulderStabilized();
				((FVRFireArm)this).Recoil(flag, flag2, flag3, (FVRFireArmRecoilProfile)null, 1f);
				((FVRFireArm)this).PlayAudioGunShot(val.GetRound(), GM.CurrentPlayerBody.GetCurrentSoundEnvironment(), 1f);
				if (GM.CurrentSceneSettings.IsAmmoInfinite || GM.CurrentPlayerBody.IsInfiniteAmmo)
				{
					val.IsSpent = false;
					val.UpdateProxyDisplay();
				}
			}
		}

		private void UpdateCylinderRot()
		{
			if (AllChambersAccessible)
			{
				for (int i = 0; i < base.FChambers.Count; i++)
				{
					int curChamber = CurChamber;
					int num = (CurChamber + 1) % ChainCylinder.NumChambers;
					int num2 = (CurChamber + ChainCylinder.NumChambers - 1) % ChainCylinder.NumChambers;
					if (i == curChamber || i == num || i == num2)
					{
						base.FChambers[i].IsAccessible = false;
					}
					else
					{
						base.FChambers[i].IsAccessible = true;
					}
				}
				if (m_isStateToggled)
				{
					int num3 = (CurChamber + 1) % ChainCylinder.NumChambers;
					if (num3 >= 0 && num3 < base.FChambers.Count)
					{
						base.FChambers[num3].IsAccessible = true;
					}
				}
				return;
			}
			for (int j = 0; j < base.FChambers.Count; j++)
			{
				base.FChambers[j].IsAccessible = false;
			}
			if (m_isStateToggled)
			{
				int num4 = (CurChamber + 1) % ChainCylinder.NumChambers;
				if (IsAccessTwoChambersBack)
				{
					num4 = (CurChamber + 2) % ChainCylinder.NumChambers;
				}
				if (num4 >= 0 && num4 < base.FChambers.Count)
				{
					base.FChambers[num4].IsAccessible = true;
				}
			}
		}

		private void UpdateSpinning()
		{
			//IL_0231: Unknown result type (might be due to invalid IL or missing references)
			//IL_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_0246: Unknown result type (might be due to invalid IL or missing references)
			//IL_025c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0261: Unknown result type (might be due to invalid IL or missing references)
			//IL_0273: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: 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_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0146: 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)
			if (!((FVRInteractiveObject)this).IsHeld)
			{
				m_isSpinning = false;
			}
			if (m_isSpinning)
			{
				Vector3 val = Vector3.zero;
				if ((Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null)
				{
					val = ((FVRInteractiveObject)this).m_hand.Input.VelLinearLocal;
				}
				float num = Vector3.Dot(((Vector3)(ref val)).normalized, ((Component)this).transform.up);
				num = Mathf.Clamp(num, 0f - ((Vector3)(ref val)).magnitude, ((Vector3)(ref val)).magnitude);
				if (Mathf.Abs(xSpinVel) < 90f)
				{
					xSpinVel += num * Time.deltaTime * 600f;
				}
				else if (Mathf.Sign(num) == Mathf.Sign(xSpinVel))
				{
					xSpinVel += num * Time.deltaTime * 600f;
				}
				if (Mathf.Abs(xSpinVel) < 90f)
				{
					if (Vector3.Dot(((Component)this).transform.up, Vector3.down) >= 0f && Mathf.Sign(xSpinVel) == 1f)
					{
						xSpinVel += Time.deltaTime * 50f;
					}
					if (Vector3.Dot(((Component)this).transform.up, Vector3.down) < 0f && Mathf.Sign(xSpinVel) == -1f)
					{
						xSpinVel -= Time.deltaTime * 50f;
					}
				}
				xSpinVel = Mathf.Clamp(xSpinVel, -500f, 500f);
				xSpinRot += xSpinVel * Time.deltaTime * 5f;
				PoseSpinHolder.localEulerAngles = new Vector3(xSpinRot, 0f, 0f);
				xSpinVel = Mathf.Lerp(xSpinVel, 0f, Time.deltaTime * 0.6f);
			}
			else
			{
				xSpinRot = 0f;
				xSpinVel = 0f;
				PoseSpinHolder.localRotation = Quaternion.RotateTowards(PoseSpinHolder.localRotation, Quaternion.identity, Time.deltaTime * 500f);
				PoseSpinHolder.localEulerAngles = new Vector3(PoseSpinHolder.localEulerAngles.x, 0f, 0f);
			}
		}

		public override List<FireArmRoundClass> GetChamberRoundList()
		{
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			List<FireArmRoundClass> list = new List<FireArmRoundClass>();
			for (int i = 0; i < base.FChambers.Count; i++)
			{
				if (base.FChambers[i].IsFull)
				{
					list.Add(base.FChambers[i].GetRound().RoundClass);
					flag = true;
				}
			}
			if (flag)
			{
				return list;
			}
			return null;
		}

		public override void SetLoadedChambers(List<FireArmRoundClass> rounds)
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (rounds.Count <= 0)
			{
				return;
			}
			for (int i = 0; i < base.FChambers.Count; i++)
			{
				if (i < rounds.Count)
				{
					base.FChambers[i].Autochamber(rounds[i]);
				}
			}
		}

		private void CockHammer(float speed)
		{
			if (!m_isHammerCocked && !m_isHammerCocking)
			{
				m_hammerCockSpeed = speed;
				m_isHammerCocking = true;
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)7, 1f);
				ChainCylinder.CurrentLerpDuration = 1f / m_hammerCockSpeed;
				ChainCylinder.StartAdvanceLerp();
				m_chainHolderTargetAngle = (m_chainHolderCurAngle = m_chainHolderTargetAngle) - 72f;
				m_chainHolderLerp = 0f;
			}
		}

		private void ToggleState()
		{
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: 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)
			m_isStateToggled = !m_isStateToggled;
			if (!((FVRPhysicalObject)this).IsAltHeld)
			{
				if (!m_isStateToggled)
				{
					((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Main.localPosition;
					((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Main.localRotation;
					if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
					{
						((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Main.localPosition;
						((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Main.localRotation;
					}
				}
				else
				{
					((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Toggled.localPosition;
					((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Toggled.localRotation;
					if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
					{
						((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Toggled.localPosition;
						((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Toggled.localRotation;
					}
				}
			}
			m_isHammerCocking = false;
			m_isHammerCocked = false;
			m_hammerCockLerp = 0f;
		}
	}
	public class ChainCylinder : MonoBehaviour
	{
		private class ChainLink
		{
			public Transform transform;

			public Vector3 baseLocalPos;

			public Quaternion baseLocalRot;

			public Vector3 particlePos;

			private Vector3 particleVel;

			private float restVelocityThreshold = 0.003f;

			public float distanceLimit = 0.12f;

			public float gravityScale = 0.8f;

			public float springRate = 0.85f;

			public float damping = 0.6f;

			public float positionScale = 0.2f;

			public bool isKinematic = false;

			public ChainLink prevLink;

			public ChainLink nextLink;

			private float idealDistanceToPrev;

			private float idealDistanceToNext;

			private float uniqueOffset1;

			private float uniqueOffset2;

			private float uniqueOffset3;

			private float moveScale;

			private float noiseFrequency1;

			private float noiseFrequency2;

			private float noiseFrequency3;

			public void Initialize()
			{
				//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_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)
				baseLocalPos = transform.localPosition;
				baseLocalRot = transform.localRotation;
				ResetParticle();
				uniqueOffset1 = Random.Range(0f, 100f);
				uniqueOffset2 = Random.Range(0f, 100f);
				uniqueOffset3 = Random.Range(0f, 100f);
				noiseFrequency1 = Random.Range(0.6f, 1.2f);
				noiseFrequency2 = Random.Range(0.6f, 1.2f);
				noiseFrequency3 = Random.Range(0.6f, 1.2f);
				moveScale = Random.Range(0.7f, 1f);
			}

			public void ResetParticle()
			{
				//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_0013: Unknown result type (might be due to invalid IL or missing references)
				//IL_0018: Unknown result type (might be due to invalid IL or missing references)
				particlePos = transform.position;
				particleVel = Vector3.zero;
			}

			public void SetToBasePosition()
			{
				//IL_0008: Unknown result type (might be due to invalid IL or missing references)
				//IL_0019: Unknown result type (might be due to invalid IL or missing references)
				transform.localPosition = baseLocalPos;
				transform.localRotation = baseLocalRot;
				ResetParticle();
			}

			public void SetBasePosition(Vector3 pos, Quaternion rot)
			{
				//IL_0002: Unknown result type (might be due to invalid IL or missing references)
				//IL_0003: Unknown result type (might be due to invalid IL or missing references)
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				//IL_000a: 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_0033: Unknown result type (might be due to invalid IL or missing references)
				baseLocalPos = pos;
				baseLocalRot = rot;
				if (isKinematic)
				{
					transform.localPosition = baseLocalPos;
					transform.localRotation = baseLocalRot;
					ResetParticle();
				}
			}

			public void UpdatePhysics(float deltaTime, float movementAmount, bool advancing)
			{
				//IL_0040: 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)
				//IL_0014: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00db: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0082: 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_0094: Unknown result type (might be due to invalid IL or missing references)
				//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_0254: Unknown result type (might be due to invalid IL or missing references)
				//IL_0259: Unknown result type (might be due to invalid IL or missing references)
				//IL_0196: 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_01b7: Unknown result type (might be due to invalid IL or missing references)
				//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
				//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
				//IL_0232: Unknown result type (might be due to invalid IL or missing references)
				//IL_023d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0247: Unknown result type (might be due to invalid IL or missing references)
				//IL_024c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0251: Unknown result type (might be due to invalid IL or missing references)
				//IL_0284: Unknown result type (might be due to invalid IL or missing references)
				//IL_0289: Unknown result type (might be due to invalid IL or missing references)
				//IL_0292: 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_0298: Unknown result type (might be due to invalid IL or missing references)
				//IL_0299: Unknown result type (might be due to invalid IL or missing references)
				//IL_029f: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
				//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
				//IL_02b1: 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_02bf: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
				//IL_02c6: Unknown result type (might be due to invalid IL or missing references)
				//IL_02cb: Unknown result type (might be due to invalid IL or missing references)
				//IL_02d0: Unknown result type (might be due to invalid IL or missing references)
				//IL_0316: Unknown result type (might be due to invalid IL or missing references)
				//IL_031b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0320: 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_0324: Unknown result type (might be due to invalid IL or missing references)
				//IL_032a: Unknown result type (might be due to invalid IL or missing references)
				//IL_032f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0357: Unknown result type (might be due to invalid IL or missing references)
				//IL_0359: Unknown result type (might be due to invalid IL or missing references)
				//IL_038d: Unknown result type (might be due to invalid IL or missing references)
				//IL_038f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0396: Unknown result type (might be due to invalid IL or missing references)
				//IL_039b: Unknown result type (might be due to invalid IL or missing references)
				//IL_039d: Unknown result type (might be due to invalid IL or missing references)
				//IL_03a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_03a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_036b: Unknown result type (might be due to invalid IL or missing references)
				//IL_036c: Unknown result type (might be due to invalid IL or missing references)
				//IL_036e: Unknown result type (might be due to invalid IL or missing references)
				//IL_036f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0374: Unknown result type (might be due to invalid IL or missing references)
				//IL_0378: Unknown result type (might be due to invalid IL or missing references)
				//IL_037f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0384: Unknown result type (might be due to invalid IL or missing references)
				//IL_0389: Unknown result type (might be due to invalid IL or missing references)
				//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c0: Unknown result type (might be due to invalid IL or missing references)
				//IL_03c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_0425: Unknown result type (might be due to invalid IL or missing references)
				//IL_042a: Unknown result type (might be due to invalid IL or missing references)
				//IL_042b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0430: Unknown result type (might be due to invalid IL or missing references)
				//IL_043d: Unknown result type (might be due to invalid IL or missing references)
				//IL_043f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0444: Unknown result type (might be due to invalid IL or missing references)
				//IL_046c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0470: Unknown result type (might be due to invalid IL or missing references)
				//IL_0475: Unknown result type (might be due to invalid IL or missing references)
				//IL_047e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0483: Unknown result type (might be due to invalid IL or missing references)
				//IL_0485: Unknown result type (might be due to invalid IL or missing references)
				//IL_0496: Unknown result type (might be due to invalid IL or missing references)
				if (isKinematic)
				{
					transform.localPosition = baseLocalPos;
					transform.localRotation = baseLocalRot;
					ResetParticle();
					return;
				}
				Vector3 position = transform.position;
				bool flag = movementAmount < 0.001f && !advancing;
				if (flag && ((Vector3)(ref particleVel)).magnitude < restVelocityThreshold)
				{
					transform.localPosition = Vector3.Lerp(transform.localPosition, baseLocalPos, deltaTime * 3f);
					transform.localRotation = baseLocalRot;
					particleVel = Vector3.zero;
					particlePos = transform.position;
					return;
				}
				Vector3 val = Physics.gravity * gravityScale;
				Vector3 val2 = Vector3.zero;
				if (movementAmount > 0.005f && !advancing)
				{
					float time = Time.time;
					float num = Mathf.PerlinNoise(time * noiseFrequency1 + uniqueOffset1, uniqueOffset2) * 2f - 1f;
					float num2 = Mathf.PerlinNoise(uniqueOffset2, time * noiseFrequency2 + uniqueOffset3) * 2f - 1f;
					float num3 = Mathf.PerlinNoise(uniqueOffset3 + time * noiseFrequency3, time * noiseFrequency1) * 2f - 1f;
					val2 = new Vector3(num * 0.05f, num2 * 0.05f, num3 * 0.05f) * moveScale * Mathf.Min(1f, movementAmount * 6f);
				}
				if (!advancing && ((Vector3)(ref val2)).magnitude < 0.001f)
				{
					float num4 = Time.time * 0.3f;
					val2 += new Vector3(Mathf.Sin(num4 * 1.2f + uniqueOffset1) * 0.006f, Mathf.Cos(num4 * 0.9f + uniqueOffset2) * 0.006f, Mathf.Sin(num4 * 0.7f + uniqueOffset3) * 0.006f) * moveScale * 0.1f;
				}
				Vector3 val3 = particlePos;
				float num5 = ((!advancing) ? (damping * Random.Range(0.9f, 1.1f)) : 0.85f);
				Vector3 val4 = Vector3.Lerp(particleVel, Vector3.zero, num5 * deltaTime) + (val + val2) * deltaTime;
				val4 = Vector3.Lerp(particleVel, val4, deltaTime * 6f);
				Vector3 val5 = val3 + val4 * deltaTime;
				float num6 = (advancing ? 0.95f : ((!flag) ? (springRate * Random.Range(0.85f, 1.15f)) : 0.98f));
				Vector3 val6 = transform.parent.TransformPoint(baseLocalPos);
				val5 = Vector3.Lerp(val5, val6, num6 * deltaTime);
				float num7 = ((!advancing) ? (distanceLimit * moveScale) : (distanceLimit * 0.3f));
				float num8 = Vector3.Distance(val5, position);
				if (num8 > num7)
				{
					Vector3 val7 = val5 - position;
					val5 = position + ((Vector3)(ref val7)).normalized * num7;
				}
				particlePos = val5;
				particleVel = (particlePos - val3) / deltaTime;
				if (flag)
				{
					particleVel *= 0.8f;
				}
				if ((prevLink != null && prevLink.isKinematic) || (nextLink != null && nextLink.isKinematic))
				{
					EnforceKinematicConnectivity(ref val5);
				}
				else
				{
					EnforceLooseConnectivity(ref val5);
				}
				Vector3 val8 = particlePos - position;
				Vector3 val9 = transform.parent.InverseTransformDirection(val8);
				float num9 = ((!advancing) ? (positionScale * moveScale) : (positionScale * 0.3f));
				val9 *= num9;
				transform.localPosition = baseLocalPos + val9;
				transform.localRotation = baseLocalRot;
			}

			private void EnforceLooseConnectivity(ref Vector3 newPos)
			{
				//IL_0144: Unknown result type (might be due to invalid IL or missing references)
				//IL_0149: 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_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c9: 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_005b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0060: 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_0066: Unknown result type (might be due to invalid IL or missing references)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_006e: Unknown result type (might be due to invalid IL or missing references)
				//IL_006f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0070: 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_007c: 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)
				//IL_0085: Unknown result type (might be due to invalid IL or missing references)
				//IL_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0091: Unknown result type (might be due to invalid IL or missing references)
				//IL_0096: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
				//IL_0100: Unknown result type (might be due to invalid IL or missing references)
				//IL_0102: Unknown result type (might be due to invalid IL or missing references)
				//IL_0107: Unknown result type (might be due to invalid IL or missing references)
				//IL_010b: Unknown result type (might be due to invalid IL or missing references)
				//IL_0110: Unknown result type (might be due to invalid IL or missing references)
				//IL_0112: Unknown result type (might be due to invalid IL or missing references)
				//IL_0114: Unknown result type (might be due to invalid IL or missing references)
				//IL_011c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_0126: Unknown result type (might be due to invalid IL or missing references)
				//IL_012a: Unknown result type (might be due to invalid IL or missing references)
				//IL_012f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0136: Unknown result type (might be due to invalid IL or missing references)
				//IL_013b: Unknown result type (might be due to invalid IL or missing references)
				if (prevLink != null && !prevLink.isKinematic)
				{
					Vector3 position = prevLink.transform.position;
					float num = Vector3.Distance(newPos, position);
					if (Mathf.Abs(num - idealDistanceToPrev) > idealDistanceToPrev * 0.6f)
					{
						Vector3 val = newPos - position;
						Vector3 normalized = ((Vector3)(ref val)).normalized;
						Vector3 val2 = position + normalized * idealDistanceToPrev;
						newPos = Vector3.Lerp(newPos, val2, 0.3f);
					}
				}
				if (nextLink != null && !nextLink.isKinematic)
				{
					Vector3 position2 = nextLink.transform.position;
					float num2 = Vector3.Distance(newPos, position2);
					if (Mathf.Abs(num2 - idealDistanceToNext) > idealDistanceToNext * 0.6f)
					{
						Vector3 val3 = newPos - position2;
						Vector3 normalized2 = ((Vector3)(ref val3)).normalized;
						Vector3 val4 = position2 + normalized2 * idealDistanceToNext;
						newPos = Vector3.Lerp(newPos, val4, 0.3f);
					}
				}
				particlePos = newPos;
			}

			public void SetupConnectivity()
			{
				//IL_000f: Unknown result type (might be due to invalid IL or missing references)
				//IL_001a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0038: Unknown result type (might be due to invalid IL or missing references)
				//IL_0043: Unknown result type (might be due to invalid IL or missing references)
				if (prevLink != null)
				{
					idealDistanceToPrev = Vector3.Distance(baseLocalPos, prevLink.baseLocalPos);
				}
				if (nextLink != null)
				{
					idealDistanceToNext = Vector3.Distance(baseLocalPos, nextLink.baseLocalPos);
				}
			}

			private void EnforceKinematicConnectivity(ref Vector3 newPos)
			{
				//IL_0136: Unknown result type (might be due to invalid IL or missing references)
				//IL_013b: 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_002d: Unknown result type (might be due to invalid IL or missing references)
				//IL_002f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0034: Unknown result type (might be due to invalid IL or missing references)
				//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
				//IL_0054: Unknown result type (might be due to invalid IL or missing references)
				//IL_0059: 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_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_0068: Unknown result type (might be due to invalid IL or missing references)
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_0070: Unknown result type (might be due to invalid IL or missing references)
				//IL_0075: Unknown result type (might be due to invalid IL or missing references)
				//IL_007a: 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_008a: Unknown result type (might be due to invalid IL or missing references)
				//IL_008f: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
				//IL_0102: Unknown result type (might be due to invalid IL or missing references)
				//IL_0104: 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_010e: Unknown result type (might be due to invalid IL or missing references)
				//IL_0113: Unknown result type (might be due to invalid IL or missing references)
				//IL_0118: Unknown result type (might be due to invalid IL or missing references)
				//IL_011c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0121: Unknown result type (might be due to invalid IL or missing references)
				//IL_0128: Unknown result type (might be due to invalid IL or missing references)
				//IL_012d: Unknown result type (might be due to invalid IL or missing references)
				if (prevLink != null && prevLink.isKinematic)
				{
					Vector3 position = prevLink.transform.position;
					float num = Vector3.Distance(newPos, position);
					if (Mathf.Abs(num - idealDistanceToPrev) > 0.005f)
					{
						Vector3 val = newPos - position;
						Vector3 normalized = ((Vector3)(ref val)).normalized;
						Vector3 val2 = position + normalized * idealDistanceToPrev;
						newPos = Vector3.Lerp(newPos, val2, 0.95f);
					}
				}
				if (nextLink != null && nextLink.isKinematic)
				{
					Vector3 position2 = nextLink.transform.position;
					float num2 = Vector3.Distance(newPos, position2);
					if (Mathf.Abs(num2 - idealDistanceToNext) > 0.005f)
					{
						Vector3 val3 = newPos - position2;
						Vector3 normalized2 = ((Vector3)(ref val3)).normalized;
						Vector3 val4 = position2 + normalized2 * idealDistanceToNext;
						newPos = Vector3.Lerp(newPos, val4, 0.95f);
					}
				}
				particlePos = newPos;
			}
		}

		public int NumChambers = 17;

		public Transform[] ChamberModels;

		public FVRFireArmChamber[] Chambers;

		[HideInInspector]
		public Vector3[] ChamberPositions;

		[HideInInspector]
		public Quaternion[] ChamberRotations;

		public float LerpSpeed = 10f;

		private int m_curChamber = 0;

		private float[] m_lerpProgress;

		private int[] m_targetIndices;

		private float m_hammerLerp = 0f;

		public int CurrentChamberIndex = 0;

		public float CurrentLerpDuration = 0.1f;

		[Tooltip("The distance the particle is clamped to")]
		public float WaggleDistanceLimit = 0.15f;

		[Tooltip("Left angle limit for chain links")]
		public float WaggleAngleLimitLeft = 25f;

		[Tooltip("Right angle limit for chain links")]
		public float WaggleAngleLimitRight = 25f;

		[Tooltip("Multiplier for physics gravity affecting the particles")]
		public float WaggleGravityScale = 0.7f;

		[Tooltip("Pulls particles back to their hinge direction")]
		public bool WaggleUseSpring = true;

		[Tooltip("Rate at which particles approach the hinge direction (0.95 = 95% closer each second)")]
		public float WaggleSpringApproachRate = 0.8f;

		[Tooltip("Rate at which particles lose velocity (0.7 = 70% slower each second)")]
		public float WaggleDamping = 0.6f;

		private ChainLink[] m_chainLinks;

		private Vector3 m_lastPosition;

		private Quaternion m_lastRotation;

		private float m_movementAmount = 0f;

		private const float STABILITY_THRESHOLD = 0.002f;

		private bool m_isAdvancing = false;

		[Header("Audio Cue Settings")]
		[Tooltip("Velocity threshold for playing jingle sound")]
		public float JingleVelocityThreshold = 1.5f;

		[Tooltip("Minimum time between jingle sounds in seconds")]
		public float JingleCooldownTime = 0.7f;

		private float m_lastJingleTime = 0f;

		private FVRFireArm m_firearm;

		private Rigidbody m_firearmRb;

		[Tooltip("Enable or disable the jingle sound when the chain moves")]
		public bool EnableJingleSound = true;

		private void Awake()
		{
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0321: Unknown result type (might be due to invalid IL or missing references)
			//IL_0326: Unknown result type (might be due to invalid IL or missing references)
			//IL_0332: Unknown result type (might be due to invalid IL or missing references)
			//IL_0337: Unknown result type (might be due to invalid IL or missing references)
			if (ChamberModels == null || ChamberModels.Length != NumChambers || Chambers == null || Chambers.Length != NumChambers)
			{
				return;
			}
			ChamberPositions = (Vector3[])(object)new Vector3[NumChambers];
			ChamberRotations = (Quaternion[])(object)new Quaternion[NumChambers];
			for (int i = 0; i < NumChambers; i++)
			{
				ref Vector3 reference = ref ChamberPositions[i];
				reference = ChamberModels[i].localPosition;
				ref Quaternion reference2 = ref ChamberRotations[i];
				reference2 = ChamberModels[i].localRotation;
			}
			m_firearm = ((Component)this).GetComponentInParent<FVRFireArm>();
			if ((Object)(object)m_firearm != (Object)null)
			{
				m_firearmRb = ((Component)m_firearm).GetComponent<Rigidbody>();
			}
			m_lerpProgress = new float[NumChambers];
			m_targetIndices = new int[NumChambers];
			for (int j = 0; j < NumChambers; j++)
			{
				m_targetIndices[j] = j;
			}
			m_chainLinks = new ChainLink[NumChambers];
			for (int k = 0; k < NumChambers; k++)
			{
				m_chainLinks[k] = new ChainLink();
				m_chainLinks[k].transform = ChamberModels[k];
				m_chainLinks[k].distanceLimit = WaggleDistanceLimit;
				m_chainLinks[k].gravityScale = WaggleGravityScale;
				m_chainLinks[k].springRate = WaggleSpringApproachRate;
				m_chainLinks[k].damping = WaggleDamping;
				if (k == 4 || k == 14)
				{
					m_chainLinks[k].damping *= 1.2f;
					m_chainLinks[k].springRate *= 1.1f;
				}
				m_chainLinks[k].positionScale = 0.2f;
				m_chainLinks[k].Initialize();
			}
			for (int l = 0; l < NumChambers; l++)
			{
				int num = (l - 1 + NumChambers) % NumChambers;
				int num2 = (l + 1) % NumChambers;
				m_chainLinks[l].prevLink = m_chainLinks[num];
				m_chainLinks[l].nextLink = m_chainLinks[num2];
			}
			for (int m = 0; m < NumChambers; m++)
			{
				m_chainLinks[m].SetupConnectivity();
			}
			for (int n = 0; n < NumChambers; n++)
			{
				ChamberModels[n].localPosition = ChamberPositions[n];
				ChamberModels[n].localRotation = ChamberRotations[n];
			}
			DisableCollisionsBetweenLinks();
			m_lastPosition = ((Component)this).transform.position;
			m_lastRotation = ((Component)this).transform.rotation;
		}

		private void DisableCollisionsBetweenLinks()
		{
			List<Collider> list = new List<Collider>();
			Transform[] chamberModels = ChamberModels;
			foreach (Transform val in chamberModels)
			{
				Collider[] componentsInChildren = ((Component)val).GetComponentsInChildren<Collider>(true);
				if (componentsInChildren != null && componentsInChildren.Length > 0)
				{
					list.AddRange(componentsInChildren);
				}
			}
			if (list.Count <= 0)
			{
				return;
			}
			for (int j = 0; j < list.Count; j++)
			{
				if ((Object)(object)list[j] == (Object)null || !list[j].enabled)
				{
					continue;
				}
				for (int k = j + 1; k < list.Count; k++)
				{
					if (!((Object)(object)list[k] == (Object)null) && list[k].enabled)
					{
						Physics.IgnoreCollision(list[j], list[k], true);
					}
				}
			}
		}

		public void Advance()
		{
			m_isAdvancing = true;
			for (int i = 0; i < NumChambers; i++)
			{
				m_targetIndices[i] = (m_targetIndices[i] + 1) % NumChambers;
				m_lerpProgress[i] = 0f;
			}
		}

		public void StartAdvanceLerp()
		{
			m_isAdvancing = true;
			for (int i = 0; i < NumChambers; i++)
			{
				m_targetIndices[i] = (m_targetIndices[i] + 1) % NumChambers;
				m_lerpProgress[i] = 0f;
			}
		}

		public void SetHammerLerp(float lerp)
		{
			m_hammerLerp = lerp;
		}

		private float CalculateMovement()
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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)
			//IL_0082: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			float num = 0f;
			if ((Object)(object)m_firearmRb != (Object)null)
			{
				Vector3 velocity = m_firearmRb.velocity;
				num = ((Vector3)(ref velocity)).magnitude;
			}
			else if ((Object)(object)m_firearm != (Object)null)
			{
				num = Vector3.Distance(((Component)m_firearm).transform.position, m_lastPosition) / Mathf.Max(Time.deltaTime, 0.0001f);
				m_lastPosition = ((Component)m_firearm).transform.position;
			}
			else
			{
				num = Vector3.Distance(((Component)this).transform.position, m_lastPosition) / Mathf.Max(Time.deltaTime, 0.0001f);
				m_lastPosition = ((Component)this).transform.position;
			}
			float num2 = Quaternion.Angle(((Component)this).transform.rotation, m_lastRotation) / 90f;
			m_lastRotation = ((Component)this).transform.rotation;
			float num3 = Mathf.Max(num, num2 * 5f);
			m_movementAmount = Mathf.Lerp(m_movementAmount, num3, Time.deltaTime * 10f);
			CheckPlayJingleSound(m_movementAmount);
			return m_movementAmount;
		}

		private void CheckPlayJingleSound(float movement)
		{
			if (!EnableJingleSound || !((Object)(object)m_firearm != (Object)null) || !((FVRInteractiveObject)m_firearm).IsHeld || !(movement > JingleVelocityThreshold) || !(Time.time > m_lastJingleTime + JingleCooldownTime))
			{
				return;
			}
			try
			{
				if ((Object)(object)m_firearm != (Object)null && (Object)(object)m_firearm.AudioClipSet != (Object)null && m_firearm.AudioClipSet.BeltGrab != null && m_firearm.AudioClipSet.BeltGrab.Clips != null && m_firearm.AudioClipSet.BeltGrab.Clips.Count > 0)
				{
					m_firearm.PlayAudioEvent((FirearmAudioEventType)50, 1f);
					m_lastJingleTime = Time.time;
				}
			}
			catch (Exception)
			{
			}
		}

		private void UpdateKinematicLinks()
		{
			int num = -2;
			int num2 = 6;
			for (int i = 0; i < NumChambers; i++)
			{
				m_chainLinks[i].isKinematic = false;
			}
			for (int j = 0; j < num2; j++)
			{
				int num3 = (CurrentChamberIndex + num + j + NumChambers) % NumChambers;
				if (num3 >= 0 && num3 < NumChambers)
				{
					m_chainLinks[num3].isKinematic = true;
				}
			}
		}

		private void Update()
		{
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Unknown result type (might be due to invalid IL or missing references)
			//IL_0218: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_023d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0248: Unknown result type (might be due to invalid IL or missing references)
			//IL_024a: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e2: 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_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			float movementAmount = CalculateMovement();
			bool flag = true;
			for (int i = 0; i < NumChambers; i++)
			{
				if (m_lerpProgress[i] < 1f)
				{
					flag = false;
					break;
				}
			}
			if (flag)
			{
				m_isAdvancing = false;
			}
			if (m_hammerLerp > 0f && m_hammerLerp < 1f)
			{
				for (int j = 0; j < NumChambers; j++)
				{
					int num = m_targetIndices[j];
					int num2 = (m_targetIndices[j] + 1) % NumChambers;
					Vector3 val = Vector3.Lerp(ChamberPositions[num], ChamberPositions[num2], m_hammerLerp);
					Quaternion val2 = Quaternion.Slerp(ChamberRotations[num], ChamberRotations[num2], m_hammerLerp);
					ChamberModels[j].localPosition = val;
					ChamberModels[j].localRotation = val2;
					m_chainLinks[j].SetBasePosition(val, val2);
				}
			}
			else
			{
				for (int k = 0; k < NumChambers; k++)
				{
					if (m_lerpProgress[k] < 1f)
					{
						m_lerpProgress[k] += Time.deltaTime / ((!(CurrentLerpDuration > 0f)) ? 0.1f : CurrentLerpDuration);
						if (m_lerpProgress[k] > 1f)
						{
							m_lerpProgress[k] = 1f;
						}
					}
					int num3 = (m_targetIndices[k] + NumChambers - 1) % NumChambers;
					int num4 = m_targetIndices[k];
					Vector3 pos = Vector3.Lerp(ChamberPositions[num3], ChamberPositions[num4], m_lerpProgress[k]);
					Quaternion rot = Quaternion.Slerp(ChamberRotations[num3], ChamberRotations[num4], m_lerpProgress[k]);
					m_chainLinks[k].SetBasePosition(pos, rot);
				}
			}
			UpdateKinematicLinks();
			for (int l = 0; l < NumChambers; l++)
			{
				m_chainLinks[l].UpdatePhysics(Time.deltaTime, movementAmount, m_isAdvancing);
			}
		}
	}
	public class ChainEjectorRod : FVRInteractiveObject
	{
		public Chain ChainRevolver;

		public override void SimpleInteraction(FVRViveHand hand)
		{
			((FVRInteractiveObject)this).SimpleInteraction(hand);
			if ((Object)(object)ChainRevolver != (Object)null)
			{
				ChainRevolver.EjectPrevCylinder();
			}
		}
	}
}
public class CooldownSound : MonoBehaviour
{
	public ClosedBoltWeapon weapon;

	public AudioClip[] audioClips;

	public float volume = 1f;

	public int minShots = 5;

	public int maxShots = 10;

	public float minDelay = 0.5f;

	public float maxDelay = 2f;

	public float resetTime = 1.5f;

	private AudioSource audioSource;

	private int shotCounter = 0;

	private float lastShotTime;

	private bool lastRoundSpent;

	private int nextShotThreshold;

	private bool isPlayingSound = false;

	private void Start()
	{
		if ((Object)(object)weapon == (Object)null)
		{
			weapon = ((Component)this).GetComponent<ClosedBoltWeapon>();
		}
		if ((Object)(object)weapon == (Object)null)
		{
			Debug.LogError((object)"CooldownSound: Weapon reference is missing. Attach this script to a ClosedBoltWeapon.");
			return;
		}
		audioSource = ((Component)weapon).gameObject.GetComponent<AudioSource>();
		if ((Object)(object)audioSource == (Object)null)
		{
			audioSource = ((Component)weapon).gameObject.AddComponent<AudioSource>();
		}
		audioSource.spatialBlend = 1f;
		audioSource.playOnAwake = false;
		audioSource.rolloffMode = (AudioRolloffMode)0;
		lastRoundSpent = weapon.Chamber.IsSpent;
		SetNewShotThreshold();
	}

	private void Update()
	{
		DetectFiring();
	}

	private void DetectFiring()
	{
		if (weapon.Chamber.IsFull && weapon.Chamber.IsSpent && !lastRoundSpent)
		{
			OnWeaponFired();
		}
		lastRoundSpent = weapon.Chamber.IsSpent;
	}

	private void OnWeaponFired()
	{
		float num = Time.time - lastShotTime;
		if (num > resetTime)
		{
			shotCounter = 0;
			SetNewShotThreshold();
		}
		shotCounter++;
		lastShotTime = Time.time;
		if (shotCounter >= nextShotThreshold)
		{
			((MonoBehaviour)this).StartCoroutine(PlaySoundWithDelay());
			shotCounter = 0;
			SetNewShotThreshold();
		}
	}

	private IEnumerator PlaySoundWithDelay()
	{
		if (!isPlayingSound)
		{
			isPlayingSound = true;
			float delay = Random.Range(minDelay, maxDelay);
			yield return (object)new WaitForSeconds(delay);
			if (audioClips.Length > 0)
			{
				int index = Random.Range(0, audioClips.Length);
				audioSource.clip = audioClips[index];
				audioSource.PlayOneShot(audioSource.clip, volume);
				yield return (object)new WaitForSeconds(audioSource.clip.length);
			}
			isPlayingSound = false;
		}
	}

	private void SetNewShotThreshold()
	{
		nextShotThreshold = Random.Range(minShots, maxShots + 1);
	}
}
public class CustomWaggleJoint : MonoBehaviour
{
	public float distanceLimit = 0.25f;

	public float angleLimitLeft = 45f;

	public float angleLimitRight = 45f;

	public float gravityScale = 1f;

	public bool useSpring;

	public float springApproachRate = 0.95f;

	public float damping;

	public Transform hingeGraphic;

	public Vector3 hingeGraphicRotationOffset;

	public bool invertWaggleAxis;

	public bool ManualExecution;

	public float onHitLimitCooldown = 0.05f;

	public Vector3 waggleAxis = Vector3.up;

	public Vector3 rotationAxis = Vector3.up;

	[Header("Gizmo Options")]
	public bool debugGizmos = false;

	public bool showRotationExtremes = false;

	public bool showRotationDirectionArrows = false;

	private Vector3 particlePos;

	private Vector3 particleVel;

	private bool leftCatchState;

	private bool rightCatchState;

	private float lastTouchTime = float.MinValue;

	private Vector3 EffectiveWaggleDir()
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: 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_002d: 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)
		return ((Component)this).transform.TransformDirection((!invertWaggleAxis) ? waggleAxis : (-waggleAxis));
	}

	private void GetEffectiveAngleLimits(out float effectiveAngleMin, out float effectiveAngleMax)
	{
		if (invertWaggleAxis)
		{
			effectiveAngleMin = 0f - angleLimitLeft;
			effectiveAngleMax = angleLimitRight;
		}
		else
		{
			effectiveAngleMin = 0f - angleLimitRight;
			effectiveAngleMax = angleLimitLeft;
		}
	}

	public void ResetParticlePos()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//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_0023: 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_002e: Unknown result type (might be due to invalid IL or missing references)
		particlePos = ((Component)this).transform.position + EffectiveWaggleDir() * distanceLimit;
		particleVel = Vector3.zero;
	}

	private void OnHitLimit(float angularVelocity)
	{
	}

	public void Execute()
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//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_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_0027: 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_0043: 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)
		//IL_004a: 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_0055: 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_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_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: 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)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f0: 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_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0141: Unknown result type (might be due to invalid IL or missing references)
		float deltaTime = Time.deltaTime;
		Transform transform = ((Component)this).transform;
		Vector3 val = Physics.gravity * gravityScale;
		Vector3 val2 = particlePos;
		Vector3 val3 = particleVel * Mathf.Pow(1f - damping, deltaTime) + val * deltaTime;
		Vector3 val4 = val2 + val3 * deltaTime;
		Vector3 val5 = transform.TransformDirection(((Vector3)(ref rotationAxis)).normalized);
		Vector3 val6 = EffectiveWaggleDir();
		Vector3 position = transform.position;
		if (useSpring)
		{
			val4 = Vector3.Lerp(val4, position + val6 * distanceLimit, 1f - Mathf.Pow(1f - springApproachRate, deltaTime));
		}
		GetEffectiveAngleLimits(out var effectiveAngleMin, out var effectiveAngleMax);
		particlePos = ProjectOnHinge(val4, position, val5, val6, distanceLimit, effectiveAngleMin, effectiveAngleMax);
		particleVel = (particlePos - val2) / deltaTime;
		if ((Object)(object)hingeGraphic != (Object)null)
		{
			hingeGraphic.rotation = Quaternion.LookRotation(particlePos - transform.position, val5) * Quaternion.Euler(hingeGraphicRotationOffset);
		}
	}

	private Vector3 ProjectOnHinge(Vector3 point, Vector3 hingePivot, Vector3 hingeAxis, Vector3 hingeDirection, float distanceLimit, float angleMin, float angleMax)
	{
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0004: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: Unknown result type (might be due to invalid IL or missing references)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: 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_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: 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)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		float num = ToHingeAngle(point, hingePivot, hingeAxis, hingeDirection);
		num = Mathf.Clamp(num, angleMin, angleMax);
		Vector3 val = Quaternion.AngleAxis(num, hingeAxis) * hingeDirection;
		return val * distanceLimit + hingePivot;
	}

	private float ToHingeAngle(Vector3 point, Vector3 hingePivot, Vector3 hingeAxis, Vector3 hingeDirection)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: 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_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: 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)
		//IL_001d: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = point - hingePivot;
		Vector3 val2 = Vector3.ProjectOnPlane(val, hingeAxis);
		Vector3 normalized = ((Vector3)(ref val2)).normalized;
		return SignedAngle(hingeDirection, normalized, hingeAxis);
	}

	private float SignedAngle(Vector3 from, Vector3 to, Vector3 axis)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: 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)
		float num = Vector3.Angle(from, to);
		return num * Mathf.Sign(Vector3.Dot(axis, Vector3.Cross(from, to)));
	}

	private void Start()
	{
		ResetParticlePos();
	}

	private void Update()
	{
		if (!ManualExecution)
		{
			Execute();
		}
	}

	private void OnDrawGizmosSelected()
	{
		//IL_002e: 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_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0055: 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_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d7: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_010c: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		//IL_0121: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: Unknown result type (might be due to invalid IL or missing references)
		//IL_0127: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		//IL_0137: Unknown result type (might be due to invalid IL or missing references)
		//IL_013c: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0147: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_0153: Unknown result type (might be due to invalid IL or missing references)
		//IL_0154: Unknown result type (might be due to invalid IL or missing references)
		//IL_015c: 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_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Unknown result type (might be due to invalid IL or missing references)
		//IL_0173: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0182: Unknown result type (might be due to invalid IL or missing references)
		//IL_018c: Unknown result type (might be due to invalid IL or missing references)
		//IL_018d: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01da: Unknown result type (might be due to invalid IL or missing references)
		//IL_01df: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0202: Unknown result type (might be due to invalid IL or missing references)
		//IL_0207: 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_0212: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		//IL_021e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0229: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0235: Unknown result type (might be due to invalid IL or missing references)
		//IL_023a: Unknown result type (might be due to invalid IL or missing references)
		//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_024c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0251: Unknown result type (might be due to invalid IL or missing references)
		if (debugGizmos && !((Object)(object)Selection.activeGameObject != (Object)(object)((Component)this).gameObject))
		{
			Transform transform = ((Component)this).transform;
			Vector3 position = transform.position;
			Vector3 val = EffectiveWaggleDir();
			Vector3 val2 = transform.TransformDirection(((Vector3)(ref rotationAxis)).normalized);
			Vector3 val3 = position + val * distanceLimit;
			Gizmos.color = Color.white;
			float num = 0.01f;
			Gizmos.DrawLine(position + Vector3.left * num, position + Vector3.right * num);
			Gizmos.DrawLine(position + Vector3.up * num, position + Vector3.down * num);
			Gizmos.DrawLine(position + Vector3.forward * num, position + Vector3.back * num);
			Handles.BeginGUI();
			Handles.Label(position, "Pivot");
			Handles.EndGUI();
			Gizmos.color = Color.green;
			Gizmos.DrawLine(position, val3);
			GetEffectiveAngleLimits(out var effectiveAngleMin, out var effectiveAngleMax);
			Vector3 val4 = Quaternion.AngleAxis(effectiveAngleMax, val2) * val;
			Vector3 val5 = Quaternion.AngleAxis(effectiveAngleMin, val2) * val;
			Vector3 val6 = position + val4 * distanceLimit;
			Vector3 val7 = position + val5 * distanceLimit;
			Gizmos.color = Color.cyan;
			Gizmos.DrawLine(position, val6);
			Gizmos.DrawLine(position, val7);
			Handles.color = Color.yellow;
			Handles.DrawWireArc(position, val2, val5, effectiveAngleMax - effectiveAngleMin, distanceLimit * 0.5f);
			if (Application.isPlaying)
			{
				Gizmos.color = Color.red;
				float num2 = 0.01f;
				Gizmos.DrawLine(particlePos + Vector3.left * num2, particlePos + Vector3.right * num2);
				Gizmos.DrawLine(particlePos + Vector3.up * num2, particlePos + Vector3.down * num2);
				Gizmos.DrawLine(particlePos + Vector3.forward * num2, particlePos + Vector3.back * num2);
			}
		}
	}
}
namespace BitWizrd.RevolverMod
{
	public class DoubleActionEjectorRod : FVRInteractiveObject
	{
		public DoubleActionLoadingGateRevolver revolver;
	}
	public class DoubleActionLoadingGateEjectorRod : FVRInteractiveObject
	{
		public DoubleActionLoadingGateRevolver Revolver;

		public override void SimpleInteraction(FVRViveHand hand)
		{
			((FVRInteractiveObject)this).SimpleInteraction(hand);
			Revolver.EjectPrevCylinder();
		}
	}
	public class DoubleActionLoadingGateRevolver : FVRFireArm
	{
		[Header("Single Action Revolver")]
		public bool AllowsSuppressor;

		public Transform Hammer;

		public Transform LoadingGate;

		public Transform Trigger;

		public Transform EjectorRod;

		public SingleActionRevolverCylinder Cylinder;

		public Transform HammerFanDir;

		private int m_curChamber;

		private float m_curChamberLerp;

		private float m_tarChamberLerp;

		[Header("Component Movement Params")]
		public float Hammer_Rot_Uncocked;

		public float Hammer_Rot_Halfcocked;

		public float Hammer_Rot_Cocked;

		public float LoadingGate_Rot_Closed;

		public float LoadingGate_Rot_Open;

		public float Trigger_Rot_Forward;

		public float Trigger_Rot_Rearward;

		public Vector3 EjectorRod_Pos_Forward;

		public Vector3 EjectorRod_Pos_Rearward;

		public bool DoesCylinderTranslateForward;

		public bool IsAccessTwoChambersBack;

		public Vector3 CylinderBackPos;

		public Vector3 CylinderFrontPos;

		[Header("Spinning Config")]
		public Transform PoseSpinHolder;

		public bool CanSpin = true;

		private bool m_isSpinning;

		[Header("StateToggling")]
		public bool StateToggles = true;

		private bool m_isStateToggled;

		public Transform Pose_Main;

		public Transform Pose_Toggled;

		public float TriggerThreshold = 0.9f;

		private float m_triggerFloat;

		private bool m_isHammerCocking;

		private bool m_isHammerCocked;

		private float m_hammerCockLerp;

		private float m_hammerCockSpeed = 10f;

		private float xSpinRot;

		private float xSpinVel;

		private float timeSinceColFire;

		[Header("DoubleAction Config")]
		private float m_tarTriggerFloat;

		private float m_tarRealTriggerFloat;

		private float m_triggerCurrentRot;

		private float m_curTriggerFloat;

		private float m_curRealTriggerFloat;

		private float lastTriggerRot;

		private RecockingState m_recockingState;

		private float m_recockingLerp;

		private bool m_shouldRecock;

		private bool DoesFiringRecock;

		private bool m_hasTriggerCycled;

		public bool CanManuallyCockHammer;

		private bool m_isHammerLocked;

		private float m_hammerCurrentRot;

		private Vector2 RecockingSpeeds = new Vector2(8f, 3f);

		public Transform RecockingPiece;

		public Transform RecockingPoint_Forward;

		public Transform RecockingPoint_Rearward;

		public float ejectedRoundOffset;

		public bool doesToggleStateHalfRotatesCylinder;

		public int CurChamber
		{
			get
			{
				return m_curChamber;
			}
			set
			{
				m_curChamber = value % Cylinder.NumChambers;
			}
		}

		public int NextChamber => (m_curChamber + 1) % Cylinder.NumChambers;

		public int PrevChamber
		{
			get
			{
				int num = m_curChamber - 1;
				return (num >= 0) ? num : (Cylinder.NumChambers - 1);
			}
		}

		public int PrevChamber2
		{
			get
			{
				int num = m_curChamber - 2;
				return (num >= 0) ? num : (Cylinder.NumChambers + num);
			}
		}

		public override void Awake()
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).Awake();
			FVRFireArmChamber[] chambers = Cylinder.Chambers;
			foreach (FVRFireArmChamber item in chambers)
			{
				base.FChambers.Add(item);
			}
			if ((Object)(object)((FVRInteractiveObject)this).PoseOverride_Touch != (Object)null)
			{
				Pose_Main.localPosition = ((FVRInteractiveObject)this).PoseOverride_Touch.localPosition;
				Pose_Main.localRotation = ((FVRInteractiveObject)this).PoseOverride_Touch.localRotation;
			}
		}

		public override void BeginInteraction(FVRViveHand hand)
		{
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: 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)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).BeginInteraction(hand);
			if (((FVRPhysicalObject)this).IsAltHeld)
			{
				return;
			}
			if (!m_isStateToggled)
			{
				((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Main.localPosition;
				((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Main.localRotation;
				if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
				{
					((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Main.localPosition;
					((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Main.localRotation;
				}
			}
			else
			{
				((FVRInteractiveObject)this).PoseOverride.localPosition = Pose_Toggled.localPosition;
				((FVRInteractiveObject)this).PoseOverride.localRotation = Pose_Toggled.localRotation;
				if ((Object)(object)((FVRInteractiveObject)this).m_grabPointTransform != (Object)null)
				{
					((FVRInteractiveObject)this).m_grabPointTransform.localPosition = Pose_Toggled.localPosition;
					((FVRInteractiveObject)this).m_grabPointTransform.localRotation = Pose_Toggled.localRotation;
				}
			}
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			((FVRPhysicalObject)this).UpdateInteraction(hand);
			m_isSpinning = false;
			if (!((FVRPhysicalObject)this).IsAltHeld)
			{
				if (!m_isStateToggled)
				{
					if (hand.Input.TouchpadPressed && !hand.IsInStreamlinedMode && (double)Vector2.Angle(hand.Input.TouchpadAxes, Vector2.up) < 45.0)
					{
						m_isSpinning = true;
					}
					if (hand.IsInStreamlinedMode)
					{
						if (hand.Input.BYButtonDown && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
						}
					}
					else if (hand.Input.TouchpadDown && (double)Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) < 45.0 && StateToggles)
					{
						ToggleState();
						((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
					}
				}
				else
				{
					if (hand.IsInStreamlinedMode)
					{
						if (hand.Input.AXButtonDown)
						{
							AdvanceCylinder();
						}
						if (hand.Input.BYButtonDown && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)17, 1f);
						}
					}
					else if (hand.Input.TouchpadDown)
					{
						if ((double)Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) < 45.0 && StateToggles)
						{
							ToggleState();
							((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)18, 1f);
						}
						else if ((double)Vector2.Angle(hand.Input.TouchpadAxes, Vector2.right) < 45.0)
						{
							AdvanceCylinder();
						}
					}
					if (hand.Input.TriggerDown)
					{
						EjectPrevCylinder();
					}
				}
			}
			UpdateTriggerHammer();
			UpdateCylinderRot();
			UpdateCylinderRelease();
			if (!((FVRInteractiveObject)this).IsHeld)
			{
				m_isSpinning = false;
			}
		}

		public override void EndInteraction(FVRViveHand hand)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			m_triggerFloat = 0f;
			((FVRFireArm)this).EndInteraction(hand);
			((FVRPhysicalObject)this).RootRigidbody.AddRelativeTorque(new Vector3(xSpinVel, 0f, 0f), (ForceMode)1);
		}

		public override void FVRFixedUpdate()
		{
			UpdateSpinning();
			if ((double)timeSinceColFire < 3.0)
			{
				timeSinceColFire += Time.deltaTime;
			}
			((FVRFireArm)this).FVRFixedUpdate();
			UpdateRecocking();
		}

		private void UpdateRecocking()
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Invalid comparison between Unknown and I4
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Invalid comparison between Unknown and I4
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			RecockingState recockingState = m_recockingState;
			if ((int)recockingState != 1)
			{
				if ((int)recockingState == 2)
				{
					m_recockingLerp -= Time.deltaTime * RecockingSpeeds.y;
					if ((double)m_recockingLerp <= 0.0)
					{
						m_recockingState = (RecockingState)0;
					}
					m_recockingLerp = Mathf.Clamp(m_recockingLerp, 0f, 1f);
					RecockingPiece.position = Vector3.Lerp(RecockingPoint_Forward.position, RecockingPoint_Rearward.position, m_recockingLerp);
				}
			}
			else
			{
				m_recockingLerp += Time.deltaTime * RecockingSpeeds.x;
				if ((double)m_recockingLerp >= 1.0)
				{
					m_recockingState = (RecockingState)2;
					m_isHammerLocked = true;
				}
				m_recockingLerp = Mathf.Clamp(m_recockingLerp, 0f, 1f);
				RecockingPiece.position = Vector3.Lerp(RecockingPoint_Forward.position, RecockingPoint_Rearward.position, m_recockingLerp);
			}
		}

		private void InitiateRecock()
		{
			//IL_0002: 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)
			if ((int)m_recockingState == 0)
			{
				m_recockingLerp = 0f;
				m_recockingState = (RecockingState)1;
			}
		}

		private void UpdateTriggerHammer()
		{
			//IL_0054: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: 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)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_024b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0523: Unknown result type (might be due to invalid IL or missing references)
			//IL_057b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0561: Unknown result type (might be due to invalid IL or missing references)
			//IL_0379: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0400: Unknown result type (might be due to invalid IL or missing references)
			if (((FVRInteractiveObject)this).IsHeld && !m_isStateToggled && !m_isHammerCocked && !m_isHammerCocking && (Object)(object)((FVRInteractiveObject)this).m_hand.OtherHand != (Object)null)
			{
				Vector3 velLinearWorld = ((FVRInteractiveObject)this).m_hand.OtherHand.Input.VelLinearWorld;
				if (Vector3.Distance(((FVRInteractiveObject)this).m_hand.OtherHand.PalmTransform.position, HammerFanDir.position) < 0.15f && Vector3.Angle(velLinearWorld, HammerFanDir.forward) < 60f && ((Vector3)(ref velLinearWorld)).magnitude > 1f)
				{
					CockHammer(10f);
				}
			}
			if (((FVRInteractiveObject)this).m_hasTriggeredUpSinceBegin && !m_isSpinning && !m_isStateToggled)
			{
				m_tarTriggerFloat = ((FVRInteractiveObject)this).m_hand.Input.TriggerFloat;
				m_tarRealTriggerFloat = ((FVRInteractiveObject)this).m_hand.Input.TriggerFloat;
			}
			else
			{
				m_tarTriggerFloat = 0f;
				m_tarRealTriggerFloat = 0f;
			}
			if (m_isHammerLocked)
			{
				m_tarTriggerFloat += 0.8f;
				m_triggerCurrentRot = Mathf.Lerp(Trigger_Rot_Forward, Trigger_Rot_Rearward, m_curTriggerFloat);
			}
			else
			{
				m_triggerCurrentRot = Mathf.Lerp(Trigger_Rot_Forward, Trigger_Rot_Rearward, m_curTriggerFloat);
			}
			m_curTriggerFloat = Mathf.MoveTowards(m_curTriggerFloat, m_tarTriggerFloat, Time.deltaTime * 14f);
			m_curRealTriggerFloat = Mathf.MoveTowards(m_curRealTriggerFloat, m_tarRealTriggerFloat, Time.deltaTime * 14f);
			if (DoesCylinderTranslateForward)
			{
				((Component)Cylinder).transform.localPosition = Vector3.Lerp(CylinderBackPos, CylinderFrontPos, m_curTriggerFloat);
			}
			if (Mathf.Abs(m_triggerCurrentRot - lastTriggerRot) > 0.01f && (Object)(object)Trigger != (Object)null)
			{
				Trigger.localEulerAngles = new Vector3(m_triggerCurrentRot, 0f, 0f);
			}
			lastTriggerRot = m_triggerCurrentRot;
			if (m_shouldRecock)
			{
				m_shouldRecock = false;
				InitiateRecock();
			}
			if (!m_hasTriggerCycled && !DoesFiringRecock)
			{
				bool flag = false;
				if (DoesFiringRecock && (int)m_recockingState != 0)
				{
					flag = true;
				}
				if (!flag && m_curTriggerFloat >= 0.98f && !((FVRInteractiveObject)this).m_hand.Input.TouchpadPressed)
				{
					if (!m_isStateToggled)
					{
						m_hasTriggerCycled = true;
						m_isHammerLocked = false;
						CurChamber++;
						m_curChamberLerp = 0f;
						m_tarChamberLerp = 0f;
						((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
						Fire();
						if (DoesFiringRecock)
						{
							m_shouldRecock = true;
						}
					}
				}
				else if (m_curTriggerFloat <= 0.08f && !m_isHammerLocked && CanManuallyCockHammer)
				{
					bool flag2 = false;
					if (DoesFiringRecock && (int)m_recockingState != 0)
					{
						flag2 = true;
					}
					if (!((FVRPhysicalObject)this).IsAltHeld && !flag2 && !m_isStateToggled)
					{
						if (((FVRInteractiveObject)this).m_hand.IsInStreamlinedMode)
						{
							if (((FVRInteractiveObject)this).m_hand.Input.AXButtonDown)
							{
								CockHammer(5f);
							}
						}
						else if (((FVRInteractiveObject)this).m_hand.Input.TouchpadDown && Vector2.Angle(((FVRInteractiveObject)this).m_hand.Input.TouchpadAxes, Vector2.down) < 45f)
						{
							CockHammer(5f);
						}
					}
				}
			}
			else if (m_hasTriggerCycled && m_curRealTriggerFloat <= 0.08f)
			{
				m_hasTriggerCycled = false;
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)16, 1f);
			}
			m_hammerCurrentRot = (m_hasTriggerCycled ? (m_isHammerLocked ? Mathf.Lerp(m_hammerCurrentRot, Hammer_Rot_Cocked, Time.deltaTime * 10f) : Mathf.Lerp(m_hammerCurrentRot, Hammer_Rot_Uncocked, Time.deltaTime * 30f)) : (m_isHammerLocked ? Mathf.Lerp(m_hammerCurrentRot, Hammer_Rot_Cocked, Time.deltaTime * 10f) : Mathf.Lerp(Hammer_Rot_Uncocked, Hammer_Rot_Cocked, m_curTriggerFloat)));
			if ((Object)(object)Hammer != (Object)null)
			{
				Hammer.localEulerAngles = new Vector3(m_hammerCurrentRot, 0f, 0f);
			}
			if ((Object)(object)LoadingGate != (Object)null)
			{
				LoadingGate.localEulerAngles = ((!m_isStateToggled) ? new Vector3(0f, 0f, LoadingGate_Rot_Closed) : new Vector3(0f, 0f, LoadingGate_Rot_Open));
			}
		}

		private void UpdateCylinderRelease()
		{
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)