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);
}
}
}
}
}