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