Decompiled source of XpertsDroneCam v0.2.0

plugins/XpertsDroneCam.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("DroneCam")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("DroneCam")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ea282da8-693d-4cf1-bf7a-8ecac0827eaa")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace DroneCam;

[BepInPlugin("com.oathorse.xdc", "Xpert's Drone Cam", "0.2.0")]
[BepInProcess("valheim.exe")]
public class DroneCamPlugin : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static Func<string, bool> <>9__14_1;

		public static ConsoleEvent <>9__14_0;

		internal void <RegisterConsoleCommands>b__14_0(ConsoleEventArgs args)
		{
			DroneCamCommands.Handle(DroneCamCommands.CollapseQuotedArgs((from s in args.Args.Skip(1)
				where !string.IsNullOrEmpty(s)
				select s).ToArray()));
		}

		internal bool <RegisterConsoleCommands>b__14_1(string s)
		{
			return !string.IsNullOrEmpty(s);
		}
	}

	public const string PluginGUID = "com.oathorse.xdc";

	public const string PluginName = "Xpert's Drone Cam";

	public const string PluginVersion = "0.2.0";

	internal static ManualLogSource Log;

	public static ConfigEntry<float> FlySpeed;

	public static ConfigEntry<float> FlySpeedFast;

	public static ConfigEntry<float> RotationSpeed;

	public static ConfigEntry<float> SmoothTime;

	public static ConfigEntry<float> TeleportDetectionDistance;

	public static ConfigEntry<float> ScrollSensitivity;

	public static ConfigEntry<float> SelectPlayerConeAngle;

	public static ConfigEntry<float> SelectEnemyConeAngle;

	private readonly Harmony _harmony = new Harmony("com.oathorse.xdc");

	private void Awake()
	{
		Log = ((BaseUnityPlugin)this).Logger;
		FlySpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "FlySpeed", 10f, "Normal fly speed (units/sec).");
		FlySpeedFast = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "FlySpeedFast", 40f, "Fast fly speed (units/sec).");
		RotationSpeed = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "RotationSpeed", 90f, "Keyboard rotation speed (degrees/sec).");
		SmoothTime = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "SmoothTime", 0.25f, "Movement smoothing time for free-fly, orbit and security.");
		TeleportDetectionDistance = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "TeleportDetectionDistance", 50f, "Distance delta that triggers portal follow detection.");
		ScrollSensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "ScrollSensitivity", 0.5f, "Mouse wheel sensitivity for distance/radius adjustment.");
		SelectPlayerConeAngle = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "SelectPlayerConeAngle", 5f, "Half-angle of the cone in degrees when selecting a player with Left Click.");
		SelectEnemyConeAngle = ((BaseUnityPlugin)this).Config.Bind<float>("Camera", "SelectEnemyConeAngle", 3f, "Half-angle of the cone in degrees when targeting an enemy with T.");
		RegisterConsoleCommands();
		_harmony.PatchAll();
		Log.LogInfo((object)"Xpert's Drone Cam 0.2.0 loaded. Console: 'dc help'  Chat: '/dc help'");
	}

	private static void RegisterConsoleCommands()
	{
		//IL_0032: 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_0029: Expected O, but got Unknown
		object obj = <>c.<>9__14_0;
		if (obj == null)
		{
			ConsoleEvent val = delegate(ConsoleEventArgs args)
			{
				DroneCamCommands.Handle(DroneCamCommands.CollapseQuotedArgs((from s in args.Args.Skip(1)
					where !string.IsNullOrEmpty(s)
					select s).ToArray()));
			};
			<>c.<>9__14_0 = val;
			obj = (object)val;
		}
		new ConsoleCommand("dc", "Xpert's Drone Cam control. Type 'dc help' for usage.", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
	}

	private void OnDestroy()
	{
		_harmony.UnpatchSelf();
	}
}
public enum StreamProtocol
{
	Spout,
	NDI
}
public enum TargetType
{
	None,
	Player,
	Enemy,
	Position
}
public class DroneCamTarget
{
	public TargetType Type;

	public string Name;

	public Transform Transform;

	public Vector3 WorldPosition;

	public bool IsValid
	{
		get
		{
			if (Type != TargetType.Position)
			{
				if ((Object)(object)Transform != (Object)null && ((Component)Transform).gameObject.activeInHierarchy)
				{
					Character component = ((Component)Transform).GetComponent<Character>();
					return component == null || !component.IsDead();
				}
				return false;
			}
			return true;
		}
	}

	public Vector3 GetPosition()
	{
		//IL_000a: 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)
		if (Type == TargetType.Position)
		{
			return WorldPosition;
		}
		if ((Object)(object)Transform != (Object)null)
		{
			return Transform.position;
		}
		return Vector3.zero;
	}

	public static DroneCamTarget ForEnemy(Character c)
	{
		return new DroneCamTarget
		{
			Type = TargetType.Enemy,
			Name = c.GetHoverName(),
			Transform = ((Component)c).transform
		};
	}

	public static DroneCamTarget ForPosition(Vector3 pos)
	{
		//IL_000d: 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)
		return new DroneCamTarget
		{
			Type = TargetType.Position,
			WorldPosition = pos
		};
	}
}
internal static class Btn
{
	public const string Toggle = "DroneCam_Toggle";

	public const string FreeFlyToggle = "DroneCam_FreeFlyToggle";

	public const string SelectPlayer = "DroneCam_SelectPlayer";

	public const string SelectEnemy = "DroneCam_SelectEnemy";

	public const string Fast = "DroneCam_Fast";

	public const string Forward = "DroneCam_Forward";

	public const string Back = "DroneCam_Back";

	public const string StrafeLeft = "DroneCam_StrafeLeft";

	public const string StrafeRight = "DroneCam_StrafeRight";

	public const string Up = "DroneCam_Up";

	public const string Down = "DroneCam_Down";

	public const string YawLeft = "DroneCam_YawLeft";

	public const string YawRight = "DroneCam_YawRight";

	public const string PitchUp = "DroneCam_PitchUp";

	public const string PitchDown = "DroneCam_PitchDown";

	public const string MouseLook = "DroneCam_MouseLook";

	public const string WheelUp = "DroneCam_WheelUp";

	public const string WheelDown = "DroneCam_WheelDown";

	public const string ModHeight = "DroneCam_ModHeight";

	public const string ModSpeed = "DroneCam_ModSpeed";

	public const string NextPlayer = "DroneCam_NextPlayer";

	public const string PrevPlayer = "DroneCam_PrevPlayer";
}
[HarmonyPatch(typeof(ZInput), "Reset")]
public static class ZInput_Reset_Patch
{
	private static void Postfix(ZInput __instance)
	{
		__instance.AddButton("DroneCam_Toggle", "<Keyboard>/f8", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_FreeFlyToggle", "<Keyboard>/f7", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_SelectPlayer", "<Mouse>/leftButton", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_SelectEnemy", "<Keyboard>/t", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_Fast", "<Keyboard>/leftShift", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_Forward", "<Keyboard>/w", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_Back", "<Keyboard>/s", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_StrafeLeft", "<Keyboard>/a", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_StrafeRight", "<Keyboard>/d", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_Up", "<Keyboard>/e", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_Down", "<Keyboard>/q", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_YawLeft", "<Keyboard>/leftArrow", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_YawRight", "<Keyboard>/rightArrow", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_PitchUp", "<Keyboard>/upArrow", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_PitchDown", "<Keyboard>/downArrow", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_MouseLook", "<Mouse>/rightButton", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_WheelUp", "<Mouse>/scroll/up", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_WheelDown", "<Mouse>/scroll/down", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_ModHeight", "<Keyboard>/leftAlt", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_ModSpeed", "<Keyboard>/leftCtrl", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_NextPlayer", "<Keyboard>/period", false, true, false, 0f, 0f);
		__instance.AddButton("DroneCam_PrevPlayer", "<Keyboard>/comma", false, true, false, 0f, 0f);
	}
}
public enum DroneCamMode
{
	Disabled,
	FreeSetup,
	Follow,
	Orbit,
	Security
}
public class DroneCamController : MonoBehaviour
{
	private DroneCamTarget _anchor;

	private DroneCamTarget _lookTarget;

	private Vector3 _anchorLastPos = Vector3.zero;

	private Vector3 _anchorLastKnownPos = Vector3.zero;

	private Vector3 _anchorLastRelOffset = Vector3.zero;

	private Vector3 _anchorLastInfoPos = Vector3.zero;

	private bool _anchorWaiting;

	private float _focalOffsetY;

	private Vector3 _lastLookPosition = Vector3.zero;

	private Vector3 _lastSafeGroundPosition = Vector3.zero;

	private bool _waitingForTeleport;

	private DroneCamMode _lastTrackingMode;

	private string _lastTrackingTarget;

	private float _lastFollowDistance = 5f;

	private float _lastFollowHeight = 2f;

	private float _lastFollowSmooth = 0.1f;

	private float _lastOrbitRadius = 10f;

	private float _lastOrbitSpeed = 30f;

	private float _lastOrbitHeight = 4f;

	private string _selectCandidateName;

	private float _followDistance = 5f;

	private float _followSmoothTime = 0.1f;

	private Vector3 _followHeightOffset = new Vector3(0f, 2f, 0f);

	private float _orbitRadius = 10f;

	private float _orbitSpeed = 30f;

	private float _orbitHeight = 4f;

	private float _orbitAngle;

	private Vector3 _securityPos;

	private Vector3 _dronePos;

	private Quaternion _droneRot;

	private Vector3 _smoothVelocity = Vector3.zero;

	private Vector3 _smoothVelRef = Vector3.zero;

	private DroneCamMode _modeBeforeSleep;

	private GameObject _fakeAttachPoint;

	private bool _broadcastRealPosition;

	private bool _targetWasSleeping;

	private bool _hudHidden;

	private Camera _streamCamera;

	private RenderTexture _streamTexture;

	private Component _spoutSender;

	private Component _ndiSender;

	private bool _streamActive;

	private int _streamWidth = 1920;

	private int _streamHeight = 1080;

	private StreamProtocol _streamProtocol;

	private GameCamera _gameCamera;

	public static DroneCamController Instance { get; private set; }

	public DroneCamMode Mode { get; private set; }

	public bool WaitingForTeleport => _waitingForTeleport;

	public bool BroadcastRealPosition => _broadcastRealPosition;

	public bool HudHidden => _hudHidden;

	private void Awake()
	{
		Instance = this;
		_gameCamera = ((Component)this).GetComponent<GameCamera>();
	}

	private void Update()
	{
		//IL_0143: Unknown result type (might be due to invalid IL or missing references)
		//IL_0148: Unknown result type (might be due to invalid IL or missing references)
		//IL_0154: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0231: Unknown result type (might be due to invalid IL or missing references)
		//IL_025e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0270: Unknown result type (might be due to invalid IL or missing references)
		//IL_0275: Unknown result type (might be due to invalid IL or missing references)
		//IL_027a: Unknown result type (might be due to invalid IL or missing references)
		//IL_027b: 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_028f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0290: Unknown result type (might be due to invalid IL or missing references)
		if (ZInput.instance == null)
		{
			return;
		}
		if (ZInput.GetButtonDown("DroneCam_Toggle"))
		{
			if (Mode == DroneCamMode.Disabled)
			{
				EnterFreeSetup();
			}
			else
			{
				ExitDroneCam();
			}
			return;
		}
		if (_waitingForTeleport)
		{
			if ((Object)(object)Player.m_localPlayer != (Object)null && (Object)(object)((Character)Player.m_localPlayer).m_nview != (Object)null && ((Character)Player.m_localPlayer).m_nview.IsValid())
			{
				((Character)Player.m_localPlayer).SetVisible(false);
				((Character)Player.m_localPlayer).m_body.position = ((Component)this).transform.position;
			}
			PollTeleportComplete();
			return;
		}
		if (ZInput.GetButtonDown("DroneCam_FreeFlyToggle") && Mode != 0)
		{
			if (Mode == DroneCamMode.FreeSetup)
			{
				if (_lastTrackingMode != 0 && _lastTrackingTarget != null)
				{
					switch (_lastTrackingMode)
					{
					case DroneCamMode.Follow:
						SetFollow(_lastTrackingTarget, _lastFollowDistance, _lastFollowHeight, _lastFollowSmooth);
						break;
					case DroneCamMode.Orbit:
						SetOrbitPlayer(_lastTrackingTarget, _lastOrbitRadius, _lastOrbitSpeed, _lastOrbitHeight);
						break;
					case DroneCamMode.Security:
						SetSecurityPlayer(_lastTrackingTarget);
						break;
					}
				}
				else
				{
					Notify("No previous tracking mode to return to.");
				}
			}
			else
			{
				SaveTrackingState();
				_dronePos = ((Component)this).transform.position;
				_droneRot = ((Component)this).transform.rotation;
				_smoothVelocity = Vector3.zero;
				Mode = DroneCamMode.FreeSetup;
				Notify("Free-fly - press F7 to return to tracking.");
			}
			return;
		}
		switch (Mode)
		{
		case DroneCamMode.FreeSetup:
			UpdateFreeSetup();
			break;
		case DroneCamMode.Follow:
			UpdateFollow();
			break;
		case DroneCamMode.Orbit:
			UpdateOrbit();
			break;
		case DroneCamMode.Security:
			UpdateSecurity();
			break;
		}
		if (Mode != 0)
		{
			HandleScrollWheel();
			HandlePlayerCycle();
			HandleSelectPlayer();
			HandleSelectEnemy();
			PollTargetSleepState();
		}
		if (Mode == DroneCamMode.Disabled || !((Object)(object)Player.m_localPlayer != (Object)null) || !((Object)(object)((Character)Player.m_localPlayer).m_nview != (Object)null) || !((Character)Player.m_localPlayer).m_nview.IsValid())
		{
			return;
		}
		((Character)Player.m_localPlayer).m_body.position = ((Component)this).transform.position;
		((Character)Player.m_localPlayer).SetVisible(false);
		if ((Object)(object)ZNetScene.instance != (Object)null && ZNetScene.instance.IsAreaReady(((Component)this).transform.position))
		{
			Vector3 val = FindGroundPosition(((Component)this).transform.position);
			if (val != ((Component)this).transform.position)
			{
				_lastSafeGroundPosition = val;
			}
		}
	}

	private void LateUpdate()
	{
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Unknown result type (might be due to invalid IL or missing references)
		if (_streamActive && !((Object)(object)_streamCamera == (Object)null) && Mode != 0)
		{
			((Component)_streamCamera).transform.position = ((Component)this).transform.position;
			((Component)_streamCamera).transform.rotation = ((Component)this).transform.rotation;
			GameCamera gameCamera = _gameCamera;
			Camera val = ((gameCamera != null) ? ((Component)gameCamera).GetComponent<Camera>() : null);
			if ((Object)(object)val != (Object)null)
			{
				_streamCamera.fieldOfView = val.fieldOfView;
			}
			_streamCamera.Render();
		}
	}

	private void SaveTrackingState()
	{
		if (Mode == DroneCamMode.Follow || Mode == DroneCamMode.Orbit || Mode == DroneCamMode.Security)
		{
			_lastTrackingMode = Mode;
			_lastTrackingTarget = _anchor?.Name;
			_lastFollowDistance = _followDistance;
			_lastFollowHeight = _followHeightOffset.y;
			_lastFollowSmooth = _followSmoothTime;
			_lastOrbitRadius = _orbitRadius;
			_lastOrbitSpeed = _orbitSpeed;
			_lastOrbitHeight = _orbitHeight;
		}
	}

	public void EnterFreeSetup()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: 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)
		_dronePos = ((Component)this).transform.position;
		_droneRot = ((Component)this).transform.rotation;
		_smoothVelocity = Vector3.zero;
		Mode = DroneCamMode.FreeSetup;
		SetGameCameraEnabled(state: false);
		EnterDroneMode();
		Notify("Free-fly active. WASD/QE move, Shift=fast, RMB/arrows rotate. F8 to exit.");
	}

	public void ExitDroneCam()
	{
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: 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_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		if (_streamActive)
		{
			TeardownStreamCamera();
		}
		_waitingForTeleport = false;
		Mode = DroneCamMode.Disabled;
		SetGameCameraEnabled(state: true);
		if (_hudHidden)
		{
			_hudHidden = false;
			Hud instance = Hud.instance;
			if (instance != null)
			{
				((Component)instance).gameObject.SetActive(true);
			}
		}
		if ((Object)(object)Player.m_localPlayer != (Object)null)
		{
			Vector3 val = ((_lastSafeGroundPosition != Vector3.zero) ? _lastSafeGroundPosition : ((Component)Player.m_localPlayer).transform.position);
			((Character)Player.m_localPlayer).m_body.position = val;
			((Character)Player.m_localPlayer).m_body.velocity = Vector3.zero;
			((Character)Player.m_localPlayer).SetVisible(true);
			ZNet.instance.SetReferencePosition(val);
		}
		Notify("Disabled - normal camera restored.");
	}

	public void ToggleHud()
	{
		_hudHidden = !_hudHidden;
		Hud instance = Hud.instance;
		if (instance != null)
		{
			((Component)instance).gameObject.SetActive(!_hudHidden);
		}
		Notify(_hudHidden ? "HUD hidden." : "HUD visible.");
	}

	private void TravelToPosition(Vector3 targetPos)
	{
		//IL_0018: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: 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_0067: 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_0070: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)Player.m_localPlayer == (Object)null))
		{
			DroneCamPlugin.Log.LogInfo((object)$"[DroneCam] TravelToPosition: {targetPos}");
			if (((Character)Player.m_localPlayer).TeleportTo(targetPos, ((Component)Player.m_localPlayer).transform.rotation, true))
			{
				_waitingForTeleport = true;
				Notify("Teleporting...");
				return;
			}
			DroneCamPlugin.Log.LogInfo((object)"[DroneCam] TeleportTo on cooldown - snapping directly.");
			SnapDroneTo(targetPos);
			_anchorLastRelOffset = targetPos - _anchorLastKnownPos;
			_anchorWaiting = false;
		}
	}

	private void TravelToPlayer(string playerName, Vector3 targetPos)
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008e: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)Player.m_localPlayer == (Object)null))
		{
			DroneCamPlugin.Log.LogInfo((object)$"[DroneCam] TravelToPlayer: '{playerName}' at {targetPos}");
			if (((Character)Player.m_localPlayer).TeleportTo(targetPos, ((Component)Player.m_localPlayer).transform.rotation, true))
			{
				_waitingForTeleport = true;
				Notify("Teleporting to " + playerName + "...");
				return;
			}
			DroneCamPlugin.Log.LogInfo((object)"[DroneCam] TeleportTo on cooldown - snapping directly.");
			Vector3 val = targetPos + _anchorLastRelOffset;
			SnapDroneTo(val);
			_anchorLastKnownPos = targetPos;
			_anchorLastPos = targetPos;
			_anchorLastRelOffset = val - targetPos;
			_anchorWaiting = false;
		}
	}

	private void PollTeleportComplete()
	{
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: 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_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0077: Unknown result type (might be due to invalid IL or missing references)
		//IL_0079: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_017a: Unknown result type (might be due to invalid IL or missing references)
		//IL_017f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: 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_00d9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
		//IL_010e: Unknown result type (might be due to invalid IL or missing references)
		//IL_010b: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_011d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)Player.m_localPlayer == (Object)null || ((Character)Player.m_localPlayer).IsTeleporting())
		{
			return;
		}
		((Character)Player.m_localPlayer).SetVisible(false);
		((Character)Player.m_localPlayer).m_body.position = ((Component)this).transform.position;
		_waitingForTeleport = false;
		DroneCamPlugin.Log.LogInfo((object)"[DroneCam] Teleport complete - resuming tracking.");
		if (_anchor == null)
		{
			return;
		}
		PlayerInfo pi = FindPlayerInfo(_anchor.Name);
		Vector3 playerInfoPosition = GetPlayerInfoPosition(pi);
		Vector3 playerRealtimePosition = GetPlayerRealtimePosition(pi);
		Vector3 val = ((playerRealtimePosition != Vector3.zero) ? playerRealtimePosition : playerInfoPosition);
		if (val != Vector3.zero)
		{
			Vector3 position = ((Component)Player.m_localPlayer).transform.position;
			((Component)this).transform.position = position;
			_dronePos = position;
			_smoothVelocity = Vector3.zero;
			_smoothVelRef = Vector3.zero;
			((Character)Player.m_localPlayer).m_body.position = position;
			_anchorLastKnownPos = val;
			_anchorLastPos = val;
			_anchorLastInfoPos = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : val);
			_anchorLastRelOffset = position - val;
			_anchorWaiting = false;
			Player val2 = FindPlayerByZdo(FindPlayerZdo(pi));
			if ((Object)(object)val2 != (Object)null)
			{
				_anchor.Transform = ((Component)val2).transform;
			}
			Notify("Now tracking " + _anchor.Name + ".");
		}
		else
		{
			_anchorWaiting = false;
			_anchorLastInfoPos = Vector3.zero;
			Notify("Arrived near " + _anchor.Name + " - acquiring target...");
		}
	}

	public void OnPlayerSleep()
	{
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: Expected O, but got Unknown
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		if (Mode != 0 && _modeBeforeSleep == DroneCamMode.Disabled)
		{
			_modeBeforeSleep = Mode;
			SetGameCameraEnabled(state: true);
			if ((Object)(object)Player.m_localPlayer != (Object)null)
			{
				_broadcastRealPosition = true;
				_fakeAttachPoint = new GameObject("DroneCam_FakeBed");
				_fakeAttachPoint.transform.position = ((Component)Player.m_localPlayer).transform.position;
				((Character)Player.m_localPlayer).AttachStart(_fakeAttachPoint.transform, (GameObject)null, false, true, false, "attach_bed", Vector3.zero, (Transform)null);
				Player.m_localPlayer.m_sleeping = true;
				((Character)Player.m_localPlayer).m_nview.GetZDO().Set(ZDOVars.s_inBed, true);
				ZDOMan.instance.FlushClientObjects();
			}
			Notify("Sleeping - drone suspended.");
		}
	}

	public void OnPlayerWake()
	{
		if (_modeBeforeSleep == DroneCamMode.Disabled)
		{
			return;
		}
		_broadcastRealPosition = false;
		if ((Object)(object)Player.m_localPlayer != (Object)null)
		{
			((Character)Player.m_localPlayer).AttachStop();
			Player.m_localPlayer.m_sleeping = false;
			if ((Object)(object)_fakeAttachPoint != (Object)null)
			{
				Object.Destroy((Object)(object)_fakeAttachPoint);
				_fakeAttachPoint = null;
			}
		}
		SetGameCameraEnabled(state: false);
		Mode = _modeBeforeSleep;
		_modeBeforeSleep = DroneCamMode.Disabled;
		Notify("Awake - drone resumed.");
	}

	private void PollTargetSleepState()
	{
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		if (_anchor == null || _anchor.Type != TargetType.Player)
		{
			return;
		}
		ZDO val = FindPlayerZdo(FindPlayerInfo(_anchor.Name));
		if (val != null)
		{
			bool @bool = val.GetBool(ZDOVars.s_inBed, false);
			if (@bool && !_targetWasSleeping)
			{
				_targetWasSleeping = true;
				OnPlayerSleep();
			}
			else if (!@bool && _targetWasSleeping)
			{
				_targetWasSleeping = false;
				OnPlayerWake();
			}
		}
	}

	private void EnterDroneMode()
	{
		if (!((Object)(object)Player.m_localPlayer == (Object)null))
		{
			Player.m_localPlayer.m_godMode = true;
			Player.m_localPlayer.m_ghostMode = true;
			SEMan seman = ((Character)Player.m_localPlayer).m_seman;
			if (seman != null)
			{
				seman.RemoveStatusEffect(SEMan.s_statusEffectWet, true);
			}
			SEMan seman2 = ((Character)Player.m_localPlayer).m_seman;
			if (seman2 != null)
			{
				seman2.RemoveStatusEffect(SEMan.s_statusEffectTared, true);
			}
		}
	}

	private void SetGameCameraEnabled(bool state)
	{
		if ((Object)(object)_gameCamera != (Object)null)
		{
			((Behaviour)_gameCamera).enabled = state;
		}
	}

	private static Vector3 FindGroundPosition(Vector3 from)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0045: Unknown result type (might be due to invalid IL or missing references)
		//IL_004a: Unknown result type (might be due to invalid IL or missing references)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: 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)
		//IL_0088: 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)
		//IL_007d: 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)
		RaycastHit val = default(RaycastHit);
		if (Physics.Raycast(from, Vector3.down, ref val, 2000f, ZoneSystem.instance.m_solidRayMask))
		{
			return ((RaycastHit)(ref val)).point + Vector3.up * 0.5f;
		}
		if (Physics.Raycast(from + Vector3.up * 500f, Vector3.down, ref val, 2000f, ZoneSystem.instance.m_solidRayMask))
		{
			return ((RaycastHit)(ref val)).point + Vector3.up * 0.5f;
		}
		return from;
	}

	private void HandleScrollWheel()
	{
		if ((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus())
		{
			return;
		}
		float num = 0f;
		if (ZInput.GetButton("DroneCam_WheelUp"))
		{
			num -= DroneCamPlugin.ScrollSensitivity.Value;
		}
		if (ZInput.GetButton("DroneCam_WheelDown"))
		{
			num += DroneCamPlugin.ScrollSensitivity.Value;
		}
		if (Mathf.Approximately(num, 0f))
		{
			return;
		}
		bool button = ZInput.GetButton("DroneCam_ModHeight");
		bool button2 = ZInput.GetButton("DroneCam_ModSpeed");
		if (button && button2)
		{
			if (Mode == DroneCamMode.Orbit)
			{
				_orbitSpeed = Mathf.Max(1f, _orbitSpeed + num * 10f);
			}
			return;
		}
		if (button2)
		{
			_focalOffsetY += num;
			return;
		}
		switch (Mode)
		{
		case DroneCamMode.Follow:
			if (button)
			{
				_followHeightOffset.y = Mathf.Max(0f, _followHeightOffset.y + num);
			}
			else
			{
				_followDistance = Mathf.Max(1f, _followDistance + num);
			}
			break;
		case DroneCamMode.FreeSetup:
			_followDistance = Mathf.Max(1f, _followDistance + num);
			break;
		case DroneCamMode.Orbit:
			if (button)
			{
				_orbitHeight = Mathf.Max(0f, _orbitHeight + num);
			}
			else
			{
				_orbitRadius = Mathf.Max(1f, _orbitRadius + num);
			}
			break;
		case DroneCamMode.Security:
			if (button)
			{
				_securityPos.y = Mathf.Max(0f, _securityPos.y + num);
			}
			break;
		}
	}

	private void HandlePlayerCycle()
	{
		if (((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus()) || _anchor == null || _anchor.Type != TargetType.Player)
		{
			return;
		}
		int num = 0;
		if (ZInput.GetButtonDown("DroneCam_NextPlayer"))
		{
			num = 1;
		}
		if (ZInput.GetButtonDown("DroneCam_PrevPlayer"))
		{
			num = -1;
		}
		if (num == 0)
		{
			return;
		}
		List<string> list = GetPlayerNames().ToList();
		if (list.Count >= 1)
		{
			int num2 = list.FindIndex((string n) => string.Equals(n, _anchor.Name, StringComparison.OrdinalIgnoreCase));
			int index = ((num2 >= 0) ? ((num2 + num + list.Count) % list.Count) : 0);
			string text = list[index];
			switch (Mode)
			{
			case DroneCamMode.Follow:
				SetFollow(text, _followDistance, _followHeightOffset.y, _followSmoothTime);
				break;
			case DroneCamMode.Orbit:
				SetOrbitPlayer(text, _orbitRadius, _orbitSpeed, _orbitHeight);
				break;
			case DroneCamMode.Security:
				SetSecurityPlayer(text);
				break;
			}
		}
	}

	private void HandleSelectPlayer()
	{
		if (((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus()) || !ZInput.GetButtonDown("DroneCam_SelectPlayer") || Mode == DroneCamMode.Disabled)
		{
			return;
		}
		_selectCandidateName = null;
		Player val = FindPlayerInLookDirection();
		string text = (((Object)(object)val != (Object)null) ? val.GetPlayerName() : _selectCandidateName);
		if (string.IsNullOrEmpty(text))
		{
			Notify("No player found in look direction.");
			return;
		}
		DroneCamPlugin.Log.LogInfo((object)("[DroneCam] SelectPlayer: targeting '" + text + "'"));
		switch ((_lastTrackingMode != 0) ? _lastTrackingMode : DroneCamMode.Orbit)
		{
		case DroneCamMode.Follow:
			SetFollow(text, _lastFollowDistance, _lastFollowHeight, _lastFollowSmooth);
			break;
		case DroneCamMode.Orbit:
			SetOrbitPlayer(text, _lastOrbitRadius, _lastOrbitSpeed, _lastOrbitHeight);
			break;
		case DroneCamMode.Security:
			SetSecurityPlayer(text);
			break;
		default:
			SetOrbitPlayer(text, _lastOrbitRadius, _lastOrbitSpeed, _lastOrbitHeight);
			break;
		}
	}

	private Player FindPlayerInLookDirection()
	{
		//IL_000e: 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_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)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: 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_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0116: Unknown result type (might be due to invalid IL or missing references)
		//IL_0136: Unknown result type (might be due to invalid IL or missing references)
		Player result = null;
		float num = float.MaxValue;
		Vector3 position = ((Component)this).transform.position;
		Vector3 forward = ((Component)this).transform.forward;
		float value = DroneCamPlugin.SelectPlayerConeAngle.Value;
		Player localPlayer = Player.m_localPlayer;
		string b = ((localPlayer != null) ? localPlayer.GetPlayerName() : null);
		foreach (PlayerInfo player in ZNet.instance.m_players)
		{
			if (string.IsNullOrEmpty(player.m_name) || string.Equals(player.m_name, b, StringComparison.OrdinalIgnoreCase))
			{
				continue;
			}
			Vector3 val = GetPlayerRealtimePosition(player);
			if (val == Vector3.zero)
			{
				val = GetPlayerInfoPosition(player);
			}
			if (val == Vector3.zero)
			{
				continue;
			}
			Vector3 val2 = val - position;
			float magnitude = ((Vector3)(ref val2)).magnitude;
			if (magnitude < 0.1f)
			{
				continue;
			}
			float num2 = Mathf.Acos(Mathf.Clamp(Vector3.Dot(forward, ((Vector3)(ref val2)).normalized), -1f, 1f)) * 57.29578f;
			if (num2 > value)
			{
				continue;
			}
			float num3 = num2 + magnitude * 0.01f;
			if (!(num3 >= num))
			{
				num = num3;
				Player val3 = FindPlayerByZdo(FindPlayerZdo(player));
				if ((Object)(object)val3 != (Object)null)
				{
					result = val3;
					continue;
				}
				result = null;
				_selectCandidateName = player.m_name;
			}
		}
		return result;
	}

	private void HandleSelectEnemy()
	{
		if (((Object)(object)Chat.instance != (Object)null && Chat.instance.HasFocus()) || !ZInput.GetButtonDown("DroneCam_SelectEnemy") || Mode == DroneCamMode.Disabled)
		{
			return;
		}
		Character val = FindEnemyInLookDirection();
		if ((Object)(object)val == (Object)null)
		{
			if (_lookTarget != null)
			{
				ClearEnemyTarget();
			}
			else
			{
				Notify("No enemy found in look direction.");
			}
		}
		else if (_lookTarget != null && string.Equals(_lookTarget.Name, val.GetHoverName(), StringComparison.OrdinalIgnoreCase) && (Object)(object)_lookTarget.Transform == (Object)(object)((Component)val).transform)
		{
			ClearEnemyTarget();
		}
		else
		{
			_lookTarget = DroneCamTarget.ForEnemy(val);
			Notify("Enemy target: " + val.GetHoverName());
		}
	}

	private Character FindEnemyInLookDirection()
	{
		//IL_000e: 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_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)
		//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_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Unknown result type (might be due to invalid IL or missing references)
		Character result = null;
		float num = float.MaxValue;
		Vector3 position = ((Component)this).transform.position;
		Vector3 forward = ((Component)this).transform.forward;
		float value = DroneCamPlugin.SelectEnemyConeAngle.Value;
		foreach (Character allCharacter in Character.GetAllCharacters())
		{
			if (allCharacter is Player || allCharacter.IsDead())
			{
				continue;
			}
			Vector3 val = ((Component)allCharacter).transform.position - position;
			float magnitude = ((Vector3)(ref val)).magnitude;
			if (magnitude < 0.1f)
			{
				continue;
			}
			float num2 = Mathf.Acos(Mathf.Clamp(Vector3.Dot(forward, ((Vector3)(ref val)).normalized), -1f, 1f)) * 57.29578f;
			if (!(num2 > value))
			{
				float num3 = num2 + magnitude * 0.01f;
				if (!(num3 >= num))
				{
					num = num3;
					result = allCharacter;
				}
			}
		}
		return result;
	}

	private void UpdateFreeSetup()
	{
		//IL_0053: 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_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: 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_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: 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_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: 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_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: 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_0117: Unknown result type (might be due to invalid IL or missing references)
		//IL_011e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: 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_0135: 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_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_014c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0151: Unknown result type (might be due to invalid IL or missing references)
		//IL_0156: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_010a: Unknown result type (might be due to invalid IL or missing references)
		//IL_010f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0114: Unknown result type (might be due to invalid IL or missing references)
		//IL_0167: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//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_017c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0183: Unknown result type (might be due to invalid IL or missing references)
		//IL_0194: Unknown result type (might be due to invalid IL or missing references)
		//IL_019b: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01db: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_020b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0213: Unknown result type (might be due to invalid IL or missing references)
		//IL_021a: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0233: Unknown result type (might be due to invalid IL or missing references)
		//IL_024a: Unknown result type (might be due to invalid IL or missing references)
		//IL_024f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0252: Unknown result type (might be due to invalid IL or missing references)
		//IL_0261: Unknown result type (might be due to invalid IL or missing references)
		//IL_026d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0272: Unknown result type (might be due to invalid IL or missing references)
		//IL_02bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
		//IL_0289: Unknown result type (might be due to invalid IL or missing references)
		//IL_028e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0291: Unknown result type (might be due to invalid IL or missing references)
		//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_02b1: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)Chat.instance != (Object)null) || !Chat.instance.HasFocus())
		{
			float num = (ZInput.GetButton("DroneCam_Fast") ? DroneCamPlugin.FlySpeedFast.Value : DroneCamPlugin.FlySpeed.Value);
			float value = DroneCamPlugin.RotationSpeed.Value;
			float value2 = DroneCamPlugin.SmoothTime.Value;
			Vector3 val = Vector3.zero;
			if (ZInput.GetButton("DroneCam_Forward"))
			{
				val += _droneRot * Vector3.forward;
			}
			if (ZInput.GetButton("DroneCam_Back"))
			{
				val -= _droneRot * Vector3.forward;
			}
			if (ZInput.GetButton("DroneCam_StrafeLeft"))
			{
				val -= _droneRot * Vector3.right;
			}
			if (ZInput.GetButton("DroneCam_StrafeRight"))
			{
				val += _droneRot * Vector3.right;
			}
			if (ZInput.GetButton("DroneCam_Up"))
			{
				val += Vector3.up;
			}
			if (ZInput.GetButton("DroneCam_Down"))
			{
				val -= Vector3.up;
			}
			_smoothVelocity = Vector3.SmoothDamp(_smoothVelocity, ((Vector3)(ref val)).normalized * num, ref _smoothVelRef, value2);
			_dronePos += _smoothVelocity * Time.deltaTime;
			if (ZInput.GetButton("DroneCam_MouseLook"))
			{
				Vector2 mouseDelta = ZInput.GetMouseDelta();
				Vector3 eulerAngles = ((Quaternion)(ref _droneRot)).eulerAngles;
				_droneRot = Quaternion.Euler(eulerAngles.x + (0f - mouseDelta.y) * value * Time.deltaTime, eulerAngles.y + mouseDelta.x * value * Time.deltaTime, 0f);
			}
			if (ZInput.GetButton("DroneCam_YawLeft"))
			{
				Vector3 eulerAngles2 = ((Quaternion)(ref _droneRot)).eulerAngles;
				_droneRot = Quaternion.Euler(eulerAngles2.x, eulerAngles2.y - value * Time.deltaTime, 0f);
			}
			if (ZInput.GetButton("DroneCam_YawRight"))
			{
				Vector3 eulerAngles3 = ((Quaternion)(ref _droneRot)).eulerAngles;
				_droneRot = Quaternion.Euler(eulerAngles3.x, eulerAngles3.y + value * Time.deltaTime, 0f);
			}
			if (ZInput.GetButton("DroneCam_PitchUp"))
			{
				Vector3 eulerAngles4 = ((Quaternion)(ref _droneRot)).eulerAngles;
				_droneRot = Quaternion.Euler(eulerAngles4.x - value * Time.deltaTime, eulerAngles4.y, 0f);
			}
			if (ZInput.GetButton("DroneCam_PitchDown"))
			{
				Vector3 eulerAngles5 = ((Quaternion)(ref _droneRot)).eulerAngles;
				_droneRot = Quaternion.Euler(eulerAngles5.x + value * Time.deltaTime, eulerAngles5.y, 0f);
			}
			((Component)this).transform.position = _dronePos;
			((Component)this).transform.rotation = _droneRot;
		}
	}

	private void UpdateFollow()
	{
		//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_0022: 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_004e: 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)
		//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_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_0077: 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_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
		//IL_007c: Unknown result type (might be due to invalid IL or missing references)
		RefreshTarget();
		if (_anchor != null && !(_anchorLastKnownPos == Vector3.zero))
		{
			Vector3 targetCenter = GetTargetCenter();
			Vector3 val;
			if ((Object)(object)_anchor.Transform != (Object)null)
			{
				val = _anchor.Transform.forward;
			}
			else
			{
				Vector3 val2 = targetCenter - ((Component)this).transform.position;
				val = ((((Vector3)(ref val2)).sqrMagnitude > 0.01f) ? ((Vector3)(ref val2)).normalized : Vector3.forward);
			}
			Vector3 val3 = targetCenter + -val * _followDistance + _followHeightOffset;
			((Component)this).transform.position = Vector3.SmoothDamp(((Component)this).transform.position, val3, ref _smoothVelRef, _followSmoothTime);
			LookSmoothAt(GetLookTarget());
		}
	}

	private void UpdateOrbit()
	{
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0097: Unknown result type (might be due to invalid IL or missing references)
		//IL_009c: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_009e: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: 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)
		if (_anchor != null && _anchor.Type != TargetType.Position)
		{
			RefreshTarget();
			if (_anchor == null || _anchorLastKnownPos == Vector3.zero)
			{
				return;
			}
		}
		Vector3 targetCenter = GetTargetCenter();
		_orbitAngle += _orbitSpeed * Time.deltaTime;
		float num = _orbitAngle * ((float)Math.PI / 180f);
		Vector3 val = default(Vector3);
		((Vector3)(ref val))..ctor(Mathf.Sin(num) * _orbitRadius, _orbitHeight, Mathf.Cos(num) * _orbitRadius);
		((Component)this).transform.position = Vector3.SmoothDamp(((Component)this).transform.position, targetCenter + val, ref _smoothVelRef, DroneCamPlugin.SmoothTime.Value);
		LookSmoothAt(GetLookTarget());
	}

	private void UpdateSecurity()
	{
		//IL_0023: Unknown result type (might be due to invalid IL or missing references)
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		if (_anchor != null && _anchor.Type != TargetType.Position)
		{
			RefreshTarget();
		}
		((Component)this).transform.position = _securityPos;
		LookSmoothAt(GetLookTarget(), 3f);
	}

	private void RefreshTarget()
	{
		//IL_0033: 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_0039: Unknown result type (might be due to invalid IL or missing references)
		//IL_0199: Unknown result type (might be due to invalid IL or missing references)
		//IL_019e: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: 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_004c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_026b: Unknown result type (might be due to invalid IL or missing references)
		//IL_020c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0211: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01de: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_01b5: 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_005f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0299: Unknown result type (might be due to invalid IL or missing references)
		//IL_029e: Unknown result type (might be due to invalid IL or missing references)
		//IL_02aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_0224: Unknown result type (might be due to invalid IL or missing references)
		//IL_022a: Unknown result type (might be due to invalid IL or missing references)
		//IL_022f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0234: Unknown result type (might be due to invalid IL or missing references)
		//IL_0241: Unknown result type (might be due to invalid IL or missing references)
		//IL_0246: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cc: 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_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_0074: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: 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_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0157: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_015f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//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_017b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0180: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: 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_0128: 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_00d6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00db: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0109: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: 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_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_0111: Unknown result type (might be due to invalid IL or missing references)
		//IL_0112: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: Unknown result type (might be due to invalid IL or missing references)
		//IL_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0120: Unknown result type (might be due to invalid IL or missing references)
		if (_anchor == null || _anchor.Type == TargetType.Position)
		{
			return;
		}
		if (_anchor.Type == TargetType.Player)
		{
			PlayerInfo pi = FindPlayerInfo(_anchor.Name);
			if (!IsValidPlayerInfo(pi))
			{
				return;
			}
			Vector3 playerInfoPosition = GetPlayerInfoPosition(pi);
			Vector3 playerRealtimePosition = GetPlayerRealtimePosition(pi);
			Vector3 val = ((playerRealtimePosition != Vector3.zero) ? playerRealtimePosition : playerInfoPosition);
			if (val == Vector3.zero)
			{
				return;
			}
			if (playerInfoPosition != Vector3.zero)
			{
				float num = ((_anchorLastInfoPos != Vector3.zero) ? Vector3.Distance(playerInfoPosition, _anchorLastInfoPos) : 0f);
				if (num > DroneCamPlugin.TeleportDetectionDistance.Value)
				{
					DroneCamPlugin.Log.LogInfo((object)$"[DroneCam] Portal detected - dist={num}");
					Vector3 val2 = playerInfoPosition + _anchorLastRelOffset;
					if (ZNetScene.instance.IsAreaReady(val2))
					{
						SnapDroneTo(val2);
						_anchorLastRelOffset = val2 - playerInfoPosition;
					}
					else
					{
						TravelToPosition(val2);
					}
					_anchorLastInfoPos = playerInfoPosition;
					_anchorLastKnownPos = playerInfoPosition;
					_anchorLastPos = playerInfoPosition;
					return;
				}
				_anchorLastInfoPos = playerInfoPosition;
			}
			Player val3 = FindPlayerByZdo(FindPlayerZdo(pi));
			if ((Object)(object)val3 != (Object)null)
			{
				_anchor.Transform = ((Component)val3).transform;
			}
			_anchorLastKnownPos = val;
			_anchorLastPos = val;
			_anchorWaiting = false;
			_anchorLastRelOffset = ((Component)this).transform.position - val;
		}
		else if (_anchor.IsValid)
		{
			Vector3 position = _anchor.GetPosition();
			if (_anchorLastPos != Vector3.zero && Vector3.Distance(position, _anchorLastPos) > DroneCamPlugin.TeleportDetectionDistance.Value)
			{
				SnapRelativeToTarget(position);
			}
			_anchorLastPos = position;
			_anchorLastKnownPos = position;
			_anchorLastRelOffset = ((Component)this).transform.position - position;
			_anchorWaiting = false;
		}
		else
		{
			if (!_anchorWaiting && _anchorLastKnownPos != Vector3.zero)
			{
				_anchorLastRelOffset = ((Component)this).transform.position - _anchorLastKnownPos;
				_anchorWaiting = true;
				_anchorLastPos = Vector3.zero;
				DroneCamPlugin.Log.LogInfo((object)"[DroneCam] Enemy anchor lost - waiting.");
			}
			Character val4 = FindNearestCharacter(_anchor.Name, ((Component)this).transform.position);
			if (!((Object)(object)val4 == (Object)null))
			{
				_anchor.Transform = ((Component)val4).transform;
				_anchorWaiting = false;
				_anchorLastPos = Vector3.zero;
				SnapRelativeToTarget(((Component)val4).transform.position);
				DroneCamPlugin.Log.LogInfo((object)"[DroneCam] Enemy anchor reacquired.");
			}
		}
	}

	private Vector3 GetTargetCenter()
	{
		//IL_000e: 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_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_005d: 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_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: 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)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		if (_anchor == null)
		{
			return ((Component)this).transform.position;
		}
		Vector3 val = ((_anchor.Type == TargetType.Player) ? ((_anchorLastKnownPos != Vector3.zero) ? _anchorLastKnownPos : ((Component)this).transform.position) : ((!_anchor.IsValid) ? _anchorLastKnownPos : _anchor.GetPosition()));
		return val + Vector3.up * _focalOffsetY;
	}

	private Vector3 GetLookTarget()
	{
		//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_009a: Unknown result type (might be due to invalid IL or missing references)
		//IL_009f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a5: 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)
		if (_lookTarget != null)
		{
			if (_lookTarget.Type == TargetType.Enemy && !_lookTarget.IsValid)
			{
				Character val = FindNearestCharacter(_lookTarget.Name, ((Component)this).transform.position);
				if ((Object)(object)val != (Object)null && !val.IsDead())
				{
					_lookTarget.Transform = ((Component)val).transform;
				}
				else
				{
					Notify("Enemy target died - returning to anchor target.");
					_lookTarget = null;
				}
			}
			if (_lookTarget != null)
			{
				_lastLookPosition = _lookTarget.GetPosition() + Vector3.up * 1.5f;
				return _lastLookPosition;
			}
		}
		_lastLookPosition = GetTargetCenter() + Vector3.up * 1.5f;
		return _lastLookPosition;
	}

	private void SnapDroneTo(Vector3 pos)
	{
		//IL_0006: 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_000e: 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_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		((Component)this).transform.position = pos;
		_dronePos = pos;
		_smoothVelocity = Vector3.zero;
		_smoothVelRef = Vector3.zero;
		if ((Object)(object)Player.m_localPlayer != (Object)null)
		{
			((Character)Player.m_localPlayer).m_body.position = pos;
		}
		DroneCamPlugin.Log.LogInfo((object)$"[DroneCam] Drone snapped to {pos}");
	}

	private void SnapRelativeToTarget(Vector3 targetPos)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0002: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0021: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_003d: 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)
		//IL_004f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		_anchorLastKnownPos = targetPos;
		_anchorLastPos = targetPos;
		switch (Mode)
		{
		case DroneCamMode.Follow:
			SnapDroneTo(targetPos + _anchorLastRelOffset);
			break;
		case DroneCamMode.Orbit:
			_orbitAngle = 0f;
			SnapDroneTo(targetPos + ((Vector3)(ref _anchorLastRelOffset)).normalized * _orbitRadius);
			break;
		}
	}

	private void LookSmoothAt(Vector3 worldPoint, float lerpSpeed = 5f)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0011: Unknown result type (might be due to invalid IL or missing references)
		//IL_002d: 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_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		Vector3 val = worldPoint - ((Component)this).transform.position;
		if (!(((Vector3)(ref val)).sqrMagnitude < 0.001f))
		{
			((Component)this).transform.rotation = Quaternion.Slerp(((Component)this).transform.rotation, Quaternion.LookRotation(val), Time.deltaTime * lerpSpeed);
		}
	}

	private void ResetTargetState()
	{
		//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)
		//IL_0025: 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_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_0035: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Unknown result type (might be due to invalid IL or missing references)
		_anchor = null;
		_lookTarget = null;
		_anchorLastPos = Vector3.zero;
		_anchorLastKnownPos = Vector3.zero;
		_anchorLastRelOffset = Vector3.zero;
		_anchorLastInfoPos = Vector3.zero;
		_anchorWaiting = false;
		_lastLookPosition = Vector3.zero;
		_targetWasSleeping = false;
		_focalOffsetY = 0f;
		_waitingForTeleport = false;
	}

	private static PlayerInfo FindPlayerInfo(string name)
	{
		//IL_000a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_004c: 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_0073: Unknown result type (might be due to invalid IL or missing references)
		if (string.IsNullOrEmpty(name))
		{
			return default(PlayerInfo);
		}
		foreach (PlayerInfo player in ZNet.instance.m_players)
		{
			if (string.Equals(player.m_name?.Trim(), name.Trim(), StringComparison.OrdinalIgnoreCase))
			{
				return player;
			}
		}
		return default(PlayerInfo);
	}

	private static bool IsValidPlayerInfo(PlayerInfo pi)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		if (!string.IsNullOrEmpty(pi.m_name))
		{
			return !((ZDOID)(ref pi.m_characterID)).IsNone();
		}
		return false;
	}

	private static ZDO FindPlayerZdo(PlayerInfo pi)
	{
		//IL_0015: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Unknown result type (might be due to invalid IL or missing references)
		if (((ZDOID)(ref pi.m_characterID)).IsNone())
		{
			return null;
		}
		return ZDOMan.instance.GetZDO(pi.m_characterID);
	}

	private static Player FindPlayerByZdo(ZDO zdo)
	{
		if (zdo == null)
		{
			return null;
		}
		foreach (Player allPlayer in Player.GetAllPlayers())
		{
			if (!((Object)(object)allPlayer == (Object)(object)Player.m_localPlayer) && (Object)(object)((Character)allPlayer).m_nview != (Object)null && ((Character)allPlayer).m_nview.GetZDO() == zdo)
			{
				return allPlayer;
			}
		}
		return null;
	}

	private Vector3 GetPlayerRealtimePosition(PlayerInfo pi)
	{
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		//IL_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0048: Unknown result type (might be due to invalid IL or missing references)
		//IL_007e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0064: Unknown result type (might be due to invalid IL or missing references)
		//IL_0065: Unknown result type (might be due to invalid IL or missing references)
		//IL_006a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0096: Unknown result type (might be due to invalid IL or missing references)
		//IL_0090: 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_0077: Unknown result type (might be due to invalid IL or missing references)
		Player localPlayer = Player.m_localPlayer;
		object obj;
		if (localPlayer == null)
		{
			obj = null;
		}
		else
		{
			ZNetView nview = ((Character)localPlayer).m_nview;
			obj = ((nview != null) ? nview.GetZDO() : null);
		}
		ZDO val = (ZDO)obj;
		ZDO val2 = FindPlayerZdo(pi);
		Player val3 = FindPlayerByZdo(val2);
		if ((Object)(object)val3 != (Object)null && (Object)(object)val3 != (Object)(object)Player.m_localPlayer)
		{
			return ((Component)val3).transform.position;
		}
		if (val2 != null && val2 != val)
		{
			return val2.GetPosition();
		}
		if (pi.m_publicPosition && pi.m_position != Vector3.zero)
		{
			return pi.m_position;
		}
		if (_anchorLastKnownPos != Vector3.zero)
		{
			return _anchorLastKnownPos;
		}
		return Vector3.zero;
	}

	private Vector3 GetPlayerInfoPosition(PlayerInfo pi)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003f: 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)
		//IL_005a: 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)
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		if (pi.m_publicPosition && pi.m_position != Vector3.zero)
		{
			return pi.m_position;
		}
		Player localPlayer = Player.m_localPlayer;
		object obj;
		if (localPlayer == null)
		{
			obj = null;
		}
		else
		{
			ZNetView nview = ((Character)localPlayer).m_nview;
			obj = ((nview != null) ? nview.GetZDO() : null);
		}
		ZDO val = (ZDO)obj;
		ZDO val2 = FindPlayerZdo(pi);
		if (val2 != null && val2 != val)
		{
			return val2.GetPosition();
		}
		if (_anchorLastKnownPos != Vector3.zero)
		{
			return _anchorLastKnownPos;
		}
		return Vector3.zero;
	}

	private static Character FindNearestCharacter(string name, Vector3 near)
	{
		//IL_004d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: Unknown result type (might be due to invalid IL or missing references)
		Character result = null;
		float num = float.MaxValue;
		foreach (Character allCharacter in Character.GetAllCharacters())
		{
			if (!(allCharacter is Player) && !allCharacter.IsDead() && (string.IsNullOrEmpty(name) || string.Equals(allCharacter.GetHoverName(), name, StringComparison.OrdinalIgnoreCase)))
			{
				float num2 = Vector3.Distance(((Component)allCharacter).transform.position, near);
				if (num2 < num)
				{
					num = num2;
					result = allCharacter;
				}
			}
		}
		return result;
	}

	private static string PlayerNotFoundReason(string name)
	{
		//IL_0014: 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)
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0040: Unknown result type (might be due to invalid IL or missing references)
		foreach (PlayerInfo player in ZNet.instance.m_players)
		{
			if (string.Equals(player.m_name?.Trim(), name.Trim(), StringComparison.OrdinalIgnoreCase))
			{
				ZDOID characterID = player.m_characterID;
				return ((ZDOID)(ref characterID)).IsNone() ? ("Player '" + name + "' character not ready yet.") : ("Player '" + name + "' found but position unavailable.");
			}
		}
		return "Player '" + name + "' not connected.";
	}

	public Vector3 GetLookAtPosition()
	{
		//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_003a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0018: 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_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		if (!(_lastLookPosition != Vector3.zero))
		{
			return ((Component)this).transform.position + ((Component)this).transform.forward * _followDistance;
		}
		return _lastLookPosition;
	}

	private static void Notify(string msg)
	{
		Chat instance = Chat.instance;
		if (instance != null)
		{
			((Terminal)instance).AddString("[XDC] " + msg);
		}
	}

	public void SetFollow(string playerName, float distance, float heightOffset, float smoothTime)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_002a: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: 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_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_0129: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		SaveTrackingState();
		PlayerInfo pi = FindPlayerInfo(playerName);
		if (!IsValidPlayerInfo(pi))
		{
			Notify(PlayerNotFoundReason(playerName));
			return;
		}
		Vector3 playerInfoPosition = GetPlayerInfoPosition(pi);
		Vector3 playerRealtimePosition = GetPlayerRealtimePosition(pi);
		Vector3 val = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : playerRealtimePosition);
		Vector3 val2 = ((playerRealtimePosition != Vector3.zero) ? playerRealtimePosition : playerInfoPosition);
		if (val == Vector3.zero)
		{
			Notify("Player '" + playerName + "' position unavailable.");
			return;
		}
		ResetTargetState();
		Player val3 = FindPlayerByZdo(FindPlayerZdo(pi));
		_anchor = new DroneCamTarget
		{
			Type = TargetType.Player,
			Name = playerName,
			Transform = ((val3 != null) ? ((Component)val3).transform : null)
		};
		_anchorLastKnownPos = ((val2 != Vector3.zero) ? val2 : val);
		_anchorLastInfoPos = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : val2);
		_followDistance = distance;
		_followHeightOffset = new Vector3(0f, heightOffset, 0f);
		_followSmoothTime = smoothTime;
		Mode = DroneCamMode.Follow;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		if (Vector3.Distance(((Component)this).transform.position, val) > DroneCamPlugin.TeleportDetectionDistance.Value)
		{
			TravelToPlayer(playerName, val);
		}
		else
		{
			Notify("Following " + playerName);
		}
	}

	public void SetFollowEnemy(string enemyName, float distance, float heightOffset, float smoothTime)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		Character val = FindNearestCharacter(enemyName, ((Component)this).transform.position);
		if ((Object)(object)val == (Object)null)
		{
			Notify("No enemy '" + enemyName + "' found nearby.");
			return;
		}
		ResetTargetState();
		_anchor = DroneCamTarget.ForEnemy(val);
		_followDistance = distance;
		_followHeightOffset = new Vector3(0f, heightOffset, 0f);
		_followSmoothTime = smoothTime;
		Mode = DroneCamMode.Follow;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		Notify("Following enemy " + val.GetHoverName());
	}

	public void SetOrbitPlayer(string playerName, float radius, float speed, float height)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_002a: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: 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_0125: Unknown result type (might be due to invalid IL or missing references)
		//IL_012a: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		SaveTrackingState();
		PlayerInfo pi = FindPlayerInfo(playerName);
		if (!IsValidPlayerInfo(pi))
		{
			Notify(PlayerNotFoundReason(playerName));
			return;
		}
		Vector3 playerInfoPosition = GetPlayerInfoPosition(pi);
		Vector3 playerRealtimePosition = GetPlayerRealtimePosition(pi);
		Vector3 val = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : playerRealtimePosition);
		Vector3 val2 = ((playerRealtimePosition != Vector3.zero) ? playerRealtimePosition : playerInfoPosition);
		if (val == Vector3.zero)
		{
			Notify("Player '" + playerName + "' position unavailable.");
			return;
		}
		ResetTargetState();
		Player val3 = FindPlayerByZdo(FindPlayerZdo(pi));
		_anchor = new DroneCamTarget
		{
			Type = TargetType.Player,
			Name = playerName,
			Transform = ((val3 != null) ? ((Component)val3).transform : null)
		};
		_anchorLastKnownPos = ((val2 != Vector3.zero) ? val2 : val);
		_anchorLastInfoPos = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : val2);
		_orbitRadius = radius;
		_orbitSpeed = speed;
		_orbitHeight = height;
		_orbitAngle = 0f;
		Mode = DroneCamMode.Orbit;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		if (Vector3.Distance(((Component)this).transform.position, val) > DroneCamPlugin.TeleportDetectionDistance.Value)
		{
			TravelToPlayer(playerName, val);
		}
		else
		{
			Notify("Orbiting " + playerName);
		}
	}

	public void SetOrbitEnemy(string enemyName, float radius, float speed, float height)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		Character val = FindNearestCharacter(enemyName, ((Component)this).transform.position);
		if ((Object)(object)val == (Object)null)
		{
			Notify("No enemy '" + enemyName + "' found nearby.");
			return;
		}
		ResetTargetState();
		_anchor = DroneCamTarget.ForEnemy(val);
		_orbitRadius = radius;
		_orbitSpeed = speed;
		_orbitHeight = height;
		_orbitAngle = 0f;
		Mode = DroneCamMode.Orbit;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		Notify("Orbiting enemy " + val.GetHoverName());
	}

	public void SetOrbitPosition(Vector3 pos, float radius, float speed, float height)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		ResetTargetState();
		_anchor = DroneCamTarget.ForPosition(pos);
		_orbitRadius = radius;
		_orbitSpeed = speed;
		_orbitHeight = height;
		_orbitAngle = 0f;
		Mode = DroneCamMode.Orbit;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		Notify($"Orbiting position - radius={radius} speed={speed} height={height}");
	}

	public void SetSecurityPlayer(string playerName)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_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_002a: Unknown result type (might be due to invalid IL or missing references)
		//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)
		//IL_0031: 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_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_003e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Unknown result type (might be due to invalid IL or missing references)
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_0044: Unknown result type (might be due to invalid IL or missing references)
		//IL_0053: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0056: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
		//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cd: 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_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e0: 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_00f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0115: Unknown result type (might be due to invalid IL or missing references)
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012e: Unknown result type (might be due to invalid IL or missing references)
		SaveTrackingState();
		PlayerInfo pi = FindPlayerInfo(playerName);
		if (!IsValidPlayerInfo(pi))
		{
			Notify(PlayerNotFoundReason(playerName));
			return;
		}
		Vector3 playerInfoPosition = GetPlayerInfoPosition(pi);
		Vector3 playerRealtimePosition = GetPlayerRealtimePosition(pi);
		Vector3 val = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : playerRealtimePosition);
		Vector3 val2 = ((playerRealtimePosition != Vector3.zero) ? playerRealtimePosition : playerInfoPosition);
		if (val == Vector3.zero)
		{
			Notify("Player '" + playerName + "' position unavailable.");
			return;
		}
		ResetTargetState();
		Player val3 = FindPlayerByZdo(FindPlayerZdo(pi));
		_anchor = new DroneCamTarget
		{
			Type = TargetType.Player,
			Name = playerName,
			Transform = ((val3 != null) ? ((Component)val3).transform : null)
		};
		_anchorLastKnownPos = ((val2 != Vector3.zero) ? val2 : val);
		_anchorLastInfoPos = ((playerInfoPosition != Vector3.zero) ? playerInfoPosition : val2);
		_securityPos = ((Component)this).transform.position;
		Mode = DroneCamMode.Security;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		if (Vector3.Distance(((Component)this).transform.position, val) > DroneCamPlugin.TeleportDetectionDistance.Value)
		{
			TravelToPlayer(playerName, val);
		}
		else
		{
			Notify("Security cam tracking " + playerName);
		}
	}

	public void SetSecurityPosition(Vector3 pos)
	{
		//IL_0007: 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)
		//IL_001e: Unknown result type (might be due to invalid IL or missing references)
		ResetTargetState();
		_anchor = DroneCamTarget.ForPosition(pos);
		_securityPos = ((Component)this).transform.position;
		Mode = DroneCamMode.Security;
		EnterDroneMode();
		SetGameCameraEnabled(state: false);
		Notify("Security cam tracking look-at position");
	}

	public void SetOrbitSpeed(float speed)
	{
		_orbitSpeed = speed;
		Notify($"Orbit speed set to {speed} deg/sec");
	}

	public void SetEnemyTargetNearest()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		Character val = FindNearestCharacter(null, ((Component)this).transform.position);
		if ((Object)(object)val == (Object)null)
		{
			Notify("No enemies nearby.");
			return;
		}
		_lookTarget = DroneCamTarget.ForEnemy(val);
		Notify("Enemy target: " + val.GetHoverName());
	}

	public void SetEnemyTargetNamed(string name)
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		Character val = FindNearestCharacter(name, ((Component)this).transform.position);
		if ((Object)(object)val == (Object)null)
		{
			Notify("No enemy '" + name + "' found nearby.");
			return;
		}
		_lookTarget = DroneCamTarget.ForEnemy(val);
		Notify("Enemy target: " + val.GetHoverName());
	}

	public void ClearEnemyTarget()
	{
		_lookTarget = null;
		Notify("Enemy target cleared.");
	}

	public void SnapToPlayer()
	{
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0031: 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_0051: Unknown result type (might be due to invalid IL or missing references)
		//IL_0052: 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)
		//IL_0059: 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_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0061: Unknown result type (might be due to invalid IL or missing references)
		//IL_0070: 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)
		//IL_0071: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: 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)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0083: Unknown result type (might be due to invalid IL or missing references)
		//IL_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00be: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e8: Unknown result type (might be due to invalid IL or missing refere