Decompiled source of JetpackHMD v1.2.1

JetpackHMD.dll

Decompiled 6 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using LethalConfig;
using LethalConfig.ConfigItems;
using LethalConfig.ConfigItems.Options;
using Microsoft.CodeAnalysis;
using TMPro;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Rumi")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+aa4ed3d2398535d4afad1f8a9f9a33ecf65dabfd")]
[assembly: AssemblyProduct("JetpackHMD")]
[assembly: AssemblyTitle("JetpackHMD")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace Rumi.JetpackHMD
{
	[BepInPlugin("Rumi.JetpackHMD", "JetpackHMD", "1.2.1")]
	public class JetpackHMD : BaseUnityPlugin
	{
		public const string modGuid = "Rumi.JetpackHMD";

		public const string modName = "JetpackHMD";

		public const string modVersion = "1.2.1";

		private static Assembly? _currentAssembly;

		private static string? _assemblyName;

		public const string mainAssetBundleName = "JetpackHMD";

		public static Assembly currentAssembly => _currentAssembly ?? (_currentAssembly = Assembly.GetExecutingAssembly());

		public static string assemblyName => _assemblyName ?? (_assemblyName = currentAssembly.FullName.Split(',')[0]);

		public static ManualLogSource? logger { get; private set; }

		public static ConfigFile? config { get; private set; }

		public static JetpackHMDConfig? uiConfig { get; private set; }

		public static Harmony harmony { get; } = new Harmony("Rumi.JetpackHMD");


		public static JetpackHMDManager? manager { get; private set; }

		public static AssetBundle? mainAssetBundle { get; private set; }

		private void Awake()
		{
			logger = ((BaseUnityPlugin)this).Logger;
			config = ((BaseUnityPlugin)this).Config;
			ManualLogSource? obj = logger;
			if (obj != null)
			{
				obj.LogInfo((object)"Start loading plugin...");
			}
			ManualLogSource? obj2 = logger;
			if (obj2 != null)
			{
				obj2.LogInfo((object)"Config Loading...");
			}
			try
			{
				uiConfig = new JetpackHMDConfig(config);
			}
			catch (Exception ex)
			{
				uiConfig = null;
				ManualLogSource? obj3 = logger;
				if (obj3 != null)
				{
					obj3.LogWarning((object)ex);
				}
				ManualLogSource? obj4 = logger;
				if (obj4 != null)
				{
					obj4.LogWarning((object)"Failed to load config file\nSettings will be loaded with defaults!");
				}
			}
			ManualLogSource? obj5 = logger;
			if (obj5 != null)
			{
				obj5.LogInfo((object)"Asset Bundle Loading...");
			}
			if (mainAssetBundle == null)
			{
				mainAssetBundle = LoadMainAssetBundle();
			}
			ManualLogSource? obj6 = logger;
			if (obj6 != null)
			{
				obj6.LogInfo((object)"PlayerControllerB Patch...");
			}
			harmony.PatchAll(typeof(JetpackHMDPatches));
			ManualLogSource? obj7 = logger;
			if (obj7 != null)
			{
				obj7.LogInfo((object)"OnSceneRelayLoaded Event registration...");
			}
			SceneManager.sceneLoaded += OnSceneRelayLoaded;
			ManualLogSource? obj8 = logger;
			if (obj8 != null)
			{
				obj8.LogInfo((object)"Plugin JetpackHMD is loaded!");
			}
		}

		private static void OnSceneRelayLoaded(Scene scene, LoadSceneMode loadMode)
		{
			if (((Scene)(ref scene)).name == "SampleSceneRelay")
			{
				UILoad();
			}
		}

		public static void UILoad()
		{
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: 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)
			JetpackHMDManager.MetaData metaData = default(JetpackHMDManager.MetaData);
			metaData.getEnableEvent = delegate
			{
				if ((Object)(object)JetpackHMDPatches.playerControllerB != (Object)null && JetpackHMDPatches.playerControllerB.jetpackControls)
				{
					JetpackHMDConfig? jetpackHMDConfig = uiConfig;
					if (jetpackHMDConfig == null || jetpackHMDConfig.enableTulipSnakes)
					{
						return true;
					}
					if (JetpackHMDPatches.playerControllerB.isHoldingObject)
					{
						return JetpackHMDPatches.playerControllerB.currentlyHeldObjectServer is JetpackItem;
					}
					return false;
				}
				return false;
			};
			metaData.getEnableWarningEvent = () => (Object)(object)JetpackHMDPatches.playerControllerB != (Object)null && JetpackHMDPatches.playerControllerB.jetpackControls && JetpackHMDPatches.playerControllerB.isHoldingObject && JetpackHMDPatches.playerControllerB.currentlyHeldObjectServer is JetpackItem;
			metaData.getScaleEvent = () => uiConfig?.scale ?? 1.5f;
			metaData.color = Color32.op_Implicit(new Color32((byte)(uiConfig?.colorR ?? 0), (byte)(uiConfig?.colorG ?? 255), (byte)(uiConfig?.colorB ?? 0), (byte)(uiConfig?.colorA ?? 255)));
			metaData.roll = new JetpackHMDRoll.MetaData
			{
				getTargetTransform = GetPlayerTransform
			};
			metaData.pitchMeter = new JetpackHMDPitchMeter.MetaData
			{
				getTargetTransform = GetPlayerTransform,
				posSpacing = (uiConfig?.pitchMeterPosSpacing ?? 75f),
				numberSpacing = (uiConfig?.pitchMeterNumberSpacing ?? 10),
				minusPitchMeterPrefab = LoadPrefab("Minus Pitch Meter"),
				plusPitchMeterPrefab = LoadPrefab("Plus Pitch Meter")
			};
			metaData.speedText = new JetpackHMDSpeedText.MetaData
			{
				getSpeedEvent = GetSpeed,
				multiplier = (uiConfig?.speedometerMultiplier ?? 1f)
			};
			metaData.speedometer = new JetpackHMDSpeedometer.MetaData
			{
				getSpeedEvent = GetSpeed,
				multiplier = (uiConfig?.speedometerMultiplier ?? 1f),
				numberSpacing = (uiConfig?.speedometerNumberSpacing ?? 10),
				speedMeterPrefab = LoadPrefab("Speedometer")
			};
			metaData.altitude = new JetpackHMDAltitude.MetaData
			{
				getTargetTransform = GetPlayerTransform,
				multiplier = (uiConfig?.altimeterMultiplier ?? 1f)
			};
			metaData.altimeter = new JetpackHMDAltimeter.MetaData
			{
				getTargetTransform = GetPlayerTransform,
				multiplier = (uiConfig?.altimeterMultiplier ?? 1f),
				numberSpacing = (uiConfig?.altimeterNumberSpacing ?? 10),
				altimeterPrefab = LoadPrefab("Altimeter")
			};
			metaData.headingIndicator = new JetpackHMDHeadingIndicator.MetaData
			{
				getTargetTransform = GetPlayerTransform
			};
			metaData.accelerationIndicator = new JetpackHMDAccelerationIndicator.MetaData
			{
				getSpeedEvent = () => ((Object)(object)JetpackHMDPatches.playerControllerB != (Object)null) ? ((Vector3)(ref JetpackHMDPatches.playerControllerB.externalForces)).magnitude : 0f,
				multiplier = (uiConfig?.speedometerMultiplier ?? 1f)
			};
			metaData.verticalSpeedIndicator = new JetpackHMDVerticalSpeedIndicator.MetaData
			{
				getSpeedEvent = () => ((Object)(object)JetpackHMDPatches.playerControllerB != (Object)null) ? JetpackHMDPatches.playerControllerB.thisController.velocity.y : 0f,
				multiplier = (uiConfig?.speedometerMultiplier ?? 1f)
			};
			JetpackHMDManager.MetaData metaData2 = metaData;
			GameObject val = GameObject.Find("IngamePlayerHUD");
			GameObject val2 = LoadPrefab("Jetpack HMD");
			if ((Object)(object)val == (Object)null)
			{
				ManualLogSource? obj = logger;
				if (obj != null)
				{
					obj.LogFatal((object)"lethalHUD is null");
				}
			}
			else if ((Object)(object)val2 == (Object)null)
			{
				ManualLogSource? obj2 = logger;
				if (obj2 != null)
				{
					obj2.LogFatal((object)"jetpackHMDGameObject == null");
				}
			}
			else
			{
				if ((Object)(object)manager == (Object)null)
				{
					manager = Object.Instantiate<GameObject>(val2, val.transform).AddComponent<JetpackHMDManager>();
				}
				manager.Init(metaData2);
			}
			static Transform? GetPlayerTransform()
			{
				if (!((Object)(object)JetpackHMDPatches.playerControllerB != (Object)null))
				{
					return null;
				}
				return ((Component)JetpackHMDPatches.playerControllerB).transform;
			}
			static float GetSpeed()
			{
				//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)
				if ((Object)(object)JetpackHMDPatches.playerControllerB != (Object)null)
				{
					Vector3 velocity = JetpackHMDPatches.playerControllerB.thisController.velocity;
					return ((Vector3)(ref velocity)).magnitude;
				}
				return 0f;
			}
		}

		private static GameObject? LoadPrefab(string prefabName)
		{
			try
			{
				if ((Object)(object)mainAssetBundle == (Object)null)
				{
					ManualLogSource? obj = logger;
					if (obj != null)
					{
						obj.LogError((object)$"{mainAssetBundle} is null");
					}
					return null;
				}
				return mainAssetBundle.LoadAsset<GameObject>(prefabName);
			}
			catch (Exception ex)
			{
				ManualLogSource? obj2 = logger;
				if (obj2 != null)
				{
					obj2.LogError((object)ex);
				}
				ManualLogSource? obj3 = logger;
				if (obj3 != null)
				{
					obj3.LogError((object)("\"" + prefabName + "\" Prefab load failure"));
				}
				return null;
			}
		}

		public static AssetBundle? LoadMainAssetBundle()
		{
			string text = "Rumi.JetpackHMD.JetpackHMD";
			try
			{
				using Stream stream = currentAssembly.GetManifestResourceStream(text);
				return AssetBundle.LoadFromStream(stream);
			}
			catch (Exception ex)
			{
				ManualLogSource? obj = logger;
				if (obj != null)
				{
					obj.LogFatal((object)ex);
				}
				ManualLogSource? obj2 = logger;
				if (obj2 != null)
				{
					obj2.LogFatal((object)("Main Asset bundle loading failed (Path : " + text));
				}
				return null;
			}
		}
	}
	public class JetpackHMDConfig
	{
		private readonly ConfigEntry<float> _scale;

		private readonly ConfigEntry<float> _pitchMeterPosSpacing;

		private readonly ConfigEntry<int> _pitchMeterNumberSpacing;

		private readonly ConfigEntry<float> _speedometerMultiplier;

		private readonly ConfigEntry<int> _speedometerNumberSpacing;

		private readonly ConfigEntry<float> _altimeterMultiplier;

		private readonly ConfigEntry<int> _altimeterNumberSpacing;

		private readonly ConfigEntry<int> _colorR;

		private readonly ConfigEntry<int> _colorG;

		private readonly ConfigEntry<int> _colorB;

		private readonly ConfigEntry<int> _colorA;

		private readonly ConfigEntry<bool> _enableTulipSnakes;

		public float scale
		{
			get
			{
				return _scale?.Value ?? 0.75f;
			}
			set
			{
				_scale.Value = value;
			}
		}

		public float pitchMeterPosSpacing
		{
			get
			{
				return _pitchMeterPosSpacing?.Value ?? 75f;
			}
			set
			{
				_pitchMeterPosSpacing.Value = value;
			}
		}

		public int pitchMeterNumberSpacing
		{
			get
			{
				return _pitchMeterNumberSpacing?.Value ?? 10;
			}
			set
			{
				_pitchMeterNumberSpacing.Value = value;
			}
		}

		public float speedometerMultiplier
		{
			get
			{
				return _speedometerMultiplier?.Value ?? 1f;
			}
			set
			{
				_speedometerMultiplier.Value = value;
			}
		}

		public int speedometerNumberSpacing
		{
			get
			{
				return _speedometerNumberSpacing?.Value ?? 10;
			}
			set
			{
				_speedometerNumberSpacing.Value = value;
			}
		}

		public float altimeterMultiplier
		{
			get
			{
				return _altimeterMultiplier?.Value ?? 1f;
			}
			set
			{
				_altimeterMultiplier.Value = value;
			}
		}

		public int altimeterNumberSpacing
		{
			get
			{
				return _altimeterNumberSpacing?.Value ?? 10;
			}
			set
			{
				_altimeterNumberSpacing.Value = value;
			}
		}

		public int colorR
		{
			get
			{
				return _colorR?.Value ?? 0;
			}
			set
			{
				_colorR.Value = value;
			}
		}

		public int colorG
		{
			get
			{
				return _colorG?.Value ?? 255;
			}
			set
			{
				_colorG.Value = value;
			}
		}

		public int colorB
		{
			get
			{
				return _colorB?.Value ?? 0;
			}
			set
			{
				_colorB.Value = value;
			}
		}

		public int colorA
		{
			get
			{
				return _colorA?.Value ?? 255;
			}
			set
			{
				_colorA.Value = value;
			}
		}

		public bool enableTulipSnakes
		{
			get
			{
				return _enableTulipSnakes?.Value ?? true;
			}
			set
			{
				_enableTulipSnakes.Value = value;
			}
		}

		public JetpackHMDConfig(ConfigFile config)
		{
			_scale = config.Bind<float>("General", "Scale", 1.5f, "Adjust the overall UI scale");
			_colorR = config.Bind<int>("General", "R Color", 0, "");
			_colorR.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_colorG = config.Bind<int>("General", "G Color", 255, "");
			_colorG.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_colorB = config.Bind<int>("General", "B Color", 0, "");
			_colorB.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_colorA = config.Bind<int>("General", "A Color", 255, "");
			_colorA.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_enableTulipSnakes = config.Bind<bool>("General", "Tulip Snake Enable", true, "Displays UI even when flying as Tulip Snake");
			_enableTulipSnakes.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_pitchMeterPosSpacing = config.Bind<float>("Pitch Meter", "Pos Spacing", 75f, (ConfigDescription)null);
			_pitchMeterPosSpacing.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_pitchMeterNumberSpacing = config.Bind<int>("Pitch Meter", "Number Spacing", 10, (ConfigDescription)null);
			_pitchMeterNumberSpacing.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_speedometerMultiplier = config.Bind<float>("Speedometer", "Multiplier", 1f, (ConfigDescription)null);
			_speedometerMultiplier.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_speedometerNumberSpacing = config.Bind<int>("Speedometer", "Number Spacing", 10, (ConfigDescription)null);
			_speedometerNumberSpacing.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_altimeterMultiplier = config.Bind<float>("Altimeter", "Multiplier", 1f, (ConfigDescription)null);
			_altimeterMultiplier.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			_altimeterNumberSpacing = config.Bind<int>("Altimeter", "Number Spacing", 10, (ConfigDescription)null);
			_altimeterNumberSpacing.SettingChanged += delegate
			{
				JetpackHMD.UILoad();
			};
			try
			{
				LethalConfigPatch();
			}
			catch (FileNotFoundException ex)
			{
				ManualLogSource? logger = JetpackHMD.logger;
				if (logger != null)
				{
					logger.LogError((object)ex);
				}
				ManualLogSource? logger2 = JetpackHMD.logger;
				if (logger2 != null)
				{
					logger2.LogWarning((object)"Lethal Config Patch Fail! (This is not a bug and occurs when LethalConfig is not present)");
				}
			}
			catch (Exception ex2)
			{
				ManualLogSource? logger3 = JetpackHMD.logger;
				if (logger3 != null)
				{
					logger3.LogError((object)ex2);
				}
				ManualLogSource? logger4 = JetpackHMD.logger;
				if (logger4 != null)
				{
					logger4.LogError((object)"Lethal Config Patch Fail!");
				}
			}
		}

		private void LethalConfigPatch()
		{
			//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_0016: Expected O, but got Unknown
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0021: Expected O, but got Unknown
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//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_0044: Expected O, but got Unknown
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Expected O, but got Unknown
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: Expected O, but got Unknown
			//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_0072: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Expected O, but got Unknown
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Expected O, but got Unknown
			//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_00a0: Expected O, but got Unknown
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Expected O, but got Unknown
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Expected O, but got Unknown
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d9: Expected O, but got Unknown
			//IL_00d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Expected O, but got Unknown
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ea: Expected O, but got Unknown
			//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fb: Expected O, but got Unknown
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			//IL_0111: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Expected O, but got Unknown
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0128: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_012d: Expected O, but got Unknown
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Expected O, but got Unknown
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Expected O, but got Unknown
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Expected O, but got Unknown
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Expected O, but got Unknown
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Expected O, but got Unknown
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0188: Expected O, but got Unknown
			//IL_0183: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Expected O, but got Unknown
			//IL_0193: Unknown result type (might be due to invalid IL or missing references)
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019f: Expected O, but got Unknown
			//IL_019f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a7: Expected O, but got Unknown
			//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Expected O, but got Unknown
			//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Expected O, but got Unknown
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ce: Expected O, but got Unknown
			//IL_01ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d9: Expected O, but got Unknown
			//IL_01d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e5: Expected O, but got Unknown
			//IL_01e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ea: Expected O, but got Unknown
			//IL_01f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Expected O, but got Unknown
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0204: Expected O, but got Unknown
			//IL_0204: Unknown result type (might be due to invalid IL or missing references)
			//IL_0210: Expected O, but got Unknown
			//IL_020b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0215: Expected O, but got Unknown
			ConfigEntry<float> obj = _scale;
			FloatSliderOptions val = new FloatSliderOptions();
			((BaseRangeOptions<float>)val).Min = 0.5f;
			((BaseRangeOptions<float>)val).Max = 2f;
			((BaseOptions)val).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj, val));
			ConfigEntry<int> obj2 = _colorR;
			IntSliderOptions val2 = new IntSliderOptions();
			((BaseRangeOptions<int>)val2).Min = 0;
			((BaseRangeOptions<int>)val2).Max = 255;
			((BaseOptions)val2).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj2, val2));
			ConfigEntry<int> obj3 = _colorG;
			IntSliderOptions val3 = new IntSliderOptions();
			((BaseRangeOptions<int>)val3).Min = 0;
			((BaseRangeOptions<int>)val3).Max = 255;
			((BaseOptions)val3).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj3, val3));
			ConfigEntry<int> obj4 = _colorB;
			IntSliderOptions val4 = new IntSliderOptions();
			((BaseRangeOptions<int>)val4).Min = 0;
			((BaseRangeOptions<int>)val4).Max = 255;
			((BaseOptions)val4).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj4, val4));
			ConfigEntry<int> obj5 = _colorA;
			IntSliderOptions val5 = new IntSliderOptions();
			((BaseRangeOptions<int>)val5).Min = 0;
			((BaseRangeOptions<int>)val5).Max = 255;
			((BaseOptions)val5).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj5, val5));
			LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(_enableTulipSnakes, false));
			ConfigEntry<float> obj6 = _pitchMeterPosSpacing;
			FloatSliderOptions val6 = new FloatSliderOptions();
			((BaseRangeOptions<float>)val6).Min = 10f;
			((BaseRangeOptions<float>)val6).Max = 200f;
			((BaseOptions)val6).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj6, val6));
			ConfigEntry<int> obj7 = _pitchMeterNumberSpacing;
			IntSliderOptions val7 = new IntSliderOptions();
			((BaseRangeOptions<int>)val7).Min = 1;
			((BaseRangeOptions<int>)val7).Max = 360;
			((BaseOptions)val7).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj7, val7));
			ConfigEntry<float> obj8 = _speedometerMultiplier;
			FloatSliderOptions val8 = new FloatSliderOptions();
			((BaseRangeOptions<float>)val8).Min = 0.125f;
			((BaseRangeOptions<float>)val8).Max = 4f;
			((BaseOptions)val8).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj8, val8));
			ConfigEntry<int> obj9 = _speedometerNumberSpacing;
			IntSliderOptions val9 = new IntSliderOptions();
			((BaseRangeOptions<int>)val9).Min = 1;
			((BaseRangeOptions<int>)val9).Max = 100;
			((BaseOptions)val9).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj9, val9));
			ConfigEntry<float> obj10 = _altimeterMultiplier;
			FloatSliderOptions val10 = new FloatSliderOptions();
			((BaseRangeOptions<float>)val10).Min = 0.125f;
			((BaseRangeOptions<float>)val10).Max = 4f;
			((BaseOptions)val10).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(obj10, val10));
			ConfigEntry<int> obj11 = _altimeterNumberSpacing;
			IntSliderOptions val11 = new IntSliderOptions();
			((BaseRangeOptions<int>)val11).Min = 1;
			((BaseRangeOptions<int>)val11).Max = 100;
			((BaseOptions)val11).RequiresRestart = false;
			LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(obj11, val11));
		}
	}
	internal class JetpackHMDPatches
	{
		public static PlayerControllerB? playerControllerB;

		[HarmonyPatch(typeof(PlayerControllerB), "Awake")]
		[HarmonyPostfix]
		private static void PlayerControllerB_Awake_Postfix(ref PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject) && __instance.isPlayerControlled && !__instance.isPlayerDead)
			{
				playerControllerB = __instance;
			}
		}

		[HarmonyPatch(typeof(PlayerControllerB), "Update")]
		[HarmonyPostfix]
		private static void PlayerControllerB_Update_Postfix(ref PlayerControllerB __instance)
		{
			if (((NetworkBehaviour)__instance).IsOwner && (!((NetworkBehaviour)__instance).IsServer || __instance.isHostPlayerObject) && __instance.isPlayerControlled && !__instance.isPlayerDead)
			{
				playerControllerB = __instance;
			}
		}
	}
	public sealed class JetpackHMDAccelerationIndicator : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<float> getSpeedEvent;

			public float multiplier;
		}

		private float multiplier = 1f;

		private TMP_Text? text;

		private float realSpeed;

		private event Func<float>? getSpeedEvent;

		public void Init(MetaData metaData)
		{
			this.getSpeedEvent = metaData.getSpeedEvent;
			multiplier = metaData.multiplier;
			text = ((Component)this).GetComponent<TMP_Text>();
		}

		private void Update()
		{
			if (!((Object)(object)text == (Object)null))
			{
				realSpeed = Mathf.Lerp(realSpeed, (this.getSpeedEvent?.Invoke() * multiplier).GetValueOrDefault(), 7.5f * Time.smoothDeltaTime);
				text.text = "<voffset=2.5><size=11>ACC</size></voffset> " + Mathf.Round(realSpeed);
			}
		}
	}
	public sealed class JetpackHMDAltimeter : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<Transform?> getTargetTransform;

			public float multiplier;

			public int numberSpacing;

			public GameObject? altimeterPrefab;
		}

		private float multiplier;

		private const float posSpacing = 66f;

		private int numberSpacing;

		private float altitude;

		private event Func<Transform?>? getTargetTransform;

		public void Init(MetaData metaData)
		{
			//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_00a6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)metaData.altimeterPrefab == (Object)null)
			{
				return;
			}
			Transform child = ((Component)this).transform.GetChild("Offset");
			if ((Object)(object)child == (Object)null)
			{
				return;
			}
			this.getTargetTransform = metaData.getTargetTransform;
			multiplier = metaData.multiplier;
			numberSpacing = metaData.numberSpacing;
			for (int i = 1; i < child.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)child.GetChild(i)).gameObject);
			}
			if (numberSpacing > 0)
			{
				float num = 0f;
				for (int j = numberSpacing; j <= 500; j += numberSpacing)
				{
					RectTransform val = (RectTransform)Object.Instantiate<GameObject>(metaData.altimeterPrefab, child).transform;
					val.anchoredPosition = new Vector2(0f, num);
					((Component)((Transform)val).GetChild(0)).GetComponent<TMP_Text>().text = j.ToString();
					num += 66f;
				}
			}
		}

		private void LateUpdate()
		{
			//IL_0097: 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)
			Transform val = this.getTargetTransform?.Invoke();
			if (!((Object)(object)val == (Object)null))
			{
				altitude = Mathf.Lerp(altitude, Mathf.Clamp((val.GetAltitude() * multiplier) ?? 500f, 0f, 500f), 7.5f * Time.smoothDeltaTime);
				((RectTransform)((Component)this).transform).anchoredPosition = new Vector2(0f, (0f - altitude) * 66f / (float)numberSpacing);
			}
		}
	}
	public sealed class JetpackHMDAltitude : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<Transform?> getTargetTransform;

			public float multiplier;
		}

		private float multiplier = 1f;

		private Transform? digit100;

		private Transform? digit10;

		private Transform? digit1;

		private Transform? digit0_01;

		private float realAltitude;

		private event Func<Transform?>? getTargetTransform;

		public void Init(MetaData metaData)
		{
			Transform child = ((Component)this).transform.GetChild("Offset");
			if (!((Object)(object)child == (Object)null))
			{
				this.getTargetTransform = metaData.getTargetTransform;
				multiplier = metaData.multiplier;
				digit100 = child.GetChild(0);
				digit10 = child.GetChild(1);
				digit1 = child.GetChild(2);
				digit0_01 = child.GetChild(3);
			}
		}

		private void LateUpdate()
		{
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			//IL_0150: 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_0160: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Expected O, but got Unknown
			//IL_01e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_01c5: 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_0221: 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_026b: Unknown result type (might be due to invalid IL or missing references)
			Transform val = this.getTargetTransform?.Invoke();
			if (!((Object)(object)val == (Object)null) && !((Object)(object)digit100 == (Object)null) && !((Object)(object)digit10 == (Object)null) && !((Object)(object)digit1 == (Object)null) && !((Object)(object)digit0_01 == (Object)null))
			{
				realAltitude = Mathf.Lerp(realAltitude, Mathf.Clamp((val.GetAltitude() * multiplier) ?? 999f, 0f, 999f), 7.5f * Time.smoothDeltaTime);
				RectTransform val2 = (RectTransform)digit100;
				float num = realAltitude * 0.01f;
				num = Mathf.Floor(num) + Mathf.Clamp01((Mathf.Repeat(num, 1f) - 0.99f) * 100f);
				if (num >= 1f)
				{
					val2.anchoredPosition = new Vector2(-22f, (0f - (Mathf.Repeat(num, 10f) + 2f)) * 17.7f);
				}
				else
				{
					val2.anchoredPosition = new Vector2(-22f, (0f - num) * 17.7f);
				}
				RectTransform val3 = (RectTransform)digit10;
				float num2 = realAltitude * 0.1f;
				num2 = Mathf.Floor(num2) + Mathf.Clamp01((Mathf.Repeat(num2, 1f) - 0.9f) * 10f);
				if (num2 >= 1f)
				{
					val3.anchoredPosition = new Vector2(-11f, (0f - (Mathf.Repeat(num2, 10f) + 2f)) * 17.7f);
				}
				else
				{
					val3.anchoredPosition = new Vector2(-11f, (0f - num2) * 17.7f);
				}
				((RectTransform)digit1).anchoredPosition = new Vector2(0f, (0f - Mathf.Repeat(Mathf.Clamp(realAltitude, 0f, float.MaxValue), 10f)) * 17.7f);
				RectTransform val4 = (RectTransform)digit0_01;
				float num3 = Mathf.Clamp(realAltitude * 5f, 0f, float.MaxValue);
				val4.anchoredPosition = new Vector2(11.5f, (0f - Mathf.Repeat(num3, 5f)) * 7.965f);
			}
		}
	}
	public sealed class JetpackHMDHeadingIndicator : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<Transform?> getTargetTransform;
		}

		private float realYaw;

		private event Func<Transform?>? getTargetTransform;

		public void Init(MetaData metaData)
		{
			this.getTargetTransform = metaData.getTargetTransform;
		}

		private void Update()
		{
			//IL_001e: 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_0037: 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_003e: 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_004f: 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_0069: 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_007e: 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_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)
			//IL_00db: 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_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: 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_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: 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_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: 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)
			Transform val = this.getTargetTransform?.Invoke();
			if (!((Object)(object)val == (Object)null))
			{
				Quaternion val2 = val.rotation * Quaternion.Euler(-90f, 0f, 0f);
				if (val.eulerAngles.x <= 0.1f)
				{
					val2 *= Quaternion.Euler(0.01f, 0f, 0f);
				}
				else if (val.eulerAngles.x >= 359.9f)
				{
					val2 *= Quaternion.Euler(-0.01f, 0f, 0f);
				}
				if (val.eulerAngles.x >= 180f && val.eulerAngles.x <= 180.1f)
				{
					val2 *= Quaternion.Euler(0.01f, 0f, 0f);
				}
				else if (val.eulerAngles.x >= 179.9f && val.eulerAngles.x <= 180f)
				{
					val2 *= Quaternion.Euler(-0.01f, 0f, 0f);
				}
				realYaw = Mathf.LerpAngle(realYaw, Mathf.Atan2(2f * (val2.y * val2.w + val2.x * val2.z), 1f - 2f * (val2.x * val2.x + val2.y * val2.y)) * 57.29578f, 7.5f * Time.smoothDeltaTime);
				((Component)this).transform.localEulerAngles = new Vector3(0f, 0f, realYaw);
			}
		}
	}
	public sealed class JetpackHMDManager : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<bool> getEnableEvent;

			public Func<bool> getEnableWarningEvent;

			public Func<float> getScaleEvent;

			public JetpackHMDRoll.MetaData roll;

			public JetpackHMDPitchMeter.MetaData pitchMeter;

			public JetpackHMDSpeedText.MetaData speedText;

			public JetpackHMDSpeedometer.MetaData speedometer;

			public JetpackHMDAltitude.MetaData altitude;

			public JetpackHMDAltimeter.MetaData altimeter;

			public JetpackHMDAccelerationIndicator.MetaData accelerationIndicator;

			public JetpackHMDVerticalSpeedIndicator.MetaData verticalSpeedIndicator;

			public JetpackHMDHeadingIndicator.MetaData headingIndicator;

			public Color color;
		}

		private CanvasGroup? canvasGroup;

		private CanvasGroup? jetpackMeterContainer;

		private bool jetpackWarningCompatibleDisable = true;

		private MetaData metaData;

		private void OnEnable()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			Canvas.preWillRenderCanvases += new WillRenderCanvases(ScaleUpdate);
		}

		private void OnDisable()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			Canvas.preWillRenderCanvases -= new WillRenderCanvases(ScaleUpdate);
		}

		private void Update()
		{
			if ((Object)(object)canvasGroup == (Object)null)
			{
				return;
			}
			Func<bool> getEnableEvent = metaData.getEnableEvent;
			if (getEnableEvent != null && getEnableEvent())
			{
				canvasGroup.alpha = Mathf.Lerp(canvasGroup.alpha, 1f, 4f * Time.smoothDeltaTime);
				if (canvasGroup.alpha >= 0.99f)
				{
					canvasGroup.alpha = 1f;
				}
				Transform child = ((Component)this).transform.GetChild(0);
				if ((Object)(object)child != (Object)null && !((Component)child).gameObject.activeSelf)
				{
					((Component)child).gameObject.SetActive(true);
				}
			}
			else
			{
				canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, 0f, 4f * Time.smoothDeltaTime);
				Transform child2 = ((Component)this).transform.GetChild(0);
				if (canvasGroup.alpha <= 0f && (Object)(object)child2 != (Object)null && ((Component)child2).gameObject.activeSelf)
				{
					((Component)child2).gameObject.SetActive(false);
				}
			}
		}

		private void LateUpdate()
		{
			//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_0088: 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_009d: 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_00b2: 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_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ff: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)canvasGroup == (Object)null)
			{
				return;
			}
			if (!jetpackWarningCompatibleDisable)
			{
				GameObject val = null;
				GameObject[] array = Object.FindObjectsByType<GameObject>((FindObjectsInactive)1, (FindObjectsSortMode)0);
				foreach (GameObject val2 in array)
				{
					if (((Object)val2).name == "jetpackMeterContainer")
					{
						val = val2;
					}
				}
				if ((Object)(object)val != (Object)null)
				{
					jetpackMeterContainer = val.GetComponent<CanvasGroup>();
					if ((Object)(object)jetpackMeterContainer != (Object)null)
					{
						RectTransform val3 = (RectTransform)((Component)jetpackMeterContainer).transform;
						val3.anchorMin = new Vector2(0.59f, 0.5f);
						val3.anchorMax = new Vector2(0.59f, 0.5f);
						val3.sizeDelta = new Vector2(18f, 78.5f);
						val3.pivot = new Vector2(0f, 0.5f);
					}
				}
				jetpackWarningCompatibleDisable = true;
			}
			if (!((Object)(object)jetpackMeterContainer != (Object)null))
			{
				return;
			}
			if (canvasGroup.alpha > 0f && !((Component)jetpackMeterContainer).gameObject.activeSelf)
			{
				((Component)jetpackMeterContainer).gameObject.SetActive(true);
			}
			Func<bool> getEnableWarningEvent = metaData.getEnableWarningEvent;
			if (getEnableWarningEvent != null && getEnableWarningEvent())
			{
				jetpackMeterContainer.alpha = Mathf.Lerp(jetpackMeterContainer.alpha, 1f, 4f * Time.smoothDeltaTime);
				if (jetpackMeterContainer.alpha >= 0.99f)
				{
					jetpackMeterContainer.alpha = 1f;
				}
			}
			else
			{
				jetpackMeterContainer.alpha = Mathf.MoveTowards(jetpackMeterContainer.alpha, 0f, 4f * Time.smoothDeltaTime);
			}
			float num = Mathf.Clamp(metaData.getScaleEvent?.Invoke() ?? 1f, 0.5f, 2f) * 0.5f;
			((RectTransform)((Component)jetpackMeterContainer).transform).anchoredPosition = new Vector2(72f * num, 0f);
		}

		private void ScaleUpdate()
		{
			//IL_0037: 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_003d: 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_004d: 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_0058: 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_0060: 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_0070: 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_0073: 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)
			float num = Mathf.Clamp(metaData.getScaleEvent?.Invoke() ?? 1f, 0.5f, 2f) * 0.5f;
			RectTransform val = (RectTransform)((Component)this).transform;
			((Transform)val).localScale = Vector3.one * num;
			Rect rect = ((RectTransform)((Transform)val).parent).rect;
			Vector3 val2 = Vector2.op_Implicit(((Rect)(ref rect)).size / num);
			val.SetSizeWithCurrentAnchors((Axis)0, val2.x);
			val.SetSizeWithCurrentAnchors((Axis)1, val2.y);
		}

		public void Init(MetaData metaData)
		{
			//IL_0328: Unknown result type (might be due to invalid IL or missing references)
			this.metaData = metaData;
			canvasGroup = ((Component)this).GetComponent<CanvasGroup>();
			jetpackWarningCompatibleDisable = false;
			ScaleUpdate();
			Transform child = ((Component)this).transform.GetChild(0);
			if ((Object)(object)child != (Object)null)
			{
				Transform child2 = child.GetChild("Roll Mask");
				if ((Object)(object)child2 != (Object)null)
				{
					Transform child3 = child2.GetChild("Roll");
					if ((Object)(object)child3 != (Object)null)
					{
						JetpackHMDRoll jetpackHMDRoll = default(JetpackHMDRoll);
						if (!((Component)child3).gameObject.TryGetComponent<JetpackHMDRoll>(ref jetpackHMDRoll))
						{
							jetpackHMDRoll = ((Component)child3).gameObject.AddComponent<JetpackHMDRoll>();
						}
						jetpackHMDRoll.Init(metaData.roll);
						Transform child4 = child3.GetChild("Pitch Meter");
						if ((Object)(object)child4 != (Object)null)
						{
							JetpackHMDPitchMeter jetpackHMDPitchMeter = default(JetpackHMDPitchMeter);
							if (!((Component)child4).gameObject.TryGetComponent<JetpackHMDPitchMeter>(ref jetpackHMDPitchMeter))
							{
								jetpackHMDPitchMeter = ((Component)child4).gameObject.AddComponent<JetpackHMDPitchMeter>();
							}
							jetpackHMDPitchMeter.Init(metaData.pitchMeter);
						}
					}
				}
				Transform child5 = child.GetChild("Speed Mask");
				if ((Object)(object)child5 != (Object)null)
				{
					Transform child6 = child5.GetChild("Speed Text");
					if ((Object)(object)child6 != (Object)null)
					{
						JetpackHMDSpeedText jetpackHMDSpeedText = default(JetpackHMDSpeedText);
						if (!((Component)child6).gameObject.TryGetComponent<JetpackHMDSpeedText>(ref jetpackHMDSpeedText))
						{
							jetpackHMDSpeedText = ((Component)child6).gameObject.AddComponent<JetpackHMDSpeedText>();
						}
						jetpackHMDSpeedText.Init(metaData.speedText);
					}
					Transform child7 = child5.GetChild("Speedometer Mask");
					if ((Object)(object)child7 != (Object)null)
					{
						Transform child8 = child7.GetChild("Speedometer");
						if ((Object)(object)child8 != (Object)null)
						{
							JetpackHMDSpeedometer jetpackHMDSpeedometer = default(JetpackHMDSpeedometer);
							if (!((Component)child8).gameObject.TryGetComponent<JetpackHMDSpeedometer>(ref jetpackHMDSpeedometer))
							{
								jetpackHMDSpeedometer = ((Component)child8).gameObject.AddComponent<JetpackHMDSpeedometer>();
							}
							jetpackHMDSpeedometer.Init(metaData.speedometer);
						}
					}
				}
				Transform child9 = child.GetChild("Altitude Mask");
				if ((Object)(object)child9 != (Object)null)
				{
					Transform child10 = child9.GetChild("Altitude");
					if ((Object)(object)child10 != (Object)null)
					{
						JetpackHMDAltitude jetpackHMDAltitude = default(JetpackHMDAltitude);
						if (!((Component)child10).gameObject.TryGetComponent<JetpackHMDAltitude>(ref jetpackHMDAltitude))
						{
							jetpackHMDAltitude = ((Component)child10).gameObject.AddComponent<JetpackHMDAltitude>();
						}
						jetpackHMDAltitude.Init(metaData.altitude);
					}
					Transform child11 = child9.GetChild("Altimeter Mask");
					if ((Object)(object)child11 != (Object)null)
					{
						Transform child12 = child11.GetChild("Altimeter");
						if ((Object)(object)child12 != (Object)null)
						{
							JetpackHMDAltimeter jetpackHMDAltimeter = default(JetpackHMDAltimeter);
							if (!((Component)child12).gameObject.TryGetComponent<JetpackHMDAltimeter>(ref jetpackHMDAltimeter))
							{
								jetpackHMDAltimeter = ((Component)child12).gameObject.AddComponent<JetpackHMDAltimeter>();
							}
							jetpackHMDAltimeter.Init(metaData.altimeter);
						}
					}
				}
				Transform child13 = child.GetChild("Acceleration Indicator");
				if ((Object)(object)child13 != (Object)null)
				{
					JetpackHMDAccelerationIndicator jetpackHMDAccelerationIndicator = default(JetpackHMDAccelerationIndicator);
					if (!((Component)child13).TryGetComponent<JetpackHMDAccelerationIndicator>(ref jetpackHMDAccelerationIndicator))
					{
						jetpackHMDAccelerationIndicator = ((Component)child13).gameObject.AddComponent<JetpackHMDAccelerationIndicator>();
					}
					jetpackHMDAccelerationIndicator.Init(metaData.accelerationIndicator);
				}
				Transform child14 = child.GetChild("Vertical Speed Indicator");
				if ((Object)(object)child14 != (Object)null)
				{
					JetpackHMDVerticalSpeedIndicator jetpackHMDVerticalSpeedIndicator = default(JetpackHMDVerticalSpeedIndicator);
					if (!((Component)child14).TryGetComponent<JetpackHMDVerticalSpeedIndicator>(ref jetpackHMDVerticalSpeedIndicator))
					{
						jetpackHMDVerticalSpeedIndicator = ((Component)child14).gameObject.AddComponent<JetpackHMDVerticalSpeedIndicator>();
					}
					jetpackHMDVerticalSpeedIndicator.Init(metaData.verticalSpeedIndicator);
				}
				Transform child15 = child.GetChild("Heading Indicator Mask");
				if ((Object)(object)child15 != (Object)null)
				{
					Transform child16 = child15.GetChild("Heading Indicator");
					if ((Object)(object)child16 != (Object)null)
					{
						JetpackHMDHeadingIndicator jetpackHMDHeadingIndicator = default(JetpackHMDHeadingIndicator);
						if (!((Component)child16).gameObject.TryGetComponent<JetpackHMDHeadingIndicator>(ref jetpackHMDHeadingIndicator))
						{
							jetpackHMDHeadingIndicator = ((Component)child16).gameObject.AddComponent<JetpackHMDHeadingIndicator>();
						}
						jetpackHMDHeadingIndicator.Init(metaData.headingIndicator);
					}
				}
			}
			Graphic[] componentsInChildren = ((Component)this).GetComponentsInChildren<Graphic>(true);
			for (int i = 0; i < componentsInChildren.Length; i++)
			{
				componentsInChildren[i].color = metaData.color;
			}
		}
	}
	public sealed class JetpackHMDPitchMeter : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<Transform?> getTargetTransform;

			public float posSpacing;

			public int numberSpacing;

			public GameObject? minusPitchMeterPrefab;

			public GameObject? plusPitchMeterPrefab;
		}

		private float posSpacing;

		private int numberSpacing;

		private float pitch;

		private event Func<Transform?>? getTargetTransform;

		public void Init(MetaData metaData)
		{
			//IL_00ad: 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_0115: 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 ((Object)(object)metaData.minusPitchMeterPrefab == (Object)null || (Object)(object)metaData.plusPitchMeterPrefab == (Object)null)
			{
				return;
			}
			this.getTargetTransform = metaData.getTargetTransform;
			posSpacing = metaData.posSpacing;
			numberSpacing = metaData.numberSpacing;
			for (int i = 1; i < ((Component)this).transform.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)((Component)this).transform.GetChild(i)).gameObject);
			}
			if (metaData.numberSpacing > 0)
			{
				float num = 0f;
				int num2 = 0;
				while (num2 < 180)
				{
					num += posSpacing;
					num2 += numberSpacing;
					GameObject obj = Object.Instantiate<GameObject>(metaData.minusPitchMeterPrefab, ((Component)this).transform);
					((RectTransform)obj.transform).anchoredPosition = new Vector2(0f, 0f - num);
					TMP_Text component = ((Component)obj.transform.GetChild(0)).GetComponent<TMP_Text>();
					TMP_Text component2 = ((Component)obj.transform.GetChild(1)).GetComponent<TMP_Text>();
					component.text = num2.ToString();
					component2.text = num2.ToString();
					GameObject obj2 = Object.Instantiate<GameObject>(metaData.plusPitchMeterPrefab, ((Component)this).transform);
					((RectTransform)obj2.transform).anchoredPosition = new Vector2(0f, num);
					TMP_Text component3 = ((Component)obj2.transform.GetChild(0)).GetComponent<TMP_Text>();
					TMP_Text component4 = ((Component)obj2.transform.GetChild(1)).GetComponent<TMP_Text>();
					component3.text = num2.ToString();
					component4.text = num2.ToString();
				}
			}
		}

		private void LateUpdate()
		{
			//IL_001e: 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_0037: 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_003e: 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_004f: 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_0069: 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_00a4: 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_00b1: 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_008e: 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)
			//IL_0135: 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)
			Transform val = this.getTargetTransform?.Invoke();
			if (!((Object)(object)val == (Object)null))
			{
				Quaternion val2 = val.rotation * Quaternion.Euler(-90f, 0f, 0f);
				if (val.eulerAngles.x <= 0.1f)
				{
					val2 *= Quaternion.Euler(0.04f, 0f, 0f);
				}
				else if (val.eulerAngles.x >= 359.9f)
				{
					val2 *= Quaternion.Euler(-0.04f, 0f, 0f);
				}
				float num = Mathf.Asin(2f * (val2.x * val2.w - val2.y * val2.z)) * 57.29578f;
				if ((num + 90f >= -0.08f && num + 90f <= 0.08f) || !float.IsNormal(pitch))
				{
					pitch = Mathf.LerpAngle(pitch, -90f, 7.5f * Time.smoothDeltaTime);
				}
				else
				{
					pitch = Mathf.LerpAngle(pitch, num, 7.5f * Time.smoothDeltaTime);
				}
				((RectTransform)((Component)this).transform).anchoredPosition = new Vector2(0f, pitch * posSpacing / (float)numberSpacing);
			}
		}
	}
	public sealed class JetpackHMDRoll : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<Transform?> getTargetTransform;
		}

		private float roll;

		private event Func<Transform?>? getTargetTransform;

		public void Init(MetaData metaData)
		{
			this.getTargetTransform = metaData.getTargetTransform;
		}

		private void LateUpdate()
		{
			//IL_001e: 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_0037: 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_003e: 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_004f: 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_0069: 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_007e: 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_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)
			//IL_00db: 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_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: 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_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: 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_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d7: 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_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: 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_01d1: Unknown result type (might be due to invalid IL or missing references)
			Transform val = this.getTargetTransform?.Invoke();
			if (!((Object)(object)val == (Object)null))
			{
				Quaternion val2 = val.rotation * Quaternion.Euler(-90f, 0f, 0f);
				if (val.eulerAngles.x <= 0.1f)
				{
					val2 *= Quaternion.Euler(0.01f, 0f, 0f);
				}
				else if (val.eulerAngles.x >= 359.9f)
				{
					val2 *= Quaternion.Euler(-0.01f, 0f, 0f);
				}
				if (val.eulerAngles.x >= 180f && val.eulerAngles.x <= 180.1f)
				{
					val2 *= Quaternion.Euler(0.01f, 0f, 0f);
				}
				else if (val.eulerAngles.x >= 179.9f && val.eulerAngles.x <= 180f)
				{
					val2 *= Quaternion.Euler(-0.01f, 0f, 0f);
				}
				roll = Mathf.LerpAngle(roll, (0f - Mathf.Atan2(2f * (val2.x * val2.y + val2.z * val2.w), 1f - 2f * (val2.x * val2.x + val2.z * val2.z))) * 57.29578f, 7.5f * Time.smoothDeltaTime);
				if ((roll >= 0.01f && roll <= 0.01f) || !float.IsNormal(roll))
				{
					roll = 0f;
				}
				((Component)this).transform.localEulerAngles = new Vector3(0f, 0f, roll);
			}
		}
	}
	public sealed class JetpackHMDSpeedometer : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<float> getSpeedEvent;

			public float multiplier;

			public int numberSpacing;

			public GameObject? speedMeterPrefab;
		}

		private float multiplier;

		private const float posSpacing = 66f;

		private int numberSpacing;

		private float speed;

		private event Func<float>? getSpeedEvent;

		public void Init(MetaData metaData)
		{
			//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_00a6: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)metaData.speedMeterPrefab == (Object)null)
			{
				return;
			}
			Transform child = ((Component)this).transform.GetChild("Offset");
			if ((Object)(object)child == (Object)null)
			{
				return;
			}
			this.getSpeedEvent = metaData.getSpeedEvent;
			multiplier = metaData.multiplier;
			numberSpacing = metaData.numberSpacing;
			for (int i = 1; i < child.childCount; i++)
			{
				Object.Destroy((Object)(object)((Component)child.GetChild(i)).gameObject);
			}
			if (numberSpacing > 0)
			{
				float num = 0f;
				for (int j = numberSpacing; j <= 200; j += numberSpacing)
				{
					RectTransform val = (RectTransform)Object.Instantiate<GameObject>(metaData.speedMeterPrefab, child).transform;
					val.anchoredPosition = new Vector2(0f, num);
					((Component)((Transform)val).GetChild(0)).GetComponent<TMP_Text>().text = j.ToString();
					num += 66f;
				}
			}
		}

		private void LateUpdate()
		{
			//IL_0082: 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)
			speed = Mathf.Lerp(speed, Mathf.Clamp((this.getSpeedEvent?.Invoke() * multiplier).GetValueOrDefault(), 0f, 200f), 7.5f * Time.smoothDeltaTime);
			((RectTransform)((Component)this).transform).anchoredPosition = new Vector2(0f, (0f - speed) * 66f / (float)numberSpacing);
		}
	}
	public sealed class JetpackHMDSpeedText : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<float> getSpeedEvent;

			public float multiplier;
		}

		private float multiplier = 1f;

		private Transform? digit100;

		private Transform? digit10;

		private Transform? digit1;

		private float realSpeed;

		private event Func<float>? getSpeedEvent;

		public void Init(MetaData metaData)
		{
			Transform child = ((Component)this).transform.GetChild("Offset");
			if (!((Object)(object)child == (Object)null))
			{
				this.getSpeedEvent = metaData.getSpeedEvent;
				multiplier = metaData.multiplier;
				digit100 = child.GetChild(0);
				digit10 = child.GetChild(1);
				digit1 = child.GetChild(2);
			}
		}

		private void LateUpdate()
		{
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Expected O, but got Unknown
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0110: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0142: Expected O, but got Unknown
			//IL_01bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a0: 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_01fc: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)digit100 == (Object)null) && !((Object)(object)digit10 == (Object)null) && !((Object)(object)digit1 == (Object)null))
			{
				realSpeed = Mathf.Lerp(realSpeed, Mathf.Clamp((this.getSpeedEvent?.Invoke() * multiplier).GetValueOrDefault(), 0f, 999f), 7.5f * Time.smoothDeltaTime);
				RectTransform val = (RectTransform)digit100;
				float num = realSpeed * 0.01f;
				num = Mathf.Floor(num) + Mathf.Clamp01((Mathf.Repeat(num, 1f) - 0.99f) * 100f);
				if (num >= 1f)
				{
					val.anchoredPosition = new Vector2(-22f, (0f - (Mathf.Repeat(num, 10f) + 2f)) * 17.7f);
				}
				else
				{
					val.anchoredPosition = new Vector2(-22f, (0f - num) * 17.7f);
				}
				RectTransform val2 = (RectTransform)digit10;
				float num2 = realSpeed * 0.1f;
				num2 = Mathf.Floor(num2) + Mathf.Clamp01((Mathf.Repeat(num2, 1f) - 0.9f) * 10f);
				if (num2 >= 1f)
				{
					val2.anchoredPosition = new Vector2(-11f, (0f - (Mathf.Repeat(num2, 10f) + 2f)) * 17.7f);
				}
				else
				{
					val2.anchoredPosition = new Vector2(-11f, (0f - num2) * 17.7f);
				}
				((RectTransform)digit1).anchoredPosition = new Vector2(0f, (0f - Mathf.Repeat(Mathf.Clamp(realSpeed, 0f, float.MaxValue), 10f)) * 17.7f);
			}
		}
	}
	public static class JetpackHMDUtility
	{
		public static Transform? GetChild(this Transform transform, string name)
		{
			for (int i = 0; i < transform.childCount; i++)
			{
				Transform child = transform.GetChild(i);
				if ((Object)(object)child != (Object)null && ((Object)child).name == name)
				{
					return child;
				}
			}
			return null;
		}

		public static float? GetAltitude(this Transform transform)
		{
			//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_0058: 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_0087: 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)
			RaycastHit[] array = Physics.RaycastAll(transform.position, Vector3.down, 1000f, ~LayerMask.GetMask(new string[6] { "Player", "Enemies", "LineOfSight", "PlaceableShipObjects", "PhysicsObject", "MapHazards" }), (QueryTriggerInteraction)1);
			if (array.Length != 0)
			{
				float y2 = transform.position.y;
				RaycastHit val = array.Aggregate((RaycastHit x, RaycastHit y) => (!(((RaycastHit)(ref x)).point.y > ((RaycastHit)(ref y)).point.y)) ? y : x);
				return y2 - ((RaycastHit)(ref val)).point.y;
			}
			return null;
		}
	}
	public sealed class JetpackHMDVerticalSpeedIndicator : MonoBehaviour
	{
		public struct MetaData
		{
			public Func<float> getSpeedEvent;

			public float multiplier;
		}

		private float multiplier = 1f;

		private TMP_Text? text;

		private float realSpeed;

		private event Func<float>? getSpeedEvent;

		public void Init(MetaData metaData)
		{
			this.getSpeedEvent = metaData.getSpeedEvent;
			multiplier = metaData.multiplier;
			text = ((Component)this).GetComponent<TMP_Text>();
		}

		private void Update()
		{
			if (!((Object)(object)text == (Object)null))
			{
				realSpeed = Mathf.Lerp(realSpeed, (this.getSpeedEvent?.Invoke() * multiplier).GetValueOrDefault(), 7.5f * Time.smoothDeltaTime);
				text.text = Mathf.Round(realSpeed) + " VS";
			}
		}
	}
}