Decompiled source of FreeCam v1.0.0

BGfreecam.dll

Decompiled 3 weeks ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using UnityEngine;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("BGfreecam")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BGfreecam")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("3494672b-32e3-4041-9dcd-ed1611acf500")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace BGfreecam;

[BepInPlugin("com.yourname.bgfreecam", "BGfreecam", "1.0.0")]
public class FreeCamPlugin : BaseUnityPlugin
{
	private struct RendererState
	{
		public Renderer renderer;

		public bool originalEnabled;

		public ShadowCastingMode originalShadowMode;
	}

	private bool isFreeCamActive = false;

	private Camera actualMainCamera;

	private GameObject freeCamObject;

	private Camera freeCam;

	public float flySpeed = 12f;

	public float lookSensitivity = 3f;

	private GameObject localPlayerRoot;

	private List<MonoBehaviour> disabledScripts = new List<MonoBehaviour>();

	private Rigidbody playerRigidbody;

	private CharacterController playerCharacterController;

	private bool playerRbWasKinematic = false;

	private List<RendererState> alteredRenderers = new List<RendererState>();

	private void Awake()
	{
		((BaseUnityPlugin)this).Logger.LogInfo((object)"BGfreecam: Final Polish Edition Successfully Loaded!");
	}

	private void Update()
	{
		//IL_006f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Expected O, but got Unknown
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d3: Unknown result type (might be due to invalid IL or missing references)
		//IL_0584: Unknown result type (might be due to invalid IL or missing references)
		//IL_059d: Unknown result type (might be due to invalid IL or missing references)
		//IL_05ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_05b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_05bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_05cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_05d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_05e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_05f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_05f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_05fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_060b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0618: Unknown result type (might be due to invalid IL or missing references)
		//IL_061d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0622: Unknown result type (might be due to invalid IL or missing references)
		//IL_0631: Unknown result type (might be due to invalid IL or missing references)
		//IL_063e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0643: Unknown result type (might be due to invalid IL or missing references)
		//IL_0648: Unknown result type (might be due to invalid IL or missing references)
		//IL_0657: Unknown result type (might be due to invalid IL or missing references)
		//IL_0659: Unknown result type (might be due to invalid IL or missing references)
		//IL_065e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0663: Unknown result type (might be due to invalid IL or missing references)
		//IL_068f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0696: Unknown result type (might be due to invalid IL or missing references)
		//IL_06a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_06ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_06b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0675: Unknown result type (might be due to invalid IL or missing references)
		//IL_0677: Unknown result type (might be due to invalid IL or missing references)
		//IL_067c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0681: Unknown result type (might be due to invalid IL or missing references)
		//IL_049a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0344: Unknown result type (might be due to invalid IL or missing references)
		//IL_0349: Unknown result type (might be due to invalid IL or missing references)
		if (Input.GetKeyDown((KeyCode)286))
		{
			isFreeCamActive = !isFreeCamActive;
			if (isFreeCamActive)
			{
				actualMainCamera = Camera.main;
				if ((Object)(object)actualMainCamera == (Object)null)
				{
					((BaseUnityPlugin)this).Logger.LogWarning((object)"BGfreecam: Main camera not found.");
					isFreeCamActive = false;
					return;
				}
				freeCamObject = new GameObject("BG_FreeCam_Object");
				freeCam = freeCamObject.AddComponent<Camera>();
				freeCam.CopyFrom(actualMainCamera);
				freeCamObject.transform.position = ((Component)actualMainCamera).transform.position;
				freeCamObject.transform.rotation = ((Component)actualMainCamera).transform.rotation;
				((Behaviour)actualMainCamera).enabled = false;
				Transform parent = ((Component)actualMainCamera).transform.parent;
				localPlayerRoot = null;
				while ((Object)(object)parent != (Object)null)
				{
					if (((Component)parent).CompareTag("Player") || ((Object)parent).name.ToLower().Contains("gnome") || ((Object)parent).name.ToLower().Contains("player"))
					{
						localPlayerRoot = ((Component)parent).gameObject;
					}
					parent = parent.parent;
				}
				if ((Object)(object)localPlayerRoot != (Object)null)
				{
					playerRigidbody = localPlayerRoot.GetComponentInChildren<Rigidbody>();
					if ((Object)(object)playerRigidbody != (Object)null)
					{
						playerRbWasKinematic = playerRigidbody.isKinematic;
						playerRigidbody.isKinematic = true;
					}
					playerCharacterController = localPlayerRoot.GetComponentInChildren<CharacterController>();
					if ((Object)(object)playerCharacterController != (Object)null)
					{
						((Collider)playerCharacterController).enabled = false;
					}
					MonoBehaviour[] componentsInChildren = localPlayerRoot.GetComponentsInChildren<MonoBehaviour>();
					MonoBehaviour[] array = componentsInChildren;
					foreach (MonoBehaviour val in array)
					{
						if (!((Object)(object)val == (Object)null) && ((Behaviour)val).enabled && !((Object)(object)val == (Object)(object)this))
						{
							string text = ((object)val).GetType().Name.ToLower();
							if (text.Contains("input") || text.Contains("movement") || text.Contains("controller") || text.Contains("motor") || text.Contains("locomotion"))
							{
								((Behaviour)val).enabled = false;
								disabledScripts.Add(val);
							}
						}
					}
					Renderer[] componentsInChildren2 = localPlayerRoot.GetComponentsInChildren<Renderer>(true);
					Renderer[] array2 = componentsInChildren2;
					foreach (Renderer val2 in array2)
					{
						if ((Object)(object)val2 != (Object)null && ((Object)((Component)val2).gameObject).name.ToLower().Contains("head"))
						{
							alteredRenderers.Add(new RendererState
							{
								renderer = val2,
								originalEnabled = val2.enabled,
								originalShadowMode = val2.shadowCastingMode
							});
							val2.enabled = true;
							val2.shadowCastingMode = (ShadowCastingMode)1;
						}
					}
				}
				Cursor.lockState = (CursorLockMode)1;
				Cursor.visible = false;
				((BaseUnityPlugin)this).Logger.LogInfo((object)"BGfreecam: Freecam active.");
			}
			else
			{
				foreach (MonoBehaviour disabledScript in disabledScripts)
				{
					if ((Object)(object)disabledScript != (Object)null)
					{
						((Behaviour)disabledScript).enabled = true;
					}
				}
				disabledScripts.Clear();
				if ((Object)(object)playerRigidbody != (Object)null)
				{
					playerRigidbody.isKinematic = playerRbWasKinematic;
					playerRigidbody = null;
				}
				if ((Object)(object)playerCharacterController != (Object)null)
				{
					((Collider)playerCharacterController).enabled = true;
					playerCharacterController = null;
				}
				foreach (RendererState alteredRenderer in alteredRenderers)
				{
					if ((Object)(object)alteredRenderer.renderer != (Object)null)
					{
						alteredRenderer.renderer.enabled = alteredRenderer.originalEnabled;
						alteredRenderer.renderer.shadowCastingMode = alteredRenderer.originalShadowMode;
					}
				}
				alteredRenderers.Clear();
				localPlayerRoot = null;
				if ((Object)(object)actualMainCamera != (Object)null)
				{
					((Behaviour)actualMainCamera).enabled = true;
				}
				if ((Object)(object)freeCamObject != (Object)null)
				{
					Object.Destroy((Object)(object)freeCamObject);
				}
				Cursor.lockState = (CursorLockMode)1;
				Cursor.visible = false;
				((BaseUnityPlugin)this).Logger.LogInfo((object)"BGfreecam: Freecam disabled. Mouse locked.");
			}
		}
		if (isFreeCamActive && (Object)(object)freeCamObject != (Object)null)
		{
			float num = Input.GetAxis("Mouse X") * lookSensitivity;
			float num2 = Input.GetAxis("Mouse Y") * lookSensitivity;
			freeCamObject.transform.Rotate(Vector3.up, num, (Space)0);
			freeCamObject.transform.Rotate(Vector3.left, num2, (Space)1);
			Vector3 val3 = Vector3.zero;
			if (Input.GetKey((KeyCode)119))
			{
				val3 += freeCamObject.transform.forward;
			}
			if (Input.GetKey((KeyCode)115))
			{
				val3 -= freeCamObject.transform.forward;
			}
			if (Input.GetKey((KeyCode)97))
			{
				val3 -= freeCamObject.transform.right;
			}
			if (Input.GetKey((KeyCode)100))
			{
				val3 += freeCamObject.transform.right;
			}
			if (Input.GetKey((KeyCode)32))
			{
				val3 += Vector3.up;
			}
			if (Input.GetKey((KeyCode)306))
			{
				val3 += Vector3.down;
			}
			Transform transform = freeCamObject.transform;
			transform.position += ((Vector3)(ref val3)).normalized * flySpeed * Time.deltaTime;
		}
	}
}