using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using MMTools; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("FreeCamAssist")] [assembly: AssemblyDescription("Toggleable free camera for Cult of the Lamb")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FreeCamAssist")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("B9B875E3-77F3-4286-9008-D1594F8D9B1E")] [assembly: AssemblyFileVersion("0.2.1.0")] [assembly: AssemblyVersion("0.2.1.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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 FreeCamAssist { [BepInPlugin("com.cotl.freecamassist", "FreeCamAssist", "0.2.1")] public sealed class FreeCamAssistPlugin : BaseUnityPlugin { public const string PluginGuid = "com.cotl.freecamassist"; public const string PluginName = "FreeCamAssist"; public const string PluginVersion = "0.2.1"; internal static ManualLogSource Log; internal static FreeCamController Controller; private Harmony _harmony; private void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; FreeCamConfig.Bind(((BaseUnityPlugin)this).Config); GameObject val = new GameObject("FreeCamAssistController"); Object.DontDestroyOnLoad((Object)val); Controller = val.AddComponent(); _harmony = new Harmony("com.cotl.freecamassist"); _harmony.PatchAll(typeof(FreeCamAssistPlugin).Assembly); Log.LogInfo((object)"FreeCamAssist 0.2.1 loaded."); } private void OnDestroy() { if (_harmony != null) { _harmony.UnpatchSelf(); } } } internal enum FreeCamMode { Survey, GroundScout, LambView } internal static class FreeCamConfig { internal static ConfigEntry Enabled; internal static ConfigEntry ToggleKey; internal static ConfigEntry ToggleKeySecondary; internal static ConfigEntry CameraLockKey; internal static ConfigEntry SwitchModeKey; internal static ConfigEntry RecenterKey; internal static ConfigEntry VerticalUpKey; internal static ConfigEntry VerticalDownKey; internal static ConfigEntry FastModifierKey; internal static ConfigEntry SlowModifierKey; internal static ConfigEntry FreezePlayerWhileActive; internal static ConfigEntry ResetVanillaOnDisable; internal static ConfigEntry SurveyMoveSpeed; internal static ConfigEntry GroundMoveSpeed; internal static ConfigEntry LambViewMoveSpeed; internal static ConfigEntry FastMultiplier; internal static ConfigEntry SlowMultiplier; internal static ConfigEntry ZoomSpeed; internal static ConfigEntry VerticalMoveSpeed; internal static ConfigEntry MouseLookSensitivity; internal static ConfigEntry SurveyPitch; internal static ConfigEntry GroundPitch; internal static ConfigEntry LambViewPitch; internal static ConfigEntry DisableDuringConversations; internal static ConfigEntry DebugLogging; internal static void Bind(ConfigFile config) { //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Expected O, but got Unknown //IL_0239: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Expected O, but got Unknown //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_027b: Expected O, but got Unknown //IL_02a9: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Expected O, but got Unknown //IL_02e1: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Expected O, but got Unknown //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Expected O, but got Unknown //IL_0351: Unknown result type (might be due to invalid IL or missing references) //IL_035b: Expected O, but got Unknown //IL_0389: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Expected O, but got Unknown //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_03cb: Expected O, but got Unknown Enabled = config.Bind("General", "Enabled", true, "Enable FreeCamAssist."); ToggleKey = config.Bind("Input", "ToggleKey", "F9", "Unity KeyCode name for toggling free camera."); ToggleKeySecondary = config.Bind("Input", "ToggleKeySecondary", "Insert", "Optional second Unity KeyCode name for toggling free camera."); CameraLockKey = config.Bind("Input", "CameraLockKey", "F8", "Unity KeyCode name for locking/unlocking the current freecam view while restoring player control."); SwitchModeKey = config.Bind("Input", "SwitchModeKey", "F10", "Unity KeyCode name for switching Survey/GroundScout/LambView modes."); RecenterKey = config.Bind("Input", "RecenterKey", "F11", "Unity KeyCode name for resetting the current freecam mode near the player."); VerticalUpKey = config.Bind("Input", "VerticalUpKey", "Space", "Unity KeyCode name for raising the camera in freecam."); VerticalDownKey = config.Bind("Input", "VerticalDownKey", "C", "Unity KeyCode name for lowering the camera in freecam."); FastModifierKey = config.Bind("Input", "FastModifierKey", "LeftShift", "Unity KeyCode name for fast movement while held."); SlowModifierKey = config.Bind("Input", "SlowModifierKey", "LeftControl", "Unity KeyCode name for slow movement while held."); FreezePlayerWhileActive = config.Bind("Safety", "FreezePlayerWhileActive", true, "Keep the Lamb/player transform pinned while freecam is active so WASD camera movement cannot walk the player into structures."); ResetVanillaOnDisable = config.Bind("Safety", "ResetVanillaOnDisable", true, "When freecam is disabled, snap the camera back to the vanilla player-follow framing."); SurveyMoveSpeed = config.Bind("Camera", "SurveyMoveSpeed", 13f, new ConfigDescription("WASD movement speed in Survey mode.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 80f), Array.Empty())); GroundMoveSpeed = config.Bind("Camera", "GroundMoveSpeed", 6f, new ConfigDescription("WASD movement speed in GroundScout mode.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 80f), Array.Empty())); LambViewMoveSpeed = config.Bind("Camera", "LambViewMoveSpeed", 4f, new ConfigDescription("WASD movement speed in LambView mode.", (AcceptableValueBase)(object)new AcceptableValueRange(0.5f, 40f), Array.Empty())); FastMultiplier = config.Bind("Camera", "FastMultiplier", 3f, new ConfigDescription("Movement multiplier while FastModifierKey is held.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 10f), Array.Empty())); SlowMultiplier = config.Bind("Camera", "SlowMultiplier", 0.35f, new ConfigDescription("Movement multiplier while SlowModifierKey is held.", (AcceptableValueBase)(object)new AcceptableValueRange(0.05f, 1f), Array.Empty())); ZoomSpeed = config.Bind("Camera", "ZoomSpeed", 12f, new ConfigDescription("Q/E and mouse wheel camera in/out speed.", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 80f), Array.Empty())); VerticalMoveSpeed = config.Bind("Camera", "VerticalMoveSpeed", 6f, new ConfigDescription("Space/C vertical lift speed in freecam.", (AcceptableValueBase)(object)new AcceptableValueRange(0.5f, 40f), Array.Empty())); MouseLookSensitivity = config.Bind("Camera", "MouseLookSensitivity", 2.5f, new ConfigDescription("Right mouse drag look sensitivity.", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 20f), Array.Empty())); SurveyPitch = config.Bind("Camera", "SurveyPitch", -60f, new ConfigDescription("Starting camera pitch for Survey mode.", (AcceptableValueBase)(object)new AcceptableValueRange(-89f, -5f), Array.Empty())); GroundPitch = config.Bind("Camera", "GroundPitch", -15f, new ConfigDescription("Starting camera pitch for GroundScout mode.", (AcceptableValueBase)(object)new AcceptableValueRange(-80f, 25f), Array.Empty())); LambViewPitch = config.Bind("Camera", "LambViewPitch", -5f, new ConfigDescription("Starting camera pitch for LambView mode.", (AcceptableValueBase)(object)new AcceptableValueRange(-70f, 45f), Array.Empty())); DisableDuringConversations = config.Bind("Safety", "DisableDuringConversations", true, "Temporarily yield to vanilla camera while conversations or scripted target cameras are active."); DebugLogging = config.Bind("Debug", "DebugLogging", false, "Verbose FreeCamAssist logs."); } } internal sealed class FreeCamController : MonoBehaviour { private FreeCamMode _mode; private Vector3 _position; private float _pitch; private float _yaw; private bool _active; private bool _cameraLocked; private bool _hasPosition; private bool _cameraTouched; private bool _previousSnappyMovement; private bool _previousDisablePlayerLook; private bool _playersFrozen; private readonly Dictionary _frozenPlayerPositions = new Dictionary(); private KeyCode _toggleKey = (KeyCode)290; private KeyCode _toggleKeySecondary = (KeyCode)277; private KeyCode _cameraLockKey = (KeyCode)289; private KeyCode _switchModeKey = (KeyCode)291; private KeyCode _recenterKey = (KeyCode)292; private KeyCode _verticalUpKey = (KeyCode)32; private KeyCode _verticalDownKey = (KeyCode)99; private KeyCode _fastKey = (KeyCode)304; private KeyCode _slowKey = (KeyCode)306; private string _lastToggleRaw; private string _lastToggleSecondaryRaw; private string _lastCameraLockRaw; private string _lastSwitchModeRaw; private string _lastRecenterRaw; private string _lastVerticalUpRaw; private string _lastVerticalDownRaw; private string _lastFastRaw; private string _lastSlowRaw; internal bool Active { get { if (_active) { return FreeCamConfig.Enabled.Value; } return false; } } private void Update() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) RefreshKeys(); if (!FreeCamConfig.Enabled.Value) { Disable(); return; } if (Input.GetKeyDown(_toggleKey) || Input.GetKeyDown(_toggleKeySecondary)) { Toggle(); } if (!_active) { return; } if (Input.GetKeyDown(_cameraLockKey)) { ToggleCameraLock(); } if (_cameraLocked) { UnfreezePlayers(); return; } if (Input.GetKeyDown(_switchModeKey)) { SwitchMode(); } if (Input.GetKeyDown(_recenterKey)) { Recenter(keepModePitch: true); } HandleMovement(); HandleMouseLook(); FreezePlayers(); } private void LateUpdate() { FreezePlayers(); Apply(CameraFollowTarget.Instance); } internal bool ShouldOwnCamera(CameraFollowTarget camera) { if (Active && (Object)(object)camera != (Object)null) { return !ShouldYieldToVanilla(camera); } return false; } internal void Apply(CameraFollowTarget camera) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) if (!Active || (Object)(object)camera == (Object)null) { return; } if (ShouldYieldToVanilla(camera)) { RestoreCameraFlags(camera); return; } if (!_hasPosition) { CaptureFrom(camera); } Quaternion rotation = Quaternion.Euler(_pitch, 0f, _yaw); Transform transform = ((Component)camera).transform; transform.position = _position; transform.rotation = rotation; camera.CurrentPosition = _position; camera.CurrentTargetCameraPosition = _position; camera.Look = Vector3.zero; SaveCameraFlags(camera); camera.SnappyMovement = true; camera.DisablePlayerLook = true; } internal bool ShouldFreezePlayerController() { if (Active && !_cameraLocked) { return FreeCamConfig.FreezePlayerWhileActive.Value; } return false; } private void Toggle() { _active = !_active; if (_active) { _cameraLocked = false; CameraFollowTarget instance = CameraFollowTarget.Instance; if ((Object)(object)instance != (Object)null) { CaptureFrom(instance); } else { Recenter(keepModePitch: false); } FreezePlayers(); } else { Disable(); } LogInfo("Free camera " + (_active ? "enabled" : "disabled") + " in " + _mode.ToString() + " mode."); } private void Disable() { if (_active || _cameraTouched) { RestoreCameraFlags(CameraFollowTarget.Instance); UnfreezePlayers(); if (FreeCamConfig.ResetVanillaOnDisable.Value) { ResetVanillaCamera(CameraFollowTarget.Instance); } _active = false; _cameraLocked = false; _hasPosition = false; } } private void SaveCameraFlags(CameraFollowTarget camera) { if (!_cameraTouched && !((Object)(object)camera == (Object)null)) { _previousSnappyMovement = camera.SnappyMovement; _previousDisablePlayerLook = camera.DisablePlayerLook; _cameraTouched = true; } } private void RestoreCameraFlags(CameraFollowTarget camera) { if (_cameraTouched) { if ((Object)(object)camera != (Object)null) { camera.SnappyMovement = _previousSnappyMovement; camera.DisablePlayerLook = _previousDisablePlayerLook; } _cameraTouched = false; } } private void SwitchMode() { _mode = ((_mode == FreeCamMode.Survey) ? FreeCamMode.GroundScout : ((_mode == FreeCamMode.GroundScout) ? FreeCamMode.LambView : FreeCamMode.Survey)); Recenter(keepModePitch: false); LogInfo("Mode -> " + _mode); } private void ToggleCameraLock() { _cameraLocked = !_cameraLocked; if (_cameraLocked) { UnfreezePlayers(); } else { FreezePlayers(); } LogInfo("Camera lock " + (_cameraLocked ? "enabled: player control restored, camera held." : "disabled: freecam controls restored.")); } private void CaptureFrom(CameraFollowTarget camera) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) _position = ((Component)camera).transform.position; Quaternion rotation = ((Component)camera).transform.rotation; Vector3 eulerAngles = ((Quaternion)(ref rotation)).eulerAngles; _pitch = NormalizeAngle(eulerAngles.x); _yaw = NormalizeAngle(eulerAngles.z); if (Mathf.Abs(_pitch) < 0.001f) { _pitch = ((_mode == FreeCamMode.Survey) ? FreeCamConfig.SurveyPitch.Value : FreeCamConfig.GroundPitch.Value); } _hasPosition = true; } private void Recenter(bool keepModePitch) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) PlayerFarming instance = PlayerFarming.Instance; CameraFollowTarget instance2 = CameraFollowTarget.Instance; if (!((Object)(object)instance == (Object)null) || !((Object)(object)instance2 == (Object)null)) { Vector3 val = (((Object)(object)instance != (Object)null) ? ((Component)instance).transform.position : instance2.GetCameraTargetWorldPosition()); if (_mode == FreeCamMode.Survey) { float pitch = (keepModePitch ? _pitch : Mathf.Clamp(FreeCamConfig.SurveyPitch.Value, -89f, -5f)); float distance = 12f; _pitch = pitch; _yaw = 0f; _position = val + CameraOffsetForPitch(_pitch, distance); } else if (_mode == FreeCamMode.GroundScout) { _pitch = (keepModePitch ? _pitch : Mathf.Clamp(FreeCamConfig.GroundPitch.Value, -80f, 25f)); _position = val + new Vector3(0f, -2.4f, -3.2f); } else { _pitch = (keepModePitch ? _pitch : Mathf.Clamp(FreeCamConfig.LambViewPitch.Value, -70f, 45f)); _yaw = PlayerFacingYaw(instance); _position = GetLambViewPosition(instance, val); } _hasPosition = true; } } private void HandleMovement() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: 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_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_0216: 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_0242: 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_025b: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) float num = ((_mode == FreeCamMode.Survey) ? FreeCamConfig.SurveyMoveSpeed.Value : ((_mode == FreeCamMode.GroundScout) ? FreeCamConfig.GroundMoveSpeed.Value : FreeCamConfig.LambViewMoveSpeed.Value)); if (Input.GetKey(_fastKey)) { num *= FreeCamConfig.FastMultiplier.Value; } if (Input.GetKey(_slowKey)) { num *= FreeCamConfig.SlowMultiplier.Value; } Vector3 up = default(Vector3); Vector3 right = default(Vector3); if (_mode == FreeCamMode.GroundScout || _mode == FreeCamMode.LambView) { float num2 = _yaw * ((float)Math.PI / 180f); ((Vector3)(ref up))..ctor(Mathf.Sin(num2), Mathf.Cos(num2), 0f); ((Vector3)(ref right))..ctor(Mathf.Cos(num2), 0f - Mathf.Sin(num2), 0f); } else { up = Vector3.up; right = Vector3.right; } Vector3 val = Vector3.zero; if (Input.GetKey((KeyCode)119)) { val += up; } if (Input.GetKey((KeyCode)115)) { val -= up; } if (Input.GetKey((KeyCode)100)) { val += right; } if (Input.GetKey((KeyCode)97)) { val -= right; } if (((Vector3)(ref val)).sqrMagnitude > 1f) { ((Vector3)(ref val)).Normalize(); } _position += val * num * Time.unscaledDeltaTime; float num3 = 0f; if (Input.GetKey(_verticalUpKey)) { num3 += 1f; } if (Input.GetKey(_verticalDownKey)) { num3 -= 1f; } if (Mathf.Abs(num3) > 0.001f) { _position += Vector3.forward * num3 * FreeCamConfig.VerticalMoveSpeed.Value * Time.unscaledDeltaTime; } Vector3 val2 = Quaternion.Euler(_pitch, 0f, _yaw) * Vector3.forward; float num4 = 0f; if (Input.GetKey((KeyCode)101)) { num4 += 1f; } if (Input.GetKey((KeyCode)113)) { num4 -= 1f; } num4 += Input.mouseScrollDelta.y * 3f; if (Mathf.Abs(num4) > 0.001f) { _position += val2 * num4 * FreeCamConfig.ZoomSpeed.Value * Time.unscaledDeltaTime; } } private void HandleMouseLook() { if (Input.GetMouseButton(1)) { float value = FreeCamConfig.MouseLookSensitivity.Value; _yaw += Input.GetAxis("Mouse X") * value; _pitch -= Input.GetAxis("Mouse Y") * value; _pitch = Mathf.Clamp(_pitch, -89f, 60f); } } private bool ShouldYieldToVanilla(CameraFollowTarget camera) { if (!FreeCamConfig.DisableDuringConversations.Value) { return false; } try { return (Object)(object)camera.TargetCamera != (Object)null || MMConversation.isPlaying || LetterBox.IsPlaying || PhotoModeManager.PhotoModeActive; } catch { return false; } } private void RefreshKeys() { RefreshKey(FreeCamConfig.ToggleKey.Value, ref _lastToggleRaw, ref _toggleKey, (KeyCode)290); RefreshKey(FreeCamConfig.ToggleKeySecondary.Value, ref _lastToggleSecondaryRaw, ref _toggleKeySecondary, (KeyCode)277); RefreshKey(FreeCamConfig.CameraLockKey.Value, ref _lastCameraLockRaw, ref _cameraLockKey, (KeyCode)289); RefreshKey(FreeCamConfig.SwitchModeKey.Value, ref _lastSwitchModeRaw, ref _switchModeKey, (KeyCode)291); RefreshKey(FreeCamConfig.RecenterKey.Value, ref _lastRecenterRaw, ref _recenterKey, (KeyCode)292); RefreshKey(FreeCamConfig.VerticalUpKey.Value, ref _lastVerticalUpRaw, ref _verticalUpKey, (KeyCode)32); RefreshKey(FreeCamConfig.VerticalDownKey.Value, ref _lastVerticalDownRaw, ref _verticalDownKey, (KeyCode)99); RefreshKey(FreeCamConfig.FastModifierKey.Value, ref _lastFastRaw, ref _fastKey, (KeyCode)304); RefreshKey(FreeCamConfig.SlowModifierKey.Value, ref _lastSlowRaw, ref _slowKey, (KeyCode)306); } private void FreezePlayers() { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (!Active || _cameraLocked || !FreeCamConfig.FreezePlayerWhileActive.Value) { UnfreezePlayers(); return; } for (int i = 0; i < PlayerFarming.players.Count; i++) { PlayerFarming val = PlayerFarming.players[i]; if (!((Object)(object)val == (Object)null)) { if (!_frozenPlayerPositions.ContainsKey(val)) { _frozenPlayerPositions[val] = ((Component)val).transform.position; } else { ((Component)val).transform.position = _frozenPlayerPositions[val]; } } } _playersFrozen = true; } private void UnfreezePlayers() { if (_playersFrozen) { _frozenPlayerPositions.Clear(); _playersFrozen = false; } } private void ResetVanillaCamera(CameraFollowTarget camera) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) PlayerFarming instance = PlayerFarming.Instance; if ((Object)(object)camera == (Object)null || (Object)(object)instance == (Object)null) { return; } try { GameManager instance2 = GameManager.GetInstance(); if ((Object)(object)instance2 != (Object)null) { instance2.CameraSetOffset(Vector3.zero); instance2.CameraResetTargetZoom(); if ((Object)(object)instance.CameraBone != (Object)null && !camera.Contains(instance.CameraBone)) { instance2.AddToCamera(instance.CameraBone, 1f); } } } catch { } camera.TargetOffset = Vector3.zero; camera.CurrentOffset = Vector3.zero; camera.Look = Vector3.zero; camera.TargetCamera = null; camera.SnappyMovement = _previousSnappyMovement; camera.DisablePlayerLook = _previousDisablePlayerLook; camera.distance = 12f; camera.targetDistance = 12f; camera.angle = -45f; ((Component)camera).transform.rotation = Quaternion.Euler(-45f, 0f, 0f); camera.SnapTo(((Component)instance).transform.position); camera.CurrentTargetCameraPosition = camera.CurrentPosition; } private static Vector3 GetLambViewPosition(PlayerFarming player, Vector3 fallback) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)player != (Object)null && (Object)(object)player.CameraBone != (Object)null) { return player.CameraBone.transform.position + new Vector3(0f, 0.1f, -0.45f); } return fallback + new Vector3(0f, 0.15f, -0.75f); } private static float PlayerFacingYaw(PlayerFarming player) { if ((Object)(object)player != (Object)null && (Object)(object)player.state != (Object)null) { return 90f - player.state.facingAngle; } return 0f; } private static void RefreshKey(string raw, ref string lastRaw, ref KeyCode key, KeyCode fallback) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected I4, but got Unknown if (!(raw == lastRaw)) { lastRaw = raw; key = (KeyCode)(int)ParseKeyCode(raw, fallback); } } private unsafe static KeyCode ParseKeyCode(string raw, KeyCode fallback) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (string.IsNullOrWhiteSpace(raw)) { return (KeyCode)0; } try { return (KeyCode)Enum.Parse(typeof(KeyCode), raw.Trim(), ignoreCase: true); } catch { if (FreeCamAssistPlugin.Log != null) { FreeCamAssistPlugin.Log.LogWarning((object)("Invalid KeyCode '" + raw + "', using " + ((object)(*(KeyCode*)(&fallback))/*cast due to .constrained prefix*/).ToString())); } return fallback; } } private static float NormalizeAngle(float angle) { while (angle > 180f) { angle -= 360f; } while (angle < -180f) { angle += 360f; } return angle; } private static Vector3 CameraOffsetForPitch(float pitchDegrees, float distance) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) float num = pitchDegrees * ((float)Math.PI / 180f); return new Vector3(0f, distance * Mathf.Sin(num), (0f - distance) * Mathf.Cos(num)); } private static void DebugLog(string message) { if (FreeCamConfig.DebugLogging.Value && FreeCamAssistPlugin.Log != null) { FreeCamAssistPlugin.Log.LogInfo((object)("[FreeCamAssist] " + message)); } } private static void LogInfo(string message) { if (FreeCamAssistPlugin.Log != null) { FreeCamAssistPlugin.Log.LogInfo((object)("[FreeCamAssist] " + message)); } } } [HarmonyPatch(typeof(CameraFollowTarget), "LateUpdate")] internal static class CameraFollowTargetLateUpdatePatch { public static bool Prefix(CameraFollowTarget __instance) { FreeCamController controller = FreeCamAssistPlugin.Controller; if ((Object)(object)controller != (Object)null && controller.ShouldOwnCamera(__instance)) { controller.Apply(__instance); return false; } return true; } public static void Postfix(CameraFollowTarget __instance) { FreeCamController controller = FreeCamAssistPlugin.Controller; if ((Object)(object)controller != (Object)null) { controller.Apply(__instance); } } } [HarmonyPatch(typeof(PlayerController), "Update")] internal static class PlayerControllerUpdatePatch { public static bool Prefix() { FreeCamController controller = FreeCamAssistPlugin.Controller; if (!((Object)(object)controller == (Object)null)) { return !controller.ShouldFreezePlayerController(); } return true; } } }