Decompiled source of CapsulePath v0.3.0

BepInEx\plugins\CapsulePath.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
using Zorro.Settings;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("CapsulePath")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+6ad93e30786c314dd5e7a869f818ef9f5eed2e45")]
[assembly: AssemblyProduct("CapsulePath")]
[assembly: AssemblyTitle("CapsulePath")]
[assembly: AssemblyMetadata("ContentWarning.VanillaCompatible", "true")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace CapsulePath;

[BepInPlugin("com.local.capsulepath", "Capsule Path", "0.3.0")]
public class CapsulePathPlugin : BaseUnityPlugin
{
	private const int SplineSteps = 10;

	private const float SplineStepLength = 0.25f;

	private const int ArrowCount = 8;

	private const float ArrowSpeedMps = 5f;

	private const float ArrowSize = 0.55f;

	private const float ArrowAngle = 38f;

	private const float MinAnimatedPathLength = 0.1f;

	private const float MinCornerSpacing = 0.05f;

	private const float DensifyStep = 0.75f;

	private const float SurfaceSnapRadius = 1.5f;

	private const float MaxLateralSnapSqr = 0.25f;

	private static readonly Color PathColor = new Color(0.15f, 1f, 0.25f, 0.45f);

	private static readonly Color ArrowColor = new Color(0.2f, 1f, 0.3f, 1f);

	private CapsulePathRecalculateKeySetting _recalculateKeySetting;

	private CapsulePathToggleKeySetting _toggleKeySetting;

	private CapsulePathHideFromCameraSetting _hideFromCameraSetting;

	private CapsulePathShowStatusSetting _showStatusSetting;

	private readonly NavMeshPath _navPath = new NavMeshPath();

	private LineRenderer _line;

	private readonly List<LineRenderer> _arrows = new List<LineRenderer>();

	private Vector3[] _smoothedPath;

	private float[] _segLengths;

	private float _totalLength;

	private float _arrowPhase;

	private bool _pathVisible = true;

	private Vector3? _capsulePos;

	private DivingBell _cachedBell;

	private readonly Dictionary<Camera, bool> _isRecordingCamera = new Dictionary<Camera, bool>();

	private bool _hiddenForRecording;

	private const float StatusDuration = 3.2f;

	private const float StatusFade = 0.6f;

	private string _statusText;

	private float _statusShownAt = -100f;

	private GUIStyle _statusStyle;

	private Texture2D _statusTex;

	private KeyCode RecalculateKey => ResolveKey(ref _recalculateKeySetting, (KeyCode)107);

	private KeyCode ToggleViewKey => ResolveKey(ref _toggleKeySetting, (KeyCode)111);

	private bool HideFromCamera
	{
		get
		{
			if (_hideFromCameraSetting == null)
			{
				GameHandler instance = GameHandler.Instance;
				object hideFromCameraSetting;
				if (instance == null)
				{
					hideFromCameraSetting = null;
				}
				else
				{
					SettingsHandler settingsHandler = instance.SettingsHandler;
					hideFromCameraSetting = ((settingsHandler != null) ? settingsHandler.GetSetting<CapsulePathHideFromCameraSetting>() : null);
				}
				_hideFromCameraSetting = (CapsulePathHideFromCameraSetting)hideFromCameraSetting;
			}
			if (_hideFromCameraSetting != null)
			{
				return ((BoolSetting)_hideFromCameraSetting).Value;
			}
			return true;
		}
	}

	private bool ShowStatusHud
	{
		get
		{
			if (_showStatusSetting == null)
			{
				GameHandler instance = GameHandler.Instance;
				object showStatusSetting;
				if (instance == null)
				{
					showStatusSetting = null;
				}
				else
				{
					SettingsHandler settingsHandler = instance.SettingsHandler;
					showStatusSetting = ((settingsHandler != null) ? settingsHandler.GetSetting<CapsulePathShowStatusSetting>() : null);
				}
				_showStatusSetting = (CapsulePathShowStatusSetting)showStatusSetting;
			}
			if (_showStatusSetting != null)
			{
				return ((BoolSetting)_showStatusSetting).Value;
			}
			return true;
		}
	}

	private static KeyCode ResolveKey<T>(ref T cached, KeyCode fallback) where T : KeyCodeSetting
	{
		//IL_0050: 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)
		if (cached == null)
		{
			GameHandler instance = GameHandler.Instance;
			object obj;
			if (instance == null)
			{
				obj = default(T);
			}
			else
			{
				SettingsHandler settingsHandler = instance.SettingsHandler;
				obj = ((settingsHandler != null) ? settingsHandler.GetSetting<T>() : default(T));
			}
			cached = (T)obj;
		}
		if (cached == null)
		{
			return fallback;
		}
		return ((KeyCodeSetting)cached/*cast due to .constrained prefix*/).Keycode();
	}

	private void Awake()
	{
		EnsureLineRenderer();
		EnsureArrows();
		SceneManager.activeSceneChanged += OnActiveSceneChanged;
		RenderPipelineManager.beginCameraRendering += OnBeginCameraRendering;
		RenderPipelineManager.endCameraRendering += OnEndCameraRendering;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"Capsule Path loaded. Defaults: K=calculate path, O=toggle path (rebindable in Settings -> MODS).");
	}

	private void Update()
	{
		//IL_0011: 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_0069: Unknown result type (might be due to invalid IL or missing references)
		TrackCapsulePosition();
		if (GameplayInputActive())
		{
			if (Input.GetKeyDown(ToggleViewKey))
			{
				_pathVisible = !_pathVisible;
				if ((Object)(object)_line != (Object)null)
				{
					((Renderer)_line).enabled = _pathVisible;
				}
				SetArrowsVisible(_pathVisible);
				if (_smoothedPath == null)
				{
					ShowStatus($"CapsulePath: press [{RecalculateKey}] to find the capsule");
				}
				else
				{
					ShowStatus(_pathVisible ? "CapsulePath: path shown" : "CapsulePath: path hidden");
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)("[CapsulePath] Visibility: " + (_pathVisible ? "ON" : "OFF")));
			}
			if (Input.GetKeyDown(RecalculateKey))
			{
				RecalculatePath();
			}
		}
		if (_smoothedPath != null && _pathVisible && _totalLength > 0.1f)
		{
			AnimateArrows();
		}
	}

	private static bool GameplayInputActive()
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Invalid comparison between Unknown and I4
		if ((int)Cursor.lockState == 1)
		{
			return GlobalInputHandler.CanTakeInput();
		}
		return false;
	}

	private void OnDestroy()
	{
		SceneManager.activeSceneChanged -= OnActiveSceneChanged;
		RenderPipelineManager.beginCameraRendering -= OnBeginCameraRendering;
		RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;
		foreach (LineRenderer arrow in _arrows)
		{
			if ((Object)(object)arrow != (Object)null)
			{
				Object.Destroy((Object)(object)((Component)arrow).gameObject);
			}
		}
		_arrows.Clear();
		if ((Object)(object)_line != (Object)null)
		{
			Object.Destroy((Object)(object)((Component)_line).gameObject);
		}
		if ((Object)(object)_statusTex != (Object)null)
		{
			Object.Destroy((Object)(object)_statusTex);
		}
	}

	private void OnBeginCameraRendering(ScriptableRenderContext context, Camera cam)
	{
		if (_pathVisible && _smoothedPath != null && HideFromCamera && IsRecordingCamera(cam))
		{
			_hiddenForRecording = true;
			if ((Object)(object)_line != (Object)null)
			{
				((Renderer)_line).enabled = false;
			}
			HideArrows();
		}
	}

	private void OnEndCameraRendering(ScriptableRenderContext context, Camera cam)
	{
		if (_hiddenForRecording && IsRecordingCamera(cam))
		{
			_hiddenForRecording = false;
			if ((Object)(object)_line != (Object)null)
			{
				((Renderer)_line).enabled = _pathVisible;
			}
			SetArrowsVisible(_pathVisible);
		}
	}

	private bool IsRecordingCamera(Camera cam)
	{
		if (!_isRecordingCamera.TryGetValue(cam, out var value))
		{
			value = (Object)(object)((Component)cam).GetComponentInParent<VideoCamera>() != (Object)null;
			_isRecordingCamera[cam] = value;
		}
		return value;
	}

	private void OnActiveSceneChanged(Scene previous, Scene current)
	{
		_capsulePos = null;
		_cachedBell = null;
		_isRecordingCamera.Clear();
		ClearPath();
		((BaseUnityPlugin)this).Logger.LogInfo((object)("[CapsulePath] Scene changed -> state reset (" + ((Scene)(ref current)).name + ")"));
	}

	private void TrackCapsulePosition()
	{
		//IL_0062: 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)
		if (!_capsulePos.HasValue && (BotHandler.instance?.bots?.Count).GetValueOrDefault() != 0)
		{
			Camera main = Camera.main;
			if (!((Object)(object)main == (Object)null))
			{
				_capsulePos = ((Component)main).transform.position;
				((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CapsulePath] Capsule anchor recorded: {_capsulePos.Value}");
			}
		}
	}

	private void RecalculatePath()
	{
		//IL_007b: 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)
		//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_00a2: 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_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_00be: 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_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_00d3: 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_0101: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: 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_0156: Unknown result type (might be due to invalid IL or missing references)
		//IL_015b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0160: 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_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_0172: Unknown result type (might be due to invalid IL or missing references)
		//IL_0177: 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_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_013a: Invalid comparison between Unknown and I4
		//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0236: Unknown result type (might be due to invalid IL or missing references)
		//IL_023c: Invalid comparison between Unknown and I4
		if (!TryGetCapsuleTarget(out var target, out var source))
		{
			ShowStatus("CapsulePath: capsule not found yet (start the dive)");
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Capsule target unknown (no diving bell, no anchor).");
			return;
		}
		Player localPlayer = Player.localPlayer;
		if ((Object)(object)localPlayer == (Object)null)
		{
			ShowStatus("CapsulePath: player not ready");
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Local player not found.");
			return;
		}
		if (!TryGetLocalAvatarPosition(localPlayer, out var position, out var source2))
		{
			ShowStatus("CapsulePath: player position unknown");
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Could not resolve dynamic local avatar position.");
			return;
		}
		Vector3 position2 = position;
		Vector3 position3 = target;
		if (!TrySampleToNavMesh(ref position2) || !TrySampleToNavMesh(ref position3))
		{
			ClearPath();
			ApplyPath((Vector3[])(object)new Vector3[2]
			{
				position + Vector3.up * 0.2f,
				target + Vector3.up * 0.2f
			});
			ShowStatus(WithVisibilityHint("CapsulePath: direct line (off NavMesh)"));
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Could not sample start/end to NavMesh. Using direct fallback.");
			return;
		}
		if (!NavMesh.CalculatePath(position2, position3, -1, _navPath) || _navPath.corners == null || _navPath.corners.Length < 2 || (int)_navPath.status == 2)
		{
			ClearPath();
			ApplyPath((Vector3[])(object)new Vector3[2]
			{
				position + Vector3.up * 0.2f,
				target + Vector3.up * 0.2f
			});
			ShowStatus(WithVisibilityHint("CapsulePath: no route - direct line"));
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Path not found/invalid. Using direct fallback.");
			return;
		}
		float num = 0f;
		for (int i = 1; i < _navPath.corners.Length; i++)
		{
			num += Vector3.Distance(_navPath.corners[i - 1], _navPath.corners[i]);
		}
		Vector3[] array = CatmullRom(LiftCorners(DensifyOnNavMesh(DropCoincidentCorners(_navPath.corners, 0.05f)), 0.12f), 10);
		ApplyPath(array);
		bool flag = (int)_navPath.status == 1;
		ShowStatus(WithVisibilityHint(flag ? $"CapsulePath: partial route ~{num:F0} m (capsule may be blocked)" : $"CapsulePath: {num:F0} m to capsule"));
		if (flag)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)"[CapsulePath] Path is partial - it stops at the closest reachable point, not at the capsule.");
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)$"[CapsulePath] Path OK. Corners={_navPath.corners.Length}, pts={array.Length}, len={num:F1}m, src={source2}, tgt={source}");
	}

	private string WithVisibilityHint(string msg)
	{
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		if (!_pathVisible)
		{
			return msg + $"  (hidden - [{ToggleViewKey}] to show)";
		}
		return msg;
	}

	private bool TryGetCapsuleTarget(out Vector3 target, out string source)
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: 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_003e: Unknown result type (might be due to invalid IL or missing references)
		DivingBell val = ResolveDivingBell();
		if ((Object)(object)val != (Object)null)
		{
			target = DivingBellAnchor(val);
			source = "DivingBell";
			return true;
		}
		if (_capsulePos.HasValue)
		{
			target = _capsulePos.Value;
			source = "camera-anchor";
			return true;
		}
		target = default(Vector3);
		source = "none";
		return false;
	}

	private DivingBell ResolveDivingBell()
	{
		if ((Object)(object)_cachedBell != (Object)null)
		{
			return _cachedBell;
		}
		DivingBell[] array = Object.FindObjectsByType<DivingBell>((FindObjectsSortMode)0);
		foreach (DivingBell val in array)
		{
			if ((Object)(object)val != (Object)null && !val.onSurface)
			{
				_cachedBell = val;
				break;
			}
		}
		return _cachedBell;
	}

	private static Vector3 DivingBellAnchor(DivingBell bell)
	{
		//IL_0075: 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_0029: 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_0046: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: Unknown result type (might be due to invalid IL or missing references)
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		Transform[] array = (((Object)(object)bell.playerDetector != (Object)null) ? bell.playerDetector.m_detectors : null);
		if (array != null && array.Length != 0)
		{
			Vector3 val = Vector3.zero;
			int num = 0;
			Transform[] array2 = array;
			foreach (Transform val2 in array2)
			{
				if ((Object)(object)val2 != (Object)null)
				{
					val += val2.position;
					num++;
				}
			}
			if (num > 0)
			{
				return val / (float)num;
			}
		}
		return ((Component)bell).transform.position;
	}

	private static Vector3[] LiftCorners(Vector3[] corners, float up)
	{
		//IL_0011: 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)
		//IL_001c: 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)
		Vector3[] array = (Vector3[])(object)new Vector3[corners.Length];
		for (int i = 0; i < corners.Length; i++)
		{
			array[i] = corners[i] + Vector3.up * up;
		}
		return array;
	}

	private static Vector3[] DropCoincidentCorners(Vector3[] corners, float minDist)
	{
		//IL_0013: 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_0032: 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_0042: Unknown result type (might be due to invalid IL or missing references)
		if (corners.Length < 3)
		{
			return corners;
		}
		List<Vector3> list = new List<Vector3>(corners.Length) { corners[0] };
		for (int i = 1; i < corners.Length - 1; i++)
		{
			if (Vector3.Distance(list[list.Count - 1], corners[i]) >= minDist)
			{
				list.Add(corners[i]);
			}
		}
		list.Add(corners[^1]);
		return list.ToArray();
	}

	private static Vector3[] DensifyOnNavMesh(Vector3[] corners)
	{
		//IL_000d: 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_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_004a: 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_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_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a1: 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_0074: 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_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)
		List<Vector3> list = new List<Vector3>(corners.Length * 4) { corners[0] };
		NavMeshHit val4 = default(NavMeshHit);
		for (int i = 1; i < corners.Length; i++)
		{
			Vector3 val = corners[i - 1];
			Vector3 val2 = corners[i];
			int num = Mathf.FloorToInt(Vector3.Distance(val, val2) / 0.75f);
			for (int j = 1; j <= num; j++)
			{
				Vector3 val3 = Vector3.Lerp(val, val2, (float)j / (float)(num + 1));
				if (NavMesh.SamplePosition(val3, ref val4, 1.5f, -1))
				{
					Vector3 val5 = ((NavMeshHit)(ref val4)).position - val3;
					val5.y = 0f;
					if (((Vector3)(ref val5)).sqrMagnitude <= 0.25f)
					{
						val3 = ((NavMeshHit)(ref val4)).position;
					}
				}
				list.Add(val3);
			}
			list.Add(val2);
		}
		return list.ToArray();
	}

	private static Vector3[] CatmullRom(Vector3[] pts, int maxSteps)
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: 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_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: 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_00b0: 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_00c0: Unknown result type (might be due to invalid IL or missing references)
		if (pts.Length < 2)
		{
			return pts;
		}
		Vector3[] array = (Vector3[])(object)new Vector3[pts.Length + 2];
		array[0] = pts[0];
		for (int i = 0; i < pts.Length; i++)
		{
			array[i + 1] = pts[i];
		}
		array[^1] = pts[^1];
		List<Vector3> list = new List<Vector3>(pts.Length * 4);
		for (int j = 1; j < array.Length - 2; j++)
		{
			int num = Mathf.Clamp(Mathf.CeilToInt(Vector3.Distance(array[j], array[j + 1]) / 0.25f), 2, maxSteps);
			for (int k = 0; k < num; k++)
			{
				float t = (float)k / (float)num;
				list.Add(CatmullRomPoint(array[j - 1], array[j], array[j + 1], array[j + 2], t));
			}
		}
		list.Add(pts[^1]);
		return list.ToArray();
	}

	private static Vector3 CatmullRomPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t)
	{
		//IL_0007: 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_0020: 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_0039: 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_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_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_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_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_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_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: 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_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_00c3: 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_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
		//IL_00de: Unknown result type (might be due to invalid IL or missing references)
		//IL_00e3: 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_00f2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f4: 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_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_0108: Unknown result type (might be due to invalid IL or missing references)
		//IL_010d: 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_0119: Unknown result type (might be due to invalid IL or missing references)
		//IL_0126: 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_012d: Unknown result type (might be due to invalid IL or missing references)
		float num = 0f;
		float num2 = num + Mathf.Max(Mathf.Sqrt(Vector3.Distance(p0, p1)), 0.2f);
		float num3 = num2 + Mathf.Max(Mathf.Sqrt(Vector3.Distance(p1, p2)), 0.2f);
		float num4 = num3 + Mathf.Max(Mathf.Sqrt(Vector3.Distance(p2, p3)), 0.2f);
		float num5 = Mathf.Lerp(num2, num3, t);
		Vector3 val = (num2 - num5) / (num2 - num) * p0 + (num5 - num) / (num2 - num) * p1;
		Vector3 val2 = (num3 - num5) / (num3 - num2) * p1 + (num5 - num2) / (num3 - num2) * p2;
		Vector3 val3 = (num4 - num5) / (num4 - num3) * p2 + (num5 - num3) / (num4 - num3) * p3;
		Vector3 val4 = (num3 - num5) / (num3 - num) * val + (num5 - num) / (num3 - num) * val2;
		Vector3 val5 = (num4 - num5) / (num4 - num2) * val2 + (num5 - num2) / (num4 - num2) * val3;
		return (num3 - num5) / (num3 - num2) * val4 + (num5 - num2) / (num3 - num2) * val5;
	}

	private void ApplyPath(Vector3[] pts)
	{
		_smoothedPath = pts;
		PrecomputeLengths();
		EnsureLineRenderer();
		_line.positionCount = pts.Length;
		_line.SetPositions(pts);
		((Renderer)_line).enabled = _pathVisible;
		_arrowPhase = 0f;
		SetArrowsVisible(_pathVisible);
	}

	private void PrecomputeLengths()
	{
		//IL_0058: 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)
		if (_smoothedPath == null || _smoothedPath.Length < 2)
		{
			_segLengths = null;
			_totalLength = 0f;
			return;
		}
		_segLengths = new float[_smoothedPath.Length - 1];
		_totalLength = 0f;
		for (int i = 0; i < _segLengths.Length; i++)
		{
			_segLengths[i] = Vector3.Distance(_smoothedPath[i], _smoothedPath[i + 1]);
			_totalLength += _segLengths[i];
		}
	}

	private void AnimateArrows()
	{
		//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)
		float num = 5f / _totalLength;
		_arrowPhase = (_arrowPhase + Time.deltaTime * num) % 1f;
		for (int i = 0; i < 8; i++)
		{
			float t = (_arrowPhase + (float)i / 8f) % 1f;
			SamplePolyline(t, out var pos, out var tangent);
			DrawChevron(_arrows[i], pos, tangent);
		}
	}

	private void SamplePolyline(float t, out Vector3 pos, out Vector3 tangent)
	{
		//IL_00c5: 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_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_0050: 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_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_0079: 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_008f: 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_0098: Unknown result type (might be due to invalid IL or missing references)
		float num = t * _totalLength;
		float num2 = 0f;
		for (int i = 0; i < _segLengths.Length; i++)
		{
			float num3 = _segLengths[i];
			if (num2 + num3 >= num || i == _segLengths.Length - 1)
			{
				float num4 = Mathf.Clamp01((num - num2) / Mathf.Max(num3, 0.001f));
				pos = Vector3.Lerp(_smoothedPath[i], _smoothedPath[i + 1], num4);
				Vector3 val = _smoothedPath[i + 1] - _smoothedPath[i];
				tangent = ((Vector3)(ref val)).normalized;
				return;
			}
			num2 += num3;
		}
		pos = _smoothedPath[_smoothedPath.Length - 1];
		tangent = Vector3.forward;
	}

	private void DrawChevron(LineRenderer lr, Vector3 tip, Vector3 forward)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0005: 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_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: 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_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_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_005b: 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_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_0068: 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_0076: 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_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_0095: 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_00a6: 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)
		Vector3 val = Vector3.Cross(Vector3.up, forward);
		Vector3 val2 = ((Vector3)(ref val)).normalized;
		if (((Vector3)(ref val2)).sqrMagnitude < 0.001f)
		{
			val2 = Vector3.right;
		}
		float num = Mathf.Cos((float)Math.PI * 19f / 90f);
		float num2 = Mathf.Sin((float)Math.PI * 19f / 90f);
		Vector3 val3 = -forward;
		Vector3 val4 = tip + (val3 * num + val2 * num2) * 0.55f;
		Vector3 val5 = tip + (val3 * num - val2 * num2) * 0.55f;
		lr.positionCount = 3;
		lr.SetPosition(0, val4);
		lr.SetPosition(1, tip);
		lr.SetPosition(2, val5);
	}

	private void ClearPath()
	{
		_smoothedPath = null;
		_segLengths = null;
		_totalLength = 0f;
		if ((Object)(object)_line != (Object)null)
		{
			_line.positionCount = 0;
		}
		HideArrows();
	}

	private void EnsureLineRenderer()
	{
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Expected O, but got Unknown
		//IL_0097: 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_00bc: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)_line != (Object)null))
		{
			GameObject val = new GameObject("CapsulePathRenderer");
			Object.DontDestroyOnLoad((Object)(object)val);
			_line = val.AddComponent<LineRenderer>();
			_line.useWorldSpace = true;
			_line.loop = false;
			_line.widthMultiplier = 0.09f;
			_line.positionCount = 0;
			_line.numCapVertices = 4;
			_line.numCornerVertices = 8;
			((Renderer)_line).shadowCastingMode = (ShadowCastingMode)0;
			((Renderer)_line).receiveShadows = false;
			((Renderer)_line).material = BuildLineMaterial(PathColor);
			_line.startColor = PathColor;
			_line.endColor = PathColor;
			_line.textureMode = (LineTextureMode)0;
			_line.alignment = (LineAlignment)0;
			((Renderer)_line).enabled = _pathVisible;
		}
	}

	private void EnsureArrows()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Expected O, but got Unknown
		//IL_008a: 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)
		if (_arrows.Count < 8)
		{
			Material sharedMaterial = BuildLineMaterial(ArrowColor);
			for (int i = _arrows.Count; i < 8; i++)
			{
				GameObject val = new GameObject($"CapsuleArrow_{i}");
				Object.DontDestroyOnLoad((Object)val);
				LineRenderer val2 = val.AddComponent<LineRenderer>();
				val2.useWorldSpace = true;
				val2.positionCount = 3;
				val2.widthMultiplier = 0.22f;
				val2.numCapVertices = 2;
				val2.numCornerVertices = 4;
				((Renderer)val2).shadowCastingMode = (ShadowCastingMode)0;
				((Renderer)val2).receiveShadows = false;
				((Renderer)val2).sharedMaterial = sharedMaterial;
				val2.startColor = ArrowColor;
				val2.endColor = ArrowColor;
				val2.alignment = (LineAlignment)0;
				((Renderer)val2).enabled = false;
				_arrows.Add(val2);
			}
		}
	}

	private void SetArrowsVisible(bool visible)
	{
		bool enabled = visible && _smoothedPath != null && _totalLength > 0.1f;
		foreach (LineRenderer arrow in _arrows)
		{
			if ((Object)(object)arrow != (Object)null)
			{
				((Renderer)arrow).enabled = enabled;
			}
		}
	}

	private void HideArrows()
	{
		foreach (LineRenderer arrow in _arrows)
		{
			if ((Object)(object)arrow != (Object)null)
			{
				((Renderer)arrow).enabled = false;
			}
		}
	}

	private Material BuildLineMaterial(Color color)
	{
		//IL_0035: 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_0042: Expected O, but got Unknown
		Shader val = Shader.Find("Sprites/Default") ?? Shader.Find("Universal Render Pipeline/Unlit");
		if ((Object)(object)val == (Object)null)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)"[CapsulePath] No usable shader found; path will not render.");
			return null;
		}
		return new Material(val)
		{
			color = color
		};
	}

	private void ShowStatus(string text)
	{
		_statusText = text;
		_statusShownAt = Time.unscaledTime;
	}

	private void OnGUI()
	{
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		//IL_0091: Expected O, but got Unknown
		//IL_008c: 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_0093: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Unknown result type (might be due to invalid IL or missing references)
		//IL_0118: 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_017b: 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_01b1: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_01d2: 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)
		if (!string.IsNullOrEmpty(_statusText) && ShowStatusHud)
		{
			float num = Time.unscaledTime - _statusShownAt;
			if (!(num < 0f) && !(num > 3.2f))
			{
				float num2 = ((num > 2.6f) ? Mathf.Clamp01((3.2f - num) / 0.6f) : 1f);
				EnsureStatusStyle();
				float num3 = Mathf.Round((float)Screen.height * 0.012f);
				float num4 = _statusStyle.fontSize;
				Vector2 val = _statusStyle.CalcSize(new GUIContent(_statusText));
				float num5 = val.x + num4 + num3 * 3f;
				float num6 = Mathf.Max(val.y, num4) + num3 * 2f;
				float num7 = Mathf.Round((float)Screen.width * 0.03f);
				float num8 = Mathf.Round((float)Screen.height * 0.5f - num6 * 0.5f);
				Color color = GUI.color;
				GUI.color = new Color(0f, 0f, 0f, 0.66f * num2);
				GUI.DrawTexture(new Rect(num7, num8, num5, num6), (Texture)(object)_statusTex);
				GUI.color = ((_smoothedPath != null && _pathVisible) ? new Color(0.2f, 1f, 0.3f, num2) : new Color(0.6f, 0.6f, 0.6f, num2));
				GUI.DrawTexture(new Rect(num7 + num3, num8 + (num6 - num4) * 0.5f, num4, num4), (Texture)(object)_statusTex);
				GUI.color = new Color(1f, 1f, 1f, num2);
				GUI.Label(new Rect(num7 + num3 * 2f + num4, num8, val.x + num3, num6), _statusText, _statusStyle);
				GUI.color = color;
			}
		}
	}

	private void EnsureStatusStyle()
	{
		//IL_0011: 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)
		//IL_0023: Expected O, but got Unknown
		//IL_002b: 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_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_005c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0068: Expected O, but got Unknown
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)_statusTex == (Object)null)
		{
			_statusTex = new Texture2D(1, 1)
			{
				hideFlags = (HideFlags)61
			};
			_statusTex.SetPixel(0, 0, Color.white);
			_statusTex.Apply();
		}
		if (_statusStyle == null)
		{
			_statusStyle = new GUIStyle
			{
				alignment = (TextAnchor)3,
				fontStyle = (FontStyle)1,
				richText = false
			};
			_statusStyle.normal.textColor = Color.white;
		}
		_statusStyle.fontSize = Mathf.Clamp(Mathf.RoundToInt((float)Screen.height * 0.022f), 12, 40);
	}

	private static bool TryGetLocalAvatarPosition(Player local, out Vector3 position, out string source)
	{
		//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_0007: 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_0049: 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_0054: 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_005e: 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_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_003a: 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_0081: 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)
		try
		{
			Vector3 val = local.HeadPosition();
			RaycastHit val2 = default(RaycastHit);
			if (Physics.Raycast(val, Vector3.down, ref val2, 3f, -5, (QueryTriggerInteraction)1))
			{
				position = ((RaycastHit)(ref val2)).point + Vector3.up * 0.1f;
				source = "HeadPosition+groundRay";
			}
			else
			{
				position = val + Vector3.down * 1.5f;
				source = "HeadPosition-1.5m";
			}
			return true;
		}
		catch
		{
		}
		if ((Object)(object)local != (Object)null)
		{
			position = ((Component)local).transform.position;
			source = "transform.position";
			return true;
		}
		position = default(Vector3);
		source = "none";
		return false;
	}

	private static bool TrySampleToNavMesh(ref Vector3 position)
	{
		//IL_0001: 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)
		NavMeshHit val = default(NavMeshHit);
		if (!NavMesh.SamplePosition(position, ref val, 4f, -1))
		{
			return false;
		}
		position = ((NavMeshHit)(ref val)).position;
		return true;
	}
}
internal static class PluginInfo
{
	public const string GUID = "com.local.capsulepath";

	public const string Name = "Capsule Path";

	public const string Version = "0.3.0";
}
[ContentWarningSetting]
public class CapsulePathRecalculateKeySetting : KeyCodeSetting, IExposedSetting
{
	protected override KeyCode GetDefaultKey()
	{
		return (KeyCode)107;
	}

	public SettingCategory GetSettingCategory()
	{
		return (SettingCategory)4;
	}

	public string GetDisplayName()
	{
		return "[CapsulePath] Recalculate path key";
	}
}
[ContentWarningSetting]
public class CapsulePathToggleKeySetting : KeyCodeSetting, IExposedSetting
{
	protected override KeyCode GetDefaultKey()
	{
		return (KeyCode)111;
	}

	public SettingCategory GetSettingCategory()
	{
		return (SettingCategory)4;
	}

	public string GetDisplayName()
	{
		return "[CapsulePath] Toggle path key";
	}
}
[ContentWarningSetting]
public class CapsulePathHideFromCameraSetting : BoolSetting, IExposedSetting
{
	protected override bool GetDefaultValue()
	{
		return true;
	}

	public override void ApplyValue()
	{
	}

	public SettingCategory GetSettingCategory()
	{
		return (SettingCategory)4;
	}

	public string GetDisplayName()
	{
		return "[CapsulePath] Hide path in camera footage";
	}
}
[ContentWarningSetting]
public class CapsulePathShowStatusSetting : BoolSetting, IExposedSetting
{
	protected override bool GetDefaultValue()
	{
		return true;
	}

	public override void ApplyValue()
	{
	}

	public SettingCategory GetSettingCategory()
	{
		return (SettingCategory)4;
	}

	public string GetDisplayName()
	{
		return "[CapsulePath] Show on-screen status";
	}
}