Decompiled source of Camera Mod v2.0.2

Mods/CameraMod.dll

Decompiled 7 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using CameraMod;
using HarmonyLib;
using Il2Cpp;
using Il2CppActiveRagdoll;
using Il2CppHurricaneVR.Framework.ControllerInput;
using Il2CppHurricaneVR.Framework.Core;
using Il2CppHurricaneVR.Framework.Core.Grabbers;
using Il2CppHurricaneVR.Framework.Core.HandPoser;
using Il2CppHurricaneVR.Framework.Core.Sockets;
using Il2CppHurricaneVR.Framework.Shared;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections;
using Il2CppSystem.Collections.Generic;
using Il2CppTMPro;
using MelonLoader;
using Microsoft.CodeAnalysis;
using NeckBreakingMod;
using UnityEngine;
using UnityEngine.Rendering.Universal;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(CameraClass), "Camera Mod", "2.0.2", "BekoniX", null)]
[assembly: MelonGame("Kubunautilus", "BrutalistickVR")]
[assembly: AssemblyTitle("CameraMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("cameramod")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("8c5cf839-fb45-4c19-b329-39d7307605a8")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[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 CameraMod
{
	public class CameraSettings
	{
		public float CamPos = 1f;

		public float CamRot = 0.1f;

		public float DronePos = 0.05f;

		public float FOV = 110f;

		public static void SaveSettings(CameraSettings settings)
		{
			string path = "Mods/CameraMod/settings.txt";
			Directory.CreateDirectory(Path.GetDirectoryName(path));
			List<string> contents = new List<string>
			{
				$"CameraPositionSmoothing (Smaller = more smoothing)={settings.CamPos}",
				$"CameraRotationSmoothing (Smaller = more smoothing)={settings.CamRot}",
				$"DronePositionSmoothing (Smaller = more smoothing)={settings.DronePos}",
				$"Camera FOV (110 by default)={settings.FOV}"
			};
			File.WriteAllLines(path, contents);
		}

		public static CameraSettings LoadSettings()
		{
			string path = "Mods/CameraMod/settings.txt";
			CameraSettings cameraSettings = new CameraSettings();
			if (!File.Exists(path))
			{
				Directory.CreateDirectory(Path.GetDirectoryName(path));
				List<string> contents = new List<string>
				{
					$"CameraPositionSmoothing (Smaller = more smoothing)={cameraSettings.CamPos}",
					$"CameraRotationSmoothing (Smaller = more smoothing)={cameraSettings.CamRot}",
					$"DronePositionSmoothing (Smaller = more smoothing)={cameraSettings.DronePos}",
					$"Camera FOV (110 by default)={cameraSettings.FOV}"
				};
				File.WriteAllLines(path, contents);
				return cameraSettings;
			}
			string[] array = File.ReadAllLines(path);
			foreach (string text in array)
			{
				string[] array2 = text.Split('=');
				if (array2.Length == 2)
				{
					string text2 = array2[0].Trim();
					string s = array2[1].Trim();
					switch (text2)
					{
					case "CameraPositionSmoothing (Smaller = more smoothing)":
						cameraSettings.CamPos = float.Parse(s);
						break;
					case "CameraRotationSmoothing (Smaller = more smoothing)":
						cameraSettings.CamRot = float.Parse(s);
						break;
					case "DronePositionSmoothing (Smaller = more smoothing":
						cameraSettings.DronePos = float.Parse(s);
						break;
					case "Camera FOV (110 by default)":
						cameraSettings.FOV = float.Parse(s);
						break;
					}
				}
			}
			return cameraSettings;
		}
	}
}
namespace NeckBreakingMod
{
	public class CameraClass : MelonMod
	{
		[HarmonyPatch(typeof(HVRHandGrabber), "OnGrabbed")]
		public static class PatchGrab
		{
			public static void Postfix(HVRHandGrabber __instance)
			{
				if (!(Time.time - sceneLoadTime < 1f))
				{
					GameObject gameObject = ((Component)((HVRGrabberBase)__instance).HeldObject).gameObject;
					if (Object.op_Implicit((Object)(object)gameObject.gameObject.transform.Find("CameraModel")))
					{
						HoldingCamCoroutine = MelonCoroutines.Start(HoldingCam(((Component)((HVRGrabberBase)__instance).HeldObject).gameObject));
					}
				}
			}
		}

		[HarmonyPatch(typeof(HVRHandGrabber), "OnReleased")]
		public static class PatchRelease
		{
			public static void Prefix(HVRHandGrabber __instance)
			{
				//IL_0059: 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_0069: 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)
				if (Time.time - sceneLoadTime < 1f)
				{
					return;
				}
				GameObject gameObject = ((Component)((HVRGrabberBase)__instance).HeldObject).gameObject;
				if (Object.op_Implicit((Object)(object)gameObject.gameObject.transform.Find("CameraModel")))
				{
					MelonCoroutines.Stop(HoldingCamCoroutine);
					Vector3 val = UpperChest.transform.position - ((Component)__instance).transform.position;
					if (((Vector3)(ref val)).sqrMagnitude < 0.04f)
					{
						MelonCoroutines.Start(HideCamera(gameObject.transform));
					}
				}
			}
		}

		private static EnemyWaveSpawner waveSpawner;

		private static List<StickHealth> HubHealthScripts = new List<StickHealth>();

		private static ModLoaderMelee MeleeModLoader;

		public static bool correctScene = false;

		private static bool HubScene = false;

		public static float backAmount = 1.5f;

		public static float upAmount = 0.65f;

		public static float droneSmoothing = 0.05f;

		public static float cameraFOV = 110f;

		public static AssetBundle droneBundle;

		public static GameObject DroneObject;

		private AssetBundle cameraBundle;

		private GameObject CameraObject;

		private bool CameraLoaded = false;

		private bool ModLoaderLoaded = false;

		private static TextMeshPro ModeText;

		public static CameraSettings camSettings;

		public static GameObject PlayerChar;

		public static GameObject HeadPivot;

		public static GameObject playerHead;

		public static GameObject EyeballR;

		public static GameObject EyeballL;

		public static GameObject playerNeck;

		private static GameObject UpperChest;

		private Transform LeftHand;

		private Transform RightHand;

		public static string CameraMode;

		public static GameObject displayCam;

		public static GameObject CameraTarget;

		public static float lastModeSwitch;

		public static float positionDamping = 1f;

		public static float rotationDamping = 0.1f;

		public static bool smoothCamera;

		public static GameObject specCam;

		public static GameObject pcCam;

		public static float sceneLoadTime;

		public static object HoldingCamCoroutine;

		public static HVRPlayerInputs playerInputs;

		public static void SetImmediateChildrenLayer(GameObject obj, int newLayer)
		{
			if (!((Object)(object)obj == (Object)null))
			{
				int childCount = obj.transform.childCount;
				for (int i = 0; i < childCount; i++)
				{
					Transform child = obj.transform.GetChild(i);
					((Component)child).gameObject.layer = newLayer;
				}
			}
		}

		public override void OnInitializeMelon()
		{
			camSettings = CameraSettings.LoadSettings();
			positionDamping = camSettings.CamPos;
			rotationDamping = camSettings.CamRot;
			droneSmoothing = camSettings.DronePos;
			cameraFOV = camSettings.FOV;
		}

		public override void OnSceneWasLoaded(int buildIndex, string sceneName)
		{
			waveSpawner = null;
			pcCam = null;
			UpperChest = null;
			playerHead = null;
			playerInputs = null;
			playerNeck = null;
			EyeballR = null;
			EyeballL = null;
			DroneObject = null;
			if (sceneName != "MainMenuScene")
			{
				correctScene = true;
				sceneLoadTime = Time.time;
				lastModeSwitch = Time.time;
				GameObject[] array = Il2CppArrayBase<GameObject>.op_Implicit(Object.FindObjectsOfType<GameObject>());
				GameObject[] array2 = array;
				foreach (GameObject val in array2)
				{
					if (!ModLoaderLoaded && (Object)(object)val != (Object)null && ((Object)val).name == "ModLoader")
					{
						ModLoaderLoaded = true;
						MeleeModLoader = val.GetComponent<ModLoaderMelee>();
					}
				}
			}
			if (sceneName == "MainHub")
			{
				HubScene = true;
				GameObject val2 = GameObject.Find("ShopStands");
				HubHealthScripts.Clear();
				HubHealthScripts.Add(((Component)val2.transform.Find("FarmerShopStand/FarmerDummy/GameObject/Physical")).GetComponent<StickHealth>());
				HubHealthScripts.Add(((Component)val2.transform.Find("PriestShopStand/PriestDummy/GameObject/Physical")).GetComponent<StickHealth>());
				HubHealthScripts.Add(((Component)val2.transform.Find("TommyShopStand/TracksuitDummy/GameObject/Physical")).GetComponent<StickHealth>());
				HubHealthScripts.Add(((Component)val2.transform.Find("HatterShopStand/HatterDummy/GameObject/Physical")).GetComponent<StickHealth>());
				HubHealthScripts.Add(((Component)val2.transform.Find("ScientistShopStand/HatterDummy/GameObject/Physical")).GetComponent<StickHealth>());
			}
			else
			{
				HubScene = false;
			}
		}

		private static AssetBundle LoadBundle(string resourcePath)
		{
			using Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath);
			if (stream == null)
			{
				MelonLogger.Error("Bundle not found: " + resourcePath);
				return null;
			}
			byte[] array = new byte[stream.Length];
			stream.Read(array, 0, array.Length);
			return AssetBundle.LoadFromMemory(Il2CppStructArray<byte>.op_Implicit(array));
		}

		private static Transform GetRandomEnemyHead()
		{
			if (!HubScene)
			{
				if ((Object)(object)waveSpawner != (Object)null && waveSpawner.stickHealthScripts.Count > 0)
				{
					int num = Random.Range(0, waveSpawner.stickHealthScripts.Count);
					return ((Component)waveSpawner.stickHealthScripts[num]).transform.Find("Body/Head");
				}
			}
			else if (HubHealthScripts != null && HubHealthScripts.Count > 0)
			{
				int num2 = Random.Range(0, HubHealthScripts.Count);
				Transform val = null;
				if (!(HubHealthScripts[num2].GetCurrentHealth() > 0f))
				{
					for (int i = 0; i < 10; i++)
					{
						if (HubHealthScripts.Count > 0)
						{
							int num3 = Random.Range(0, HubHealthScripts.Count);
							if (!(HubHealthScripts[num3].GetCurrentHealth() > 0f))
							{
								HubHealthScripts.Remove(HubHealthScripts[num3]);
							}
							else
							{
								val = ((Component)HubHealthScripts[num3]).transform.Find("Body/Head");
							}
							continue;
						}
						return null;
					}
				}
				else
				{
					val = ((Component)HubHealthScripts[num2]).transform.Find("Body/Head");
				}
				if ((Object)(object)val != (Object)null)
				{
					return val;
				}
			}
			return null;
		}

		public override void OnFixedUpdate()
		{
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Expected O, but got Unknown
			//IL_026f: Unknown result type (might be due to invalid IL or missing references)
			//IL_028f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ada: Unknown result type (might be due to invalid IL or missing references)
			//IL_0ae5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aea: Unknown result type (might be due to invalid IL or missing references)
			//IL_0aef: Unknown result type (might be due to invalid IL or missing references)
			//IL_0839: Unknown result type (might be due to invalid IL or missing references)
			//IL_083e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0854: Unknown result type (might be due to invalid IL or missing references)
			//IL_085b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0860: Unknown result type (might be due to invalid IL or missing references)
			//IL_086a: Unknown result type (might be due to invalid IL or missing references)
			//IL_086f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0874: Unknown result type (might be due to invalid IL or missing references)
			//IL_0880: Unknown result type (might be due to invalid IL or missing references)
			//IL_0885: Unknown result type (might be due to invalid IL or missing references)
			//IL_0887: Unknown result type (might be due to invalid IL or missing references)
			//IL_088c: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_08a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_08d7: Unknown result type (might be due to invalid IL or missing references)
			//IL_08ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_08fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0900: Unknown result type (might be due to invalid IL or missing references)
			//IL_0905: Unknown result type (might be due to invalid IL or missing references)
			//IL_0907: Unknown result type (might be due to invalid IL or missing references)
			//IL_0909: Unknown result type (might be due to invalid IL or missing references)
			//IL_090e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0924: Unknown result type (might be due to invalid IL or missing references)
			//IL_0929: Unknown result type (might be due to invalid IL or missing references)
			//IL_0930: Unknown result type (might be due to invalid IL or missing references)
			//IL_0945: Unknown result type (might be due to invalid IL or missing references)
			//IL_094a: Unknown result type (might be due to invalid IL or missing references)
			//IL_095b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0968: Unknown result type (might be due to invalid IL or missing references)
			//IL_096f: Unknown result type (might be due to invalid IL or missing references)
			//IL_098e: Unknown result type (might be due to invalid IL or missing references)
			//IL_09a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_09b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_09be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a43: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a5d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a77: Unknown result type (might be due to invalid IL or missing references)
			//IL_0a91: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c0a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c15: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c1a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c1f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0b4d: Unknown result type (might be due to invalid IL or missing references)
			//IL_070e: Unknown result type (might be due to invalid IL or missing references)
			//IL_071d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0727: Unknown result type (might be due to invalid IL or missing references)
			//IL_0746: Unknown result type (might be due to invalid IL or missing references)
			//IL_0755: Unknown result type (might be due to invalid IL or missing references)
			//IL_075f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0c7d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0bc7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0798: Unknown result type (might be due to invalid IL or missing references)
			//IL_07a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_07b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_07c0: Unknown result type (might be due to invalid IL or missing references)
			//IL_07c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_07cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_07ee: Unknown result type (might be due to invalid IL or missing references)
			//IL_07fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0807: Unknown result type (might be due to invalid IL or missing references)
			//IL_0cf7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0654: Unknown result type (might be due to invalid IL or missing references)
			//IL_0678: Unknown result type (might be due to invalid IL or missing references)
			//IL_0535: Unknown result type (might be due to invalid IL or missing references)
			if (Time.time - sceneLoadTime < 1f)
			{
				return;
			}
			if ((Object)(object)pcCam == (Object)null && correctScene)
			{
				GameObject[] array = Il2CppArrayBase<GameObject>.op_Implicit(Object.FindObjectsOfType<GameObject>());
				GameObject[] array2 = array;
				foreach (GameObject val in array2)
				{
					if (((Object)(object)val != (Object)null && ((Object)val).name == "Hexa4Rig26.10.23") || ((Object)val).name == "Hexa4Rig26.10.23(Clone)")
					{
						PlayerChar = val;
						pcCam = ((Component)val.transform.Find("HexaBody/PlayerHexaPelvis/CameraRig/FloorOffset/Scaler/Camera")).gameObject;
						UpperChest = ((Component)val.transform.Find("HexaBody/PlayerHexaPelvis/PhysicalUpperbody/Physical/Body/PlayerPelvis/MiddleChestPoint/MiddleChest/UpperChestPoint/PlayerUpperChest")).gameObject;
						playerHead = ((Component)val.transform.Find("HexaBody/PlayerHexaPelvis/PhysicalUpperbody/Physical/Body/Head")).gameObject;
						LeftHand = val.transform.Find("Physics LeftHand");
						RightHand = val.transform.Find("Physics RightHand");
						EyeballL = ((Component)playerHead.transform.Find("Eyeball_L")).gameObject;
						EyeballR = ((Component)playerHead.transform.Find("Eyeball_R")).gameObject;
						((Component)pcCam.transform.Find("DamageOverlay")).gameObject.layer = 16;
					}
					if (((Object)(object)val != (Object)null && ((Object)val).name == "WaveSpawnButton (1)") || ((Object)val).name == "WaveSpawnButton(Clone)")
					{
						waveSpawner = ((Component)val.transform.GetChild(0)).GetComponent<EnemyWaveSpawner>();
					}
				}
				GameObject val2 = new GameObject("SpectatorCamera");
				UniversalAdditionalCameraData val3 = val2.AddComponent<UniversalAdditionalCameraData>();
				val3.allowXRRendering = false;
				val2.AddComponent<Camera>();
				val2.transform.SetParent((Transform)null, true);
				Camera component = val2.GetComponent<Camera>();
				val2.tag = "Untagged";
				component.stereoTargetEye = (StereoTargetEyeMask)0;
				component.targetDisplay = 0;
				val3.renderPostProcessing = true;
				pcCam.SetActive(true);
				component.fieldOfView = cameraFOV;
				component.nearClipPlane = 0.01f;
				val2.transform.position = pcCam.transform.position;
				val2.transform.localPosition = new Vector3(0f, 0f, 0f);
				pcCam.GetComponent<Camera>().cullingMask = -32769;
				component.cullingMask = -65537;
				component.cullingMask &= -16385;
				component.cullingMask &= -32769;
				playerInputs = PlayerChar.GetComponent<HVRPlayerInputs>();
				specCam = val2;
				smoothCamera = true;
				CameraTarget = pcCam;
				CameraMode = "FirstPerson";
			}
			if (correctScene && ((Object)(object)DroneObject == (Object)null || (Object)(object)CameraObject == (Object)null))
			{
				if ((Object)(object)droneBundle == (Object)null)
				{
					droneBundle = LoadBundle("CameraMod.Resources.bekdrone");
					cameraBundle = LoadBundle("CameraMod.Resources.bekcamera");
				}
				if ((Object)(object)droneBundle != (Object)null && (Object)(object)cameraBundle != (Object)null)
				{
					Il2CppArrayBase<GameObject> val4 = droneBundle.LoadAllAssets<GameObject>();
					if (!CameraLoaded)
					{
						CameraLoaded = true;
						Il2CppArrayBase<GameObject> val5 = cameraBundle.LoadAllAssets<GameObject>();
						GameObject val6 = null;
						foreach (GameObject item in val5)
						{
							if (((Object)item).name == "Camera" && (Object)(object)MeleeModLoader != (Object)null)
							{
								val6 = Object.Instantiate<GameObject>(item, MeleeModLoader.instantiatedPrefabParent.transform);
							}
						}
						MeleeWeaponWrapper component2 = val6.GetComponent<MeleeWeaponWrapper>();
						GameObject val7 = MeleeModLoader.CreateMeleePrefab(val6, component2.meleeWeaponSO, component2.collidersForDetectingGrab, component2.stabbingColliders, component2);
					}
					IEnumerator enumerator2 = MeleeModLoader.loadedUnsocketedModsParent.transform.GetEnumerator();
					try
					{
						while (enumerator2.MoveNext())
						{
							Object current2 = enumerator2.Current;
							if ((Object)(object)((Il2CppObjectBase)current2).TryCast<Transform>() != (Object)null && current2 != null && (Object)(object)((Component)((Il2CppObjectBase)current2).Cast<Transform>()).GetComponent<MeleeWeaponWrapper>() != (Object)null && ((Component)((Il2CppObjectBase)current2).Cast<Transform>()).GetComponent<MeleeWeaponWrapper>().meleeWeaponSO.weaponName == "Camerabek")
							{
								CameraObject = Object.Instantiate<GameObject>(((Component)((Il2CppObjectBase)current2).Cast<Transform>()).gameObject, (Transform)null);
								CameraObject.transform.position = new Vector3(0f, -100f, 0f);
								ModeText = ((Component)CameraObject.transform.Find("CameraModel/ModeText")).GetComponent<TextMeshPro>();
								((TMP_Text)ModeText).text = "Mode: FP Smooth";
								playerHead.layer = 16;
								EyeballL.layer = 16;
								EyeballR.layer = 16;
								((Component)CameraObject.transform.Find("CameraModel/Screen/CameraPos/hmdCam")).gameObject.SetActive(true);
								Object.Destroy((Object)(object)CameraObject.GetComponent<HVRTagSocketable>());
								ConvertURPMatToPaintCel.ConvertToPaintCel(((Renderer)((Component)CameraObject.transform.GetChild(2)).GetComponent<MeshRenderer>()).material);
							}
						}
					}
					finally
					{
						if (enumerator2 is IDisposable disposable)
						{
							disposable.Dispose();
						}
					}
					if (val4 != null && val4.Length > 0)
					{
						DroneObject = Object.Instantiate<GameObject>(val4[1]);
						DroneObject.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f);
						DroneObject.transform.position = new Vector3(0f, -10f, 0f);
						SetImmediateChildrenLayer(((Component)DroneObject.transform.Find("DroneModel")).gameObject, 16);
					}
				}
			}
			if (smoothCamera)
			{
				if (CameraMode != "DroneCam")
				{
					if (CameraMode != "BodyCam" && CameraMode != "Enemy")
					{
						specCam.transform.position = Vector3.Lerp(specCam.transform.position, CameraTarget.transform.position, positionDamping);
						specCam.transform.rotation = Quaternion.Lerp(specCam.transform.rotation, CameraTarget.transform.rotation, rotationDamping);
					}
					if (CameraMode == "Enemy")
					{
						specCam.transform.position = Vector3.Lerp(specCam.transform.position, CameraTarget.transform.position + CameraTarget.transform.forward * 0.15f, 1.5f);
						specCam.transform.rotation = Quaternion.Lerp(specCam.transform.rotation, CameraTarget.transform.rotation, 0.1f);
					}
				}
				else if ((Object)(object)DroneObject != (Object)null)
				{
					Vector3 forward = DroneObject.transform.forward;
					forward.y = 0f;
					((Vector3)(ref forward)).Normalize();
					Vector3 val8 = forward * backAmount + Vector3.up * upAmount;
					Vector3 val9 = CameraTarget.transform.position + val8;
					DroneObject.transform.position = Vector3.Lerp(DroneObject.transform.position, val9, droneSmoothing);
					specCam.transform.position = DroneObject.transform.Find("DroneModel/DCam").position;
					Vector3 val10 = CameraTarget.transform.position - specCam.transform.position;
					Quaternion val11 = Quaternion.LookRotation(val10);
					specCam.transform.rotation = Quaternion.Lerp(specCam.transform.rotation, val11, rotationDamping);
					Vector3 eulerAngles = specCam.transform.eulerAngles;
					DroneObject.transform.rotation = Quaternion.Euler(0f, eulerAngles.y + 180f, eulerAngles.z);
					DroneObject.transform.Find("DroneModel/DCam").rotation = Quaternion.Euler(0f - eulerAngles.x, DroneObject.transform.eulerAngles.y, DroneObject.transform.eulerAngles.z);
					float num = 15000f;
					GameObject gameObject = ((Component)DroneObject.transform.Find("DroneModel/RightFrontPr")).gameObject;
					GameObject gameObject2 = ((Component)DroneObject.transform.Find("DroneModel/LeftFrontPr")).gameObject;
					GameObject gameObject3 = ((Component)DroneObject.transform.Find("DroneModel/LeftBackPr")).gameObject;
					GameObject gameObject4 = ((Component)DroneObject.transform.Find("DroneModel/RightBackPr")).gameObject;
					gameObject.transform.Rotate(Vector3.up, num * Time.deltaTime);
					gameObject2.transform.Rotate(Vector3.up, num * Time.deltaTime);
					gameObject3.transform.Rotate(Vector3.up, num * Time.deltaTime);
					gameObject4.transform.Rotate(Vector3.up, num * Time.deltaTime);
				}
			}
			if (!((Object)(object)playerInputs != (Object)null))
			{
				return;
			}
			Vector3 val12;
			if (playerInputs.IsLeftGrabActivated)
			{
				val12 = UpperChest.transform.position - LeftHand.position;
				if (((Vector3)(ref val12)).sqrMagnitude < 0.035f)
				{
					if ((Object)(object)((HVRGrabberBase)((Component)LeftHand).GetComponent<HVRHandGrabber>()).HeldObject == (Object)null)
					{
						((HVRGrabberBase)((Component)LeftHand).GetComponent<HVRHandGrabber>()).ForceRelease();
						CameraObject.transform.position = ((Component)LeftHand).transform.position;
						MelonCoroutines.Start(SummonCam(((Component)LeftHand).gameObject));
					}
					else if (!(((Object)((Component)((HVRGrabberBase)((Component)LeftHand).GetComponent<HVRHandGrabber>()).HeldObject).gameObject).name == "WristCannonMag(Clone)"))
					{
						((HVRGrabberBase)((Component)LeftHand).GetComponent<HVRHandGrabber>()).ForceRelease();
						CameraObject.transform.position = ((Component)LeftHand).transform.position;
						MelonCoroutines.Start(SummonCam(((Component)LeftHand).gameObject));
					}
				}
			}
			if (!playerInputs.IsRightGrabActivated)
			{
				return;
			}
			val12 = UpperChest.transform.position - RightHand.position;
			if (((Vector3)(ref val12)).sqrMagnitude < 0.035f)
			{
				if ((Object)(object)((HVRGrabberBase)((Component)RightHand).GetComponent<HVRHandGrabber>()).HeldObject == (Object)null)
				{
					((HVRGrabberBase)((Component)RightHand).GetComponent<HVRHandGrabber>()).ForceRelease();
					CameraObject.transform.position = ((Component)RightHand).transform.position;
					MelonCoroutines.Start(SummonCam(((Component)RightHand).gameObject));
				}
				else if (!(((Object)((Component)((HVRGrabberBase)((Component)RightHand).GetComponent<HVRHandGrabber>()).HeldObject).gameObject).name == "WristCannonMag(Clone)"))
				{
					((HVRGrabberBase)((Component)RightHand).GetComponent<HVRHandGrabber>()).ForceRelease();
					CameraObject.transform.position = ((Component)RightHand).transform.position;
					MelonCoroutines.Start(SummonCam(((Component)RightHand).gameObject));
				}
			}
		}

		private IEnumerator SummonCam(GameObject camHand)
		{
			yield return (object)new WaitForSeconds(0.1f);
			HVRPosableGrabPoint grabPoint = ((Component)CameraObject.transform.Find("GrabPoints/GrabPoint")).GetComponent<HVRPosableGrabPoint>();
			camHand.GetComponent<HVRHandGrabber>().Grab(CameraObject.GetComponent<HVRGrabbable>(), (HVRGrabTrigger)0, grabPoint);
		}

		private static IEnumerator EnemyPov(Transform enemyHead)
		{
			StickHealth cachedHealth = ((Component)enemyHead.parent.parent).GetComponent<StickHealth>();
			while (cachedHealth.GetCurrentHealth() > 0f)
			{
				if (CameraMode != "Enemy")
				{
					yield break;
				}
				yield return (object)new WaitForSeconds(1f);
			}
			yield return (object)new WaitForSeconds(5f);
			if (HubScene)
			{
				HubHealthScripts.Remove(cachedHealth);
			}
			Transform randomHead = GetRandomEnemyHead();
			if ((Object)(object)randomHead != (Object)null)
			{
				CameraTarget = ((Component)randomHead).gameObject;
				specCam.transform.position = randomHead.position + randomHead.forward * 0.15f;
				specCam.transform.rotation = randomHead.rotation;
				if (HubScene)
				{
					HubHealthScripts.Remove(cachedHealth);
				}
				MelonCoroutines.Start(EnemyPov(randomHead));
			}
			else
			{
				Camera component = specCam.GetComponent<Camera>();
				component.cullingMask &= -32769;
				playerHead.layer = 16;
				EyeballL.layer = 16;
				EyeballR.layer = 16;
				CameraTarget = pcCam;
				CameraMode = "FirstPerson";
				((TMP_Text)ModeText).text = "Mode: FP Smooth";
				specCam.transform.SetParent((Transform)null, true);
				specCam.transform.position = pcCam.transform.position;
				specCam.transform.localPosition = new Vector3(0f, 0f, 0f);
			}
		}

		public static IEnumerator HoldingCam(GameObject CameraObject)
		{
			HVRGrabbable grabbable = ((Component)CameraObject.transform).GetComponent<HVRGrabbable>();
			while (true)
			{
				if ((Object)(object)grabbable != (Object)null && ((grabbable.IsRightHandGrabbed && playerInputs.IsRightTriggerHoldActive) || (grabbable.IsLeftHandGrabbed && playerInputs.IsLeftTriggerHoldActive)) && Time.time - lastModeSwitch > 1f)
				{
					lastModeSwitch = Time.time;
					if (CameraMode == "FirstPerson")
					{
						Camera component = specCam.GetComponent<Camera>();
						component.cullingMask |= 0x8000;
						CameraTarget = UpperChest;
						CameraMode = "BodyCam";
						((TMP_Text)ModeText).text = "Mode: Bodycam";
						specCam.transform.SetParent(UpperChest.transform, false);
						specCam.transform.position = UpperChest.transform.position;
						specCam.transform.rotation = UpperChest.transform.rotation;
						specCam.transform.localPosition = new Vector3(0f, 0.11f, 0.1f);
						continue;
					}
					if (CameraMode == "BodyCam")
					{
						CameraTarget = ((Component)CameraObject.transform.Find("CameraModel/Screen/CameraPos")).gameObject;
						CameraMode = "SelfieCam";
						((TMP_Text)ModeText).text = "Mode: Selfie";
						playerHead.layer = 15;
						EyeballL.layer = 15;
						EyeballR.layer = 15;
						specCam.transform.SetParent((Transform)null, true);
						specCam.transform.position = CameraObject.transform.position;
						specCam.transform.localPosition = new Vector3(0f, 0f, 0f);
						continue;
					}
					if (CameraMode == "SelfieCam")
					{
						playerHead.layer = 15;
						EyeballL.layer = 15;
						EyeballR.layer = 15;
						CameraTarget = pcCam;
						CameraMode = "DroneCam";
						((TMP_Text)ModeText).text = "Mode: Drone";
						specCam.transform.SetParent((Transform)null, true);
						continue;
					}
					if (CameraMode == "DroneCam")
					{
						playerHead.layer = 15;
						EyeballL.layer = 15;
						EyeballR.layer = 15;
						CameraMode = "Enemy";
						((TMP_Text)ModeText).text = "Mode: NPC Pov";
						Transform randomHead = GetRandomEnemyHead();
						if ((Object)(object)randomHead != (Object)null)
						{
							CameraTarget = ((Component)randomHead).gameObject;
							specCam.transform.position = randomHead.position + randomHead.forward * 0.2f;
							specCam.transform.rotation = randomHead.rotation;
							MelonCoroutines.Start(EnemyPov(randomHead));
						}
						DroneObject.transform.position = new Vector3(0f, -10f, 0f);
						continue;
					}
					if (CameraMode == "Enemy")
					{
						Camera component2 = specCam.GetComponent<Camera>();
						component2.cullingMask &= -32769;
						playerHead.layer = 16;
						EyeballL.layer = 16;
						EyeballR.layer = 16;
						CameraTarget = pcCam;
						CameraMode = "FirstPerson";
						((TMP_Text)ModeText).text = "Mode: FP Smooth";
						specCam.transform.SetParent((Transform)null, true);
						specCam.transform.position = pcCam.transform.position;
						specCam.transform.localPosition = new Vector3(0f, 0f, 0f);
						continue;
					}
				}
				yield return (object)new WaitForSeconds(0.1f);
			}
		}

		private static IEnumerator HideCamera(Transform CameraTransform)
		{
			yield return (object)new WaitForEndOfFrame();
			CameraTransform.position = new Vector3(0f, -100f, 0f);
		}
	}
}