Decompiled source of FreeCam v1.1.0

Cam.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("McHorse")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+0033f06e376c3eac5c04c11ad201961f3674d637")]
[assembly: AssemblyProduct("Cam")]
[assembly: AssemblyTitle("Cam")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Cam
{
	[BepInPlugin("McHorse.FreeCam", "FreeCam", "1.1")]
	public class FreeCam : BaseUnityPlugin
	{
		private ConfigEntry<KeyCode> _toggleCameraKey = null;

		private ConfigEntry<KeyCode> _setEyesKey = null;

		private ConfigEntry<KeyCode> _toggleHUD = null;

		private ConfigEntry<KeyCode> _screenshot = null;

		private ConfigEntry<int> _fov = null;

		private ConfigEntry<float> _moveSpeed = null;

		private ConfigEntry<float> _lookSensitivity = null;

		private ConfigEntry<float> _fovSensitivity = null;

		private ConfigEntry<bool> _resetPosition = null;

		private ConfigEntry<bool> _smoothingEnabled = null;

		private ConfigEntry<float> _smoothingFactor = null;

		private bool _camDetached;

		private bool _cameraControlActive;

		private bool _hudVisible;

		private float _fovOffset;

		private float _currentMoveSpeed;

		private Vector3? _lastDetachedPosition;

		private Quaternion? _lastDetachedRotation;

		private float _smoothedFov;

		private Vector3 _targetPosition;

		private Quaternion _targetRotation;

		private const float MoveSpeedMin = 0.5f;

		private const float MoveSpeedMax = 50f;

		private Camera? _gameCam;

		private Transform? _cameraParent;

		private Vector3 _cameraGlobalPosition;

		private Vector3 _cameraLocalPosition;

		private Quaternion _cameraLocalRotation;

		private Transform? _flashlightParent;

		private Vector3 _flashlightLocalPosition;

		private Quaternion _flashlightLocalRotation;

		private bool _flashlightCached;

		private int _flashlightLayer = -1;

		private int _playerLayer = -1;

		private List<Camera> _allCameras = new List<Camera>();

		private List<int> _allCamerasCulling = new List<int>();

		private FieldInfo? _fieldLeftScaleAmount = typeof(PlayerExpression).GetField("pupilLeftScaleAmount", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

		private FieldInfo? _fieldRightScaleAmount = typeof(PlayerExpression).GetField("pupilRightScaleAmount", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

		internal static FreeCam Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: Expected O, but got Unknown
			//IL_0115: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Expected O, but got Unknown
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Expected O, but got Unknown
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Expected O, but got Unknown
			//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ab: Expected O, but got Unknown
			//IL_01cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d7: Expected O, but got Unknown
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Expected O, but got Unknown
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			_toggleCameraKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleCam", (KeyCode)122, "Toggle camera view");
			_setEyesKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "SetEyes", (KeyCode)118, "Set eyes");
			_toggleHUD = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleHUD", (KeyCode)280, "Toggle HUD");
			_screenshot = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "Screenshot", (KeyCode)281, "Take a screenshot");
			_fov = ((BaseUnityPlugin)this).Config.Bind<int>("Options", "FOV", 50, new ConfigDescription("Set FOV", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 180), Array.Empty<object>()));
			_moveSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Options", "MoveSpeed", 5f, new ConfigDescription("Default free-cam movement speed.", (AcceptableValueBase)null, Array.Empty<object>()));
			_lookSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Options", "LookSensitivity", 2f, new ConfigDescription("Mouse look sensitivity when controlling detached camera.", (AcceptableValueBase)null, Array.Empty<object>()));
			_fovSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Options", "FovSensitivity", 0.5f, new ConfigDescription("Mouse FOV change sensitivity when holding Alt.", (AcceptableValueBase)null, Array.Empty<object>()));
			_resetPosition = ((BaseUnityPlugin)this).Config.Bind<bool>("Options", "ResetPosition", true, new ConfigDescription("When enabled, reset the camera's position and rotation to player's head.", (AcceptableValueBase)null, Array.Empty<object>()));
			_smoothingEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Smoothing", "Enabled", false, new ConfigDescription("Smooth camera position, rotation and FOV by lerping toward target values.", (AcceptableValueBase)null, Array.Empty<object>()));
			_smoothingFactor = ((BaseUnityPlugin)this).Config.Bind<float>("Smoothing", "SmoothingFactor", 0.2f, new ConfigDescription("Lerp factor per frame (higher = snappier, lower = smoother).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.01f, 1f), Array.Empty<object>()));
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		internal void Patch()
		{
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
			//IL_051b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0446: Unknown result type (might be due to invalid IL or missing references)
			//IL_0466: Unknown result type (might be due to invalid IL or missing references)
			//IL_04ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_048e: Unknown result type (might be due to invalid IL or missing references)
			//IL_049f: Unknown result type (might be due to invalid IL or missing references)
			//IL_04bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_04c1: 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_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a3: 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_01c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c6: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0207: Unknown result type (might be due to invalid IL or missing references)
			//IL_021b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0221: Unknown result type (might be due to invalid IL or missing references)
			//IL_0226: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0239: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0243: Unknown result type (might be due to invalid IL or missing references)
			//IL_0257: Unknown result type (might be due to invalid IL or missing references)
			//IL_025d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_0267: Unknown result type (might be due to invalid IL or missing references)
			//IL_0275: Unknown result type (might be due to invalid IL or missing references)
			//IL_027a: 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)
			//IL_0296: Unknown result type (might be due to invalid IL or missing references)
			//IL_029b: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_035e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0363: Unknown result type (might be due to invalid IL or missing references)
			//IL_0365: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_03cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_03d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_03c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0403: 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_03f4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0421: Unknown result type (might be due to invalid IL or missing references)
			//IL_0426: Unknown result type (might be due to invalid IL or missing references)
			if (_camDetached)
			{
				UpdateAnimations();
				float num = Mathf.Clamp((float)_fov.Value + _fovOffset, 5f, 120f);
				bool value = _smoothingEnabled.Value;
				_smoothedFov = (value ? Mathf.Lerp(_smoothedFov, num, _smoothingFactor.Value) : num);
				CameraZoom.Instance.OverrideZoomSet(_smoothedFov, 0.1f, 2000f, 2000f, ((Component)this).gameObject, 0);
				if (Input.GetMouseButtonDown(2) && (Object)(object)_gameCam != (Object)null)
				{
					_cameraControlActive = !_cameraControlActive;
					if (_cameraControlActive)
					{
						_targetPosition = ((Component)_gameCam).transform.position;
						_targetRotation = ((Component)_gameCam).transform.rotation;
					}
				}
				if (_cameraControlActive && (Object)(object)_gameCam != (Object)null)
				{
					GameDirector instance = GameDirector.instance;
					if (instance != null)
					{
						instance.SetDisableInput(0.1f);
					}
					float axis = Input.GetAxis("Mouse ScrollWheel");
					if (axis != 0f)
					{
						_currentMoveSpeed += axis * 10f;
						_currentMoveSpeed = Mathf.Clamp(_currentMoveSpeed, 0.5f, 50f);
					}
					Transform transform = ((Component)_gameCam).transform;
					float unscaledDeltaTime = Time.unscaledDeltaTime;
					if (Input.GetKey((KeyCode)119))
					{
						_targetPosition += _targetRotation * Vector3.forward * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)115))
					{
						_targetPosition -= _targetRotation * Vector3.forward * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)100))
					{
						_targetPosition += _targetRotation * Vector3.right * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)97))
					{
						_targetPosition -= _targetRotation * Vector3.right * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)304))
					{
						_targetPosition += Vector3.up * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)306))
					{
						_targetPosition -= Vector3.up * (_currentMoveSpeed * unscaledDeltaTime);
					}
					if (Input.GetKey((KeyCode)308))
					{
						_fovOffset -= Input.GetAxis("Mouse Y") * _fovSensitivity.Value;
					}
					else
					{
						float num2 = Input.GetAxis("Mouse X") * _lookSensitivity.Value;
						float num3 = (0f - Input.GetAxis("Mouse Y")) * _lookSensitivity.Value;
						Vector3 eulerAngles = ((Quaternion)(ref _targetRotation)).eulerAngles;
						float num4 = eulerAngles.x + num3;
						if (num4 > 180f)
						{
							num4 -= 360f;
						}
						num4 = Mathf.Clamp(num4, -89f, 89f);
						_targetRotation = Quaternion.Euler(num4, eulerAngles.y + num2, eulerAngles.z);
					}
					transform.position = (value ? Vector3.Lerp(transform.position, _targetPosition, _smoothingFactor.Value) : _targetPosition);
					transform.rotation = (value ? Quaternion.Slerp(transform.rotation, _targetRotation, _smoothingFactor.Value) : _targetRotation);
					_cameraGlobalPosition = transform.position;
				}
			}
			if (IsInPlayableLevel(out PlayerController playerController))
			{
				if (Input.GetKeyDown(_toggleCameraKey.Value))
				{
					ToggleCameraDetachment(playerController);
				}
				if (Input.GetKeyDown(_setEyesKey.Value))
				{
					PlayerAvatar instance2 = PlayerAvatar.instance;
					PlayerAvatarVisuals playerAvatarVisuals = instance2.playerAvatarVisuals;
					if (TryGetHit(playerAvatarVisuals.headUpTransform.position, ((Component)instance2.localCamera).transform.forward, out var hit, 200f))
					{
						_cameraGlobalPosition = ((RaycastHit)(ref hit)).point;
					}
				}
				if (Input.GetKeyDown(_toggleHUD.Value))
				{
					GameObject hUDCanvas = GetHUDCanvas();
					if ((Object)(object)hUDCanvas != (Object)null)
					{
						_hudVisible = !_hudVisible;
						hUDCanvas.SetActive(_hudVisible);
					}
				}
			}
			if (!Input.GetKeyDown(_screenshot.Value))
			{
				return;
			}
			try
			{
				string text = Path.Combine(Paths.BepInExRootPath, "screenshots");
				Directory.CreateDirectory(text);
				string path = $"screenshot_{DateTime.Now:yyyy-MM-dd_HH-mm-ss_fff}.png";
				string text2 = Path.Combine(text, path);
				MenuManager instance3 = MenuManager.instance;
				if (instance3 != null)
				{
					instance3.MenuEffectClick((MenuClickEffectType)0, (MenuPage)null, -1f, -1f, true);
				}
				MenuManager instance4 = MenuManager.instance;
				if (instance4 != null)
				{
					instance4.MenuEffectHover(-1f, -1f);
				}
				ScreenCapture.CaptureScreenshot(text2);
				Logger.LogMessage((object)("Screenshot saved: " + text2));
			}
			catch (IOException arg)
			{
				Logger.LogError((object)$"Failed to save screenshot: {arg}");
			}
			catch (UnauthorizedAccessException arg2)
			{
				Logger.LogError((object)$"Failed to save screenshot: {arg2}");
			}
			catch (ArgumentException arg3)
			{
				Logger.LogError((object)$"Failed to save screenshot: {arg3}");
			}
		}

		public static bool TryGetHit(Vector3 position, Vector3 forward, out RaycastHit hit, float maxDistance = 100f, int layerMask = -5)
		{
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000a: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			forward = ((Vector3)(ref forward)).normalized;
			return Physics.Raycast(position, forward, ref hit, maxDistance, layerMask, (QueryTriggerInteraction)1);
		}

		private static GameObject? GetHUDCanvas()
		{
			GameObject[] array = (from t in Resources.FindObjectsOfTypeAll<Transform>()
				where ((Object)t).name == "HUD Canvas"
				select ((Component)t).gameObject).ToArray();
			return (array.Length == 0) ? null : array[0];
		}

		private static bool IsInPlayableLevel(out PlayerController playerController)
		{
			playerController = null;
			if (!LevelGenerator.Instance.Generated)
			{
				return false;
			}
			if (!TryGetLocalPlayerController(out playerController))
			{
				return false;
			}
			return true;
		}

		private static bool TryGetLocalPlayerController(out PlayerController pc)
		{
			pc = null;
			PlayerController instance = PlayerController.instance;
			if ((Object)(object)instance != (Object)null && ((Behaviour)instance).isActiveAndEnabled && ((Component)instance).gameObject.activeInHierarchy)
			{
				pc = instance;
				return true;
			}
			return false;
		}

		private void ToggleCameraDetachment(PlayerController player)
		{
			_hudVisible = true;
			if (!_camDetached)
			{
				DetachCamera(player);
			}
			else
			{
				ReattachCamera();
			}
		}

		private void DetachCamera(PlayerController player)
		{
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00eb: 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)
			//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0201: Unknown result type (might be due to invalid IL or missing references)
			//IL_0206: 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_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0287: Unknown result type (might be due to invalid IL or missing references)
			if (!TryGetPlayersViewCamera(player, out Camera cam))
			{
				Logger.LogWarning((object)"ToggleDetachGameplayCamera: Couldn't find player's view camera.");
				return;
			}
			_gameCam = cam;
			_camDetached = true;
			_fovOffset = 0f;
			_smoothedFov = _fov.Value;
			_targetPosition = ((Component)cam).transform.position;
			_targetRotation = ((Component)cam).transform.rotation;
			_currentMoveSpeed = _moveSpeed.Value;
			_cameraParent = ((Component)cam).transform.parent;
			_cameraGlobalPosition = new Vector3(((Component)((Component)cam).transform).transform.position.x, ((Component)((Component)cam).transform).transform.position.y, ((Component)((Component)cam).transform).transform.position.z);
			_cameraLocalPosition = ((Component)cam).transform.localPosition;
			_cameraLocalRotation = ((Component)cam).transform.localRotation;
			_playerLayer = PlayerAvatar.instance.playerAvatarVisuals.meshParent.layer;
			_allCameras.Clear();
			_allCameras.AddRange(((Component)Camera.main).GetComponentsInChildren<Camera>(true));
			_allCamerasCulling.Clear();
			foreach (Camera allCamera in _allCameras)
			{
				_allCamerasCulling.Add(allCamera.cullingMask);
			}
			((Component)cam).transform.SetParent((Transform)null, true);
			if (!_resetPosition.Value && _lastDetachedPosition.HasValue && _lastDetachedRotation.HasValue)
			{
				((Component)cam).transform.position = _lastDetachedPosition.Value;
				((Component)cam).transform.rotation = _lastDetachedRotation.Value;
				_cameraGlobalPosition = _lastDetachedPosition.Value;
			}
			PlayerAvatar.instance.playerAvatarVisuals.meshParent.SetActive(true);
			((Behaviour)PlayerAvatar.instance.playerAvatarVisuals.animator).enabled = true;
			BindFlashlightToClientHand(enable: true);
			ApplyFlashlightCameraMaskRouting();
			GameObject? hUDCanvas = GetHUDCanvas();
			if (hUDCanvas != null)
			{
				hUDCanvas.SetActive(_hudVisible);
			}
			ManualLogSource logger = Logger;
			object arg = ((Component)cam).transform.position;
			Quaternion rotation = ((Component)cam).transform.rotation;
			logger.LogMessage((object)$"Camera detached at world pos={arg} rot={((Quaternion)(ref rotation)).eulerAngles}");
		}

		private void ReattachCamera()
		{
			//IL_0030: 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_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)_gameCam == (Object)null)
			{
				_camDetached = false;
				Logger.LogWarning((object)"ToggleDetachGameplayCamera: Missing cached camera; resetting state.");
				return;
			}
			_lastDetachedPosition = _cameraGlobalPosition;
			_lastDetachedRotation = ((Component)_gameCam).transform.rotation;
			Transform transform = ((Component)_gameCam).transform;
			if ((Object)(object)_cameraParent != (Object)null)
			{
				transform.SetParent(_cameraParent, false);
				transform.localPosition = _cameraLocalPosition;
				transform.localRotation = _cameraLocalRotation;
			}
			else
			{
				Logger.LogWarning((object)"ToggleDetachGameplayCamera: Original parent was null/missing; leaving camera unparented.");
			}
			_camDetached = false;
			_cameraControlActive = false;
			PlayerAvatar.instance.playerAvatarVisuals.meshParent.SetActive(false);
			((Behaviour)PlayerAvatar.instance.playerAvatarVisuals.animator).enabled = false;
			GameObject? hUDCanvas = GetHUDCanvas();
			if (hUDCanvas != null)
			{
				hUDCanvas.SetActive(true);
			}
			for (int i = 0; i < _allCameras.Count; i++)
			{
				_allCameras[i].cullingMask = _allCamerasCulling[i];
			}
			BindFlashlightToClientHand(enable: false);
			Logger.LogMessage((object)"Camera reattached and restored.");
		}

		private static bool TryGetPlayersViewCamera(PlayerController player, out Camera cam)
		{
			cam = null;
			Camera componentInChildren = ((Component)player).GetComponentInChildren<Camera>(true);
			if ((Object)(object)componentInChildren != (Object)null && ((Behaviour)componentInChildren).isActiveAndEnabled && ((Component)componentInChildren).gameObject.activeInHierarchy)
			{
				cam = componentInChildren;
				return true;
			}
			if ((Object)(object)Camera.main != (Object)null && ((Behaviour)Camera.main).isActiveAndEnabled && ((Component)Camera.main).gameObject.activeInHierarchy)
			{
				cam = Camera.main;
				return true;
			}
			return false;
		}

		private void UpdateAnimations()
		{
			//IL_027e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0283: Unknown result type (might be due to invalid IL or missing references)
			//IL_0294: 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_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: 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_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: 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_0342: Unknown result type (might be due to invalid IL or missing references)
			//IL_023e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: Unknown result type (might be due to invalid IL or missing references)
			//IL_03ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0412: Unknown result type (might be due to invalid IL or missing references)
			//IL_042e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0439: Unknown result type (might be due to invalid IL or missing references)
			//IL_044d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0468: Unknown result type (might be due to invalid IL or missing references)
			//IL_049f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0530: Unknown result type (might be due to invalid IL or missing references)
			//IL_0535: Unknown result type (might be due to invalid IL or missing references)
			//IL_0539: Unknown result type (might be due to invalid IL or missing references)
			//IL_054f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0554: Unknown result type (might be due to invalid IL or missing references)
			//IL_0556: Unknown result type (might be due to invalid IL or missing references)
			//IL_055b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0562: Unknown result type (might be due to invalid IL or missing references)
			//IL_0567: Unknown result type (might be due to invalid IL or missing references)
			//IL_056f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0577: Unknown result type (might be due to invalid IL or missing references)
			//IL_057c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0584: Unknown result type (might be due to invalid IL or missing references)
			//IL_0592: Unknown result type (might be due to invalid IL or missing references)
			//IL_0597: Unknown result type (might be due to invalid IL or missing references)
			//IL_059e: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_05d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_05dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_05e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_0721: Unknown result type (might be due to invalid IL or missing references)
			//IL_0723: Unknown result type (might be due to invalid IL or missing references)
			//IL_072e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0746: Unknown result type (might be due to invalid IL or missing references)
			//IL_074b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0756: Unknown result type (might be due to invalid IL or missing references)
			//IL_0611: Unknown result type (might be due to invalid IL or missing references)
			//IL_061c: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_07af: Unknown result type (might be due to invalid IL or missing references)
			//IL_07c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f6: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0702: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_06dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_06e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0641: Unknown result type (might be due to invalid IL or missing references)
			//IL_064c: Unknown result type (might be due to invalid IL or missing references)
			//IL_07a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_07a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0671: Unknown result type (might be due to invalid IL or missing references)
			//IL_067c: Unknown result type (might be due to invalid IL or missing references)
			//IL_080f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0814: Unknown result type (might be due to invalid IL or missing references)
			//IL_0822: Unknown result type (might be due to invalid IL or missing references)
			//IL_0824: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_08bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_08bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_08e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_08f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_08d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_08d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_08da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a10: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a1b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ade: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ae3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0afa: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b16: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b1b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b32: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b37: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f9d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0fa2: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)PlayerAvatar.instance) || !Object.op_Implicit((Object)(object)PlayerAvatar.instance.playerAvatarVisuals))
			{
				return;
			}
			PlayerAvatar instance = PlayerAvatar.instance;
			PlayerAvatarVisuals playerAvatarVisuals = PlayerAvatar.instance.playerAvatarVisuals;
			if (Object.op_Implicit((Object)(object)playerAvatarVisuals.playerEyes) && Object.op_Implicit((Object)(object)instance))
			{
				Vector3 position = playerAvatarVisuals.headUpTransform.position;
				Vector3 forward = ((Component)instance.localCamera).transform.forward;
				if (Object.op_Implicit((Object)(object)instance.tumble) && instance.tumble.isTumbling)
				{
					forward = ((Component)instance.tumble).transform.forward;
				}
				Vector3 val = _cameraGlobalPosition - position;
				Vector3 val2 = SemiFunc.ClampDirection(val, forward, 40f);
				Vector3 val3 = SemiFunc.ClampDirection(val, forward, 60f);
				playerAvatarVisuals.headLookAtTransform.rotation = Quaternion.Slerp(playerAvatarVisuals.headLookAtTransform.rotation, Quaternion.LookRotation(val2), playerAvatarVisuals.deltaTime * 15f);
				playerAvatarVisuals.playerEyes.eyeLeft.rotation = Quaternion.Slerp(playerAvatarVisuals.playerEyes.eyeLeft.rotation, Quaternion.LookRotation(val3), playerAvatarVisuals.deltaTime * 15f);
				playerAvatarVisuals.playerEyes.eyeRight.rotation = Quaternion.Slerp(playerAvatarVisuals.playerEyes.eyeRight.rotation, Quaternion.LookRotation(val3), playerAvatarVisuals.deltaTime * 15f);
				PlayerExpression playerExpression = instance.playerExpression;
				FieldInfo fieldLeftScaleAmount = _fieldLeftScaleAmount;
				FieldInfo fieldRightScaleAmount = _fieldRightScaleAmount;
				if ((Object)(object)playerExpression != (Object)null && fieldLeftScaleAmount != null && fieldRightScaleAmount != null)
				{
					float num = (float)fieldLeftScaleAmount.GetValue(playerExpression) * playerAvatarVisuals.playerEyes.pupilSizeMultiplier * playerAvatarVisuals.playerEyes.pupilLeftSizeMultiplier;
					float num2 = (float)fieldRightScaleAmount.GetValue(playerExpression) * playerAvatarVisuals.playerEyes.pupilSizeMultiplier * playerAvatarVisuals.playerEyes.pupilRightSizeMultiplier;
					num = Mathf.Clamp(num, 0.25f, 2.5f);
					num2 = Mathf.Clamp(num2, 0.25f, 2.5f);
					playerAvatarVisuals.playerEyes.pupilLeft.localScale = Vector3.one * num;
					playerAvatarVisuals.playerEyes.pupilRight.localScale = Vector3.one * num2;
				}
			}
			else
			{
				playerAvatarVisuals.headLookAtTransform.localRotation = Quaternion.Slerp(playerAvatarVisuals.headLookAtTransform.localRotation, Quaternion.identity, playerAvatarVisuals.deltaTime * 15f);
			}
			float num3 = 0f;
			if (!instance.isTumbling)
			{
				num3 = ((Component)instance.localCamera).transform.eulerAngles.x;
			}
			if (playerAvatarVisuals.headTiltOverrideTimer > 0f)
			{
				num3 += playerAvatarVisuals.headTiltOverrideAmount;
				playerAvatarVisuals.headTiltOverrideAmount = 0f;
			}
			if (num3 > 90f)
			{
				num3 -= 360f;
			}
			if (instance.isCrawling)
			{
				num3 *= 0.4f;
			}
			else if (instance.isCrouching)
			{
				num3 *= 0.75f;
			}
			float num4 = playerAvatarVisuals.headLookAtTransform.localEulerAngles.x;
			if (num4 > 90f)
			{
				num4 -= 360f;
			}
			num3 += num4;
			num3 = (instance.isCrouching ? Mathf.Clamp(num3, -40f, 40f) : ((!instance.isCrouching) ? Mathf.Clamp(num3, -75f, 85f) : Mathf.Clamp(num3, -60f, 65f)));
			float num5 = SemiFunc.SpringFloatGet(playerAvatarVisuals.lookUpSpring, num3, playerAvatarVisuals.deltaTime);
			playerAvatarVisuals.headUpTransform.localRotation = Quaternion.Euler(num5 * 0.5f, 0f, 0f);
			playerAvatarVisuals.bodyTopUpTransform.localRotation = Quaternion.Euler(num5 * 0.25f, 0f, 0f);
			playerAvatarVisuals.upDifference = Quaternion.Angle(Quaternion.Euler(playerAvatarVisuals.upPrevious, 0f, 0f), Quaternion.Euler(playerAvatarVisuals.headUpTransform.eulerAngles.x, 0f, 0f));
			float num6 = playerAvatarVisuals.upPrevious - playerAvatarVisuals.headUpTransform.eulerAngles.x;
			if (Mathf.Abs(num6) < 180f)
			{
				playerAvatarVisuals.upDirection = Mathf.Sign(num6);
			}
			playerAvatarVisuals.upPrevious = playerAvatarVisuals.headUpTransform.eulerAngles.x;
			playerAvatarVisuals.headTiltOverrideTimer -= playerAvatarVisuals.deltaTime;
			float num7 = 0f;
			if (playerAvatarVisuals.turnDifference > 1f)
			{
				num7 = playerAvatarVisuals.turnDifference * 5f * (0f - playerAvatarVisuals.turnDirection);
			}
			num7 = Mathf.Clamp(num7, -100f, 100f);
			playerAvatarVisuals.headSideSteer = Mathf.Lerp(playerAvatarVisuals.headSideSteer, num7, 20f * playerAvatarVisuals.deltaTime);
			Quaternion localRotation = playerAvatarVisuals.headLookAtTransform.localRotation;
			Quaternion val4 = Quaternion.Euler(0f, ((Quaternion)(ref localRotation)).eulerAngles.y + playerAvatarVisuals.headSideSteer, 0f);
			val4 = Quaternion.Slerp(Quaternion.identity, val4, 0.5f);
			Quaternion val5 = SemiFunc.SpringQuaternionGet(playerAvatarVisuals.lookSideSpring, val4, playerAvatarVisuals.deltaTime);
			playerAvatarVisuals.headSideTransform.localRotation = val5;
			playerAvatarVisuals.bodyTopSideTransform.localRotation = Quaternion.Slerp(Quaternion.identity, val5, 0.5f);
			Vector3 zero = Vector3.zero;
			if (((Vector3)(ref instance.rbVelocity)).magnitude > 0.1f)
			{
				Vector3 val6 = ((Component)this).transform.TransformDirection(instance.rbVelocity);
				if (Vector3.Dot(((Vector3)(ref val6)).normalized, ((Component)this).transform.forward) < -0.5f)
				{
					zero.x = -3f;
				}
				if (Vector3.Dot(((Vector3)(ref val6)).normalized, ((Component)this).transform.forward) > 0.5f)
				{
					zero.x = 3f;
				}
				if (Vector3.Dot(((Vector3)(ref val6)).normalized, ((Component)this).transform.right) > 0.5f)
				{
					zero.z = -3f;
				}
				if (Vector3.Dot(((Vector3)(ref val6)).normalized, ((Component)this).transform.right) < -0.5f)
				{
					zero.z = 3f;
				}
			}
			if (playerAvatarVisuals.tiltSprinting != playerAvatarVisuals.animSprinting)
			{
				if (playerAvatarVisuals.tiltSprinting)
				{
					playerAvatarVisuals.tiltTimer = 0.25f;
					playerAvatarVisuals.tiltTarget = playerAvatarVisuals.leanSpringTargetPrevious * 2f;
				}
				else
				{
					playerAvatarVisuals.tiltTimer = 0.25f;
					playerAvatarVisuals.tiltTarget = zero * 3f;
				}
				playerAvatarVisuals.tiltSprinting = playerAvatarVisuals.animSprinting;
			}
			playerAvatarVisuals.leanTransform.localRotation = SemiFunc.SpringQuaternionGet(playerAvatarVisuals.leanSpring, Quaternion.Euler(zero), playerAvatarVisuals.deltaTime);
			playerAvatarVisuals.tiltTransform.localRotation = SemiFunc.SpringQuaternionGet(playerAvatarVisuals.tiltSpring, Quaternion.Euler(playerAvatarVisuals.tiltTarget), playerAvatarVisuals.deltaTime);
			if (playerAvatarVisuals.tiltTimer > 0f)
			{
				playerAvatarVisuals.tiltTimer -= playerAvatarVisuals.deltaTime;
				if (playerAvatarVisuals.tiltTimer <= 0f)
				{
					playerAvatarVisuals.tiltTarget = Vector3.zero;
				}
			}
			playerAvatarVisuals.leanSpringTargetPrevious = zero;
			bool flag = false;
			float num8 = 15f;
			float num9 = 0.5f;
			Vector3 val7 = Vector3.zero;
			if (instance.isMoving && !playerAvatarVisuals.animJumping && ((Vector3)(ref instance.rbVelocity)).magnitude > 0.1f)
			{
				flag = true;
				num8 = 10f;
				num9 = 0.7f;
				Vector3 normalized = ((Vector3)(ref instance.rbVelocity)).normalized;
				normalized.y = 0f;
				val7 = normalized;
			}
			if (playerAvatarVisuals.legTwistActive != flag)
			{
				playerAvatarVisuals.legTwistActive = flag;
				playerAvatarVisuals.legTwistSpring.speed = num8;
				playerAvatarVisuals.legTwistSpring.damping = num9;
			}
			else
			{
				playerAvatarVisuals.legTwistSpring.speed = Mathf.Lerp(playerAvatarVisuals.legTwistSpring.speed, num8, playerAvatarVisuals.deltaTime * 5f);
				playerAvatarVisuals.legTwistSpring.damping = Mathf.Lerp(playerAvatarVisuals.legTwistSpring.damping, num9, playerAvatarVisuals.deltaTime * 5f);
			}
			Quaternion val8 = Quaternion.identity;
			if (val7 != Vector3.zero)
			{
				val8 = Quaternion.LookRotation(val7, Vector3.up);
			}
			playerAvatarVisuals.legTwistTransform.localRotation = SemiFunc.SpringQuaternionGet(playerAvatarVisuals.legTwistSpring, val8, playerAvatarVisuals.deltaTime);
			bool flag2 = false;
			if (instance.isTumbling)
			{
				if (!playerAvatarVisuals.animSprinting && !playerAvatarVisuals.animTumbling)
				{
					playerAvatarVisuals.animator.SetTrigger("TumblingImpulse");
					playerAvatarVisuals.animTumbling = true;
				}
				if ((((Vector3)(ref instance.tumble.physGrabObject.rbVelocity)).magnitude > 1f && !instance.tumble.physGrabObject.impactDetector.inCart) || ((Vector3)(ref instance.tumble.physGrabObject.rbAngularVelocity)).magnitude > 1f)
				{
					playerAvatarVisuals.animator.SetBool("TumblingMove", true);
					flag2 = true;
				}
				else
				{
					playerAvatarVisuals.animator.SetBool("TumblingMove", false);
				}
				playerAvatarVisuals.animator.SetBool("Tumbling", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Tumbling", false);
				playerAvatarVisuals.animator.SetBool("TumblingMove", false);
				playerAvatarVisuals.animTumbling = false;
			}
			if (playerAvatarVisuals.playerAvatarRightArm.poseNew == playerAvatarVisuals.playerAvatarRightArm.grabberPose)
			{
				playerAvatarVisuals.animator.SetBool("Grabbing", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Grabbing", false);
			}
			if (instance.isCrouching || instance.isTumbling)
			{
				playerAvatarVisuals.animator.SetBool("Crouching", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Crouching", false);
			}
			if (instance.isCrawling || instance.isTumbling)
			{
				playerAvatarVisuals.animator.SetBool("Crawling", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Crawling", false);
			}
			AnimatorStateInfo currentAnimatorStateInfo = playerAvatarVisuals.animator.GetCurrentAnimatorStateInfo(0);
			if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Crouch to Crawl"))
			{
				currentAnimatorStateInfo = playerAvatarVisuals.animator.GetCurrentAnimatorStateInfo(0);
				if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Crawl"))
				{
					currentAnimatorStateInfo = playerAvatarVisuals.animator.GetCurrentAnimatorStateInfo(0);
					if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Crawl Move"))
					{
						currentAnimatorStateInfo = playerAvatarVisuals.animator.GetCurrentAnimatorStateInfo(0);
						if (!((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Slide"))
						{
							playerAvatarVisuals.animInCrawl = false;
							goto IL_0b62;
						}
					}
				}
			}
			playerAvatarVisuals.animInCrawl = true;
			goto IL_0b62;
			IL_0b62:
			if (instance.isMoving && !playerAvatarVisuals.animJumping)
			{
				playerAvatarVisuals.animator.SetBool("Moving", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Moving", false);
			}
			if (!instance.isMoving && !playerAvatarVisuals.animJumping && Mathf.Abs(playerAvatarVisuals.turnDifference) > 0.5f)
			{
				playerAvatarVisuals.animator.SetBool("Turning", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Turning", false);
			}
			if (instance.isSprinting && !playerAvatarVisuals.animJumping && !playerAvatarVisuals.animTumbling)
			{
				if (!playerAvatarVisuals.animSprinting && !playerAvatarVisuals.animSliding)
				{
					playerAvatarVisuals.animator.SetTrigger("SprintingImpulse");
					playerAvatarVisuals.animSprinting = true;
				}
				playerAvatarVisuals.animator.SetBool("Sprinting", true);
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Sprinting", false);
				playerAvatarVisuals.animSprinting = false;
			}
			playerAvatarVisuals.animSlidingImpulse = false;
			if (instance.isSliding && !playerAvatarVisuals.animJumping && !playerAvatarVisuals.animTumbling)
			{
				if (!playerAvatarVisuals.animSliding)
				{
					playerAvatarVisuals.animSlidingImpulse = true;
					playerAvatarVisuals.animator.SetTrigger("SlidingImpulse");
				}
				playerAvatarVisuals.animator.SetBool("Sliding", true);
				playerAvatarVisuals.animSliding = true;
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Sliding", false);
				playerAvatarVisuals.animSliding = false;
			}
			if (playerAvatarVisuals.animJumping)
			{
				if (playerAvatarVisuals.animJumpingImpulse)
				{
					playerAvatarVisuals.animJumpTimer = 0.2f;
					playerAvatarVisuals.animJumpingImpulse = false;
					playerAvatarVisuals.animator.SetTrigger("JumpingImpulse");
					playerAvatarVisuals.animator.SetBool("Jumping", true);
					playerAvatarVisuals.animator.SetBool("Falling", false);
				}
				else if (instance.rbVelocityRaw.y < -0.5f && playerAvatarVisuals.animJumpTimer <= 0f)
				{
					playerAvatarVisuals.animator.SetBool("Falling", true);
				}
				if (instance.isGrounded && playerAvatarVisuals.animJumpTimer <= 0f)
				{
					playerAvatarVisuals.animJumpedTimer = 0.5f;
					playerAvatarVisuals.animJumping = false;
				}
				playerAvatarVisuals.animJumpTimer -= playerAvatarVisuals.deltaTime;
			}
			else
			{
				playerAvatarVisuals.animator.SetBool("Jumping", false);
				playerAvatarVisuals.animator.SetBool("Falling", false);
			}
			if (playerAvatarVisuals.animJumpedTimer > 0f)
			{
				playerAvatarVisuals.animJumpedTimer -= playerAvatarVisuals.deltaTime;
			}
			if (!playerAvatarVisuals.playerAvatar.isGrounded)
			{
				playerAvatarVisuals.animFallingTimer += playerAvatarVisuals.deltaTime;
			}
			else
			{
				playerAvatarVisuals.animFallingTimer = 0f;
			}
			if (!instance.isCrawling && !playerAvatarVisuals.animJumping && !playerAvatarVisuals.animSliding && !playerAvatarVisuals.animTumbling && playerAvatarVisuals.animFallingTimer > 0.25f && playerAvatarVisuals.animJumpedTimer <= 0f)
			{
				playerAvatarVisuals.animJumpTimer = 0.2f;
				playerAvatarVisuals.animJumping = true;
				playerAvatarVisuals.animJumpingImpulse = false;
				playerAvatarVisuals.animator.SetTrigger("FallingImpulse");
				playerAvatarVisuals.animator.SetBool("Jumping", true);
				playerAvatarVisuals.animator.SetBool("Falling", true);
			}
			if (flag2)
			{
				float num10 = Mathf.Max(((Vector3)(ref instance.tumble.physGrabObject.rbVelocity)).magnitude, ((Vector3)(ref instance.tumble.physGrabObject.rbAngularVelocity)).magnitude) * 0.5f;
				num10 = Mathf.Clamp(num10, 0.5f, 1.25f);
				playerAvatarVisuals.animator.speed = num10 * playerAvatarVisuals.animationSpeedMultiplier;
				instance.tumble.TumbleMoveSoundSet(flag2, num10);
				return;
			}
			currentAnimatorStateInfo = playerAvatarVisuals.animator.GetCurrentAnimatorStateInfo(0);
			if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).IsName("Sprint"))
			{
				playerAvatarVisuals.animator.speed = (1f + (float)StatsManager.instance.playerUpgradeSpeed[instance.steamID] * 0.1f) * playerAvatarVisuals.animationSpeedMultiplier;
			}
			else if (instance.isMoving && instance.mapToolController.Active)
			{
				playerAvatarVisuals.animator.speed = 0.5f * playerAvatarVisuals.animationSpeedMultiplier;
			}
			else
			{
				playerAvatarVisuals.animator.speed = 1f * playerAvatarVisuals.animationSpeedMultiplier;
			}
		}

		private void BindFlashlightToClientHand(bool enable)
		{
			//IL_012d: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			FlashlightController instance = FlashlightController.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			if (enable)
			{
				if (!((Object)(object)instance.FollowTransformClient == (Object)null))
				{
					if (!_flashlightCached)
					{
						_flashlightCached = true;
						_flashlightParent = ((Component)instance).transform.parent;
						_flashlightLocalPosition = ((Component)instance).transform.localPosition;
						_flashlightLocalRotation = ((Component)instance).transform.localRotation;
					}
					_flashlightLayer = ((Component)instance).gameObject.layer;
					((Component)instance).transform.SetParent(instance.FollowTransformClient, false);
					((Component)instance).transform.localPosition = Vector3.zero;
					((Component)instance).transform.localRotation = Quaternion.identity;
					Renderer[] componentsInChildren = ((Component)instance).GetComponentsInChildren<Renderer>(true);
					foreach (Renderer val in componentsInChildren)
					{
						val.forceRenderingOff = false;
						val.allowOcclusionWhenDynamic = false;
					}
				}
			}
			else if (_flashlightCached)
			{
				((Component)instance).transform.SetParent(_flashlightParent, false);
				((Component)instance).transform.localPosition = _flashlightLocalPosition;
				((Component)instance).transform.localRotation = _flashlightLocalRotation;
				_flashlightCached = false;
				_flashlightParent = null;
				_flashlightLayer = -1;
			}
		}

		private void ApplyFlashlightCameraMaskRouting()
		{
			if (_flashlightLayer < 0)
			{
				return;
			}
			foreach (Camera allCamera in _allCameras)
			{
				if (_playerLayer >= 0 && (allCamera.cullingMask & (1 << _playerLayer)) != 0)
				{
					allCamera.cullingMask |= 1 << _flashlightLayer;
				}
				else
				{
					allCamera.cullingMask &= ~(1 << _flashlightLayer);
				}
			}
		}
	}
}