Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SimpleFreeCam v1.4.0
BepInEx/plugins/SimpleFreeCam.dll
Decompiled 3 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyInputUtils.Api; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using SimpleFreeCam.Input; using SimpleFreeCam.Patches; using SimpleFreeCam.UI; using TMPro; using Unity.Netcode; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Rendering; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("SimpleFreeCam")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SimpleFreeCam")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("6649931a-a94b-4986-8489-8153ecf188f6")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace SimpleFreeCam { internal static class FreeCamClass { [CompilerGenerated] private sealed class <SetupFreecam>d__18 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SetupFreecam>d__18(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0108: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitUntil((Func<bool>)(() => (Object)(object)StartOfRound.Instance.localPlayerController != (Object)null)); <>1__state = 1; return true; case 1: <>1__state = -1; playerController = StartOfRound.Instance.localPlayerController; HUDObject = ((Component)GameObject.Find("Systems").transform.Find("Rendering/PlayerHUDHelmetModel")).gameObject; playerModel = ((Component)((Component)playerController).transform.Find("ScavengerModel/LOD1")).GetComponent<SkinnedMeshRenderer>(); mainCameraTransform = ((Component)playerController).transform.Find("ScavengerModel/metarig/CameraContainer/MainCamera"); freeCameraTransform = GameObject.Find("FreeCameraCinematic").transform; FreeCam = StartOfRound.Instance.freeCinematicCamera; playerAudioListener = ((Component)playerController).transform.Find("ScavengerModel/metarig/CameraContainer/MainCamera/PlayerAudioListener"); if ((Object)(object)FreeCamHUD.Instance == (Object)null) { new GameObject("SimpleFreeCamHUD").AddComponent<FreeCamHUD>(); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static GameObject HUDObject; private static SkinnedMeshRenderer playerModel; private static Transform playerAudioListener; private static PlayerControllerB playerController = null; internal static bool shouldChangeFOV = false; private static Transform mainCameraTransform; private static Transform freeCameraTransform; private static Camera FreeCam; internal static bool lockFreeCam = false; internal static bool isInFreeCam = false; internal static bool isInMenu = true; internal static float freecamSpeed = 5f; private static bool hasChangedSpeed = false; private static bool hasBootedAlready = false; private static float PlayerSavedCameraUp = 0f; public static float FreeCamSavedCameraUp = 0f; private static float freecamFOV = 60f; private static readonly FieldInfo cameraUpField = typeof(PlayerControllerB).GetField("cameraUp", BindingFlags.Instance | BindingFlags.NonPublic); [IteratorStateMachine(typeof(<SetupFreecam>d__18))] public static IEnumerator SetupFreecam() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SetupFreecam>d__18(0); } public static void SetFreeCamera_performed(CallbackContext obj) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) if (!((CallbackContext)(ref obj)).performed || isInMenu) { return; } typeof(PlayerControllerB).GetMethod("SetFreeCamera_performed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(playerController, new object[1] { obj }); if (!playerController.inTerminalMenu && !playerController.isTypingChat) { if (isInFreeCam) { DisableFreecam(); } else if (!playerController.isPlayerDead) { EnableFreecam(); } } } public static void ToggleFOVSwitch_performed(bool isHeldDown) { if (!((Object)(object)playerController == (Object)null) && isInFreeCam) { shouldChangeFOV = isHeldDown; } } public static void ToggleFreecamMovement_performed(CallbackContext obj) { if (((CallbackContext)(ref obj)).performed && !((Object)(object)playerController == (Object)null) && isInFreeCam) { lockFreeCam = !lockFreeCam; DisableFreecamOnLock(); } } public static void ResetFOV_performed(CallbackContext obj) { if (((CallbackContext)(ref obj)).performed && !((Object)(object)playerController == (Object)null) && isInFreeCam) { freecamFOV = 60f; FreeCam.fieldOfView = 60f; } } public static void ResetFreeCam() { hasBootedAlready = false; FreeCamSavedCameraUp = 0f; } public static void TeleportFreeCamToPlayer_performed(CallbackContext obj) { if (((CallbackContext)(ref obj)).performed && !((Object)(object)playerController == (Object)null) && isInFreeCam) { TeleportFreeCamToPlayer(); } } public static void SetFreecamLocation(Vector3 position) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) if (isInFreeCam && !lockFreeCam) { freeCameraTransform.position = position; StartOfRound.Instance.freeCinematicCameraTurnCompass.position = position; } } public static void SetFreecamFOV(float fov) { freecamFOV = Mathf.Clamp(fov, 5f, 160f); if (isInFreeCam) { FreeCam.fieldOfView = freecamFOV; } } public static float GetFreecamFOV() { return freecamFOV; } public static void TeleportFreeCamToPlayer() { TeleportFreeCamToPlayer(-0.5f); } private static void ResetFreeCamRotation() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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) Quaternion rotation = (Quaternion)((!((Object)(object)playerController != (Object)null)) ? default(Quaternion) : Quaternion.LookRotation(GetPlayerForwardWithoutPitch())); freeCameraTransform.rotation = rotation; StartOfRound.Instance.freeCinematicCameraTurnCompass.rotation = rotation; } private static void ResetFreeCamTransform(float offset) { TeleportFreeCamToPlayer(offset); ResetFreeCamRotation(); } public static void TeleportFreeCamToPlayer(float offset) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //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) SetFreecamLocation(((Component)playerController.gameplayCamera).transform.position + GetPlayerForwardWithoutPitch() * offset); } private static Vector3 GetPlayerForwardWithoutPitch() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) Vector3 forward = ((Component)playerController.gameplayCamera).transform.forward; forward.y = 0f; return ((Vector3)(ref forward)).normalized; } private static void EnableFreecam() { //IL_0106: Unknown result type (might be due to invalid IL or missing references) lockFreeCam = false; isInFreeCam = true; shouldChangeFOV = false; FreeCam.cullingMask = playerController.gameplayCamera.cullingMask; if (!hasBootedAlready) { hasBootedAlready = true; freecamSpeed = SimpleFreeCamPatchBase.instance.FreeCamConfigEntryFloat.Value; ResetFreeCamTransform(-1f); } if (SimpleFreeCamPatchBase.instance.FreeCamConfigEntryResetTransform.Value) { ResetFreeCamTransform(-1f); } else if (SimpleFreeCamPatchBase.instance.FreeCamConfigEntryResetDistance.Value && ShouldDistanceReset()) { ResetFreeCamTransform(-1f); } if (SimpleFreeCamPatchBase.instance.FreeCamConfigEntry.Value) { freecamSpeed = SimpleFreeCamPatchBase.instance.FreeCamConfigEntryFloat.Value; } else if (!hasChangedSpeed) { freecamSpeed = SimpleFreeCamPatchBase.instance.FreeCamConfigEntryFloat.Value; } SwitchCameraUpField(switchToFreeCam: true); FreeCam.fieldOfView = freecamFOV; playerController.isFreeCamera = true; StartOfRound.Instance.freeCinematicCameraTurnCompass.rotation = freeCameraTransform.rotation; StartOfRound.Instance.SwitchCamera(FreeCam); FreeCamHUD.ResetHideUI(); HUDObject.SetActive(false); ((Renderer)playerController.thisPlayerModelArms).enabled = false; ((Renderer)playerModel).shadowCastingMode = (ShadowCastingMode)1; playerAudioListener.SetParent(freeCameraTransform, false); if ((Object)(object)playerController.currentlyHeldObjectServer != (Object)null) { playerController.currentlyHeldObjectServer.parentObject = playerController.serverItemHolder; } HUDManager.Instance.HideHUD(true); } private static bool ShouldDistanceReset() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) if (SimpleFreeCamPatchBase.instance.FreeCamConfigEntryResetDistance.Value) { float num = SimpleFreeCamPatchBase.instance.FreeCamConfigEntryInt.Value * SimpleFreeCamPatchBase.instance.FreeCamConfigEntryInt.Value; Vector3 val = ((Component)playerController).transform.localPosition - ((Component)FreeCam).transform.localPosition; return ((Vector3)(ref val)).sqrMagnitude > num; } return false; } public static void TickDistanceWarning() { FreeCamHUD.TriggerDistanceWarning(ShouldDistanceReset()); } private static void SwitchCameraUpField(bool switchToFreeCam) { if (switchToFreeCam) { PlayerSavedCameraUp = (float)cameraUpField.GetValue(playerController); cameraUpField.SetValue(playerController, FreeCamSavedCameraUp); } else { FreeCamSavedCameraUp = (float)cameraUpField.GetValue(playerController); cameraUpField.SetValue(playerController, PlayerSavedCameraUp); } } public static void DisableFreecam() { if (!lockFreeCam) { SwitchCameraUpField(switchToFreeCam: false); } lockFreeCam = false; isInFreeCam = false; playerController.isFreeCamera = false; ((Behaviour)StartOfRound.Instance.freeCinematicCamera).enabled = false; StartOfRound.Instance.SwitchCamera(playerController.isPlayerDead ? StartOfRound.Instance.spectateCamera : playerController.gameplayCamera); HUDObject.SetActive(true); ((Renderer)playerController.thisPlayerModelArms).enabled = true; ((Renderer)playerModel).shadowCastingMode = (ShadowCastingMode)3; playerAudioListener.SetParent(mainCameraTransform, false); if ((Object)(object)playerController.currentlyHeldObjectServer != (Object)null) { playerController.currentlyHeldObjectServer.parentObject = playerController.localItemHolder; } HUDManager.Instance.HideHUD(playerController.isPlayerDead); } public static void DisableFreecamOnLock() { isInFreeCam = true; SwitchCameraUpField(!lockFreeCam); playerController.isFreeCamera = !lockFreeCam; } internal static void AdjustSpeed(float scrollDelta) { if (isInFreeCam && !lockFreeCam) { freecamSpeed = Mathf.Clamp(freecamSpeed + ((scrollDelta > 0f) ? 0.5f : (-0.5f)), 0f, 50f); if (!hasChangedSpeed) { hasChangedSpeed = true; } } } internal static void UpdateSpeed(float newSpeed) { if (!hasChangedSpeed) { freecamSpeed = newSpeed; } } internal static bool IsInVehicle() { if ((Object)(object)playerController != (Object)null) { return playerController.inVehicleAnimation; } return false; } internal static float GetSpeed() { return freecamSpeed; } internal static void AdjustFOV(float delta) { if (isInFreeCam && !lockFreeCam) { SetFreecamFOV(freecamFOV + delta); } } internal static float GetFOVSensitivityMultiplier() { return freecamFOV / 60f; } } internal static class FreeCamFOVInfo { internal const float MinFOV = 5f; internal const float MaxFOV = 160f; internal const float ScrollStep = 1f; internal const float DefaultFOV = 60f; } internal static class FreeCamSpeedInfo { internal const float MinSpeed = 0f; internal const float MaxSpeed = 50f; internal const float ScrollStep = 0.5f; internal const float DefaultSpeed = 5f; internal const float SprintMultiplier = 2f; internal const float VehicleMinimumSpeed = 2f; } internal static class ModInfo { internal const string modGUID = "PixelIndieDev_SimpleFreeCam"; internal const string modName = "Simple Freecam"; internal const string modVersion = "1.4.0.0"; } [BepInPlugin("PixelIndieDev_SimpleFreeCam", "Simple Freecam", "1.4.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class SimpleFreeCamPatchBase : BaseUnityPlugin { private readonly Harmony harmony = new Harmony("PixelIndieDev_SimpleFreeCam"); public static SimpleFreeCamPatchBase instance; internal static SimpleFreeCamInputs InputActionsInstance; internal ConfigEntry<bool> FreeCamConfigEntry; internal ConfigEntry<float> FreeCamConfigEntryFloat; internal ConfigEntry<int> FreeCamConfigEntryInt; internal ConfigEntry<bool> FreeCamConfigEntryResetTransform; internal ConfigEntry<bool> FreeCamConfigEntryResetDistance; internal ConfigEntry<bool> FreeCamConfigEntryHideUI; internal ConfigEntry<bool> FreeCamConfigEntryDefaultUIVisiblity; internal ConfigEntry<float> FreeCamConfigEntryFloatOpacity; internal ConfigEntry<bool> FreeCamConfigDisableShowWarningDistance; internal ConfigEntry<bool> FreeCamConfigDisableShowWarningReset; internal ManualLogSource logSource; private void Awake() { //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Expected O, but got Unknown //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b7: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Expected O, but got Unknown //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Expected O, but got Unknown //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Expected O, but got Unknown //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Expected O, but got Unknown //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Expected O, but got Unknown //IL_020e: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Expected O, but got Unknown //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Expected O, but got Unknown //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Expected O, but got Unknown //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02af: Expected O, but got Unknown //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Expected O, but got Unknown //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Expected O, but got Unknown //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Expected O, but got Unknown //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_031c: Unknown result type (might be due to invalid IL or missing references) //IL_0328: Expected O, but got Unknown //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_032d: Expected O, but got Unknown //IL_0354: Unknown result type (might be due to invalid IL or missing references) //IL_0359: Unknown result type (might be due to invalid IL or missing references) //IL_0365: Expected O, but got Unknown //IL_0360: Unknown result type (might be due to invalid IL or missing references) //IL_036a: Expected O, but got Unknown //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_0396: Unknown result type (might be due to invalid IL or missing references) //IL_03a2: Expected O, but got Unknown //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03a7: Expected O, but got Unknown //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03d3: Unknown result type (might be due to invalid IL or missing references) //IL_03df: Expected O, but got Unknown //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03e4: Expected O, but got Unknown //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0410: Unknown result type (might be due to invalid IL or missing references) //IL_041c: Expected O, but got Unknown //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_0421: Expected O, but got Unknown logSource = Logger.CreateLogSource("PixelIndieDev_SimpleFreeCam"); if ((Object)(object)instance == (Object)null) { instance = this; } InputActionsInstance = new SimpleFreeCamInputs(); InputActionsInstance.PixelIndieDev_FreeCamKey.performed += FreeCamClass.SetFreeCamera_performed; InputActionsInstance.PixelIndieDev_FreeCamMovementKey.performed += FreeCamClass.ToggleFreecamMovement_performed; InputActionsInstance.PixelIndieDev_FreeCamFOVModifierKey.performed += delegate { FreeCamClass.ToggleFOVSwitch_performed(isHeldDown: true); }; InputActionsInstance.PixelIndieDev_FreeCamFOVModifierKey.canceled += delegate { FreeCamClass.ToggleFOVSwitch_performed(isHeldDown: false); }; InputActionsInstance.PixelIndieDev_FreeCamResetFOVKey.performed += FreeCamClass.ResetFOV_performed; InputActionsInstance.PixelIndieDev_FreeCamTeleportToPlayerKey.performed += FreeCamClass.TeleportFreeCamToPlayer_performed; InputActionsInstance.PixelIndieDev_FreeCamHideUI.performed += FreeCamHUD.HideUI_performed; FreeCamConfigEntryResetTransform = ((BaseUnityPlugin)this).Config.Bind<bool>("Transform", "Reset freecam location and rotation on freecam", false, "When enabled, the freecam will teleport to the player's current position and rotation every time freecam is activated."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigEntryResetTransform, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigEntryResetDistance = ((BaseUnityPlugin)this).Config.Bind<bool>("Transform", "Reset freecam when too far away", false, "When enabled, the freecam will automatically teleport to the player's position and rotation if it exceeds the 'Max freecam distance'."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigEntryResetDistance, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigEntryInt = ((BaseUnityPlugin)this).Config.Bind<int>("Transform", "Max freecam distance", 100, "The maximum distance (in meters) the freecam can be from the player when activating freecam before it resets."); ConfigEntry<int> freeCamConfigEntryInt = FreeCamConfigEntryInt; IntSliderOptions val = new IntSliderOptions(); ((BaseRangeOptions<int>)val).Min = 10; ((BaseRangeOptions<int>)val).Max = 300; ((BaseOptions)val).RequiresRestart = false; LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(freeCamConfigEntryInt, val)); FreeCamConfigEntry = ((BaseUnityPlugin)this).Config.Bind<bool>("Speed", "Reset speed on freecam", false, "When enabled, the freecam movement speed resets to the default speed every time freecam is activated."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigEntry, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigEntryFloat = ((BaseUnityPlugin)this).Config.Bind<float>("Speed", "Default freecam speed", 5f, $"The base movement speed of the freecam. Scroll while in freecam to adjust speed (range: {0f} - {50f}, in steps of {0.5f})."); FreeCamConfigEntryFloat.SettingChanged += delegate { FreeCamClass.UpdateSpeed(FreeCamConfigEntryFloat.Value); }; ConfigEntry<float> freeCamConfigEntryFloat = FreeCamConfigEntryFloat; FloatStepSliderOptions val2 = new FloatStepSliderOptions(); ((BaseRangeOptions<float>)val2).Min = 0f; ((BaseRangeOptions<float>)val2).Max = 50f; val2.Step = 0.5f; ((BaseOptions)val2).RequiresRestart = false; LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatStepSliderConfigItem(freeCamConfigEntryFloat, val2)); FreeCamConfigEntryFloatOpacity = ((BaseUnityPlugin)this).Config.Bind<float>("UI", "Opacity", 0.9f, "Controls the UI opacity while in freecam"); FreeCamConfigEntryFloatOpacity.SettingChanged += delegate { FreeCamHUD.UpdateOpacity(FreeCamConfigEntryFloatOpacity.Value); }; ConfigEntry<float> freeCamConfigEntryFloatOpacity = FreeCamConfigEntryFloatOpacity; FloatStepSliderOptions val3 = new FloatStepSliderOptions(); ((BaseRangeOptions<float>)val3).Min = 0.05f; ((BaseRangeOptions<float>)val3).Max = 1f; val3.Step = 0.05f; ((BaseOptions)val3).RequiresRestart = false; LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatStepSliderConfigItem(freeCamConfigEntryFloatOpacity, val3)); FreeCamConfigEntryDefaultUIVisiblity = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "Is UI visible by default", true, "When enabled, the freecam UI will be visible by default."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigEntryDefaultUIVisiblity, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigEntryHideUI = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "Reset UI visibility on freecam", false, "When enabled, the freecam UI resets to the default visibility every time freecam is activated."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigEntryHideUI, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigDisableShowWarningReset = ((BaseUnityPlugin)this).Config.Bind<bool>("Warnings", "Disable showing reset transform warning", false, "When enabled, the freecam UI will never show the reset transform warning on screen."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigDisableShowWarningReset, new BoolCheckBoxOptions { RequiresRestart = false })); FreeCamConfigDisableShowWarningDistance = ((BaseUnityPlugin)this).Config.Bind<bool>("Warnings", "Disable showing distance warning", false, "When enabled, the freecam UI will never show the far away distance warning on screen."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(FreeCamConfigDisableShowWarningDistance, new BoolCheckBoxOptions { RequiresRestart = false })); harmony.PatchAll(typeof(SimpleFreeCamPatchBase)); harmony.PatchAll(typeof(StartOfRoundPatch)); harmony.PatchAll(typeof(PlayerControllerPatch)); harmony.PatchAll(typeof(VehicleControllerPatch)); harmony.PatchAll(typeof(HUDManagerPatch)); harmony.PatchAll(typeof(NetworkPatch)); logSource.LogInfo((object)"Simple Freecam (version - 1.4.0.0): patches applied successfully"); } } } namespace SimpleFreeCam.UI { internal class FreeCamHUD : MonoBehaviour { internal enum WarningReason { None, DistanceWarning, ResetWarning } private GameObject hudCanvasObj; private Image statsBorder; private Image statsBackground; private TextMeshProUGUI statsText; private Image warningBorder; private Image warningBackground; private TextMeshProUGUI warningText; private static float ColorAlpha = 1f; private static Color Blackish_Background = new Color(0.04f, 0.04f, 0.04f, ColorAlpha); private static Color Green_Outline = new Color(0.49f, 0.82f, 0.49f, ColorAlpha); private static Color Green_Text = new Color(0.27f, 0.47f, 0.27f, ColorAlpha); private static Color Orange_Outline; private static Color Orange_Text; private static Color Distance_Outline; private static Color Distance_Text; private static Color Reset_Outline; private static Color Reset_Text; private static bool ShowDistanceWarning = false; private static bool ShouldHideUI = false; private static WarningReason currentWarningReason = WarningReason.None; private const float BoxWidth = 300f; private const float BoxHeight = 112f; private const float BottomMargin = 100f; private const float BorderSize = 4f; private const float Warning_BoxWidth = 540f; private const float Warning_BoxHeight = 80f; private const float Warning_BottomMargin = 250f; private const float Warning_BorderSize = 2f; private const int Text_Fontsize = 20; private static readonly string[] WarningStrings = new string[3] { "! NO WARNING TO DISPLAY !\n<size=75%>! THIS MUST BE AN ERROR !</size>", "! FREECAM TOO FAR FROM PLAYER !\n<size=75%>! MOVE CLOSER OR THE FREECAM WILL TELEPORT TO THE PLAYER ON NEXT USE !</size>", "! RESET FREECAM TRANSFORM ENABLED !\n<size=75%>! THE FREECAM WILL TELEPORT TO THE PLAYER ON NEXT USE !</size>" }; internal static FreeCamHUD Instance { get; private set; } private static void InitializeColors() { //IL_0000: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) Orange_Outline = ShiftHue(Green_Outline, 0.72f); Orange_Text = ShiftHue(Green_Text, 0.72f); Distance_Outline = ShiftHue(Green_Outline, 0.8f); Distance_Text = ShiftHue(Green_Text, 0.8f); Reset_Outline = ShiftHue(Green_Outline, 0.41f); Reset_Text = ShiftHue(Green_Text, 0.41f); } private static Color ShiftHue(Color color, float hueShift) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) float num2 = default(float); float num3 = default(float); float num = default(float); Color.RGBToHSV(color, ref num, ref num2, ref num3); num = (num + hueShift) % 1f; return Color.HSVToRGB(num, num2, num3); } public static void HideUI_performed(CallbackContext obj) { if (((CallbackContext)(ref obj)).performed && FreeCamClass.isInFreeCam) { ShouldHideUI = !ShouldHideUI; } } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } Instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); InitializeColors(); CreateTMPUI(); UpdateOpacity(SimpleFreeCamPatchBase.instance.FreeCamConfigEntryFloatOpacity.Value); } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } public static void TriggerDistanceWarning(bool doWarning) { ShowDistanceWarning = doWarning; } private static bool ShouldShowWarning() { if (!SimpleFreeCamPatchBase.instance.FreeCamConfigDisableShowWarningReset.Value && SimpleFreeCamPatchBase.instance.FreeCamConfigEntryResetTransform.Value) { currentWarningReason = WarningReason.ResetWarning; return true; } if (!SimpleFreeCamPatchBase.instance.FreeCamConfigDisableShowWarningDistance.Value && ShowDistanceWarning) { currentWarningReason = WarningReason.DistanceWarning; return true; } return false; } private void Update() { //IL_005f: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) bool flag = FreeCamClass.isInFreeCam; if (flag) { flag = ((!SimpleFreeCamPatchBase.instance.FreeCamConfigEntryDefaultUIVisiblity.Value) ? ShouldHideUI : (!ShouldHideUI)); } if (hudCanvasObj.activeSelf != flag) { hudCanvasObj.SetActive(flag); } if (flag) { bool lockFreeCam = FreeCamClass.lockFreeCam; ((Graphic)statsBorder).color = (lockFreeCam ? Orange_Outline : Green_Outline); ((Graphic)statsBackground).color = Blackish_Background; ((Graphic)statsText).color = (lockFreeCam ? Orange_Text : Green_Text); string arg = (lockFreeCam ? "LOCKED" : "UNLOCKED"); ((TMP_Text)statsText).text = $"FOV: {FreeCamClass.GetFreecamFOV():F1}\nSpeed: {FreeCamClass.GetSpeed():F2}x\nFreecam {arg}"; bool flag2 = ShouldShowWarning(); UpdateWarningColorsAndText(); if (((Component)warningBorder).gameObject.activeSelf != flag2) { ((Component)warningBorder).gameObject.SetActive(flag2); } } } public static void UpdateOpacity(float newOpacity) { UpdateOpacity(newOpacity, onlyWarning: false); } private static void UpdateOpacity(float newOpacity, bool onlyWarning) { if ((Object)(object)Instance != (Object)null) { Instance.UpdateStaticColors(); } float a = newOpacity - 0.3f; if (!onlyWarning) { ColorAlpha = newOpacity; Blackish_Background.a = newOpacity; Green_Outline.a = a; Green_Text.a = newOpacity; Orange_Outline.a = a; Orange_Text.a = newOpacity; } Distance_Outline.a = a; Distance_Text.a = newOpacity; Reset_Outline.a = a; Reset_Text.a = newOpacity; } public static void ResetHideUI() { if (SimpleFreeCamPatchBase.instance.FreeCamConfigEntryHideUI.Value) { ShouldHideUI = false; } } private void UpdateWarningColorsAndText() { ((TMP_Text)warningText).text = GetWarningText(); UpdateOpacity(SimpleFreeCamPatchBase.instance.FreeCamConfigEntryFloatOpacity.Value); } private static string GetWarningText() { int num = (int)currentWarningReason; if (num >= 0 && num < WarningStrings.Length) { return WarningStrings[num]; } return WarningStrings[0]; } private static Color GetWarningColor(int index) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) bool flag = currentWarningReason == WarningReason.DistanceWarning; switch (index) { case 0: if (!flag) { return Reset_Outline; } return Distance_Outline; case 1: if (!flag) { return Reset_Text; } return Distance_Text; default: return new Color(0f, 0f, 0f, 0f); } } private void CreateTMPUI() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0086: 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_0107: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0130: 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_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) TMP_FontAsset font = ((IEnumerable<TMP_FontAsset>)Resources.FindObjectsOfTypeAll<TMP_FontAsset>()).FirstOrDefault((Func<TMP_FontAsset, bool>)((TMP_FontAsset f) => ((Object)f).name.Contains("3270"))); hudCanvasObj = new GameObject("FreeCamTMPCanvas"); hudCanvasObj.transform.SetParent(((Component)this).transform); Canvas obj = hudCanvasObj.AddComponent<Canvas>(); obj.renderMode = (RenderMode)0; obj.sortingOrder = 100; CanvasScaler obj2 = hudCanvasObj.AddComponent<CanvasScaler>(); obj2.uiScaleMode = (ScaleMode)1; obj2.referenceResolution = new Vector2(1920f, 1080f); obj2.matchWidthOrHeight = 1f; statsBorder = CreateUIBox(hudCanvasObj.transform, "StatsBorder", 308f, 120f, 96f); statsBackground = CreateUIBox(((Component)statsBorder).transform, "StatsBackground", 300f, 112f, 0f); RectTransform component = ((Component)statsBackground).GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = new Vector2(4f, 4f); component.offsetMax = new Vector2(-4f, -4f); statsText = CreateUIText(((Component)statsBackground).transform, "StatsText", font); warningBorder = CreateUIBox(hudCanvasObj.transform, "WarningBorder", 544f, 84f, 248f); warningBackground = CreateUIBox(((Component)warningBorder).transform, "WarningBackground", 540f, 80f, 0f); RectTransform component2 = ((Component)warningBackground).GetComponent<RectTransform>(); component2.anchorMin = Vector2.zero; component2.anchorMax = Vector2.one; component2.offsetMin = new Vector2(2f, 2f); component2.offsetMax = new Vector2(-2f, -2f); warningText = CreateUIText(((Component)warningBackground).transform, "WarningText", font); ((TMP_Text)warningText).text = WarningStrings[0]; ((Graphic)warningBackground).color = Blackish_Background; UpdateStaticColors(); hudCanvasObj.SetActive(false); } private void UpdateStaticColors() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)warningBorder != (Object)null) { ((Graphic)warningBorder).color = GetWarningColor(0); } if ((Object)(object)warningText != (Object)null) { ((Graphic)warningText).color = GetWarningColor(1); } } private Image CreateUIBox(Transform parent, string name, float width, float height, float yOffset) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(parent, false); Image result = val.AddComponent<Image>(); RectTransform component = val.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(width, height); component.anchorMin = new Vector2(0.5f, 0f); component.anchorMax = new Vector2(0.5f, 0f); component.pivot = new Vector2(0.5f, 0f); component.anchoredPosition = new Vector2(0f, yOffset); return result; } private TextMeshProUGUI CreateUIText(Transform parent, string name, TMP_FontAsset font) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_004d: 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_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name); val.transform.SetParent(parent, false); TextMeshProUGUI val2 = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val2).alignment = (TextAlignmentOptions)544; ((TMP_Text)val2).fontSize = 20f; ((TMP_Text)val2).fontStyle = (FontStyles)1; if ((Object)(object)font != (Object)null) { ((TMP_Text)val2).font = font; } RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; component.anchoredPosition = Vector2.zero; return val2; } } } namespace SimpleFreeCam.Patches { [HarmonyPatch(typeof(HUDManager))] internal static class HUDManagerPatch { private static MethodInfo MethodDisableScanElementsCached; [HarmonyPatch("PingScan_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool DisableScanning(HUDManager __instance) { if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Update")] [HarmonyPostfix] [HarmonyPriority(0)] private static void DisableScanHUD(HUDManager __instance) { if (FreeCamClass.isInFreeCam) { if (MethodDisableScanElementsCached == null) { MethodDisableScanElementsCached = typeof(HUDManager).GetMethod("DisableAllScanElements", BindingFlags.Instance | BindingFlags.NonPublic); } MethodDisableScanElementsCached?.Invoke(__instance, null); } } } [HarmonyPatch(typeof(NetworkManager))] internal static class NetworkPatch { [HarmonyPostfix] [HarmonyPatch("SetSingleton")] private static void RegisterPrefab() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("PixelIndieDev_SimpleFreeCam Prefab"); ((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D); Object.DontDestroyOnLoad((Object)(object)val); NetworkObject obj = val.AddComponent<NetworkObject>(); typeof(NetworkObject).GetField("GlobalObjectIdHash", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(obj, GetHash("PixelIndieDev_SimpleFreeCam")); NetworkManager.Singleton.PrefabHandler.AddNetworkPrefab(val); } private static uint GetHash(string value) { return value?.Aggregate(17u, (uint current, char c) => (current * 31) ^ c) ?? 0; } } [HarmonyPatch(typeof(PlayerControllerB))] internal static class PlayerControllerPatch { [CompilerGenerated] private sealed class <InjectMoveInputZero>d__3 : IEnumerable<CodeInstruction>, IEnumerable, IEnumerator<CodeInstruction>, IDisposable, IEnumerator { private int <>1__state; private CodeInstruction <>2__current; private int <>l__initialThreadId; private IEnumerable<CodeInstruction> instructions; public IEnumerable<CodeInstruction> <>3__instructions; private FieldInfo <moveInputVectorField>5__2; private MethodInfo <helperMethod>5__3; private bool <patched>5__4; private IEnumerator<CodeInstruction> <>7__wrap4; private CodeInstruction <instruction>5__6; CodeInstruction IEnumerator<CodeInstruction>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <InjectMoveInputZero>d__3(int <>1__state) { this.<>1__state = <>1__state; <>l__initialThreadId = Environment.CurrentManagedThreadId; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || (uint)(num - 1) <= 2u) { try { } finally { <>m__Finally1(); } } <moveInputVectorField>5__2 = null; <helperMethod>5__3 = null; <>7__wrap4 = null; <instruction>5__6 = null; <>1__state = -2; } private bool MoveNext() { //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <moveInputVectorField>5__2 = AccessTools.Field(typeof(PlayerControllerB), "moveInputVector"); <helperMethod>5__3 = AccessTools.Method(typeof(PlayerControllerPatch), "ZeroMoveInputIfFreecam", (Type[])null, (Type[])null); <patched>5__4 = false; <>7__wrap4 = instructions.GetEnumerator(); <>1__state = -3; break; case 1: <>1__state = -3; if (!<patched>5__4 && <instruction>5__6.opcode == OpCodes.Stfld && (FieldInfo)<instruction>5__6.operand == <moveInputVectorField>5__2) { <>2__current = new CodeInstruction(OpCodes.Ldarg_0, (object)null); <>1__state = 2; return true; } goto IL_014c; case 2: <>1__state = -3; <>2__current = new CodeInstruction(OpCodes.Call, (object)<helperMethod>5__3); <>1__state = 3; return true; case 3: { <>1__state = -3; <patched>5__4 = true; goto IL_014c; } IL_014c: <instruction>5__6 = null; break; } if (<>7__wrap4.MoveNext()) { <instruction>5__6 = <>7__wrap4.Current; <>2__current = <instruction>5__6; <>1__state = 1; return true; } <>m__Finally1(); <>7__wrap4 = null; return false; } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<>7__wrap4 != null) { <>7__wrap4.Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } [DebuggerHidden] IEnumerator<CodeInstruction> IEnumerable<CodeInstruction>.GetEnumerator() { <InjectMoveInputZero>d__3 <InjectMoveInputZero>d__; if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId) { <>1__state = 0; <InjectMoveInputZero>d__ = this; } else { <InjectMoveInputZero>d__ = new <InjectMoveInputZero>d__3(0); } <InjectMoveInputZero>d__.instructions = <>3__instructions; return <InjectMoveInputZero>d__; } [DebuggerHidden] IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable<CodeInstruction>)this).GetEnumerator(); } } private static int originalSensitivity = -1; private static Vector3 compassPositionBeforeUpdate; [HarmonyPatch("Update")] [HarmonyPrefix] [HarmonyPriority(0)] private static void SaveCompassPosition(PlayerControllerB __instance) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) if (((NetworkBehaviour)__instance).IsOwner && (Object)(object)__instance == (Object)(object)StartOfRound.Instance.localPlayerController && FreeCamClass.isInFreeCam) { compassPositionBeforeUpdate = StartOfRound.Instance.freeCinematicCameraTurnCompass.position; } } [IteratorStateMachine(typeof(<InjectMoveInputZero>d__3))] [HarmonyPatch("Update")] [HarmonyTranspiler] [HarmonyPriority(0)] private static IEnumerable<CodeInstruction> InjectMoveInputZero(IEnumerable<CodeInstruction> instructions) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <InjectMoveInputZero>d__3(-2) { <>3__instructions = instructions }; } private static void ZeroMoveInputIfFreecam(PlayerControllerB instance) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (instance.isFreeCamera) { instance.moveInputVector = Vector2.zero; } } [HarmonyPatch("Update")] [HarmonyPostfix] [HarmonyPriority(0)] private static void ApplyFreecamMovement(PlayerControllerB __instance) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0076: 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_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: 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_012d: 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_0165: 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_017b: Unknown result type (might be due to invalid IL or missing references) if (!((NetworkBehaviour)__instance).IsOwner || (Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController || !FreeCamClass.isInFreeCam) { return; } if (__instance.inTerminalMenu || __instance.isTypingChat) { FreeCamClass.DisableFreecam(); return; } FreeCamClass.TickDistanceWarning(); if (FreeCamClass.lockFreeCam) { return; } Transform freeCinematicCameraTurnCompass = StartOfRound.Instance.freeCinematicCameraTurnCompass; freeCinematicCameraTurnCompass.position = compassPositionBeforeUpdate; Vector2 val = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Move", false).ReadValue<Vector2>(); float num = IngamePlayerSettings.Instance.playerInput.actions.FindAction("Sprint", false).ReadValue<float>(); if (!(((Vector2)(ref val)).sqrMagnitude < 0.01f)) { float num2 = FreeCamClass.GetSpeed(); if (num > 0.5f) { num2 *= 2f; } freeCinematicCameraTurnCompass.position += (freeCinematicCameraTurnCompass.right * val.x + freeCinematicCameraTurnCompass.forward * val.y) * num2 * Time.deltaTime; ((Component)StartOfRound.Instance.freeCinematicCamera).transform.position = Vector3.Lerp(((Component)StartOfRound.Instance.freeCinematicCamera).transform.position, freeCinematicCameraTurnCompass.position, 3f * Time.deltaTime); ((Component)StartOfRound.Instance.freeCinematicCamera).transform.rotation = Quaternion.Slerp(((Component)StartOfRound.Instance.freeCinematicCamera).transform.rotation, freeCinematicCameraTurnCompass.rotation, 3f * Time.deltaTime); } } [HarmonyPatch("KillPlayer")] [HarmonyPostfix] [HarmonyPriority(0)] private static void OnPlayerDeath(PlayerControllerB __instance) { if (((NetworkBehaviour)__instance).IsOwner && __instance.isFreeCamera) { FreeCamClass.DisableFreecam(); } } [HarmonyPatch("ScrollMouse_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool InterceptScroll(PlayerControllerB __instance, CallbackContext context) { if (!((NetworkBehaviour)__instance).IsOwner || (Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!((CallbackContext)(ref context)).performed) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } float num = Mathf.Clamp(((CallbackContext)(ref context)).ReadValue<float>(), -1f, 1f); if (num == 0f) { return false; } if (FreeCamClass.shouldChangeFOV) { FreeCamClass.AdjustFOV((num > 0f) ? (-1f) : 1f); } else { FreeCamClass.AdjustSpeed(num); } return false; } [HarmonyPatch("LateUpdate")] [HarmonyPostfix] [HarmonyPriority(0)] private static void FreecamLateUpdatePatch(PlayerControllerB __instance) { //IL_003d: 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 (FreeCamClass.isInFreeCam && !FreeCamClass.lockFreeCam && !((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController)) { Transform freeCinematicCameraTurnCompass = StartOfRound.Instance.freeCinematicCameraTurnCompass; ((Component)StartOfRound.Instance.freeCinematicCamera).transform.rotation = freeCinematicCameraTurnCompass.rotation; ((Component)StartOfRound.Instance.freeCinematicCamera).transform.position = freeCinematicCameraTurnCompass.position; } } [HarmonyPatch("PlayerLookInput")] [HarmonyPrefix] [HarmonyPriority(0)] private static void PlayerLookInputPatch(PlayerControllerB __instance) { if (!((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) && FreeCamClass.isInFreeCam && !FreeCamClass.lockFreeCam) { originalSensitivity = IngamePlayerSettings.Instance.settings.lookSensitivity; IngamePlayerSettings.Instance.settings.lookSensitivity = Mathf.Clamp(Mathf.RoundToInt((float)IngamePlayerSettings.Instance.settings.lookSensitivity * FreeCamClass.GetFOVSensitivityMultiplier()), 1, originalSensitivity); } } [HarmonyPatch("PlayerLookInput")] [HarmonyPostfix] [HarmonyPriority(0)] private static void Postfix(PlayerControllerB __instance) { if (!((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) && FreeCamClass.isInFreeCam && !FreeCamClass.lockFreeCam) { IngamePlayerSettings.Instance.settings.lookSensitivity = originalSensitivity; } } [HarmonyPatch("Crouch_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchCrouch(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Jump_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchJump(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Interact_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchInteract(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ClickHoldInteraction")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool BlockHoldInteract(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ItemSecondaryUse_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchItemSecUSe(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ItemTertiaryUse_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchTertiary(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ActivateItem_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchActivateItemPerf(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ActivateItem_canceled")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchActivateItemCanc(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Discard_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchDiscard(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("ScrollMouse_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchScroll(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("InspectItem_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchInspect(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Emote1_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchEmote1(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("Emote2_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchEmote2(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("UseUtilitySlot_performed")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool PatchUtility(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } [HarmonyPatch("SetHoverTipAndCurrentInteractTrigger")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool BlockHoverTip(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance.localPlayerController) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } if ((Object)(object)__instance.hoveringOverTrigger != (Object)null) { __instance.hoveringOverTrigger.StopInteraction(); __instance.previousHoveringOverTrigger = __instance.hoveringOverTrigger; __instance.hoveringOverTrigger = null; } ((Behaviour)__instance.cursorIcon).enabled = false; ((TMP_Text)__instance.cursorTip).text = ""; return false; } } [HarmonyPatch(typeof(StartOfRound))] internal static class StartOfRoundPatch { [HarmonyPatch("Start")] [HarmonyPostfix] [HarmonyPriority(0)] private static void OnGameEntered(StartOfRound __instance) { ((MonoBehaviour)__instance).StartCoroutine(FreeCamClass.SetupFreecam()); } [HarmonyPatch("ChangeLevel")] [HarmonyPostfix] [HarmonyPriority(0)] private static void OnChangeLevel(StartOfRound __instance) { FreeCamClass.isInMenu = false; FreeCamClass.ResetFreeCam(); } [HarmonyPatch("OnLocalDisconnect")] [HarmonyPostfix] [HarmonyPriority(0)] private static void OnDisconnect(StartOfRound __instance) { FreeCamClass.isInMenu = true; FreeCamClass.DisableFreecam(); } } [HarmonyPatch(typeof(VehicleController))] internal static class VehicleControllerPatch { [HarmonyPatch("GetVehicleInput")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool BlockVehicleInput(VehicleController __instance) { //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) if (!__instance.localPlayerInControl) { return true; } if (!FreeCamClass.isInFreeCam) { return true; } if (!FreeCamClass.lockFreeCam) { __instance.moveInputVector = Vector2.zero; __instance.drivePedalPressed = false; __instance.brakePedalPressed = false; return false; } return true; } [HarmonyPatch("DoTurboBoost")] [HarmonyPrefix] [HarmonyPriority(0)] private static bool BlockTurboBoost(VehicleController __instance) { if (!__instance.localPlayerInControl) { return true; } if (!FreeCamClass.isInFreeCam || FreeCamClass.lockFreeCam) { return true; } return false; } } } namespace SimpleFreeCam.Input { public class SimpleFreeCamInputs : LcInputActions { [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamMovementKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamTeleportToPlayerKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamFOVModifierKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamResetFOVKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction PixelIndieDev_FreeCamHideUI { get; set; } } }