Decompiled source of FreeCam v1.0.0

Cam.dll

Decompiled 3 days 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+42ca81115bd7a28780cbae53da56cdca26863ddb")]
[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.0")]
	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 bool _camDetached;

		private bool _hudVisible;

		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_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: 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)287, "Toggle camera view");
			_setEyesKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "SetEyes", (KeyCode)118, "Set eyes");
			_toggleHUD = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ToggleHUD", (KeyCode)278, "Toggle HUD");
			_screenshot = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "Screenshot", (KeyCode)283, "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>()));
			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_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
			if (_camDetached)
			{
				UpdateAnimations();
				CameraZoom.Instance.OverrideZoomSet((float)_fov.Value, 0.1f, 2000f, 2000f, ((Component)this).gameObject, 0);
			}
			if (IsInPlayableLevel(out PlayerController playerController))
			{
				if (Input.GetKeyDown(_toggleCameraKey.Value))
				{
					ToggleCameraDetachment(playerController);
				}
				if (Input.GetKeyDown(_setEyesKey.Value))
				{
					PlayerAvatar instance = PlayerAvatar.instance;
					PlayerAvatarVisuals playerAvatarVisuals = instance.playerAvatarVisuals;
					if (TryGetHit(playerAvatarVisuals.headUpTransform.position, ((Component)instance.localCamera).transform.forward, out var hit, 200f))
					{
						_cameraGlobalPosition = ((RaycastHit)(ref hit)).point;
					}
				}
				if (Input.GetKeyDown(_toggleHUD.Value))
				{
					GameObject hUDCanvas = GetHUDCanvas();
					_hudVisible = !_hudVisible;
					hUDCanvas.SetActive(_hudVisible);
				}
			}
			if (Input.GetKeyDown(_screenshot.Value))
			{
				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);
					ScreenCapture.CaptureScreenshot(text2);
					Logger.LogMessage((object)("Screenshot saved: " + text2));
				}
				catch (Exception arg)
				{
					Logger.LogError((object)$"Failed to save screenshot: {arg}");
				}
			}
		}

		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_0051: 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_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0085: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: 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_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: 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)
			if (!TryGetPlayersViewCamera(player, out Camera cam))
			{
				Logger.LogWarning((object)"ToggleDetachGameplayCamera: Couldn't find player's view camera.");
				return;
			}
			_gameCam = cam;
			_camDetached = true;
			_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);
			PlayerAvatar.instance.playerAvatarVisuals.meshParent.SetActive(true);
			((Behaviour)PlayerAvatar.instance.playerAvatarVisuals.animator).enabled = true;
			BindFlashlightToClientHand(enable: true);
			ApplyFlashlightCameraMaskRouting();
			GetHUDCanvas().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_005b: 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)
			if ((Object)(object)_gameCam == (Object)null)
			{
				_camDetached = false;
				Logger.LogWarning((object)"ToggleDetachGameplayCamera: Missing cached camera; resetting state.");
				return;
			}
			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;
			PlayerAvatar.instance.playerAvatarVisuals.meshParent.SetActive(false);
			((Behaviour)PlayerAvatar.instance.playerAvatarVisuals.animator).enabled = false;
			GetHUDCanvas().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_024c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0251: Unknown result type (might be due to invalid IL or missing references)
			//IL_0262: 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_028f: 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_020d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0214: Unknown result type (might be due to invalid IL or missing references)
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0231: 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_0310: Unknown result type (might be due to invalid IL or missing references)
			//IL_03bd: 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_03fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0407: Unknown result type (might be due to invalid IL or missing references)
			//IL_041b: 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_046d: 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_0507: Unknown result type (might be due to invalid IL or missing references)
			//IL_051d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0522: Unknown result type (might be due to invalid IL or missing references)
			//IL_0524: Unknown result type (might be due to invalid IL or missing references)
			//IL_0529: 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_053d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0545: Unknown result type (might be due to invalid IL or missing references)
			//IL_054a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0552: Unknown result type (might be due to invalid IL or missing references)
			//IL_0560: Unknown result type (might be due to invalid IL or missing references)
			//IL_0565: Unknown result type (might be due to invalid IL or missing references)
			//IL_056c: 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_05a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_05a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_05af: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_06ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_06f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_06fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0714: Unknown result type (might be due to invalid IL or missing references)
			//IL_0719: Unknown result type (might be due to invalid IL or missing references)
			//IL_0724: Unknown result type (might be due to invalid IL or missing references)
			//IL_05df: Unknown result type (might be due to invalid IL or missing references)
			//IL_05ea: Unknown result type (might be due to invalid IL or missing references)
			//IL_077b: 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_0793: Unknown result type (might be due to invalid IL or missing references)
			//IL_0798: Unknown result type (might be due to invalid IL or missing references)
			//IL_06c4: Unknown result type (might be due to invalid IL or missing references)
			//IL_06cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_06d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_06aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_06af: Unknown result type (might be due to invalid IL or missing references)
			//IL_060f: Unknown result type (might be due to invalid IL or missing references)
			//IL_061a: Unknown result type (might be due to invalid IL or missing references)
			//IL_076e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0773: Unknown result type (might be due to invalid IL or missing references)
			//IL_063f: Unknown result type (might be due to invalid IL or missing references)
			//IL_064a: Unknown result type (might be due to invalid IL or missing references)
			//IL_07dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_07e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_07f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_07f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_0882: Unknown result type (might be due to invalid IL or missing references)
			//IL_0887: Unknown result type (might be due to invalid IL or missing references)
			//IL_0889: Unknown result type (might be due to invalid IL or missing references)
			//IL_088b: Unknown result type (might be due to invalid IL or missing references)
			//IL_08b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08bf: Unknown result type (might be due to invalid IL or missing references)
			//IL_089c: Unknown result type (might be due to invalid IL or missing references)
			//IL_089e: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_09de: Unknown result type (might be due to invalid IL or missing references)
			//IL_09e9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aac: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ab1: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ac8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0acd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ae4: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ae9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b00: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b05: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f6b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0f70: 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;
				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_0b30;
						}
					}
				}
			}
			playerAvatarVisuals.animInCrawl = true;
			goto IL_0b30;
			IL_0b30:
			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);
				}
			}
		}
	}
}