Decompiled source of LRTS Scope v1.0.0

LRTS_Scope.dll

Decompiled 3 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using FistVR;
using H3VRUtils.Vehicles;
using HarmonyLib;
using OpenScripts2;
using OtherLoader;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Windows.Speech;

[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 JerryComponent
{
	public class DshapeGrip : MonoBehaviour
	{
		public ClosedBoltWeapon gun;

		public GameObject trigL;

		public GameObject trigR;

		public GameObject magrel;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			if (trigL.transform.localEulerAngles.x > 45f || trigR.transform.localEulerAngles.x > 45f)
			{
				gun.Fire();
			}
			if (magrel.transform.localEulerAngles.x > 45f && (Object)(object)((FVRFireArm)gun).Magazine != (Object)null)
			{
				((FVRFireArm)gun).EjectMag(false);
			}
		}
	}
	public class MGMount2 : MonoBehaviour
	{
		public GameObject mgSpace;

		public GameObject mgX;

		public GameObject mgY;

		public GameObject mgObj;

		private float mgMoveX;

		private float mgMoveY;

		public ClosedBoltWeapon gun;

		public GameObject proxyrounds;

		private void OnTriggerStay(Collider other)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_010e: 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)
			if (gun.Chamber.IsFull)
			{
				mgObj.transform.position = ((Component)other).gameObject.transform.position;
				mgMoveX = mgObj.transform.localPosition.x;
				mgMoveY = mgObj.transform.localPosition.y;
				if (mgMoveX > 1f)
				{
					mgMoveX = 1f;
				}
				if (mgMoveX < 0f)
				{
					mgMoveX = 0f;
				}
				if (mgMoveY > 1f)
				{
					mgMoveY = 1f;
				}
				if (mgMoveY < 0f)
				{
					mgMoveY = 0f;
				}
				mgX.transform.localEulerAngles = new Vector3(0f, (1f - mgMoveX) * 40f, 0f);
				mgY.transform.localEulerAngles = new Vector3(mgMoveY * 40f, 0f, 0f);
			}
		}

		private void Update()
		{
			//IL_0152: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)((FVRFireArm)gun).Magazine != (Object)null)
			{
				if (!gun.Chamber.IsFull && ((FVRFireArm)gun).Magazine.m_numRounds <= 0)
				{
					mgMoveX = 0.5f;
					mgX.transform.localEulerAngles = new Vector3(0f, 20f, 0f);
					mgMoveY = 0f;
					mgY.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
					proxyrounds.SetActive(false);
					((FVRFireArm)gun).ConnectedToBox = false;
					((FVRFireArm)gun).HasBelt = false;
					if (((FVRFireArm)gun).BeltDD.m_roundsOnBelt > 0)
					{
						((FVRFireArm)gun).BeltDD.RemoveRound(true);
					}
				}
				if (((FVRFireArm)gun).Magazine.m_numRounds > 0)
				{
					proxyrounds.SetActive(true);
				}
			}
			if ((Object)(object)((FVRFireArm)gun).Magazine == (Object)null)
			{
				mgMoveX = 0.5f;
				mgX.transform.localEulerAngles = new Vector3(0f, 20f, 0f);
				mgMoveY = 0f;
				mgY.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
				proxyrounds.SetActive(false);
			}
		}
	}
	public class turretrotation : MonoBehaviour
	{
		public float lowlimit = 2f;

		public float highlimit = 47f;

		public GameObject turretX;

		public GameObject turretY;

		public GameObject trigger;

		public ClosedBoltWeapon gun;

		public float rotX = 180f;

		public float rotY = 10f;

		public GameObject followhands;

		private void OnTriggerStay(Collider other)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			followhands.transform.position = ((Component)other).gameObject.transform.position;
		}

		private void OnTriggerExit(Collider other)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			followhands.transform.localPosition = new Vector3(0f, 0f, 0f);
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: 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_00f5: 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_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0148: Unknown result type (might be due to invalid IL or missing references)
			//IL_0178: 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_011d: Unknown result type (might be due to invalid IL or missing references)
			if (trigger.transform.localEulerAngles.x > 2f && trigger.transform.localEulerAngles.x < 88f)
			{
				gun.Fire();
			}
			if (followhands.transform.localPosition.x >= 0.05f || followhands.transform.localPosition.x <= -0.05f)
			{
				rotX += followhands.transform.localPosition.x * 0.75f;
				turretX.transform.localEulerAngles = new Vector3(0f, rotX, 0f);
			}
			if (followhands.transform.localPosition.y >= 0.05f || followhands.transform.localPosition.y <= -0.05f)
			{
				rotY += followhands.transform.localPosition.y * 0.25f;
				turretY.transform.localEulerAngles = new Vector3(0f, 0f, rotY);
				if (rotY < lowlimit)
				{
					rotY = lowlimit;
				}
				if (rotY > highlimit)
				{
					rotY = highlimit;
				}
			}
		}
	}
	public class turretrotation1 : MonoBehaviour
	{
		public GameObject seatrot;

		public GameObject hatch;

		public float lowlimit = 2f;

		public float highlimit = 52f;

		public GameObject turretX;

		public GameObject turretY;

		public GameObject trigger;

		public OpenBoltReceiver gun;

		public float rotX = 180f;

		public float rotY = 10f;

		public GameObject followhands;

		public string handb;

		public string handid;

		public string X;

		public string Y;

		public float hx = 0f;

		public float hy = 0f;

		public float hz = 0f;

		public float refx = 0f;

		public float refy = 0f;

		public float xrot = 0f;

		public float yrot = 0f;

		public SpringJoint SJ;

		public Rigidbody rigcomt;

		public Transform rigcomtlock;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_0034: 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_030c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0311: Unknown result type (might be due to invalid IL or missing references)
			//IL_0364: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: 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_0334: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_0187: 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_0387: Unknown result type (might be due to invalid IL or missing references)
			//IL_038c: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_0451: Unknown result type (might be due to invalid IL or missing references)
			//IL_0456: Unknown result type (might be due to invalid IL or missing references)
			//IL_03da: Unknown result type (might be due to invalid IL or missing references)
			//IL_03df: Unknown result type (might be due to invalid IL or missing references)
			//IL_0291: Unknown result type (might be due to invalid IL or missing references)
			//IL_0296: 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_0210: Unknown result type (might be due to invalid IL or missing references)
			//IL_04a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_04cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_04e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0474: Unknown result type (might be due to invalid IL or missing references)
			//IL_0479: Unknown result type (might be due to invalid IL or missing references)
			//IL_040e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0413: Unknown result type (might be due to invalid IL or missing references)
			//IL_0436: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_04fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0503: Unknown result type (might be due to invalid IL or missing references)
			//IL_0542: Unknown result type (might be due to invalid IL or missing references)
			//IL_0557: Unknown result type (might be due to invalid IL or missing references)
			//IL_055c: 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_05a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_058c: Unknown result type (might be due to invalid IL or missing references)
			//IL_026e: 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_05dc: Unknown result type (might be due to invalid IL or missing references)
			rigcomt.isKinematic = false;
			rigcomt.useGravity = false;
			((Component)rigcomt).gameObject.transform.localEulerAngles = ((Component)rigcomtlock).transform.localEulerAngles;
			((Component)rigcomt).gameObject.transform.localPosition = ((Component)rigcomtlock).transform.localPosition;
			turretX = GameObject.Find(X);
			turretY = GameObject.Find(Y);
			if ((Object)(object)GameObject.Find(handid) != (Object)null)
			{
				followhands = GameObject.Find(handid);
				followhands.transform.SetParent(GameObject.Find(handb).transform);
				if ((Object)(object)SJ == (Object)null)
				{
					followhands.transform.localPosition = new Vector3(0f, 0.027f, 0f);
					SJ = followhands.AddComponent<SpringJoint>();
					((Joint)SJ).connectedBody = rigcomt;
					SJ.spring = 2500f;
					SJ.damper = 10f;
					SJ.tolerance = 0f;
					SJ.maxDistance = 0f;
					SJ.minDistance = 0f;
				}
				hx = followhands.transform.localPosition.x;
				hz = 0f;
				if (hx > 0.1f)
				{
					hx = 0.1f;
				}
				else if (hx < -0.1f)
				{
					hx = -0.1f;
				}
				if (hatch.transform.localEulerAngles.x > 45f && seatrot.transform.localEulerAngles.x > 45f)
				{
					if (hy > 0.052f)
					{
						hy = 0.052f;
					}
					else if (hy < 0.002f)
					{
						hy = 0.002f;
					}
					hy = followhands.transform.localPosition.y;
				}
				else if (hatch.transform.localEulerAngles.x < 45f || seatrot.transform.localEulerAngles.x < 45f)
				{
					hy = 0.027f;
				}
				followhands.transform.localPosition = new Vector3(hx, hy, hz);
			}
			if (trigger.transform.localEulerAngles.x > 2f && trigger.transform.localEulerAngles.x < 88f)
			{
				gun.ReleaseSeer();
			}
			else if (trigger.transform.localEulerAngles.x < 2f || trigger.transform.localEulerAngles.x > 88f)
			{
				gun.EngageSeer();
			}
			if (seatrot.transform.localEulerAngles.x < 45f && hatch.transform.localEulerAngles.x > 45f)
			{
				turretX.transform.localEulerAngles = new Vector3(0f, Mathf.SmoothDamp(turretX.transform.localEulerAngles.y, 0f, ref refx, 1f), 0f);
			}
			else if (seatrot.transform.localEulerAngles.x > 45f || hatch.transform.localEulerAngles.x < 45f)
			{
				turretX.transform.localEulerAngles = new Vector3(0f, turretX.transform.localEulerAngles.y + 1500f * followhands.transform.localPosition.x * Time.deltaTime, 0f);
			}
			yrot = Mathf.SmoothDamp(yrot, followhands.transform.localPosition.y * 1000f, ref refy, 2f);
			turretY.transform.localEulerAngles = new Vector3(0f, 0f, yrot);
			if (turretY.transform.localEulerAngles.z > highlimit)
			{
				turretY.transform.localEulerAngles = new Vector3(0f, 0f, highlimit);
			}
			else if (turretY.transform.localEulerAngles.z < lowlimit)
			{
				turretY.transform.localEulerAngles = new Vector3(0f, 0f, lowlimit);
			}
		}
	}
	public class ButtonIgnition : FVRInteractiveObject
	{
		public VehicleControl vehicle;

		public VehicleAudioSet audioSet;

		public float ignitionTime;

		private float m_it;

		public float failChance;

		public Random rand;

		public void Start()
		{
			rand = new Random();
		}

		public override void BeginInteraction(FVRViveHand hand)
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			m_it = ignitionTime;
			if (vehicle.isOn)
			{
				SM.PlayGenericSound(audioSet.VehicleStop, ((Component)this).transform.position);
				m_it = 999999f;
				vehicle.TurnOffEngine(forcibly: false);
			}
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_0048: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).UpdateInteraction(hand);
			m_it -= Time.fixedDeltaTime;
			if (m_it <= 0f)
			{
				vehicle.TurnOnEngine(forcibly: false);
				SM.PlayGenericSound(audioSet.VehicleStart, ((Component)this).transform.position);
				m_it = 999999f;
			}
		}
	}
	internal class CarFollow : MonoBehaviour
	{
		public VehicleControl _carControl;

		public Transform _setPos;

		private FVRMovementManager _playerMovement;

		private void Awake()
		{
			_playerMovement = Object.FindObjectOfType<FVRMovementManager>();
		}

		private void Update()
		{
			if (_carControl.isOn)
			{
				PlayerForwardFollowSet();
			}
		}

		private void PlayerForwardFollowSet()
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			((Component)_playerMovement).transform.rotation = Quaternion.RotateTowards(((Component)_playerMovement).transform.rotation, ((Component)_setPos).transform.rotation, 5f);
		}
	}
	public class AddScope : MonoBehaviour
	{
		public Camera cam;

		public Shader shad;

		public MeshRenderer mr1;

		public int reticlesize = 1024;

		public float _VR = 0f;

		public float _VS = 0.25f;

		public float _ER = 1f;

		public float _RS = 4.12f;

		public float _ROX = 0f;

		public float _ROY = 0f;

		private void Start()
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Expected O, but got Unknown
			RenderTexture val = new RenderTexture(reticlesize, reticlesize, 16, (RenderTextureFormat)0);
			val.Create();
			cam.targetTexture = val;
			Material val2 = new Material(shad);
			val2.SetTexture("_MainTex", (Texture)(object)val);
			val2.SetFloat("_VignetteRadius", _VR);
			val2.SetFloat("_VignetteSmoothness", _VS);
			val2.SetFloat("_EyeRelief", _ER);
			val2.SetTexture("_ReticleTex", (Texture)(object)val);
			val2.SetFloat("_ReticleScale", _RS);
			val2.SetFloat("_ReticleOffsetX", _ROX);
			val2.SetFloat("_ReticleOffsetY", _ROY);
			((Renderer)mr1).material = val2;
		}

		private void Update()
		{
		}
	}
	[Serializable]
	public class DriveShiftNode
	{
		public Vector3 localposition;

		public Vector3 rotation;

		public int left = -1;

		public int up = -1;

		public int right = -1;

		public int down = -1;

		public int gear = 0;
	}
	public class DriveShift : FVRInteractiveObject
	{
		public VehicleControl vehicle;

		public Text gearText;

		public int currentNode;

		public List<DriveShiftNode> driveShiftNodes;

		public VehicleAudioSet audioSet;

		public void Update()
		{
			if (vehicle.carSetting.automaticGear)
			{
				if (vehicle.currentGear > 0 && vehicle.speed > 1f)
				{
					gearText.text = vehicle.currentGear.ToString();
				}
				else if (vehicle.speed > 1f)
				{
					gearText.text = "R";
				}
				else
				{
					gearText.text = "N";
				}
			}
			else if (vehicle.NeutralGear)
			{
				gearText.text = "N";
			}
			else if (vehicle.currentGear != 0)
			{
				gearText.text = vehicle.currentGear.ToString();
			}
			else
			{
				gearText.text = "R";
			}
		}

		private void Start()
		{
			//IL_0039: 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)
			vehicle.ShiftTo(driveShiftNodes[currentNode].gear);
			((Component)this).transform.localPosition = driveShiftNodes[currentNode].localposition;
			((Component)this).transform.localEulerAngles = driveShiftNodes[currentNode].rotation;
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: 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_019e: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_025e: Unknown result type (might be due to invalid IL or missing references)
			//IL_027f: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.left) <= 45f && hand.Input.TouchpadDown && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.2f && driveShiftNodes[currentNode].left != -1)
			{
				flag = true;
				currentNode = driveShiftNodes[currentNode].left;
			}
			if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.up) <= 45f && hand.Input.TouchpadDown && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.2f && driveShiftNodes[currentNode].up != -1)
			{
				flag = true;
				currentNode = driveShiftNodes[currentNode].up;
			}
			if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.right) <= 45f && hand.Input.TouchpadDown && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.2f && driveShiftNodes[currentNode].right != -1)
			{
				flag = true;
				currentNode = driveShiftNodes[currentNode].right;
			}
			if (Vector2.Angle(hand.Input.TouchpadAxes, Vector2.down) <= 45f && hand.Input.TouchpadDown && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.2f && driveShiftNodes[currentNode].down != -1)
			{
				flag = true;
				currentNode = driveShiftNodes[currentNode].down;
			}
			if (flag)
			{
				vehicle.ShiftTo(driveShiftNodes[currentNode].gear);
				((Component)this).transform.localPosition = driveShiftNodes[currentNode].localposition;
				((Component)this).transform.localEulerAngles = driveShiftNodes[currentNode].rotation;
			}
		}
	}
	public class IfInWater : MonoBehaviour
	{
		public GameObject floatScr;

		public FVRPhysicalObject obj;

		private void Start()
		{
		}

		private void Update()
		{
			if (obj.IsInWater)
			{
				floatScr.SetActive(true);
			}
			else if (!obj.IsInWater)
			{
				floatScr.SetActive(false);
			}
		}
	}
	public class IsFloating : MonoBehaviour
	{
		public FVRPhysicalObject floatObj;

		public Rigidbody floatObjRB;

		public Transform floatDir;

		public float ForceF;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			if (floatObj.IsInWater)
			{
				floatObjRB.AddForce(floatDir.forward * Time.deltaTime * ForceF, (ForceMode)0);
			}
			else if (floatObj.IsInWater)
			{
			}
		}
	}
	public class ParkingBrakeClick : FVRInteractiveObject
	{
		public VehicleControl vehicle;

		public Vector3 positionOff;

		public Vector3 positionOn;

		public Vector3 rotationOff;

		public Vector3 rotationOn;

		public bool isOn;

		public VehicleAudioSet audioSet;

		public override void SimpleInteraction(FVRViveHand hand)
		{
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: 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)
			//IL_0034: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).SimpleInteraction(hand);
			isOn = !isOn;
			if (isOn)
			{
				SM.PlayGenericSound(audioSet.HandbrakeUp, ((Component)this).transform.position);
				((Component)this).transform.localPosition = positionOn;
				((Component)this).transform.localEulerAngles = rotationOn;
				vehicle.brake = true;
			}
			else
			{
				SM.PlayGenericSound(audioSet.HandbrakeDown, ((Component)this).transform.position);
				((Component)this).transform.localPosition = positionOff;
				((Component)this).transform.localEulerAngles = rotationOff;
				vehicle.brake = false;
			}
		}
	}
	public class Propeller : MonoBehaviour
	{
		public VehicleControl Vehicle;

		public Rigidbody Prop;

		public Rigidbody Prop2;

		public Transform ForceDir;

		public Transform ForceDir2;

		public bool propon;

		public bool isRev;

		public float ForceP = 400000f;

		public GameObject PropRot;

		private void Start()
		{
		}

		public void PropellerON()
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: 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_004f: 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_0083: 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_0099: 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_00ba: 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)
			if (isRev)
			{
				Prop.AddForce(ForceDir.forward * Time.deltaTime * ForceP, (ForceMode)0);
				Prop2.AddForce(ForceDir2.forward * Time.deltaTime * ForceP, (ForceMode)0);
			}
			else if (!isRev)
			{
				Prop.AddForce(ForceDir.forward * Time.deltaTime * (0f - ForceP), (ForceMode)0);
				Prop2.AddForce(ForceDir2.forward * Time.deltaTime * (0f - ForceP), (ForceMode)0);
			}
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			if (PropRot.transform.localEulerAngles.x >= 45f)
			{
				PropellerON();
			}
			else if (!(PropRot.transform.localEulerAngles.x < 45f))
			{
			}
			if (Vehicle.currentGear == 0)
			{
				isRev = true;
			}
			else if (Vehicle.currentGear == 1)
			{
				isRev = false;
			}
		}
	}
	internal class SteeringWheel : FVRInteractiveObject
	{
		public VehicleControl vehicle;

		public float resetLerpSpeed;

		public float maxRot;

		public bool reverseRot;

		[Header("Debug Values")]
		public Text rotText;

		public float rot;

		public float rh;

		public float lr;

		public float inlerp;

		public float lerp;

		public float rotAmt;

		public VehicleAudioSet audioSet;

		public override void BeginInteraction(FVRViveHand hand)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).BeginInteraction(hand);
			Transform child = ((Component)this).transform.GetChild(0);
			child.parent = null;
			Vector3 localEulerAngles = ((Component)this).transform.localEulerAngles;
			((Component)this).transform.LookAt(((Component)hand).transform);
			((Component)this).transform.localEulerAngles = new Vector3(localEulerAngles.x, ((Component)this).transform.localEulerAngles.y, localEulerAngles.z);
			child.parent = ((Component)this).transform;
		}

		public override void EndInteraction(FVRViveHand hand)
		{
			//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_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_004d: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).EndInteraction(hand);
			Transform child = ((Component)this).transform.GetChild(0);
			child.parent = null;
			((Component)this).transform.localEulerAngles = new Vector3(((Component)this).transform.localEulerAngles.x, 0f, ((Component)this).transform.localEulerAngles.z);
			child.parent = ((Component)this).transform;
		}

		public override void UpdateInteraction(FVRViveHand hand)
		{
			//IL_000e: 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_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_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).UpdateInteraction(hand);
			Vector3 localEulerAngles = ((Component)this).transform.localEulerAngles;
			((Component)this).transform.LookAt(((Component)hand).transform);
			Vector3 localEulerAngles2 = ((Component)this).transform.localEulerAngles;
			rot = Mathf.DeltaAngle((float)Math.Round(localEulerAngles2.y), (float)Math.Round(localEulerAngles.y));
			rotAmt += rot;
			if (rotAmt >= maxRot)
			{
				rotAmt = maxRot;
				((Component)this).transform.localEulerAngles = localEulerAngles;
			}
			else if (rotAmt <= 0f - maxRot)
			{
				rotAmt = 0f - maxRot;
				((Component)this).transform.localEulerAngles = localEulerAngles;
			}
			else
			{
				((Component)this).transform.localEulerAngles = new Vector3(localEulerAngles.x, localEulerAngles2.y, localEulerAngles.z);
			}
			rh = localEulerAngles2.y;
			lr = localEulerAngles.y;
			SetRot();
			bool flag = false;
			if (hand.Input.TouchpadPressed && ((Vector2)(ref hand.Input.TouchpadAxes)).magnitude > 0.25f)
			{
				flag = true;
			}
			if (flag)
			{
				vehicle.accel = 0f - (float)Math.Pow(((Vector2)(ref hand.Input.TouchpadAxes)).magnitude, 2.0);
				vehicle.brake = true;
			}
			else
			{
				vehicle.accel = (float)Math.Pow(hand.Input.TriggerFloat, 2.0);
				vehicle.brake = false;
			}
		}

		private void FixedUpdate()
		{
			//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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: 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)
			if ((Object)(object)base.m_hand == (Object)null)
			{
				float num = resetLerpSpeed;
				if (rotAmt > 0f)
				{
					num = 0f - num;
				}
				if (rotAmt > num || rotAmt < 0f - num)
				{
					rotAmt += num;
					((Component)this).transform.localEulerAngles = new Vector3(((Component)this).transform.localEulerAngles.x, ((Component)this).transform.localEulerAngles.y - num, ((Component)this).transform.localEulerAngles.z);
					vehicle.accel = 0f;
					SetRot();
				}
			}
		}

		private void SetRot()
		{
			bool flag = rotAmt <= 0f;
			lerp = Mathf.Abs(rotAmt) / maxRot;
			lerp *= -1f;
			if (flag)
			{
				lerp *= -1f;
			}
			if (reverseRot)
			{
				lerp = 0f - lerp;
			}
			if ((Object)(object)rotText != (Object)null)
			{
				rotText.text = lerp.ToString();
			}
			vehicle.steer = lerp;
		}
	}
	public class VehicleControl : MonoBehaviour
	{
		public enum ControlMode
		{
			simple = 1,
			touch
		}

		[Serializable]
		public class CarWheels
		{
			public ConnectWheel wheels;
		}

		[Serializable]
		public class ConnectWheel
		{
			public bool frontWheelDrive = true;

			public Transform frontRight;

			public Transform frontLeft;

			public Transform frontRight2;

			public Transform frontLeft2;

			public WheelSetting frontSetting;

			public bool backWheelDrive = true;

			public Transform backRight;

			public Transform backLeft;

			public Transform backRight2;

			public Transform backLeft2;

			public WheelSetting rearSetting;
		}

		[Serializable]
		public class WheelSetting
		{
			public float Radius = 0.4f;

			public float Weight = 1000f;

			public float Distance = 0.2f;
		}

		[Serializable]
		public class CarLights
		{
			public Light[] brakeLights;

			public Light[] reverseLights;
		}

		[Serializable]
		public class CarSounds
		{
			public AudioSource IdleEngine;

			public AudioSource LowEngine;

			public AudioSource HighEngine;

			public float minPitch = 1f;

			public float maxPitch = 10f;

			public AudioSource nitro;

			public AudioSource switchGear;
		}

		[Serializable]
		public class CarParticles
		{
			public GameObject brakeParticlePerfab;

			public ParticleSystem shiftParticle1;

			public ParticleSystem shiftParticle2;

			private GameObject[] wheelParticle = (GameObject[])(object)new GameObject[8];
		}

		[Serializable]
		public class CarSetting
		{
			public bool showNormalGizmos = false;

			public Transform carSteer;

			public HitGround[] hitGround;

			public List<Transform> cameraSwitchView;

			public float springs = 25000f;

			public float dampers = 1500f;

			public float carPower = 120f;

			public float shiftPower = 150f;

			public float brakePower = 8000f;

			public Vector3 shiftCentre = new Vector3(0f, -0.8f, 0f);

			public float maxSteerAngle = 25f;

			public float shiftDownRPM = 1500f;

			public float shiftUpRPM = 2500f;

			public float idleRPM = 500f;

			public float stiffness = 2f;

			public bool automaticGear = true;

			public float[] gears = new float[6] { -10f, 9f, 6f, 4.5f, 3f, 2.5f };

			public float LimitBackwardSpeed = 60f;

			public float LimitForwardSpeed = 220f;
		}

		[Serializable]
		public class HitGround
		{
			public string tag = "street";

			public bool grounded = false;

			public AudioClip brakeSound;

			public AudioClip groundSound;

			public Color brakeColor;
		}

		private class WheelComponent
		{
			public Transform wheel;

			public WheelCollider collider;

			public Vector3 startPos;

			public float rotation = 0f;

			public float rotation2 = 0f;

			public float maxSteer;

			public bool drive;

			public float pos_y = 0f;

			public WheelSetting settings;
		}

		public ControlMode controlMode = ControlMode.simple;

		public bool activeControl = false;

		public CarWheels carWheels;

		public CarLights carLights;

		public CarSounds carSounds;

		public CarParticles carParticles;

		public CarSetting carSetting;

		[HideInInspector]
		public float steer = 0f;

		[HideInInspector]
		public float accel = 0f;

		[HideInInspector]
		public bool brake;

		private bool shifmotor;

		[HideInInspector]
		public float curTorque = 100f;

		[HideInInspector]
		public float powerShift = 100f;

		[HideInInspector]
		public bool shift;

		private float torque = 100f;

		[HideInInspector]
		public float speed = 0f;

		private float lastSpeed = -10f;

		private bool shifting = false;

		private float[] efficiencyTable = new float[22]
		{
			0.6f, 0.65f, 0.7f, 0.75f, 0.8f, 0.85f, 0.9f, 1f, 1f, 0.95f,
			0.8f, 0.7f, 0.6f, 0.5f, 0.45f, 0.4f, 0.36f, 0.33f, 0.3f, 0.2f,
			0.1f, 0.05f
		};

		private float efficiencyTableStep = 250f;

		private float Pitch;

		private float PitchDelay;

		private float shiftTime = 0f;

		private float shiftDelay = 0f;

		[HideInInspector]
		public int currentGear = 0;

		[HideInInspector]
		public bool NeutralGear = true;

		[HideInInspector]
		public float motorRPM = 0f;

		[HideInInspector]
		public bool Backward = false;

		[HideInInspector]
		public float accelFwd = 0f;

		[HideInInspector]
		public float accelBack = 0f;

		[HideInInspector]
		public float steerAmount = 0f;

		private float wantedRPM = 0f;

		private float w_rotate;

		private float slip;

		private float slip2 = 0f;

		private GameObject[] Particle = (GameObject[])(object)new GameObject[8];

		private Vector3 steerCurAngle;

		private Rigidbody myRigidbody;

		private WheelComponent[] wheels;

		public bool isOn = true;

		public bool isForciblyOff = false;

		public Rigidbody GetRigidbody()
		{
			return myRigidbody;
		}

		private WheelComponent SetWheelComponent(Transform wheel, float maxSteer, bool drive, float pos_y, WheelSetting setting)
		{
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_0035: 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)
			//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_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Expected O, but got Unknown
			//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)
			WheelComponent wheelComponent = new WheelComponent();
			GameObject val = new GameObject(((Object)wheel).name + "WheelCollider");
			val.transform.parent = ((Component)this).transform;
			val.transform.position = wheel.position;
			val.transform.eulerAngles = ((Component)this).transform.eulerAngles;
			pos_y = val.transform.localPosition.y;
			WheelCollider val2 = (WheelCollider)val.AddComponent(typeof(WheelCollider));
			wheelComponent.wheel = wheel;
			wheelComponent.collider = val.GetComponent<WheelCollider>();
			wheelComponent.drive = drive;
			wheelComponent.pos_y = pos_y;
			wheelComponent.maxSteer = maxSteer;
			wheelComponent.startPos = val.transform.localPosition;
			wheelComponent.settings = setting;
			return wheelComponent;
		}

		private void Awake()
		{
			//IL_0078: 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_00de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: 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_020f: Unknown result type (might be due to invalid IL or missing references)
			//IL_026b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_032d: 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_0372: Unknown result type (might be due to invalid IL or missing references)
			//IL_0377: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_040f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0414: Unknown result type (might be due to invalid IL or missing references)
			//IL_044e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0457: Unknown result type (might be due to invalid IL or missing references)
			//IL_045c: Unknown result type (might be due to invalid IL or missing references)
			//IL_048a: Unknown result type (might be due to invalid IL or missing references)
			if (carSetting.automaticGear)
			{
				NeutralGear = false;
			}
			myRigidbody = ((Component)((Component)this).transform).GetComponent<Rigidbody>();
			wheels = new WheelComponent[8];
			wheels[0] = SetWheelComponent(carWheels.wheels.frontRight, carSetting.maxSteerAngle, carWheels.wheels.frontWheelDrive, carWheels.wheels.frontRight.position.y, carWheels.wheels.frontSetting);
			wheels[1] = SetWheelComponent(carWheels.wheels.frontLeft, carSetting.maxSteerAngle, carWheels.wheels.frontWheelDrive, carWheels.wheels.frontLeft.position.y, carWheels.wheels.frontSetting);
			wheels[4] = SetWheelComponent(carWheels.wheels.frontRight2, carSetting.maxSteerAngle, carWheels.wheels.frontWheelDrive, carWheels.wheels.frontRight2.position.y, carWheels.wheels.frontSetting);
			wheels[5] = SetWheelComponent(carWheels.wheels.frontLeft2, carSetting.maxSteerAngle, carWheels.wheels.frontWheelDrive, carWheels.wheels.frontLeft2.position.y, carWheels.wheels.frontSetting);
			wheels[2] = SetWheelComponent(carWheels.wheels.backRight, 0f, carWheels.wheels.backWheelDrive, carWheels.wheels.backRight.position.y, carWheels.wheels.rearSetting);
			wheels[3] = SetWheelComponent(carWheels.wheels.backLeft, 0f, carWheels.wheels.backWheelDrive, carWheels.wheels.backLeft.position.y, carWheels.wheels.rearSetting);
			wheels[6] = SetWheelComponent(carWheels.wheels.backRight2, 0f, carWheels.wheels.backWheelDrive, carWheels.wheels.backRight2.position.y, carWheels.wheels.rearSetting);
			wheels[7] = SetWheelComponent(carWheels.wheels.backLeft2, 0f, carWheels.wheels.backWheelDrive, carWheels.wheels.backLeft2.position.y, carWheels.wheels.rearSetting);
			if (Object.op_Implicit((Object)(object)carSetting.carSteer))
			{
				steerCurAngle = carSetting.carSteer.localEulerAngles;
			}
			WheelComponent[] array = wheels;
			foreach (WheelComponent wheelComponent in array)
			{
				WheelCollider collider = wheelComponent.collider;
				collider.suspensionDistance = wheelComponent.settings.Distance;
				JointSpring suspensionSpring = collider.suspensionSpring;
				suspensionSpring.spring = carSetting.springs;
				suspensionSpring.damper = carSetting.dampers;
				collider.suspensionSpring = suspensionSpring;
				collider.radius = wheelComponent.settings.Radius;
				collider.mass = wheelComponent.settings.Weight;
				WheelFrictionCurve val = collider.forwardFriction;
				((WheelFrictionCurve)(ref val)).asymptoteValue = 5000f;
				((WheelFrictionCurve)(ref val)).extremumSlip = 2f;
				((WheelFrictionCurve)(ref val)).asymptoteSlip = 20f;
				((WheelFrictionCurve)(ref val)).stiffness = carSetting.stiffness;
				collider.forwardFriction = val;
				val = collider.sidewaysFriction;
				((WheelFrictionCurve)(ref val)).asymptoteValue = 7500f;
				((WheelFrictionCurve)(ref val)).asymptoteSlip = 2f;
				((WheelFrictionCurve)(ref val)).stiffness = carSetting.stiffness;
				collider.sidewaysFriction = val;
			}
		}

		public void TurnOnEngine(bool forcibly)
		{
			if (!isForciblyOff)
			{
				isOn = true;
			}
			else if (forcibly)
			{
				isForciblyOff = false;
				isOn = true;
			}
		}

		public void TurnOffEngine(bool forcibly)
		{
			isForciblyOff = forcibly;
			isOn = false;
		}

		public void ShiftTo(int newGear)
		{
			((Component)carSounds.switchGear).GetComponent<AudioSource>().Play();
			currentGear = newGear;
			if (currentGear == 0)
			{
				NeutralGear = true;
			}
			else
			{
				NeutralGear = false;
			}
			if (currentGear == -1)
			{
				currentGear = 0;
			}
		}

		public void ShiftUp(bool ignoreDelay)
		{
			float timeSinceLevelLoad = Time.timeSinceLevelLoad;
			if ((timeSinceLevelLoad < shiftDelay && !ignoreDelay) || currentGear >= carSetting.gears.Length - 1)
			{
				return;
			}
			((Component)carSounds.switchGear).GetComponent<AudioSource>().Play();
			if (!carSetting.automaticGear)
			{
				if (currentGear == 0)
				{
					if (NeutralGear)
					{
						currentGear++;
						NeutralGear = false;
					}
					else
					{
						NeutralGear = true;
					}
				}
				else
				{
					currentGear++;
				}
			}
			else
			{
				currentGear++;
			}
			shiftDelay = timeSinceLevelLoad + 1f;
			shiftTime = 1.5f;
		}

		public void ShiftDown(bool ignoreDelay)
		{
			float timeSinceLevelLoad = Time.timeSinceLevelLoad;
			if ((timeSinceLevelLoad < shiftDelay && !ignoreDelay) || (currentGear <= 0 && !NeutralGear))
			{
				return;
			}
			((Component)carSounds.switchGear).GetComponent<AudioSource>().Play();
			if (!carSetting.automaticGear)
			{
				if (currentGear == 1)
				{
					if (!NeutralGear)
					{
						currentGear--;
						NeutralGear = true;
					}
				}
				else if (currentGear == 0)
				{
					NeutralGear = false;
				}
				else
				{
					currentGear--;
				}
			}
			else
			{
				currentGear--;
			}
			shiftDelay = timeSinceLevelLoad + 0.1f;
			shiftTime = 2f;
		}

		private void OnCollisionEnter(Collision collision)
		{
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: 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_00cb: 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_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)((Component)collision.transform.root).GetComponent<VehicleControl>()))
			{
				VehicleControl component = ((Component)collision.transform.root).GetComponent<VehicleControl>();
				Vector3 relativeVelocity = collision.relativeVelocity;
				component.slip2 = Mathf.Clamp(((Vector3)(ref relativeVelocity)).magnitude, 0f, 10f);
				myRigidbody.angularVelocity = new Vector3((0f - myRigidbody.angularVelocity.x) * 0.5f, myRigidbody.angularVelocity.y * 0.5f, (0f - myRigidbody.angularVelocity.z) * 0.5f);
				myRigidbody.velocity = new Vector3(myRigidbody.velocity.x, myRigidbody.velocity.y * 0.5f, myRigidbody.velocity.z);
			}
		}

		private void OnCollisionStay(Collision collision)
		{
			if (Object.op_Implicit((Object)(object)((Component)collision.transform.root).GetComponent<VehicleControl>()))
			{
				((Component)collision.transform.root).GetComponent<VehicleControl>().slip2 = 5f;
			}
		}

		private void Update()
		{
		}

		private void FixedUpdate()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_0722: Unknown result type (might be due to invalid IL or missing references)
			//IL_0727: Unknown result type (might be due to invalid IL or missing references)
			//IL_076f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0778: Unknown result type (might be due to invalid IL or missing references)
			//IL_077d: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aed: Unknown result type (might be due to invalid IL or missing references)
			//IL_0afe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b03: Unknown result type (might be due to invalid IL or missing references)
			//IL_1006: Unknown result type (might be due to invalid IL or missing references)
			//IL_1010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f22: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f29: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f2e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f48: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f53: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f58: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f61: Unknown result type (might be due to invalid IL or missing references)
			//IL_1028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b59: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b5e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0d41: Unknown result type (might be due to invalid IL or missing references)
			if (!isOn)
			{
				accel = 0f;
			}
			Vector3 velocity = myRigidbody.velocity;
			speed = ((Vector3)(ref velocity)).magnitude * 2.7f;
			if (speed < lastSpeed - 10f && slip < 10f)
			{
				slip = lastSpeed / 15f;
			}
			lastSpeed = speed;
			if (slip2 != 0f)
			{
				slip2 = Mathf.MoveTowards(slip2, 0f, 0.1f);
			}
			myRigidbody.centerOfMass = carSetting.shiftCentre;
			if (!carWheels.wheels.frontWheelDrive && !carWheels.wheels.backWheelDrive)
			{
				accel = 0f;
			}
			if (Object.op_Implicit((Object)(object)carSetting.carSteer))
			{
				carSetting.carSteer.localEulerAngles = new Vector3(steerCurAngle.x, steerCurAngle.y, steerCurAngle.z + steer * -510f);
			}
			if (carSetting.automaticGear && currentGear == 1 && accel < 0f)
			{
				if (speed < 5f)
				{
					ShiftDown(ignoreDelay: false);
				}
			}
			else if (carSetting.automaticGear && currentGear == 0 && accel > 0f)
			{
				if (speed < 5f)
				{
					ShiftUp(ignoreDelay: false);
				}
			}
			else if (carSetting.automaticGear && motorRPM > carSetting.shiftUpRPM && accel > 0f && speed > 10f && !brake)
			{
				ShiftUp(ignoreDelay: false);
			}
			else if (carSetting.automaticGear && motorRPM < carSetting.shiftDownRPM && currentGear > 1)
			{
				ShiftDown(ignoreDelay: false);
			}
			if (speed < 1f)
			{
				Backward = true;
			}
			if (currentGear != 0 || !Backward)
			{
				Backward = false;
			}
			Light[] brakeLights = carLights.brakeLights;
			foreach (Light val in brakeLights)
			{
				if (brake || accel < 0f || speed < 1f)
				{
					val.intensity = Mathf.MoveTowards(val.intensity, 8f, 0.5f);
				}
				else
				{
					val.intensity = Mathf.MoveTowards(val.intensity, 0f, 0.5f);
				}
				((Behaviour)val).enabled = val.intensity != 0f;
			}
			Light[] reverseLights = carLights.reverseLights;
			foreach (Light val2 in reverseLights)
			{
				if (speed > 2f && currentGear == 0)
				{
					val2.intensity = Mathf.MoveTowards(val2.intensity, 8f, 0.5f);
				}
				else
				{
					val2.intensity = Mathf.MoveTowards(val2.intensity, 0f, 0.5f);
				}
				((Behaviour)val2).enabled = val2.intensity != 0f;
			}
			wantedRPM = 5500f * accel * 0.1f + wantedRPM * 0.9f;
			float num = 0f;
			int num2 = 0;
			bool flag = false;
			int num3 = 0;
			WheelComponent[] array = wheels;
			WheelHit val4 = default(WheelHit);
			foreach (WheelComponent wheelComponent in array)
			{
				WheelCollider collider = wheelComponent.collider;
				if (wheelComponent.drive)
				{
					num = ((!NeutralGear && brake && currentGear < 2) ? (num + accel * carSetting.idleRPM) : (NeutralGear ? (num + carSetting.idleRPM * accel) : (num + collider.rpm)));
					num2++;
				}
				if (brake || accel < 0f)
				{
					if (accel < 0f || (brake && (wheelComponent == wheels[2] || wheelComponent == wheels[3] || wheelComponent == wheels[6] || wheelComponent == wheels[7])))
					{
						if (brake && accel > 0f)
						{
							slip = Mathf.Lerp(slip, 5f, accel * 0.01f);
						}
						else if (speed > 1f)
						{
							slip = Mathf.Lerp(slip, 1f, 0.002f);
						}
						else
						{
							slip = Mathf.Lerp(slip, 1f, 0.02f);
						}
						wantedRPM = 0f;
						collider.brakeTorque = carSetting.brakePower;
						wheelComponent.rotation = w_rotate;
					}
				}
				else
				{
					float brakeTorque;
					if (accel == 0f || NeutralGear)
					{
						float num5 = (collider.brakeTorque = 1000f);
						brakeTorque = num5;
					}
					else
					{
						float num5 = (collider.brakeTorque = 0f);
						brakeTorque = num5;
					}
					collider.brakeTorque = brakeTorque;
					slip = ((!(speed > 0f)) ? (slip = Mathf.Lerp(slip, 0.01f, 0.02f)) : ((!(speed > 100f)) ? (slip = Mathf.Lerp(slip, 1.5f, 0.02f)) : (slip = Mathf.Lerp(slip, 1f + Mathf.Abs(steer), 0.02f))));
					w_rotate = wheelComponent.rotation;
				}
				WheelFrictionCurve val3 = collider.forwardFriction;
				((WheelFrictionCurve)(ref val3)).asymptoteValue = 5000f;
				((WheelFrictionCurve)(ref val3)).extremumSlip = 2f;
				((WheelFrictionCurve)(ref val3)).asymptoteSlip = 20f;
				((WheelFrictionCurve)(ref val3)).stiffness = carSetting.stiffness / (slip + slip2);
				collider.forwardFriction = val3;
				val3 = collider.sidewaysFriction;
				((WheelFrictionCurve)(ref val3)).stiffness = carSetting.stiffness / (slip + slip2);
				((WheelFrictionCurve)(ref val3)).extremumSlip = 0.2f + Mathf.Abs(steer);
				collider.sidewaysFriction = val3;
				if (shift && currentGear > 1 && speed > 50f && shifmotor && Mathf.Abs(steer) < 0.2f)
				{
					if (powerShift == 0f)
					{
						shifmotor = false;
					}
					powerShift = Mathf.MoveTowards(powerShift, 0f, Time.deltaTime * 10f);
					carSounds.nitro.volume = Mathf.Lerp(carSounds.nitro.volume, 1f, Time.deltaTime * 10f);
					if (!carSounds.nitro.isPlaying)
					{
						((Component)carSounds.nitro).GetComponent<AudioSource>().Play();
					}
					curTorque = ((!(powerShift > 0f)) ? carSetting.carPower : carSetting.shiftPower);
					carParticles.shiftParticle1.emissionRate = Mathf.Lerp(carParticles.shiftParticle1.emissionRate, (float)((powerShift > 0f) ? 50 : 0), Time.deltaTime * 10f);
					carParticles.shiftParticle2.emissionRate = Mathf.Lerp(carParticles.shiftParticle2.emissionRate, (float)((powerShift > 0f) ? 50 : 0), Time.deltaTime * 10f);
				}
				else
				{
					if (powerShift > 20f)
					{
						shifmotor = true;
					}
					carSounds.nitro.volume = Mathf.MoveTowards(carSounds.nitro.volume, 0f, Time.deltaTime * 2f);
					if (carSounds.nitro.volume == 0f)
					{
						carSounds.nitro.Stop();
					}
					powerShift = Mathf.MoveTowards(powerShift, 100f, Time.deltaTime * 5f);
					curTorque = carSetting.carPower;
					carParticles.shiftParticle1.emissionRate = Mathf.Lerp(carParticles.shiftParticle1.emissionRate, 0f, Time.deltaTime * 10f);
					carParticles.shiftParticle2.emissionRate = Mathf.Lerp(carParticles.shiftParticle2.emissionRate, 0f, Time.deltaTime * 10f);
				}
				wheelComponent.rotation = Mathf.Repeat(wheelComponent.rotation + Time.deltaTime * collider.rpm * 360f / 60f, 360f);
				wheelComponent.rotation2 = Mathf.Lerp(wheelComponent.rotation2, collider.steerAngle, 0.1f);
				wheelComponent.wheel.localRotation = Quaternion.Euler(wheelComponent.rotation, wheelComponent.rotation2, 0f);
				Vector3 localPosition = wheelComponent.wheel.localPosition;
				if (collider.GetGroundHit(ref val4))
				{
					if (Object.op_Implicit((Object)(object)carParticles.brakeParticlePerfab))
					{
						if ((Object)(object)Particle[num3] == (Object)null)
						{
							Particle[num3] = Object.Instantiate<GameObject>(carParticles.brakeParticlePerfab, wheelComponent.wheel.position, Quaternion.identity);
							((Object)Particle[num3]).name = "WheelParticle";
							Particle[num3].transform.parent = ((Component)this).transform;
							Particle[num3].AddComponent<AudioSource>();
							Particle[num3].GetComponent<AudioSource>().maxDistance = 50f;
							Particle[num3].GetComponent<AudioSource>().spatialBlend = 1f;
							Particle[num3].GetComponent<AudioSource>().dopplerLevel = 5f;
							Particle[num3].GetComponent<AudioSource>().rolloffMode = (AudioRolloffMode)2;
						}
						ParticleSystem component = Particle[num3].GetComponent<ParticleSystem>();
						bool flag2 = false;
						for (int l = 0; l < carSetting.hitGround.Length; l++)
						{
							if (((Component)((WheelHit)(ref val4)).collider).CompareTag(carSetting.hitGround[l].tag))
							{
								flag2 = carSetting.hitGround[l].grounded;
								if ((brake || Mathf.Abs(((WheelHit)(ref val4)).sidewaysSlip) > 0.5f) && speed > 1f)
								{
									Particle[num3].GetComponent<AudioSource>().clip = carSetting.hitGround[l].brakeSound;
								}
								else if ((Object)(object)Particle[num3].GetComponent<AudioSource>().clip != (Object)(object)carSetting.hitGround[l].groundSound && !Particle[num3].GetComponent<AudioSource>().isPlaying)
								{
									Particle[num3].GetComponent<AudioSource>().clip = carSetting.hitGround[l].groundSound;
								}
								Particle[num3].GetComponent<ParticleSystem>().startColor = carSetting.hitGround[l].brakeColor;
							}
						}
						if (flag2 && speed > 5f && !brake)
						{
							component.enableEmission = true;
							Particle[num3].GetComponent<AudioSource>().volume = 0.5f;
							if (!Particle[num3].GetComponent<AudioSource>().isPlaying)
							{
								Particle[num3].GetComponent<AudioSource>().Play();
							}
						}
						else if ((brake || Mathf.Abs(((WheelHit)(ref val4)).sidewaysSlip) > 0.6f) && speed > 1f)
						{
							if (accel < 0f || ((brake || Mathf.Abs(((WheelHit)(ref val4)).sidewaysSlip) > 0.6f) && (wheelComponent == wheels[2] || wheelComponent == wheels[3] || wheelComponent == wheels[6] || wheelComponent == wheels[7])))
							{
								if (!Particle[num3].GetComponent<AudioSource>().isPlaying)
								{
									Particle[num3].GetComponent<AudioSource>().Play();
								}
								component.enableEmission = true;
								Particle[num3].GetComponent<AudioSource>().volume = 10f;
							}
						}
						else
						{
							component.enableEmission = false;
							Particle[num3].GetComponent<AudioSource>().volume = Mathf.Lerp(Particle[num3].GetComponent<AudioSource>().volume, 0f, Time.deltaTime * 10f);
						}
					}
					localPosition.y -= Vector3.Dot(wheelComponent.wheel.position - ((WheelHit)(ref val4)).point, ((Component)this).transform.TransformDirection(0f, 1f, 0f) / ((Component)this).transform.lossyScale.x) - collider.radius;
					localPosition.y = Mathf.Clamp(localPosition.y, -10f, wheelComponent.pos_y);
					flag = flag || wheelComponent.drive;
				}
				else
				{
					if ((Object)(object)Particle[num3] != (Object)null)
					{
						ParticleSystem component2 = Particle[num3].GetComponent<ParticleSystem>();
						component2.enableEmission = false;
					}
					localPosition.y = wheelComponent.startPos.y - wheelComponent.settings.Distance;
					myRigidbody.AddForce(Vector3.down * 5000f);
				}
				num3++;
				wheelComponent.wheel.localPosition = localPosition;
			}
			if (num2 > 1)
			{
				num /= (float)num2;
			}
			motorRPM = 0.95f * motorRPM + 0.05f * Mathf.Abs(num * carSetting.gears[currentGear]);
			if (motorRPM > 5500f)
			{
				motorRPM = 5200f;
			}
			int num7 = (int)(motorRPM / efficiencyTableStep);
			if (num7 >= efficiencyTable.Length)
			{
				num7 = efficiencyTable.Length - 1;
			}
			if (num7 < 0)
			{
				num7 = 0;
			}
			float num8 = curTorque * carSetting.gears[currentGear] * efficiencyTable[num7];
			WheelComponent[] array2 = wheels;
			foreach (WheelComponent wheelComponent2 in array2)
			{
				WheelCollider collider2 = wheelComponent2.collider;
				if (wheelComponent2.drive)
				{
					if (Mathf.Abs(collider2.rpm) > Mathf.Abs(wantedRPM))
					{
						collider2.motorTorque = 0f;
					}
					else
					{
						float motorTorque = collider2.motorTorque;
						if (!brake && accel != 0f && !NeutralGear)
						{
							if ((speed < carSetting.LimitForwardSpeed && currentGear > 0) || (speed < carSetting.LimitBackwardSpeed && currentGear == 0))
							{
								collider2.motorTorque = motorTorque * 0.9f + num8 * 1f;
							}
							else
							{
								collider2.motorTorque = 0f;
								collider2.brakeTorque = 2000f;
							}
						}
						else
						{
							collider2.motorTorque = 0f;
						}
					}
				}
				if (brake || slip2 > 2f)
				{
					collider2.steerAngle = Mathf.Lerp(collider2.steerAngle, steer * wheelComponent2.maxSteer, 0.02f);
					continue;
				}
				float num9 = Mathf.Clamp(speed / carSetting.maxSteerAngle, 1f, carSetting.maxSteerAngle);
				collider2.steerAngle = steer * (wheelComponent2.maxSteer / num9);
			}
			Pitch = Mathf.Clamp(1.2f + (motorRPM - carSetting.idleRPM) / (carSetting.shiftUpRPM - carSetting.idleRPM), carSounds.minPitch, carSounds.maxPitch);
			shiftTime = Mathf.MoveTowards(shiftTime, 0f, 0.1f);
			if (Pitch == 1f)
			{
				carSounds.IdleEngine.volume = Mathf.Lerp(carSounds.IdleEngine.volume, 1f, 0.1f);
				carSounds.LowEngine.volume = Mathf.Lerp(carSounds.LowEngine.volume, 0.5f, 0.1f);
				carSounds.HighEngine.volume = Mathf.Lerp(carSounds.HighEngine.volume, 0f, 0.1f);
			}
			else
			{
				carSounds.IdleEngine.volume = Mathf.Lerp(carSounds.IdleEngine.volume, 1.8f - Pitch, 0.1f);
				if ((Pitch > PitchDelay || accel > 0f) && shiftTime == 0f)
				{
					carSounds.LowEngine.volume = Mathf.Lerp(carSounds.LowEngine.volume, 0f, 0.2f);
					carSounds.HighEngine.volume = Mathf.Lerp(carSounds.HighEngine.volume, 1f, 0.1f);
				}
				else
				{
					carSounds.LowEngine.volume = Mathf.Lerp(carSounds.LowEngine.volume, 0.5f, 0.1f);
					carSounds.HighEngine.volume = Mathf.Lerp(carSounds.HighEngine.volume, 0f, 0.2f);
				}
				carSounds.HighEngine.pitch = Pitch;
				carSounds.LowEngine.pitch = Pitch;
				PitchDelay = Pitch;
			}
			if (!isOn)
			{
				carSounds.IdleEngine.volume = 0f;
				carSounds.LowEngine.volume = 0f;
				carSounds.HighEngine.volume = 0f;
			}
		}

		private void OnDrawGizmos()
		{
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: 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_0047: 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_006b: 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_0089: 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_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: 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)
			if (carSetting.showNormalGizmos && !Application.isPlaying)
			{
				Matrix4x4 matrix = Matrix4x4.TRS(((Component)this).transform.position, ((Component)this).transform.rotation, ((Component)this).transform.lossyScale);
				Gizmos.matrix = matrix;
				Gizmos.color = new Color(1f, 0f, 0f, 0.5f);
				Gizmos.DrawCube(Vector3.up / 1.5f, new Vector3(2.5f, 2f, 6f));
				Gizmos.DrawSphere(carSetting.shiftCentre / ((Component)this).transform.lossyScale.x, 0.2f);
			}
		}
	}
	public class enginestartsound : MonoBehaviour
	{
		public GameObject button;

		public GameObject sound;

		public VehicleControl vehicle;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: 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)
			if (button.transform.localEulerAngles.x >= 45f && !vehicle.isOn)
			{
				sound.SetActive(true);
			}
			else if (button.transform.localEulerAngles.x < 45f || vehicle.isOn)
			{
				sound.SetActive(false);
			}
		}
	}
	public class gunpodtrigger : MonoBehaviour
	{
		public FVRInteractiveObject obj;

		public GameObject trigger;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: 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)
			if ((Object)(object)obj.m_hand != (Object)null)
			{
				if (obj.m_hand.Input.TriggerPressed)
				{
					trigger.transform.localEulerAngles = new Vector3(90f, 0f, 0f);
				}
				else
				{
					trigger.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
				}
			}
			else
			{
				trigger.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
			}
		}
	}
	public class Bikehandle : MonoBehaviour
	{
		public GameObject fakebikeh;

		public GameObject realbikeh;

		public ConstantForce forceR;

		public ConstantForce forceF;

		public float forcesize;

		private void Update()
		{
			//IL_001c: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0043: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0152: 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_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)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011b: Unknown result type (might be due to invalid IL or missing references)
			//IL_013c: Unknown result type (might be due to invalid IL or missing references)
			fakebikeh.transform.localEulerAngles = new Vector3(0f, realbikeh.transform.localEulerAngles.y, 0f);
			if (fakebikeh.transform.localEulerAngles.y >= 2.5f && fakebikeh.transform.localEulerAngles.y <= 35f)
			{
				forceF.relativeForce = new Vector3(forcesize, 0f, 0f);
				forceR.relativeForce = new Vector3(forcesize, 0f, 0f);
			}
			if (fakebikeh.transform.localEulerAngles.y <= 357.5f && fakebikeh.transform.localEulerAngles.y >= 325f)
			{
				forceF.relativeForce = new Vector3(0f - forcesize, 0f, 0f);
				forceR.relativeForce = new Vector3(0f - forcesize, 0f, 0f);
			}
			if (fakebikeh.transform.localEulerAngles.y < 2.5f || fakebikeh.transform.localEulerAngles.y > 357.5f)
			{
				forceF.relativeForce = new Vector3(0f, 0f, 0f);
				forceR.relativeForce = new Vector3(0f, 0f, 0f);
			}
		}
	}
	public class moveGC : MonoBehaviour
	{
		public VehicleControl vc;

		public GameObject trackinghead;

		private float move;

		private void Update()
		{
			//IL_001d: 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_018c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0191: 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)
			//IL_00a1: 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)
			//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_006e: 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_0159: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			if (vc.isOn)
			{
				if (trackinghead.transform.localPosition.x > 0.15f)
				{
					move = trackinghead.transform.localPosition.x;
					vc.carSetting.shiftCentre = new Vector3(move, 0.25f, 0.3f);
					if (move > 0.2f)
					{
						move = 0.2f;
					}
				}
				if (trackinghead.transform.localPosition.x < -0.15f)
				{
					move = trackinghead.transform.localPosition.x;
					vc.carSetting.shiftCentre = new Vector3(move, 0.25f, 0.3f);
					if (move < -0.2f)
					{
						move = -0.2f;
					}
				}
			}
			if (!vc.isOn || (trackinghead.transform.localPosition.x > -0.15f && trackinghead.transform.localPosition.x < 0.15f))
			{
				vc.carSetting.shiftCentre = new Vector3(0f, 0.25f, 0.3f);
			}
		}
	}
	public class speedlimit : MonoBehaviour
	{
		public HingeJoint joint;

		public float limit;

		public VehicleControl vehicle;

		public GameObject needle;

		public bool isImperial;

		public float maxSpeed;

		public Vector3 needleNoSpeed;

		public Vector3 needleMaxSpeed;

		public void Update()
		{
			//IL_0045: 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)
			//IL_0051: 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_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: 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_00ba: Unknown result type (might be due to invalid IL or missing references)
			float num = Mathf.Abs(vehicle.speed);
			if (isImperial)
			{
				num *= 0.6213712f;
			}
			float num2 = Mathf.InverseLerp(0f, maxSpeed, num);
			needle.transform.localEulerAngles = Vector3.Lerp(needleNoSpeed, needleMaxSpeed, num2);
			JointLimits limits = joint.limits;
			((JointLimits)(ref limits)).min = needle.transform.localEulerAngles.x - limit;
			((JointLimits)(ref limits)).max = limit - needle.transform.localEulerAngles.x;
			joint.limits = limits;
		}
	}
	public class FireRope : MonoBehaviour
	{
		public ClosedBoltWeapon gun;

		public GameObject trigger;

		public FVRFireArmChamber chamber;

		public GameObject MuzzleFlash;

		public Transform muzzle;

		public bool fired = false;

		private void Start()
		{
		}

		private void Update()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_006e: 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)
			if (trigger.transform.localPosition.z >= 0.1f)
			{
				if (chamber.IsFull && !chamber.IsSpent)
				{
					gun.Fire();
					if (!fired)
					{
						Object.Instantiate<GameObject>(MuzzleFlash, ((Component)muzzle).transform.position, ((Component)muzzle).transform.rotation);
						fired = true;
					}
				}
			}
			else if (trigger.transform.localPosition.z < 0.1f)
			{
				fired = false;
			}
		}
	}
	public class HMDScope : MonoBehaviour
	{
		public FVRFireArmAttachment main;

		public GameObject HMDpiece;

		public GameObject HMD;

		public GameObject Screen;

		public GameObject Cam;

		private void Start()
		{
		}

		private void FixedUpdate()
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//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)
			if ((Object)(object)main.curMount != (Object)null)
			{
				HMDpiece.SetActive(true);
			}
			else if ((Object)(object)main.curMount == (Object)null)
			{
				HMDpiece.SetActive(false);
			}
			if (HMD.transform.localEulerAngles.z > 45f)
			{
				Screen.SetActive(true);
				Cam.SetActive(true);
			}
			else if (HMD.transform.localEulerAngles.z < 45f)
			{
				Screen.SetActive(false);
				Cam.SetActive(false);
			}
		}
	}
	public class SlideScope : MonoBehaviour
	{
		public GameObject SlideRot;

		public Camera Cam1;

		private RenderTexture rt1;

		private Material mt1;

		public MeshRenderer mr1;

		public Shader sd;

		private void Update()
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			Cam1.fieldOfView = SlideRot.transform.localEulerAngles.x;
		}
	}
}
namespace MeatyScripts
{
	public class NGSW_FC : FVRInteractiveObject
	{
		[Header("NGSW FireControl Config")]
		public PIPScopeController PIPScopeController;

		public Transform PostZeroReticleParent;

		public Transform RaycastOrigin;

		public LayerMask RangeFinderHitLayers;

		public GameObject OneEcksReticle;

		public float OneEcksReticleBaseScale = 1f;

		public GameObject PreZeroReticle;

		public float PreZeroReticleBaseScale = 1f;

		public GameObject PostZeroReticle;

		public float PostZeroReticleBaseScale = 1f;

		public Text HeadingText;

		private float _currentHeading;

		public float RangeFinderRange = 5000f;

		public Text ZeroRangeText;

		public int BulletDropCalculationSingleFrameLimit = 0;

		public float AsynchAbortEpsilon = 0.1f;

		public int MaxAsynchIterationsPerFrame = 100;

		public float ArtificialCalculationDelay = 0.1f;

		public float IncompleteZeroBlinkInterval = 0.25f;

		[Header("Zoom Ring")]
		public float OneEcksThreshold = 0.1f;

		private bool _isOneEcks = false;

		private bool _isZeroed = false;

		private FVRFireArm _fireArm;

		private RaycastHit _lastHit;

		private bool _stillCalculatingDrop;

		private float _consineAdjustedRange;

		private float _calculatedDrop;

		private bool _compassEnabled = true;

		private float _currentMagnification;

		public bool CompassEnabled => _compassEnabled;

		public override void Start()
		{
			((FVRInteractiveObject)this).Start();
			base.IsSimpleInteract = true;
			CheckMagnificationLevel();
			UpdateReticles();
			ResetZero();
		}

		public void Update()
		{
			if (Application.isEditor)
			{
				UpdateHeading();
				CheckMagnificationLevel();
				UpdateReticles();
			}
		}

		public override void FVRUpdate()
		{
			((FVRInteractiveObject)this).FVRUpdate();
			UpdateHeading();
			CheckMagnificationLevel();
			UpdateReticles();
		}

		public void ToggleCompass()
		{
			_compassEnabled = !_compassEnabled;
		}

		private void FindCurrentFirearm()
		{
			if ((Object)(object)((FVRFireArmAttachmentInterface)PIPScopeController).Attachment != (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)PIPScopeController).Attachment.curMount != (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)PIPScopeController).Attachment.curMount.Parent != (Object)null && ((FVRFireArmAttachmentInterface)PIPScopeController).Attachment.curMount.Parent is FVRFireArm)
			{
				ref FVRFireArm fireArm = ref _fireArm;
				FVRPhysicalObject parent = ((FVRFireArmAttachmentInterface)PIPScopeController).Attachment.curMount.Parent;
				fireArm = (FVRFireArm)(object)((parent is FVRFireArm) ? parent : null);
			}
			else if ((Object)(object)PIPScopeController.OverrideFireArm != (Object)null)
			{
				_fireArm = PIPScopeController.OverrideFireArm;
			}
			else if ((Object)(object)PIPScopeController.OverrideFireArm == (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)PIPScopeController).Attachment != (Object)null && (Object)(object)((FVRFireArmAttachmentInterface)PIPScopeController).Attachment.curMount == (Object)null)
			{
				_fireArm = null;
			}
		}

		private void CheckMagnificationLevel()
		{
			_currentMagnification = ((PIPScopeController.PScope.currentMagnification != 0f) ? PIPScopeController.PScope.currentMagnification : PIPScopeController.PScope.baseMagnification);
			if (!_isOneEcks && _currentMagnification < 1f + OneEcksThreshold)
			{
				_isOneEcks = true;
				ResetZero();
			}
			else if (_isOneEcks && !Mathf.Approximately(_currentMagnification, 1f))
			{
				_isOneEcks = false;
				ResetZero();
			}
		}

		private void UpdateReticles()
		{
			//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_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c0: 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_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: 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_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_0172: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_018e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0193: 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_01aa: Unknown result type (might be due to invalid IL or missing references)
			if (_isOneEcks)
			{
				OneEcksReticle.SetActive(true);
				PreZeroReticle.SetActive(false);
				PostZeroReticle.SetActive(false);
			}
			else if (!_stillCalculatingDrop)
			{
				OneEcksReticle.SetActive(false);
				if (_isZeroed)
				{
					PreZeroReticle.SetActive(false);
					PostZeroReticle.SetActive(true);
				}
				else
				{
					PreZeroReticle.SetActive(true);
					PostZeroReticle.SetActive(false);
				}
			}
			if (OneEcksReticle.activeSelf)
			{
				Vector3 val = Vector3.one * OneEcksReticleBaseScale * _currentMagnification;
				if (OneEcksReticle.transform.localScale != val)
				{
					OneEcksReticle.transform.localScale = val;
				}
			}
			else if (PreZeroReticle.activeSelf)
			{
				Vector3 val2 = Vector3.one * PreZeroReticleBaseScale * _currentMagnification;
				if (PreZeroReticle.transform.localScale != val2)
				{
					PreZeroReticle.transform.localScale = val2;
				}
			}
			else if (PostZeroReticle.activeSelf)
			{
				Vector3 val3 = Vector3.one * PostZeroReticleBaseScale * _currentMagnification;
				if (PostZeroReticle.transform.localScale != val3)
				{
					PostZeroReticle.transform.localScale = val3;
				}
			}
		}

		public override void SimpleInteraction(FVRViveHand hand)
		{
			//IL_001a: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			((FVRInteractiveObject)this).SimpleInteraction(hand);
			if (_isOneEcks)
			{
				return;
			}
			if (Physics.Raycast(RaycastOrigin.position, RaycastOrigin.forward, ref _lastHit, RangeFinderRange, LayerMask.op_Implicit(RangeFinderHitLayers)))
			{
				FindCurrentFirearm();
				if ((Object)(object)_fireArm != (Object)null)
				{
					CalculateBulletDrop();
				}
				if (_stillCalculatingDrop)
				{
					ResetZero();
					((MonoBehaviour)this).StopCoroutine("WaitForCalculation");
					((MonoBehaviour)this).StartCoroutine("WaitForCalculation");
				}
				else
				{
					Zero();
				}
			}
			else
			{
				ResetZero();
			}
		}

		public void TriggerRangeFinderZeroing()
		{
			//IL_0013: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			if (_isOneEcks)
			{
				return;
			}
			if (Physics.Raycast(RaycastOrigin.position, RaycastOrigin.forward, ref _lastHit, RangeFinderRange, LayerMask.op_Implicit(RangeFinderHitLayers)))
			{
				FindCurrentFirearm();
				if ((Object)(object)_fireArm != (Object)null)
				{
					float num = 90f - Vector3.Angle(Vector3.up, _fireArm.GetMuzzle().forward);
					_consineAdjustedRange = ((RaycastHit)(ref _lastHit)).distance * Mathf.Cos(num * ((float)Math.PI / 180f));
					CalculateBulletDrop();
				}
				if (_stillCalculatingDrop)
				{
					ResetZero();
					((MonoBehaviour)this).StopCoroutine("WaitForCalculation");
					((MonoBehaviour)this).StartCoroutine("WaitForCalculation");
				}
				else
				{
					Zero();
				}
			}
			else
			{
				ResetZero();
			}
		}

		private IEnumerator WaitForCalculation()
		{
			((MonoBehaviour)this).StopCoroutine("DisplayBlinker");
			((MonoBehaviour)this).StartCoroutine("DisplayBlinker");
			while (_stillCalculatingDrop)
			{
				yield return null;
			}
			Zero();
		}

		private IEnumerator DisplayBlinker()
		{
			if ((Object)(object)ZeroRangeText != (Object)null)
			{
				ZeroRangeText.text = $"{Mathf.RoundToInt(((RaycastHit)(ref _lastHit)).distance)}m";
			}
			while (_stillCalculatingDrop)
			{
				if ((Object)(object)ZeroRangeText != (Object)null)
				{
					((Component)ZeroRangeText).gameObject.SetActive(false);
				}
				PreZeroReticle.SetActive(false);
				yield return (object)new WaitForSeconds(IncompleteZeroBlinkInterval);
				if ((Object)(object)ZeroRangeText != (Object)null)
				{
					((Component)ZeroRangeText).gameObject.SetActive(true);
				}
				PreZeroReticle.SetActive(true);
				yield return (object)new WaitForSeconds(IncompleteZeroBlinkInterval);
			}
		}

		private void UpdateHeading()
		{
			//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_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			if (_compassEnabled)
			{
				Vector3 forward = ((Component)this).transform.forward;
				forward.y = 0f;
				Vector3 forward2 = Vector3.forward;
				Vector3 up = Vector3.up;
				float currentHeading = AngleSigned(forward2, forward, up);
				_currentHeading = currentHeading;
				if (_currentHeading < 0f)
				{
					_currentHeading += 360f;
				}
				if ((Object)(object)HeadingText != (Object)null)
				{
					HeadingText.text = FormatHeadingText();
				}
			}
			else if ((Object)(object)HeadingText != (Object)null)
			{
				HeadingText.text = string.Empty;
			}
		}

		private string FormatHeadingText()
		{
			string text = $"{Mathf.RoundToInt(_currentHeading)}°";
			string empty = string.Empty;
			empty = ((_currentHeading < 22.5f || _currentHeading > 337.5f) ? "N " : ((_currentHeading >= 22.5f && _currentHeading < 67.5f) ? "NE " : ((_currentHeading >= 67.5f && _currentHeading < 112.5f) ? "E " : ((_currentHeading >= 112.5f && _currentHeading < 157.5f) ? "SE " : ((_currentHeading >= 157.5f && _currentHeading < 202.5f) ? "S " : ((_currentHeading >= 202.5f && _currentHeading < 247.5f) ? "SW " : ((!(_currentHeading >= 247.5f) || !(_currentHeading < 292.5f)) ? "NW " : "W ")))))));
			return empty + text;
		}

		private float AngleSigned(Vector3 v1, Vector3 v2, Vector3 n)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			return Mathf.Atan2(Vector3.Dot(n, Vector3.Cross(v1, v2)), Vector3.Dot(v1, v2)) * 57.29578f;
		}

		public void Zero()
		{
			//IL_00b2: 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_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_00cc: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0087: 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_0051: 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_0061: 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_0154: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: 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_018e: 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)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b5: 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_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: 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_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0222: Unknown result type (might be due to invalid IL or missing references)
			//IL_0224: Unknown result type (might be due to invalid IL or missing references)
			//IL_0229: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			float distance = ((RaycastHit)(ref _lastHit)).distance;
			if ((Object)(object)_fireArm == (Object)null)
			{
				if ((Object)(object)PIPScopeController.OverrideMuzzle != (Object)null)
				{
					Vector3 val = PIPScopeController.OverrideMuzzle.position + PIPScopeController.OverrideMuzzle.forward * distance;
					PostZeroReticleParent.LookAt(val, Vector3.up);
					_isZeroed = true;
				}
				else
				{
					PostZeroReticleParent.localRotation = Quaternion.identity;
					_isZeroed = false;
				}
				return;
			}
			Transform muzzle = _fireArm.GetMuzzle();
			Vector3 val2 = ((RaycastHit)(ref _lastHit)).point - muzzle.position;
			float magnitude = ((Vector3)(ref val2)).magnitude;
			Vector3 val3 = Vector3.ProjectOnPlane(val2, Vector3.up);
			float magnitude2 = ((Vector3)(ref val3)).magnitude;
			if ((Object)(object)_fireArm != (Object)null)
			{
				float calculatedDrop = _calculatedDrop;
				if (calculatedDrop == float.MinValue)
				{
					PostZeroReticleParent.localPosition = Vector3.zero;
					if ((Object)(object)ZeroRangeText != (Object)null)
					{
						ZeroRangeText.text = "Out of range!";
					}
					_isZeroed = false;
					return;
				}
				Vector3 val4 = Vector2.op_Implicit(_fireArm.GetCombinedFixedDrift(_fireArm.AccuracyClass) * 0.0166667f);
				float num = _fireArm.GetCombinedFixedDrop(_fireArm.AccuracyClass) * 0.0166667f;
				Quaternion val5 = muzzle.rotation * Quaternion.Euler(val4.y + num, val4.x, 0f);
				Vector3 val6 = val5 * Vector3.forward;
				Vector3 val7 = muzzle.position + val6 * magnitude + Vector3.up * calculatedDrop;
				Camera scopeCam = PIPScopeController.PScope.scopeCam;
				float num2 = scopeCam.fieldOfView / 2f;
				float num3 = (float)scopeCam.pixelHeight / 2f;
				Vector3 val8 = ((Component)scopeCam).transform.InverseTransformPoint(val7);
				float num4 = Mathf.Atan2(val8.x, val8.z) * 57.29578f;
				float num5 = Mathf.Atan2(val8.y, val8.z) * 57.29578f;
				float num6 = Mathf.Tan(num4 * ((float)Math.PI / 180f)) / Mathf.Tan(num2 * ((float)Math.PI / 180f)) * num3;
				float num7 = Mathf.Tan(num5 * ((float)Math.PI / 180f)) / Mathf.Tan(num2 * ((float)Math.PI / 180f)) * num3;
				PostZeroReticleParent.localPosition = new Vector3(num6, num7, 0f);
			}
			if ((Object)(object)ZeroRangeText != (Object)null)
			{
				ZeroRangeText.text = $"{Mathf.RoundToInt(distance)}m";
			}
			_isZeroed = true;
		}

		private void ResetZero()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			PostZeroReticleParent.localPosition = Vector3.zero;
			if ((Object)(object)ZeroRangeText != (Object)null)
			{
				ZeroRangeText.text = string.Empty;
			}
			_isZeroed = false;
		}

		public void CalculateBulletDrop()
		{
			//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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: 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_013c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0141: Unknown result type (might be due to invalid IL or missing references)
			//IL_0232: Unknown result type (might be due to invalid IL or missing references)
			//IL_0234: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f2: 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_01f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			FVRFireArmChamber currentChamber = OpenScripts2_BasePlugin.GetCurrentChamber(_fireArm);
			FireArmRoundType roundType = _fireArm.RoundType;
			FVRFireArmRoundDisplayData val = AM.SRoundDisplayDataDic[roundType];
			float num = ((!((Object)(object)currentChamber != (Object)null)) ? 1f : AM.GetChamberVelMult(currentChamber.RoundType, Vector3.Distance(((Component)currentChamber).transform.position, _fireArm.GetMuzzle().position)));
			float airDensity = 1.225f;
			float fixedDeltaTime = Time.fixedDeltaTime;
			float num2 = val.ZeroingVel;
			float num3 = val.ZeroingMass;
			float num4 = val.ZeroingXDim;
			BallisticProjectile val2 = null;
			if ((Object)(object)currentChamber != (Object)null && currentChamber.IsFull && !currentChamber.IsSpent)
			{
				FVRFireArmRound round = currentChamber.GetRound();
				if ((Object)(object)round != (Object)null)
				{
					val2 = round.BallisticProjectilePrefab.GetComponent<BallisticProjectile>();
					if ((Object)(object)val2 != (Object)null)
					{
						num2 = val2.MuzzleVelocityBase;
						num3 = val2.Mass;
						num4 = val2.Dimensions.x;
					}
				}
			}
			Vector3 val3 = default(Vector3);
			((Vector3)(ref val3))..ctor(0f, 0f, num2 * num);
			float num5 = (float)Math.PI * Mathf.Pow(num4 * 0.5f, 2f);
			Vector3 val4 = Vector3.zero;
			float num6 = 0f;
			bool flag = false;
			int currentKeyframe = 0;
			bool flag2 = false;
			int i;
			for (i = 0; i < BulletDropCalculationSingleFrameLimit; i++)
			{
				if (val4.z >= _consineAdjustedRange)
				{
					break;
				}
				if (!flag && ((Vector3)(ref val3)).magnitude < 430f)
				{
					flag = true;
				}
				if (!flag2 && val4.y < 0f)
				{
					flag2 = true;
				}
				val3 += Vector3.down * GetGravity(val2) * fixedDeltaTime;
				val3 = ApplyDrag(val3, airDensity, fixedDeltaTime, num5, num3);
				Vector3 val5 = val4 + val3 * fixedDeltaTime;
				num6 += Vector3.Distance(val5, val4);
				val4 = val5;
			}
			if (i == BulletDropCalculationSingleFrameLimit)
			{
				((MonoBehaviour)this).StopAllCoroutines();
				((MonoBehaviour)this).StartCoroutine(ContinueDropCalculationAfterBreak(currentKeyframe, val4, val3, num3, num5, val2));
			}
			else
			{
				_calculatedDrop = val4.y;
				_stillCalculatingDrop = false;
			}
		}

		private IEnumerator ContinueDropCalculationAfterBreak(int currentKeyframe, Vector3 startingBulletPosition, Vector3 startingBulletVelocity, float ZeroingMass, float ZeroingCrossSectionArea, BallisticProjectile projectile)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Unknown result type (might be due to invalid IL or missing references)
			_stillCalculatingDrop = true;
			Vector3 bulletPosition = startingBulletPosition;
			Vector3 velocityVector2 = startingBulletVelocity;
			float physicsDeltaTime2 = 0.012f;
			physicsDeltaTime2 = Time.fixedDeltaTime;
			float airDensity = 1.225f;
			Vector3 positionLastFrame;
			do
			{
				positionLastFrame = bulletPosition;
				for (int i = 0; i < MaxAsynchIterationsPerFrame; i++)
				{
					if (bulletPosition.z >= _consineAdjustedRange)
					{
						break;
					}
					velocityVector2 += Vector3.down * GetGravity(projectile) * physicsDeltaTime2;
					velocityVector2 = ApplyDrag(velocityVector2, airDensity, physicsDeltaTime2, ZeroingCrossSectionArea, ZeroingMass);
					Vector3 val = bulletPosition + velocityVector2 * physicsDeltaTime2;
					if (Mathf.Abs(val.z - bulletPosition.z) < AsynchAbortEpsilon / (float)MaxAsynchIterationsPerFrame)
					{
						break;
					}
					bulletPosition = val;
				}
				if (bulletPosition.z >= _consineAdjustedRange)
				{
					break;
				}
				yield return (object)new WaitForSeconds(ArtificialCalculationDelay);
			}
			while (Mathf.Abs(bulletPosition.z - positionLastFrame.z) > AsynchAbortEpsilon);
			if (bulletPosition.z < _consineAdjustedRange)
			{
				_calculatedDrop = float.MinValue;
			}
			else
			{
				_calculatedDrop = bulletPosition.y;
			}
			_stillCalculatingDrop = false;
		}

		private Vector3 ApplyDrag(Vector3 velocityVector, float airDensity, float deltaTime, float frontArea, float Mass)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0