Decompiled source of HuntTenPaces v1.0.1

HuntTenPaces.dll

Decompiled 3 days ago
using System;
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 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.HuntTenPaces
{
	[BepInPlugin("BitWizrd.HuntTenPaces", "HuntTenPaces", "1.0.1")]
	[BepInProcess("h3vr.exe")]
	[Description("Built with MeatKit")]
	[BepInDependency("h3vr.otherloader", "1.3.0")]
	public class HuntTenPacesPlugin : 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.HuntTenPaces");
			OtherLoader.RegisterDirectLoad(BasePath, "BitWizrd.HuntTenPaces", "", "ten paces", "", "");
		}
	}
}
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 Lemat : BreakActionWeapon
	{
		public enum FireMode
		{
			Revolver,
			Shotgun
		}

		[Header("Shotgun Hinge Setup")]
		public HingeJoint hinge;

		public float hingeLimit = 45f;

		public float hingeEjectLimit = 30f;

		[Header("Lemat Mode (Default Revolver)")]
		public FireMode CurrentMode = FireMode.Revolver;

		[Header("Barrels & Chambers")]
		public Transform RevolverMuzzle;

		public Transform ShotgunMuzzle;

		public FVRFireArmChamber ShotgunChamber;

		[Header("Shotgun Ejection")]
		public float ShotgunEjectOffset = -0.06f;

		public float ShotgunEjectSpeed = -2.5f;

		[Header("Selector Pin")]
		public Transform FireSelectorPin;

		public Vector3 RevolverPinRotation = Vector3.zero;

		public Vector3 ShotgunPinRotation = new Vector3(90f, 0f, 0f);

		[Header("Revolver Cylinder")]
		public SingleActionRevolverCylinder Cylinder;

		[Header("Revolver Mechanics")]
		public Transform Hammer;

		public Transform LoadingGate;

		public Transform Trigger;

		[Tooltip("Trigger rotates on X-axis.")]
		public float Trigger_Rot_Forward = 0f;

		public float Trigger_Rot_Rearward = 25f;

		private bool hasTriggeredUpSinceBegin = false;

		[Tooltip("Rotate revolve gate around Z-axis.")]
		public float LoadingGate_Rot_Closed = 0f;

		public float LoadingGate_Rot_Open = 40f;

		[Tooltip("Revolver hammer angles (X-axis).")]
		public float Hammer_Rot_Uncocked_Revolver = 0f;

		public float Hammer_Rot_Cocked_Revolver = 30f;

		[Tooltip("Shotgun hammer angles (X-axis).")]
		public float Hammer_Rot_Uncocked_Shotgun = 0f;

		public float Hammer_Rot_Cocked_Shotgun = 30f;

		[Tooltip("Revolver hammer angle for half-cock (X-axis).")]
		public float Hammer_Rot_Halfcock_Revolver = 15f;

		[Tooltip("Trigger threshold to fire.")]
		public float TriggerThreshold = 0.9f;

		[Header("Cylinder Mechanics (Classic Single-Action)")]
		public bool DoesCylinderTranslateForward;

		public bool DoesHalfCockHalfRotCylinder;

		public bool HasTransferBarSafety;

		public bool IsAccessTwoChambersBack;

		public Vector3 CylinderBackPos;

		public Vector3 CylinderFrontPos;

		[Header("Optional Spin Feature (Revolver Only)")]
		public Transform PoseSpinHolder;

		public bool CanSpin = true;

		[Tooltip("Allows revolve gate toggling (half-cock).")]
		public bool StateToggles = true;

		[Header("Revolver Muzzle Effects")]
		public int RevolverMuzzleFireIndex = 0;

		public int RevolverMuzzleSmokeIndex = 1;

		public int RevolverGasOutIndex = 2;

		[Header("Shotgun Muzzle Effects")]
		public int ShotgunMuzzleFireIndex = 0;

		public int ShotgunMuzzleSmokeIndex = 1;

		public int ShotgunGasOutIndex = 2;

		[Header("Revolver Pose Toggling (like SingleActionRevolver)")]
		public Transform Pose_Main;

		public Transform Pose_Toggled;

		public bool StateTogglesPose = true;

		[Header("LematMk2-Style Audio / Recoil")]
		public FVRFireArmRecoilProfile ShotgunRecoilProfile;

		[Header("Fanning")]
		public bool CanFan = true;

		public Transform HammerFanDir;

		public float FanDistance = 0.15f;

		public float FanAngle = 60f;

		public float FanVelocityThreshold = 1f;

		[Header("Foregrip Reference")]
		public LematForegrip ForegripRef;

		[Header("Shotgun Ammo Type")]
		public FireArmRoundType ShotgunRoundType = (FireArmRoundType)21;

		private FireArmRoundType m_originalRoundType;

		private bool m_hasInitializedRoundTypes = false;

		private bool _inputsBlocked = false;

		private bool m_isGateOpen;

		public bool m_isShotgunOpen;

		public bool foregripLatch;

		private bool m_isHammerCocked;

		private bool m_isHammerCocking;

		private float m_hammerCockLerp;

		private float m_hammerCockSpeed = 10f;

		private float Hammer_Rot_Uncocked;

		private float Hammer_Rot_Cocked;

		private int m_curChamber;

		private float m_curChamberLerp;

		private float m_tarChamberLerp;

		private float timeSinceColFire = 999f;

		private bool m_isSpinning;

		private float xSpinRot;

		private float xSpinVel;

		private bool mWasShotgunChamberFull;

		private bool mToggleDebounce;

		private Vector3 m_TargetSelectorRotation;

		private float m_SelectorPinSpeed = 10f;

		private bool mLemat_HasUnlockedBreak;

		private bool mLemat_HasEjectedThisOpen;

		private Vector3 m_HingeStartPos;

		public bool m_IsLatchHeldOpen;

		public bool TriggerReset = true;

		private float prevTriggerFloat = 0f;

		private bool m_isStateToggled = false;

		private List<FVRFireArmChamber> m_allChambers = new List<FVRFireArmChamber>();

		private bool m_isFilteringChambers = false;

		private FireArmRoundType? m_lastFilteredType = null;

		private FireArmRoundType m_savedRoundType;

		public int CurChamber
		{
			get
			{
				return m_curChamber;
			}
			set
			{
				m_curChamber = value % 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_000f: 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_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013d: 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_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a9: Unknown result type (might be due to invalid IL or missing references)
			if (!m_hasInitializedRoundTypes)
			{
				m_originalRoundType = ((FVRFireArm)this).RoundType;
				m_hasInitializedRoundTypes = true;
			}
			((BreakActionWeapon)this).Awake();
			((BreakActionWeapon)this).SetHasLatchButton(false);
			((FVRFireArm)this).FChambers = new List<FVRFireArmChamber>();
			if ((Object)(object)Cylinder != (Object)null && Cylinder.Chambers != null)
			{
				FVRFireArmChamber[] chambers = Cylinder.Chambers;
				foreach (FVRFireArmChamber val in chambers)
				{
					if ((Object)(object)val != (Object)null)
					{
						val.Firearm = (FVRFireArm)(object)this;
						((FVRFireArm)this).FChambers.Add(val);
					}
				}
			}
			if ((Object)(object)ShotgunChamber != (Object)null)
			{
				ShotgunChamber.Firearm = (FVRFireArm)(object)this;
				ShotgunChamber.RoundType = ShotgunRoundType;
				if (!((FVRFireArm)this).FChambers.Contains(ShotgunChamber))
				{
					((FVRFireArm)this).FChambers.Add(ShotgunChamber);
				}
			}
			m_allChambers.Clear();
			m_allChambers.AddRange(((FVRFireArm)this).FChambers);
			CurrentMode = FireMode.Revolver;
			Hammer_Rot_Uncocked = Hammer_Rot_Uncocked_Revolver;
			Hammer_Rot_Cocked = Hammer_Rot_Cocked_Revolver;
			m_TargetSelectorRotation = RevolverPinRotation;
			if ((Object)(object)FireSelectorPin != (Object)null)
			{
				FireSelectorPin.localEulerAngles = RevolverPinRotation;
			}
			m_IsLatchHeldOpen = false;
			m_isShotgunOpen = false;
			mLemat_HasUnlockedBreak = false;
			mLemat_HasEjectedThisOpen = false;
			((BreakActionWeapon)this).SetIsExternallyUnlatched(false);
			if ((Object)(object)hinge != (Object)null)
			{
				m_HingeStartPos = ((Component)hinge).transform.localPosition;
			}
		}

		public override void BeginInteraction(FVRViveHand hand)
		{
			((FVRFireArm)this).BeginInteraction(hand);
			if ((Object)(object)hand != (Object)null && hand.Input.TriggerFloat <= 0.45f)
			{
				hasTriggeredUpSinceBegin = true;
			}
			else
			{
				hasTriggeredUpSinceBegin = false;
			}
		}

		public override Transform GetMuzzle()
		{
			return (CurrentMode != 0) ? ShotgunMuzzle : RevolverMuzzle;
		}

		private void FireMuzzleFire(int index)
		{
			((FVRFireArm)this).FireMuzzleSmoke(index);
		}

		public void Fire()
		{
			if ((CurrentMode == FireMode.Revolver && m_isGateOpen) || (CurrentMode == FireMode.Shotgun && m_isShotgunOpen))
			{
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
			}
			else if (CurrentMode == FireMode.Revolver)
			{
				if ((Object)(object)Cylinder == (Object)null || Cylinder.Chambers == null || Cylinder.NumChambers == 0)
				{
					((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
					return;
				}
				FVRFireArmChamber val = Cylinder.Chambers[m_curChamber];
				if ((Object)(object)val == (Object)null || !val.IsFull || val.IsSpent || (Object)(object)val.GetRound() == (Object)null)
				{
					((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
				}
				else if (val.Fire())
				{
					FVRFireArmRound round = val.GetRound();
					((FVRFireArm)this).Fire(val, ((FVRFireArm)this).GetMuzzle(), true, 1f, -1f);
					FireMuzzleFire(RevolverMuzzleFireIndex);
					((FVRFireArm)this).FireMuzzleSmoke(RevolverMuzzleSmokeIndex);
					((FVRFireArm)this).AddGas(RevolverGasOutIndex);
					((FVRFireArm)this).Recoil(((FVRFireArm)this).IsTwoHandStabilized(), (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null, ((FVRFireArm)this).IsShoulderStabilized(), (FVRFireArmRecoilProfile)null, 1f);
					HandleRoundDischarge(val, round);
				}
			}
			else if ((Object)(object)ShotgunChamber == (Object)null || !ShotgunChamber.IsFull || ShotgunChamber.IsSpent || (Object)(object)ShotgunChamber.GetRound() == (Object)null)
			{
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
			}
			else if (ShotgunChamber.Fire())
			{
				FVRFireArmRound round2 = ShotgunChamber.GetRound();
				((FVRFireArm)this).Fire(ShotgunChamber, ((FVRFireArm)this).GetMuzzle(), true, 1f, -1f);
				FireMuzzleFire(ShotgunMuzzleFireIndex);
				((FVRFireArm)this).FireMuzzleSmoke(ShotgunMuzzleSmokeIndex);
				((FVRFireArm)this).AddGas(ShotgunGasOutIndex);
				((FVRFireArm)this).Recoil(((FVRFireArm)this).IsTwoHandStabilized(), (Object)(object)((FVRPhysicalObject)this).AltGrip != (Object)null, ((FVRFireArm)this).IsShoulderStabilized(), ShotgunRecoilProfile, 1f);
				HandleRoundDischarge(ShotgunChamber, round2);
			}
		}

		private void HandleRoundDischarge(FVRFireArmChamber chamber, FVRFireArmRound round)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)round != (Object)null)
			{
				((FVRFireArm)this).PlayAudioGunShot(round, GM.CurrentPlayerBody.GetCurrentSoundEnvironment(), 1f);
				if (round.IsCaseless && !chamber.SuppressCaselessDeletion)
				{
					chamber.SetRound((FVRFireArmRound)null, false);
				}
			}
			if (GM.CurrentSceneSettings.IsAmmoInfinite || GM.CurrentPlayerBody.IsInfiniteAmmo)
			{
				chamber.IsSpent = false;
				chamber.UpdateProxyDisplay();
			}
		}

		public override void FVRUpdate()
		{
			((FVRFireArm)this).FVRUpdate();
			UpdateHammerShared();
			UpdateFanning();
			UpdateSpinning();
			UpdateTriggerLogic();
			if (CurrentMode == FireMode.Revolver)
			{
				UpdateCylinderRot();
			}
			UpdateChamberStateFeedback();
			UpdateSelectorPin();
			UpdateLoadingGate();
			if (StateTogglesPose && CurrentMode == FireMode.Revolver)
			{
				ToggleRevolverPose(m_isGateOpen);
			}
			CheckQuickBeltSlotsForAmmo();
		}

		private void UpdateSelectorPin()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)FireSelectorPin == (Object)null) && (CurrentMode != 0 || !m_isGateOpen))
			{
				float x = FireSelectorPin.localEulerAngles.x;
				float x2 = m_TargetSelectorRotation.x;
				float num = Mathf.LerpAngle(x, x2, Time.deltaTime * m_SelectorPinSpeed);
				FireSelectorPin.localEulerAngles = new Vector3(num, 0f, 0f);
			}
		}

		private void UpdateLoadingGate()
		{
			//IL_0034: 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_008e: Unknown result type (might be due to invalid IL or missing references)
			if (m_isShotgunOpen)
			{
				if ((Object)(object)LoadingGate != (Object)null)
				{
					LoadingGate.localEulerAngles = new Vector3(0f, 0f, LoadingGate_Rot_Closed);
				}
			}
			else if (CurrentMode == FireMode.Revolver && (Object)(object)LoadingGate != (Object)null)
			{
				float num = ((!m_isGateOpen) ? LoadingGate_Rot_Closed : LoadingGate_Rot_Open);
				LoadingGate.localEulerAngles = new Vector3(0f, 0f, num);
			}
			else if ((Object)(object)LoadingGate != (Object)null)
			{
				LoadingGate.localEulerAngles = new Vector3(0f, 0f, LoadingGate_Rot_Closed);
			}
		}

		public override void FVRFixedUpdate()
		{
			((BreakActionWeapon)this).FVRFixedUpdate();
			timeSinceColFire += Time.deltaTime;
			if (m_isShotgunOpen && !((BreakActionWeapon)this).IsLatched && (Object)(object)hinge != (Object)null && !mLemat_HasEjectedThisOpen && Mathf.Abs(hinge.angle) >= hingeEjectLimit)
			{
				mLemat_HasEjectedThisOpen = true;
				if (base.m_EjectsOnOpen)
				{
					PopOutEmpties();
				}
			}
			UpdateChamberAccessibility();
		}

		private void UpdateChamberAccessibility()
		{
			if (CurrentMode == FireMode.Shotgun && (Object)(object)ShotgunChamber != (Object)null)
			{
				ShotgunChamber.IsAccessible = m_isShotgunOpen && !((BreakActionWeapon)this).IsLatched;
			}
		}

		private void UpdateChamberStateFeedback()
		{
			if ((Object)(object)ShotgunChamber != (Object)null && ShotgunChamber.IsFull && !mWasShotgunChamberFull)
			{
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)20, 1f);
			}
			mWasShotgunChamberFull = (Object)(object)ShotgunChamber != (Object)null && ShotgunChamber.IsFull;
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_0163: Unknown result type (might be due to invalid IL or missing references)
			//IL_0164: Unknown result type (might be due to invalid IL or missing references)
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0170: 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_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0340: Unknown result type (might be due to invalid IL or missing references)
			//IL_0345: Unknown result type (might be due to invalid IL or missing references)
			((BreakActionWeapon)this).UpdateInteraction(hand);
			if ((Object)(object)hand == (Object)null)
			{
				return;
			}
			if (hand.IsInStreamlinedMode)
			{
				if (CurrentMode == FireMode.Revolver)
				{
					if (hand.Input.BYButtonDown)
					{
						ToggleRevolverGate(!m_isGateOpen);
					}
					if (hand.Input.AXButtonDown)
					{
						if (m_isGateOpen)
						{
							AdvanceCylinder();
						}
						else if (!m_isHammerCocked && !m_isHammerCocking)
						{
							CockHammerRevolver(5f);
						}
						else if (m_isHammerCocked)
						{
							ToggleFireMode();
						}
					}
				}
				else
				{
					if (hand.Input.BYButtonPressed)
					{
						m_IsLatchHeldOpen = true;
					}
					else
					{
						m_IsLatchHeldOpen = false;
					}
					if (hand.Input.AXButtonDown)
					{
						if (!m_isHammerCocked && !m_isHammerCocking)
						{
							CockHammerShotgun(5f);
						}
						else if (m_isHammerCocked)
						{
							ToggleFireMode();
						}
					}
				}
			}
			else
			{
				Vector2 touchpadAxes = hand.Input.TouchpadAxes;
				if (CurrentMode == FireMode.Revolver)
				{
					if (hand.Input.TouchpadDown)
					{
						float num = Vector2.Angle(touchpadAxes, Vector2.up);
						float num2 = Vector2.Angle(touchpadAxes, Vector2.down);
						float num3 = Vector2.Angle(touchpadAxes, Vector2.left);
						float num4 = Vector2.Angle(touchpadAxes, Vector2.right);
						if (num < 45f)
						{
							m_isSpinning = true;
						}
						else if (num2 < 45f)
						{
							if (!m_isHammerCocked && !m_isHammerCocking)
							{
								CockHammerRevolver(5f);
							}
							else if (m_isHammerCocked)
							{
								ToggleFireMode();
							}
						}
						else if (num3 < 45f)
						{
							ToggleRevolverGate(!m_isGateOpen);
						}
						else if (num4 < 45f && m_isGateOpen)
						{
							AdvanceCylinder();
						}
					}
				}
				else if (hand.Input.TouchpadPressed)
				{
					if (touchpadAxes.y > 0.1f)
					{
						m_IsLatchHeldOpen = true;
					}
					else
					{
						m_IsLatchHeldOpen = false;
					}
					if (hand.Input.TouchpadDown && touchpadAxes.y < -0.1f)
					{
						if (!m_isHammerCocked && !m_isHammerCocking)
						{
							CockHammerShotgun(5f);
						}
						else if (m_isHammerCocked)
						{
							ToggleFireMode();
						}
					}
				}
				else
				{
					m_IsLatchHeldOpen = false;
				}
			}
			m_IsLatchHeldOpen = m_IsLatchHeldOpen || foregripLatch;
			if (m_IsLatchHeldOpen)
			{
				if (!m_isShotgunOpen && !m_isGateOpen)
				{
					((BreakActionWeapon)this).SetIsExternallyUnlatched(true);
					BreakOpen();
				}
			}
			else if ((Object)(object)hinge != (Object)null && ((Component)hinge).transform.localEulerAngles.x <= 1f)
			{
				BreakClose();
			}
		}

		public override void EndInteraction(FVRViveHand hand)
		{
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			((BreakActionWeapon)this).EndInteraction(hand);
			if (m_isSpinning && (Object)(object)PoseSpinHolder != (Object)null && (Object)(object)hand != (Object)null)
			{
				((FVRPhysicalObject)this).RootRigidbody.AddRelativeTorque(new Vector3(xSpinVel, 0f, 0f), (ForceMode)1);
			}
			m_isSpinning = false;
		}

		private void UpdateTriggerLogic()
		{
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			float num = ((!((Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null)) ? 0f : ((FVRInteractiveObject)this).m_hand.Input.TriggerFloat);
			if ((Object)(object)Trigger != (Object)null)
			{
				Trigger.localEulerAngles = new Vector3(Mathf.Lerp(Trigger_Rot_Forward, Trigger_Rot_Rearward, num), 0f, 0f);
			}
			if (num <= 0.45f)
			{
				hasTriggeredUpSinceBegin = true;
				TriggerReset = true;
			}
			float num2 = ((!hasTriggeredUpSinceBegin) ? 0f : num);
			if (!(num2 > TriggerThreshold))
			{
				return;
			}
			if (CurrentMode == FireMode.Revolver)
			{
				if (m_isGateOpen && !m_isShotgunOpen)
				{
					if (TriggerReset)
					{
						EjectAccessibleRevolverChamber();
						TriggerReset = false;
					}
				}
				else if (!m_isGateOpen && m_isShotgunOpen)
				{
					if (m_isHammerCocked && TriggerReset)
					{
						ResetHammerState();
						((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
						TriggerReset = false;
					}
				}
				else if (m_isHammerCocked)
				{
					m_isHammerCocked = false;
					m_isHammerCocking = false;
					m_hammerCockLerp = 0f;
					Fire();
				}
			}
			else
			{
				if (CurrentMode != FireMode.Shotgun)
				{
					return;
				}
				if (m_isShotgunOpen)
				{
					if (m_isHammerCocked && TriggerReset)
					{
						ResetHammerState();
						((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)6, 1f);
						TriggerReset = false;
					}
				}
				else if (m_isHammerCocked)
				{
					ResetHammerState();
					Fire();
				}
			}
		}

		private void ResetHammerState()
		{
			m_isHammerCocked = false;
			m_isHammerCocking = false;
			m_hammerCockLerp = 0f;
		}

		private void UpdateHammerShared()
		{
			//IL_016f: Unknown result type (might be due to invalid IL or missing references)
			if (m_isHammerCocking)
			{
				if (m_hammerCockLerp < 1f)
				{
					m_hammerCockLerp += Time.deltaTime * m_hammerCockSpeed;
				}
				else
				{
					m_hammerCockLerp = 1f;
					m_isHammerCocking = false;
					m_isHammerCocked = true;
					if (CurrentMode == FireMode.Revolver && (Object)(object)Cylinder != (Object)null && Cylinder.Chambers != null)
					{
						m_curChamber++;
						if (m_curChamber >= Cylinder.NumChambers)
						{
							m_curChamber = 0;
						}
						m_curChamberLerp = 0f;
						m_tarChamberLerp = 0f;
					}
				}
			}
			if (CurrentMode == FireMode.Revolver && m_isGateOpen && !m_isHammerCocking && !m_isHammerCocked)
			{
				float num = Hammer_Rot_Cocked_Revolver - Hammer_Rot_Uncocked_Revolver;
				if (Mathf.Abs(num) > 0.001f)
				{
					float num2 = (Hammer_Rot_Halfcock_Revolver - Hammer_Rot_Uncocked_Revolver) / num;
					num2 = Mathf.Clamp01(num2);
					m_hammerCockLerp = num2;
				}
			}
			if ((Object)(object)Hammer != (Object)null)
			{
				float num3 = Mathf.Lerp(Hammer_Rot_Uncocked, Hammer_Rot_Cocked, m_hammerCockLerp);
				Hammer.localEulerAngles = new Vector3(num3, 0f, 0f);
			}
		}

		private void UpdateFanning()
		{
			//IL_009a: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bb: 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_00d9: Unknown result type (might be due to invalid IL or missing references)
			if (!CanFan || !((FVRInteractiveObject)this).IsHeld || (Object)(object)((FVRInteractiveObject)this).m_hand == (Object)null || (Object)(object)((FVRInteractiveObject)this).m_hand.OtherHand == (Object)null || (Object)(object)HammerFanDir == (Object)null || m_isHammerCocked || m_isHammerCocking || (CurrentMode == FireMode.Revolver && m_isGateOpen))
			{
				return;
			}
			Vector3 velLinearWorld = ((FVRInteractiveObject)this).m_hand.OtherHand.Input.VelLinearWorld;
			float num = Vector3.Distance(((FVRInteractiveObject)this).m_hand.OtherHand.PalmTransform.position, HammerFanDir.position);
			if (num < FanDistance && Vector3.Angle(velLinearWorld, HammerFanDir.forward) < FanAngle && ((Vector3)(ref velLinearWorld)).magnitude > FanVelocityThreshold)
			{
				if (CurrentMode == FireMode.Revolver)
				{
					CockHammerRevolver(10f);
				}
				else
				{
					CockHammerShotgun(10f);
				}
			}
		}

		private void UpdateSpinning()
		{
			//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_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: 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_00d5: 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_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_0098: 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_009a: Unknown result type (might be due to invalid IL or missing references)
			if (!CanSpin || !((FVRInteractiveObject)this).IsHeld || (Object)(object)PoseSpinHolder == (Object)null)
			{
				return;
			}
			bool isSpinning = false;
			if (!m_isGateOpen && (Object)(object)((FVRInteractiveObject)this).m_hand != (Object)null && !m_isHammerCocking && !m_isHammerCocked && !((FVRInteractiveObject)this).m_hand.IsInStreamlinedMode && ((FVRInteractiveObject)this).m_hand.Input.TouchpadPressed)
			{
				Vector2 touchpadAxes = ((FVRInteractiveObject)this).m_hand.Input.TouchpadAxes;
				if (Vector2.Angle(touchpadAxes, Vector2.up) < 45f)
				{
					isSpinning = true;
				}
			}
			m_isSpinning = isSpinning;
			if (m_isSpinning)
			{
				Vector3 velLinearLocal = ((FVRInteractiveObject)this).m_hand.Input.VelLinearLocal;
				float num = Vector3.Dot(((Vector3)(ref velLinearLocal)).normalized, ((Component)this).transform.up);
				if (Mathf.Abs(xSpinVel) < 90f)
				{
					xSpinVel += num * Time.deltaTime * 600f;
				}
				else if (Mathf.Sign(num) == Mathf.Sign(xSpinVel))
				{
					xSpinVel += num * Time.deltaTime * 600f;
				}
				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);
			}
		}

		private void UpdateCylinderRot()
		{
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_020a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_0124: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: 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_0236: Unknown result type (might be due to invalid IL or missing references)
			//IL_023c: 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_0146: Unknown result type (might be due to invalid IL or missing references)
			if (m_isShotgunOpen)
			{
				for (int i = 0; i < Cylinder.Chambers.Length; i++)
				{
					Cylinder.Chambers[i].IsAccessible = false;
				}
			}
			else if (m_isStateToggled || m_isGateOpen)
			{
				int num = PrevChamber;
				if (IsAccessTwoChambersBack)
				{
					num = PrevChamber2;
				}
				for (int j = 0; j < Cylinder.Chambers.Length; j++)
				{
					Cylinder.Chambers[j].IsAccessible = j == num;
				}
				if (DoesHalfCockHalfRotCylinder)
				{
					int num2 = (CurChamber + 1) % Cylinder.NumChambers;
					((Component)Cylinder).transform.localRotation = Quaternion.Slerp(Cylinder.GetLocalRotationFromCylinder(CurChamber), Cylinder.GetLocalRotationFromCylinder(num2), 0.5f);
				}
				else
				{
					((Component)Cylinder).transform.localRotation = Cylinder.GetLocalRotationFromCylinder(CurChamber);
				}
				if (DoesCylinderTranslateForward)
				{
					((Component)Cylinder).transform.localPosition = CylinderBackPos;
				}
			}
			else
			{
				for (int k = 0; k < Cylinder.Chambers.Length; k++)
				{
					Cylinder.Chambers[k].IsAccessible = false;
				}
				m_tarChamberLerp = ((!m_isHammerCocking) ? 0f : m_hammerCockLerp);
				m_curChamberLerp = Mathf.Lerp(m_curChamberLerp, m_tarChamberLerp, Time.deltaTime * 16f);
				int num3 = (CurChamber + 1) % Cylinder.NumChambers;
				((Component)Cylinder).transform.localRotation = Quaternion.Slerp(Cylinder.GetLocalRotationFromCylinder(CurChamber), Cylinder.GetLocalRotationFromCylinder(num3), m_curChamberLerp);
				if (DoesCylinderTranslateForward)
				{
					((Component)Cylinder).transform.localPosition = Vector3.Lerp(CylinderBackPos, CylinderFrontPos, m_hammerCockLerp);
				}
			}
		}

		private void CockHammerRevolver(float speed)
		{
			if (!m_isHammerCocked && !m_isHammerCocking)
			{
				m_hammerCockSpeed = speed;
				m_isHammerCocking = true;
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)7, 1f);
			}
		}

		private void CockHammerShotgun(float speed)
		{
			if (!m_isHammerCocked && !m_isHammerCocking)
			{
				m_hammerCockSpeed = speed;
				m_isHammerCocking = true;
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)7, 1f);
			}
		}

		private void ToggleFireMode()
		{
			//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_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: 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)
			if (!m_isGateOpen)
			{
				bool isHammerCocked = m_isHammerCocked;
				bool isHammerCocking = m_isHammerCocking;
				float hammerCockLerp = m_hammerCockLerp;
				if (CurrentMode == FireMode.Revolver)
				{
					CurrentMode = FireMode.Shotgun;
					Hammer_Rot_Uncocked = Hammer_Rot_Uncocked_Shotgun;
					Hammer_Rot_Cocked = Hammer_Rot_Cocked_Shotgun;
					((FVRFireArm)this).RoundType = ShotgunRoundType;
				}
				else
				{
					CurrentMode = FireMode.Revolver;
					Hammer_Rot_Uncocked = Hammer_Rot_Uncocked_Revolver;
					Hammer_Rot_Cocked = Hammer_Rot_Cocked_Revolver;
					((FVRFireArm)this).RoundType = m_originalRoundType;
				}
				m_TargetSelectorRotation = ((CurrentMode != 0) ? ShotgunPinRotation : RevolverPinRotation);
				((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)15, 1f);
				m_isHammerCocked = isHammerCocked;
				m_isHammerCocking = isHammerCocking;
				m_hammerCockLerp = hammerCockLerp;
			}
		}

		private void ToggleRevolverPose(bool openGatePose)
		{
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: 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_0068: 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_0118: 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_00a6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Pose_Main == (Object)null || (Object)(object)Pose_Toggled == (Object)null || ((FVRPhysicalObject)this).IsAltHeld || !((FVRInteractiveObject)this).IsHeld)
			{
				return;
			}
			if (!openGatePose)
			{
				((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;
				}
			}
		}

		private void ToggleRevolverGate(bool open)
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			if (m_isShotgunOpen || CurrentMode != 0 || m_isGateOpen == open)
			{
				return;
			}
			m_isGateOpen = open;
			((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)((!open) ? 31 : 30), 1f);
			if (!open)
			{
				ResetHammerState();
				if ((Object)(object)Hammer != (Object)null)
				{
					Hammer.localEulerAngles = new Vector3(Hammer_Rot_Uncocked, 0f, 0f);
				}
				return;
			}
			m_isHammerCocking = false;
			m_isHammerCocked = false;
			float num = Hammer_Rot_Cocked_Revolver - Hammer_Rot_Uncocked_Revolver;
			if (Mathf.Abs(num) > 0.001f)
			{
				float num2 = (Hammer_Rot_Halfcock_Revolver - Hammer_Rot_Uncocked_Revolver) / num;
				num2 = Mathf.Clamp01(num2);
				m_hammerCockLerp = num2;
			}
		}

		private void AdvanceCylinder()
		{
			m_curChamber++;
			if (m_curChamber >= Cylinder.NumChambers)
			{
				m_curChamber = 0;
			}
			((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)0, 1f);
		}

		private void EjectAccessibleRevolverChamber()
		{
			//IL_0068: 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_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_008d: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)Cylinder == (Object)null || Cylinder.Chambers == null)
			{
				return;
			}
			for (int i = 0; i < Cylinder.Chambers.Length; i++)
			{
				FVRFireArmChamber val = Cylinder.Chambers[i];
				if (val.IsAccessible)
				{
					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);
					break;
				}
			}
		}

		public void PopOutEmpties()
		{
			if ((Object)(object)ShotgunChamber != (Object)null && ShotgunChamber.IsFull && ShotgunChamber.IsSpent)
			{
				PopOutRound(ShotgunChamber);
			}
		}

		public void PopOutRound(FVRFireArmChamber chamber)
		{
			//IL_0015: 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_002b: 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_003b: 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_004b: Unknown result type (might be due to invalid IL or missing references)
			((FVRFireArm)this).PlayAudioEvent((FirearmAudioEventType)21, 1f);
			chamber.EjectRound(((Component)chamber).transform.position + ((Component)chamber).transform.forward * base.EjectOffset, ((Component)chamber).transform.forward * base.EjectSpeed, Vector3.right, false);
			((FVRFireArm)this).AddGas(ShotgunGasOutIndex);
		}

		public void BreakOpen()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0074: Unknown result type (might be due to invalid IL or missing references)
			if (!m_isShotgunOpen && !m_isGateOpen)
			{
				m_isShotgunOpen = true;
				((BreakActionWeapon)this).SetIsExternallyUnlatched(true);
				if (CurrentMode == FireMode.Revolver)
				{
					((FVRFireArm)this).RoundType = ShotgunRoundType;
				}
				if ((Object)(object)hinge != (Object)null)
				{
					JointLimits limits = hinge.limits;
					((JointLimits)(ref limits)).max = hingeLimit;
					hinge.limits = limits;
				}
				if ((Object)(object)ShotgunChamber != (Object)null)
				{
					ShotgunChamber.IsAccessible = true;
				}
			}
		}

		public void BreakClose()
		{
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			if (m_isShotgunOpen)
			{
				m_isShotgunOpen = false;
				mLemat_HasEjectedThisOpen = false;
				((BreakActionWeapon)this).SetIsExternallyUnlatched(false);
				if (CurrentMode == FireMode.Revolver)
				{
					((FVRFireArm)this).RoundType = m_originalRoundType;
				}
				if ((Object)(object)hinge != (Object)null)
				{
					JointLimits limits = hinge.limits;
					((JointLimits)(ref limits)).max = 0f;
					hinge.limits = limits;
					((Component)hinge).transform.localPosition = m_HingeStartPos;
				}
				if ((Object)(object)ShotgunChamber != (Object)null)
				{
					ShotgunChamber.IsAccessible = false;
				}
			}
		}

		private void CheckQuickBeltSlotsForAmmo()
		{
			//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: 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)
			FVRViveHand val = null;
			FVRViveHand[] hands = GM.CurrentMovementManager.Hands;
			foreach (FVRViveHand val2 in hands)
			{
				if ((Object)(object)val2.CurrentInteractable == (Object)(object)this)
				{
					val = val2;
					break;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			FVRViveHand val3 = ((!((Object)(object)val == (Object)(object)GM.CurrentMovementManager.Hands[0])) ? GM.CurrentMovementManager.Hands[0] : GM.CurrentMovementManager.Hands[1]);
			if ((Object)(object)val3.CurrentHoveredQuickbeltSlot != (Object)null && val3.CurrentHoveredQuickbeltSlot.HeldObject is FVRFireArmRound)
			{
				FVRInteractiveObject heldObject = val3.CurrentHoveredQuickbeltSlot.HeldObject;
				FVRFireArmRound val4 = (FVRFireArmRound)(object)((heldObject is FVRFireArmRound) ? heldObject : null);
				if (m_isFilteringChambers)
				{
					FireArmRoundType? lastFilteredType = m_lastFilteredType;
					if (lastFilteredType.GetValueOrDefault() == val4.RoundType && lastFilteredType.HasValue)
					{
						return;
					}
				}
				FilterChambersForRoundType(val4.RoundType);
			}
			else if (m_isFilteringChambers)
			{
				RestoreAllChambers();
			}
		}

		private void FilterChambersForRoundType(FireArmRoundType roundType)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: 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_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			m_isFilteringChambers = true;
			m_lastFilteredType = roundType;
			m_savedRoundType = ((FVRFireArm)this).RoundType;
			((FVRFireArm)this).RoundType = roundType;
			((FVRFireArm)this).FChambers.Clear();
			foreach (FVRFireArmChamber allChamber in m_allChambers)
			{
				if (allChamber.RoundType == roundType)
				{
					((FVRFireArm)this).FChambers.Add(allChamber);
				}
			}
		}

		private void RestoreAllChambers()
		{
			//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)
			((FVRFireArm)this).RoundType = m_savedRoundType;
			m_isFilteringChambers = false;
			m_lastFilteredType = null;
			((FVRFireArm)this).FChambers.Clear();
			((FVRFireArm)this).FChambers.AddRange(m_allChambers);
		}
	}
	public class LematForegrip : FVRAlternateGrip
	{
		[Header("Shotgun Setup")]
		public Transform ShotgunBase;

		public HingeJoint Hinge;

		private Vector3 localPosStart;

		private Rigidbody RB;

		private Lemat Wep;

		private float m_initialDamp = 0.05f;

		private float m_initialSpring = 0.05f;

		public override void Awake()
		{
			//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_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			((FVRAlternateGrip)this).Awake();
			localPosStart = ((Component)Hinge).transform.localPosition;
			RB = ((Compo