Decompiled source of AutoPilotPlus v0.2.9

AutoPilotPlus.dll

Decompiled 14 hours ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using AutoPilotPlus.Patches;
using AutoPilotPlus.UI;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CruiseAssistPlus;
using CruiseAssistPlus.Api;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[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("AutoPilotPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.2.9.0")]
[assembly: AssemblyInformationalVersion("0.2.9+22a084def477c044c536750bd4def8b544161951")]
[assembly: AssemblyProduct("AutoPilotPlus")]
[assembly: AssemblyTitle("AutoPilotPlus")]
[assembly: AssemblyVersion("0.2.9.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace AutoPilotPlus
{
	public class PilotExtension : INavigatorExtension
	{
		public enum PState
		{
			Inactive,
			Active
		}

		public static PState State = PState.Inactive;

		public static bool InputSailSpeedUp;

		public static double EnergyPer;

		public static double Speed;

		public static bool HasWarper;

		public static string LastWarpReason = "";

		private static bool _energyStalled;

		public static bool Launching;

		private static bool _orbitLaunch;

		public static string LaunchStatus = "";

		private static bool Armed
		{
			get
			{
				if (AutoPilotPlusPlugin.MasterEnabled != null && AutoPilotPlusPlugin.MasterEnabled.Value)
				{
					return State == PState.Active;
				}
				return false;
			}
		}

		private static bool HasTarget
		{
			get
			{
				if (CruiseAssistPlusPlugin.SelectTargetStar == null && CruiseAssistPlusPlugin.SelectTargetPlanet == null && CruiseAssistPlusPlugin.TargetStar == null)
				{
					return CruiseAssistPlusPlugin.TargetPlanet != null;
				}
				return true;
			}
		}

		public string PanelLabel => "AutoPilot";

		public void OnTargetChanged(int astroId)
		{
			if (astroId == 0)
			{
				State = PState.Inactive;
				InputSailSpeedUp = false;
				_orbitLaunch = false;
				CruiseAssistPlusPlugin.SuppressAutoArrival = false;
			}
			else
			{
				State = (AutoPilotPlusPlugin.AutoStart.Value ? PState.Active : PState.Inactive);
				PlanetData localPlanet = GameMain.localPlanet;
				Player mainPlayer = GameMain.mainPlayer;
				CruiseAssistPlusPlugin.SuppressAutoArrival = (_orbitLaunch = localPlanet != null && CruiseAssistPlusPlugin.SelectTargetPlanet != null && CruiseAssistPlusPlugin.SelectTargetPlanet.id == localPlanet.id && (mainPlayer == null || !mainPlayer.sailing));
			}
			AutoPilotPlusPlugin.Dbg($"target changed astroId={astroId} -> state={State} orbitLaunch={_orbitLaunch}");
		}

		public void SetInactive()
		{
			State = PState.Inactive;
			InputSailSpeedUp = false;
			Launching = false;
			_orbitLaunch = false;
			CruiseAssistPlusPlugin.SuppressAutoArrival = false;
		}

		public static void ToggleArmed()
		{
			State = ((State != PState.Active) ? PState.Active : PState.Inactive);
			if (State == PState.Inactive)
			{
				InputSailSpeedUp = false;
			}
		}

		public bool OperateWalk(PlayerMove_Walk m)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			if (((PlayerAction)m).player == null || (int)((PlayerAction)m).player.movementState != 0)
			{
				return false;
			}
			if (!LaunchAllowed(((PlayerAction)m).player))
			{
				return false;
			}
			ArmForLaunch();
			ZeroGravity(((PlayerAction)m).controller);
			InputSailSpeedUp = false;
			if (m.mecha == null || m.mecha.thrusterLevel < 1)
			{
				LaunchStatus = "need Thruster tech to launch";
				if (GameMain.gameTick % 30 == 0L)
				{
					AutoPilotPlusPlugin.Dbg($"launch blocked: thrusterLevel={((m.mecha != null) ? m.mecha.thrusterLevel : (-1))}");
				}
				return false;
			}
			Launching = true;
			LaunchStatus = "launching…";
			if (GameMain.gameTick % 30 == 0L)
			{
				AutoPilotPlusPlugin.Dbg("launch: Walk -> SwitchToFly");
			}
			m.SwitchToFly();
			return true;
		}

		public bool OperateDrift(PlayerMove_Drift m)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Invalid comparison between Unknown and I4
			if (((PlayerAction)m).player == null || (int)((PlayerAction)m).player.movementState != 1)
			{
				return false;
			}
			if (!LaunchAllowed(((PlayerAction)m).player))
			{
				return false;
			}
			ArmForLaunch();
			ZeroGravity(((PlayerAction)m).controller);
			InputSailSpeedUp = false;
			Launching = true;
			((PlayerAction)m).controller.input0.z = 1f;
			LaunchStatus = "launching…";
			return true;
		}

		public bool OperateFly(PlayerMove_Fly m)
		{
			//IL_000e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0014: Invalid comparison between Unknown and I4
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			if (((PlayerAction)m).player == null || (int)((PlayerAction)m).player.movementState != 2)
			{
				return false;
			}
			if (!Launching || !LaunchAllowed(((PlayerAction)m).player))
			{
				return false;
			}
			ArmForLaunch();
			ZeroGravity(((PlayerAction)m).controller);
			InputSailSpeedUp = false;
			if (m.navigation != null)
			{
				m.navigation.navigating = false;
			}
			m.targetAltitude = Mathf.Max(m.targetAltitude, 60f);
			((PlayerAction)m).controller.input1.y = 1f;
			((PlayerAction)m).controller.input0.y = 1f;
			LaunchStatus = $"launching (alt {m.currentAltitude:0} m)";
			if (GameMain.gameTick % 30 == 0L)
			{
				AutoPilotPlusPlugin.Dbg($"launch climb: alt={m.currentAltitude:0} horz={((PlayerAction)m).controller.horzSpeed:0.0} " + $"thruster={((m.mecha != null) ? m.mecha.thrusterLevel : (-1))}");
			}
			if (m.currentAltitude > 45f && m.mecha != null && m.mecha.thrusterLevel >= 2)
			{
				((PlayerAction)m).controller.movementStateInFrame = (EMovementState)3;
				((PlayerAction)m).controller.actionSail.ResetSailState();
				GameCamera.instance.SyncForSailMode();
				GameScenarioLogic gameScenario = GameMain.gameScenario;
				if (gameScenario != null)
				{
					gameScenario.NotifyOnSailModeEnter();
				}
				AutoPilotPlusPlugin.Dbg($"launch: Fly -> Sail (alt={m.currentAltitude:0} horz={((PlayerAction)m).controller.horzSpeed:0.0})");
			}
			return true;
		}

		private static bool LaunchAllowed(Player player)
		{
			if (player != null && AutoPilotPlusPlugin.MasterEnabled.Value && AutoPilotPlusPlugin.AutoLaunch.Value)
			{
				return HasTarget;
			}
			return false;
		}

		private static void ArmForLaunch()
		{
			if (State != PState.Active)
			{
				State = PState.Active;
				AutoPilotPlusPlugin.Dbg("ground launch -> armed");
			}
		}

		private static void ZeroGravity(PlayerController controller)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_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)
			if ((Object)(object)controller != (Object)null && AutoPilotPlusPlugin.IgnoreGravity.Value)
			{
				controller.universalGravity = VectorLF3.zero;
				controller.localGravity = Vector3.zero;
			}
		}

		public bool OperateSail(PlayerMove_Sail move)
		{
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fe: 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_02ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_02e2: Unknown result type (might be due to invalid IL or missing references)
			if (!Armed)
			{
				InputSailSpeedUp = false;
				return false;
			}
			Player player = ((PlayerAction)move).player;
			Mecha val = move.mecha ?? ((player != null) ? player.mecha : null);
			if (player == null || val == null)
			{
				Launching = false;
				return false;
			}
			if (!player.sailing)
			{
				return false;
			}
			EnergyPer = ((val.coreEnergyCap > 0.0) ? (val.coreEnergy / val.coreEnergyCap * 100.0) : 0.0);
			Speed = ((VectorLF3)(ref move.visual_uvel)).magnitude;
			HasWarper = val.HasWarper();
			if (player.warping)
			{
				Launching = false;
				return false;
			}
			if (!HasTarget)
			{
				InputSailSpeedUp = false;
				Launching = false;
				return false;
			}
			if (AutoPilotPlusPlugin.IgnoreGravity.Value)
			{
				player.controller.universalGravity = VectorLF3.zero;
				player.controller.localGravity = Vector3.zero;
			}
			PlanetData localPlanet = GameMain.localPlanet;
			VectorLF3 val2;
			double num;
			if (localPlanet != null)
			{
				val2 = player.uPosition - localPlanet.uPosition;
				num = ((VectorLF3)(ref val2)).magnitude - (double)localPlanet.realRadius;
			}
			else
			{
				num = double.MaxValue;
			}
			double num2 = num;
			bool flag = localPlanet == null || num2 > (double)AutoPilotPlusPlugin.SpaceAltitude.Value;
			if (_orbitLaunch)
			{
				return HandleOrbitLaunch(player, localPlanet, num2);
			}
			if (localPlanet != null && !flag && (CruiseAssistPlusPlugin.TargetPlanet == null || CruiseAssistPlusPlugin.TargetPlanet.id != localPlanet.id))
			{
				Launching = true;
				return ClimbToSpace(player, localPlanet, num2);
			}
			Launching = false;
			bool flag2 = EnergyReadyToBoost();
			InputSailSpeedUp = flag && flag2 && Speed < (double)AutoPilotPlusPlugin.MaxSpeed.Value;
			LaunchStatus = ((!flag2) ? $"low energy ({EnergyPer:0}%) — recharging" : (flag ? "cruising" : "approaching…"));
			if (GameMain.gameTick % 60 == 0L)
			{
				AutoPilotPlusPlugin.Dbg($"sail inSpace={flag} boost={InputSailSpeedUp} energy={EnergyPer:0}% " + $"speed={Speed:0} range={CruiseAssistPlusPlugin.TargetRange:0} onPlanet={localPlanet != null}");
			}
			if (localPlanet == null)
			{
				PlanetData targetPlanet = CruiseAssistPlusPlugin.TargetPlanet;
				if (targetPlanet != null)
				{
					double num3 = CruiseAssistPlusPlugin.TargetRange - (double)targetPlanet.realRadius;
					float value = AutoPilotPlusPlugin.ApproachBrakeRange.Value;
					if (num3 < (double)value)
					{
						InputSailSpeedUp = false;
						float value2 = AutoPilotPlusPlugin.ApproachSpeedCap.Value;
						float num4 = Mathf.Clamp((float)(num3 / (double)value) * (float)AutoPilotPlusPlugin.MaxSpeed.Value, value2, (float)AutoPilotPlusPlugin.MaxSpeed.Value);
						val2 = player.uVelocity;
						double magnitude = ((VectorLF3)(ref val2)).magnitude;
						if (magnitude > (double)num4)
						{
							player.uVelocity = VectorLF3.op_Implicit(VectorLF3.op_Implicit(player.uVelocity) * (float)((double)num4 / magnitude));
						}
						LaunchStatus = $"arriving — braking ({num3:0} m)";
						if (GameMain.gameTick % 30 == 0L)
						{
							AutoPilotPlusPlugin.Dbg($"approach brake range={num3:0} cap={num4:0} speed={magnitude:0}");
						}
						return false;
					}
				}
				TryWarp(move, player, val);
				return false;
			}
			return ApproachOrDepart(player, localPlanet);
		}

		private static bool EnergyReadyToBoost()
		{
			if (EnergyPer < (double)AutoPilotPlusPlugin.MinEnergyPer.Value)
			{
				_energyStalled = true;
			}
			else if (EnergyPer >= (double)AutoPilotPlusPlugin.ResumeEnergyPer.Value)
			{
				_energyStalled = false;
			}
			return !_energyStalled;
		}

		private bool HandleOrbitLaunch(Player player, PlanetData localPlanet, double altitude)
		{
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: 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_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: 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_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: 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)
			CruiseAssistPlusPlugin.SuppressAutoArrival = true;
			if (localPlanet != null && !(altitude >= (double)AutoPilotPlusPlugin.OrbitAltitude.Value))
			{
				Launching = true;
				InputSailSpeedUp = false;
				Vector3 val = VectorLF3.op_Implicit(player.uPosition - localPlanet.uPosition);
				Vector3 normalized = ((Vector3)(ref val)).normalized;
				float num = AutoPilotPlusPlugin.LaunchClimbSpeed.Value;
				float num2 = Mathf.Clamp01((float)(altitude / (double)Mathf.Max(1f, AutoPilotPlusPlugin.OrbitAltitude.Value)));
				float num3 = num * Mathf.Lerp(0.3f, 1f, Mathf.Clamp01(num2 / 0.5f));
				player.uVelocity = VectorLF3.op_Implicit(normalized * num3);
				LaunchStatus = $"launching to orbit… ({altitude:0} m)";
				if (GameMain.gameTick % 30 == 0L)
				{
					AutoPilotPlusPlugin.Dbg($"orbit climb alt={altitude:0} climbSpeed={num3:0}");
				}
				return true;
			}
			Launching = false;
			InputSailSpeedUp = false;
			VectorLF3 uVelocity = player.uVelocity;
			double magnitude = ((VectorLF3)(ref uVelocity)).magnitude;
			if (magnitude > 20.0)
			{
				player.uVelocity = VectorLF3.op_Implicit(VectorLF3.op_Implicit(player.uVelocity) * (float)(20.0 / magnitude));
			}
			LaunchStatus = "in orbit";
			AutoPilotPlusPlugin.Dbg($"orbit launch complete alt={altitude:0} -> hold + clear");
			_orbitLaunch = false;
			CruiseAssistPlusPlugin.SuppressAutoArrival = false;
			CruiseAssistPlusPlugin.ClearSelection();
			return true;
		}

		private bool ClimbToSpace(Player player, PlanetData localPlanet, double altitude)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_0041: 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_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_0078: 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_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)
			//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_00d0: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_0096: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			LaunchStatus = $"climbing to space… ({altitude:0} m)";
			InputSailSpeedUp = false;
			Vector3 val = VectorLF3.op_Implicit(player.uPosition - localPlanet.uPosition);
			Vector3 normalized = ((Vector3)(ref val)).normalized;
			val = VectorLF3.op_Implicit(CruiseAssistPlusPlugin.TargetUPos - player.uPosition);
			Vector3 normalized2 = ((Vector3)(ref val)).normalized;
			float num = Mathf.Clamp01((float)(altitude / (double)Mathf.Max(1f, AutoPilotPlusPlugin.SpaceAltitude.Value)));
			Vector3 val2 = Vector3.Slerp(normalized, normalized2, num * 0.75f);
			if (Vector3.Dot(val2, normalized) < 0.2f)
			{
				val = val2 + normalized;
				val2 = ((Vector3)(ref val)).normalized;
			}
			float num2 = (float)AutoPilotPlusPlugin.LaunchClimbSpeed.Value * Mathf.Lerp(0.3f, 1f, Mathf.Clamp01(num / 0.5f));
			player.uVelocity = VectorLF3.op_Implicit(val2 * num2);
			if (GameMain.gameTick % 60 == 0L)
			{
				AutoPilotPlusPlugin.Dbg($"climb-out alt={altitude:0} climbSpeed={num2:0} " + $"climbFrac={num:0.00} energy={EnergyPer:0}%");
			}
			return true;
		}

		private void TryWarp(PlayerMove_Sail move, Player player, Mecha mecha)
		{
			//IL_00d7: Unknown result type (might be due to invalid IL or missing references)
			StarData targetStar = CruiseAssistPlusPlugin.TargetStar;
			StarData localStar = GameMain.localStar;
			if (!AutoPilotPlusPlugin.LocalWarp.Value && localStar != null && (targetStar == null || targetStar.id == localStar.id))
			{
				LastWarpReason = "same-system";
				return;
			}
			double num = (float)AutoPilotPlusPlugin.WarpMinRangeAU.Value * AutoPilotPlusPlugin.UnitsPerAU.Value;
			if (CruiseAssistPlusPlugin.TargetRange < num)
			{
				LastWarpReason = "too close";
			}
			else if (Speed < (double)AutoPilotPlusPlugin.SpeedToWarp.Value)
			{
				LastWarpReason = "too slow";
			}
			else if (!HasWarper)
			{
				LastWarpReason = "no warper";
			}
			else if (mecha.coreEnergy <= mecha.warpStartPowerPerSpeed * (double)move.maxWarpSpeed)
			{
				LastWarpReason = "low energy";
			}
			else if (mecha.UseWarper())
			{
				player.warpCommand = true;
				VFAudio.Create("warp-begin", player.transform, Vector3.zero, true, 0, -1, -1L);
				LastWarpReason = "WARP!";
				AutoPilotPlusPlugin.Dbg("engaged warp");
			}
		}

		private static void SteerToward(Player player, VectorLF3 targetUPos)
		{
			//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_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: 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_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: 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_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)
			VectorLF3 uVelocity = player.uVelocity;
			double magnitude = ((VectorLF3)(ref uVelocity)).magnitude;
			if (!(magnitude < 1.0))
			{
				VectorLF3 val = targetUPos - player.uPosition;
				float num = Vector3.Angle(VectorLF3.op_Implicit(val), VectorLF3.op_Implicit(player.uVelocity));
				float num2 = AutoPilotPlusPlugin.ApproachTurnRate.Value / Mathf.Max(AutoPilotPlusPlugin.ApproachMinAngle.Value, num);
				player.uVelocity = VectorLF3.op_Implicit(Vector3.Slerp(VectorLF3.op_Implicit(player.uVelocity), VectorLF3.op_Implicit(((VectorLF3)(ref val)).normalized * magnitude), num2));
			}
		}

		private bool ApproachOrDepart(Player player, PlanetData localPlanet)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: 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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: 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_008f: 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_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: 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_015f: 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_016b: 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)
			VectorLF3 val = player.uPosition - localPlanet.uPosition;
			double num = ((VectorLF3)(ref val)).magnitude - (double)localPlanet.realRadius;
			float value = AutoPilotPlusPlugin.ApproachSpeedCap.Value;
			float value2 = AutoPilotPlusPlugin.MinClearance.Value;
			if (Speed > (double)value && num > (double)Math.Max(localPlanet.realRadius, value2))
			{
				SteerToward(player, CruiseAssistPlusPlugin.TargetUPos);
				return true;
			}
			VectorLF3 targetUPos = CruiseAssistPlusPlugin.TargetUPos;
			VectorLF3 val2 = targetUPos - localPlanet.uPosition;
			VectorLF3 val3 = ((Vector3.Angle(VectorLF3.op_Implicit(val), VectorLF3.op_Implicit(val2)) > 90f) ? val : (targetUPos - player.uPosition));
			double num2 = Math.Min(Speed, value);
			if (CruiseAssistPlusPlugin.TargetPlanet != null && CruiseAssistPlusPlugin.TargetPlanet.id == localPlanet.id && AutoPilotPlusPlugin.AutoLand.Value)
			{
				InputSailSpeedUp = false;
				num2 = Mathf.Clamp((float)num, 8f, value);
				if (num < (double)value2 * 0.25 && Speed < 20.0)
				{
					AutoPilotPlusPlugin.Dbg("auto-land: releasing control to game");
					return false;
				}
			}
			float num3 = Vector3.Angle(VectorLF3.op_Implicit(val3), VectorLF3.op_Implicit(player.uVelocity));
			float num4 = AutoPilotPlusPlugin.ApproachTurnRate.Value / Mathf.Max(AutoPilotPlusPlugin.ApproachMinAngle.Value, num3);
			player.uVelocity = VectorLF3.op_Implicit(Vector3.Slerp(VectorLF3.op_Implicit(player.uVelocity), VectorLF3.op_Implicit(((VectorLF3)(ref val3)).normalized * num2), num4));
			return true;
		}

		public void OnGUI()
		{
			PilotUI.OnGUI();
		}

		public void TogglePanel()
		{
			PilotUI.Visible = !PilotUI.Visible;
		}
	}
	[BepInPlugin("com.livinginstinkt.dsp.autopilotplus", "AutoPilotPlus", "0.2.9")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class AutoPilotPlusPlugin : BaseUnityPlugin
	{
		public const string Guid = "com.livinginstinkt.dsp.autopilotplus";

		public const string Name = "AutoPilotPlus";

		public const string Version = "0.2.9";

		internal static ManualLogSource Log;

		internal static AutoPilotPlusPlugin Instance;

		internal static ConfigEntry<bool> MasterEnabled;

		internal static ConfigEntry<bool> AutoStart;

		internal static ConfigEntry<int> MinEnergyPer;

		internal static ConfigEntry<int> ResumeEnergyPer;

		internal static ConfigEntry<int> LaunchClimbSpeed;

		internal static ConfigEntry<int> MaxSpeed;

		internal static ConfigEntry<int> WarpMinRangeAU;

		internal static ConfigEntry<int> SpeedToWarp;

		internal static ConfigEntry<bool> LocalWarp;

		internal static ConfigEntry<bool> IgnoreGravity;

		internal static ConfigEntry<bool> AutoLand;

		internal static ConfigEntry<bool> AutoLaunch;

		internal static ConfigEntry<bool> HidePanelWhenNotInSpace;

		internal static ConfigEntry<float> ApproachSpeedCap;

		internal static ConfigEntry<float> MinClearance;

		internal static ConfigEntry<float> ApproachTurnRate;

		internal static ConfigEntry<float> ApproachMinAngle;

		internal static ConfigEntry<float> UnitsPerAU;

		internal static ConfigEntry<int> WarperItemId;

		internal static ConfigEntry<float> SpaceAltitude;

		internal static ConfigEntry<float> ApproachBrakeRange;

		internal static ConfigEntry<float> OrbitAltitude;

		internal static ConfigEntry<bool> DebugLog;

		internal static ConfigEntry<bool> DebugWindow;

		private Harmony _harmony;

		private PilotExtension _extension;

		private void Awake()
		{
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Expected O, but got Unknown
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0126: Expected O, but got Unknown
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0158: Expected O, but got Unknown
			//IL_0188: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Expected O, but got Unknown
			//IL_0361: Unknown result type (might be due to invalid IL or missing references)
			//IL_036b: Expected O, but got Unknown
			//IL_039e: Unknown result type (might be due to invalid IL or missing references)
			//IL_03a8: Expected O, but got Unknown
			//IL_03fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0408: Expected O, but got Unknown
			Log = ((BaseUnityPlugin)this).Logger;
			Instance = this;
			MasterEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Master switch for AutoPilotPlus.");
			AutoStart = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AutoStart", true, "Arm autopilot automatically when a target is selected. When off, arm it from the AutoPilot window.");
			MinEnergyPer = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "MinEnergyPer", 20, new ConfigDescription("Stop boosting below this mecha core energy %.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			LaunchClimbSpeed = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "LaunchClimbSpeed", 250, new ConfigDescription("Top speed (units/s) the ground-launch uses to climb straight out of the gravity well to space — driven directly, WITHOUT boost, so it's as fast as possible on thrust alone. Ramps up to this as altitude builds.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(40, 2000), Array.Empty<object>()));
			ResumeEnergyPer = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "ResumeEnergyPer", 50, new ConfigDescription("After energy drops below MinEnergyPer, don't boost again until it recharges to this %. Prevents a stall/boost loop where boost restarts the instant energy crosses MinEnergyPer and immediately drains back to empty without building speed (leaves you frozen, drifting).", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 100), Array.Empty<object>()));
			MaxSpeed = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "MaxSpeed", 2000, new ConfigDescription("Sail boost speed cap.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(100, 5000), Array.Empty<object>()));
			WarpMinRangeAU = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "WarpMinRangeAU", 2, new ConfigDescription("Minimum distance (AU) to the target before warp is allowed.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 60), Array.Empty<object>()));
			SpeedToWarp = ((BaseUnityPlugin)this).Config.Bind<int>("Flight", "SpeedToWarp", 1200, new ConfigDescription("Minimum sail speed before warp engages.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(100, 5000), Array.Empty<object>()));
			LocalWarp = ((BaseUnityPlugin)this).Config.Bind<bool>("Flight", "LocalWarp", false, "Allow warp within the current star system.");
			IgnoreGravity = ((BaseUnityPlugin)this).Config.Bind<bool>("Flight", "IgnoreGravity", true, "Zero gravity while automating (cleaner take-off).");
			AutoLand = ((BaseUnityPlugin)this).Config.Bind<bool>("Flight", "AutoLand", true, "Decelerate and settle onto the destination planet on arrival.");
			AutoLaunch = ((BaseUnityPlugin)this).Config.Bind<bool>("Flight", "AutoLaunch", true, "When armed with a target while on the ground, auto-launch into orbit (Walk->Fly->Sail) and cruise to it. Needs Thruster tech.");
			HidePanelWhenNotInSpace = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "HidePanelWhenNotInSpace", false, "Auto-hide the AutoPilot+ window while walking/building on a planet; show it in space.");
			ApproachSpeedCap = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "ApproachSpeedCap", 120f, "Speed cap while manoeuvring near a planet.");
			MinClearance = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "MinClearance", 800f, "Altitude (units above surface) considered 'clear' of a planet.");
			ApproachTurnRate = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "ApproachTurnRate", 1.6f, "Slerp numerator for approach steering.");
			ApproachMinAngle = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "ApproachMinAngle", 10f, "Slerp angle floor for approach steering.");
			UnitsPerAU = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "UnitsPerAU", 40000f, "Game units per AU (used for the warp distance check).");
			WarperItemId = ((BaseUnityPlugin)this).Config.Bind<int>("Tuning", "WarperItemId", 1210, "Item id of the Space Warper.");
			SpaceAltitude = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "SpaceAltitude", 600f, "Altitude (m above surface) above which the mecha is considered 'in space' and may boost/thrust. Below this it coasts out on launch momentum to save energy.");
			ApproachBrakeRange = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "ApproachBrakeRange", 6000f, new ConfigDescription("Distance (m above the destination surface) at which the approach starts braking. Inside this range the mecha bleeds speed proportional to remaining distance so it settles into a slow high orbit instead of coasting in at cruise speed and crashing.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1000f, 40000f), Array.Empty<object>()));
			OrbitAltitude = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "OrbitAltitude", 1500f, new ConfigDescription("Target altitude (m above surface) for 'launch to orbit' — selecting the planet you're standing on climbs to roughly this altitude and holds there instead of flying off to another target.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(600f, 20000f), Array.Empty<object>()));
			DebugLog = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugLog", false, "Verbose per-tick autopilot logging (why warp did/didn't fire, etc).");
			DebugWindow = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugWindow", false, "Show the AutoPilot debug overlay.");
			PilotUI.LoadFromConfig(((BaseUnityPlugin)this).Config);
			_harmony = new Harmony("com.livinginstinkt.dsp.autopilotplus");
			_harmony.PatchAll(typeof(VFInputPatch));
			_extension = new PilotExtension();
			CruiseAssistPlusPlugin.RegisterExtension((INavigatorExtension)(object)_extension);
			Log.LogInfo((object)"AutoPilotPlus v0.2.9 loaded.");
		}

		private void OnDestroy()
		{
			CruiseAssistPlusPlugin.UnregisterExtension(typeof(PilotExtension));
			Harmony harmony = _harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
			_harmony = null;
		}

		internal static void Dbg(string msg)
		{
			if (DebugLog != null && DebugLog.Value)
			{
				Log.LogInfo((object)("[ap] " + msg));
			}
		}
	}
}
namespace AutoPilotPlus.UI
{
	public static class PilotConfigUI
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static WindowFunction <0>__Draw;
		}

		private const int WinId = 68302;

		public static Rect Rect = new Rect(410f, 470f, 340f, 460f);

		public static bool Visible = false;

		private static ConfigEntry<float> _left;

		private static ConfigEntry<float> _top;

		public static void LoadFromConfig(ConfigFile cfg)
		{
			_left = cfg.Bind<float>("Window", "PilotConfigLeft", 410f, (ConfigDescription)null);
			_top = cfg.Bind<float>("Window", "PilotConfigTop", 470f, (ConfigDescription)null);
			((Rect)(ref Rect)).x = _left.Value;
			((Rect)(ref Rect)).y = _top.Value;
		}

		public static void OnGUI()
		{
			//IL_000d: 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_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Expected O, but got Unknown
			if (Visible)
			{
				Rect rect = Rect;
				object obj = <>O.<0>__Draw;
				if (obj == null)
				{
					WindowFunction val = Draw;
					<>O.<0>__Draw = val;
					obj = (object)val;
				}
				Rect = GUILayout.Window(68302, rect, (WindowFunction)obj, "AutoPilot+ Config", Array.Empty<GUILayoutOption>());
				if (_left != null)
				{
					_left.Value = ((Rect)(ref Rect)).x;
					_top.Value = ((Rect)(ref Rect)).y;
				}
			}
		}

		private static void Draw(int id)
		{
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			GUILayout.FlexibleSpace();
			if (GUILayout.Button("✕", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(26f) }))
			{
				Visible = false;
			}
			GUILayout.EndHorizontal();
			AutoPilotPlusPlugin.MasterEnabled.Value = GUILayout.Toggle(AutoPilotPlusPlugin.MasterEnabled.Value, "Enabled (master)", Array.Empty<GUILayoutOption>());
			GUILayout.Space(4f);
			GUILayout.Label("Automation", Bold(), Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.AutoStart.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoStart.Value, "Auto-arm on target select", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.AutoLaunch.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoLaunch.Value, "Auto-launch from ground", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.AutoLand.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoLand.Value, "Auto-land on arrival", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.IgnoreGravity.Value = GUILayout.Toggle(AutoPilotPlusPlugin.IgnoreGravity.Value, "Ignore gravity while automating", Array.Empty<GUILayoutOption>());
			GUILayout.Space(4f);
			GUILayout.Label("Warp", Bold(), Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.LocalWarp.Value = GUILayout.Toggle(AutoPilotPlusPlugin.LocalWarp.Value, "Allow warp within the current system", Array.Empty<GUILayoutOption>());
			GUILayout.Label($"Min warp range: {AutoPilotPlusPlugin.WarpMinRangeAU.Value} AU", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.WarpMinRangeAU.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.WarpMinRangeAU.Value, 1f, 60f, Array.Empty<GUILayoutOption>()));
			GUILayout.Label($"Speed to warp: {AutoPilotPlusPlugin.SpeedToWarp.Value}", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.SpeedToWarp.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.SpeedToWarp.Value, 100f, 5000f, Array.Empty<GUILayoutOption>()) / 50f) * 50;
			GUILayout.Space(4f);
			GUILayout.Label("Flight", Bold(), Array.Empty<GUILayoutOption>());
			GUILayout.Label($"Min core energy to boost: {AutoPilotPlusPlugin.MinEnergyPer.Value}%", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.MinEnergyPer.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.MinEnergyPer.Value, 0f, 100f, Array.Empty<GUILayoutOption>()));
			GUILayout.Label($"Resume-boost energy: {AutoPilotPlusPlugin.ResumeEnergyPer.Value}%", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.ResumeEnergyPer.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.ResumeEnergyPer.Value, 0f, 100f, Array.Empty<GUILayoutOption>()));
			GUILayout.Label($"Max sail speed: {AutoPilotPlusPlugin.MaxSpeed.Value}", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.MaxSpeed.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.MaxSpeed.Value, 100f, 5000f, Array.Empty<GUILayoutOption>()) / 50f) * 50;
			GUILayout.Label($"Launch climb speed (no boost): {AutoPilotPlusPlugin.LaunchClimbSpeed.Value}", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.LaunchClimbSpeed.Value = Mathf.RoundToInt(GUILayout.HorizontalSlider((float)AutoPilotPlusPlugin.LaunchClimbSpeed.Value, 40f, 2000f, Array.Empty<GUILayoutOption>()) / 10f) * 10;
			GUILayout.Label($"Space altitude (climb-out target): {AutoPilotPlusPlugin.SpaceAltitude.Value:0} m", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.SpaceAltitude.Value = Mathf.Round(GUILayout.HorizontalSlider(AutoPilotPlusPlugin.SpaceAltitude.Value, 100f, 2000f, Array.Empty<GUILayoutOption>()) / 50f) * 50f;
			GUILayout.Label($"Approach brake range: {AutoPilotPlusPlugin.ApproachBrakeRange.Value:0} m", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.ApproachBrakeRange.Value = Mathf.Round(GUILayout.HorizontalSlider(AutoPilotPlusPlugin.ApproachBrakeRange.Value, 1000f, 40000f, Array.Empty<GUILayoutOption>()) / 500f) * 500f;
			GUILayout.Label($"Orbit altitude (launch-to-orbit): {AutoPilotPlusPlugin.OrbitAltitude.Value:0} m", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.OrbitAltitude.Value = Mathf.Round(GUILayout.HorizontalSlider(AutoPilotPlusPlugin.OrbitAltitude.Value, 600f, 20000f, Array.Empty<GUILayoutOption>()) / 100f) * 100f;
			GUILayout.Space(4f);
			GUILayout.Label("UI", Bold(), Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.HidePanelWhenNotInSpace.Value = GUILayout.Toggle(AutoPilotPlusPlugin.HidePanelWhenNotInSpace.Value, "Hide panel when not in space", Array.Empty<GUILayoutOption>());
			GUILayout.Space(4f);
			GUILayout.Label("Debug", Bold(), Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.DebugLog.Value = GUILayout.Toggle(AutoPilotPlusPlugin.DebugLog.Value, "Verbose debug logging", Array.Empty<GUILayoutOption>());
			AutoPilotPlusPlugin.DebugWindow.Value = GUILayout.Toggle(AutoPilotPlusPlugin.DebugWindow.Value, "Show debug overlay", Array.Empty<GUILayoutOption>());
			GUILayout.EndVertical();
			GUI.DragWindow();
		}

		private static GUIStyle Bold()
		{
			//IL_000a: 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_0017: Expected O, but got Unknown
			return new GUIStyle(GUI.skin.label)
			{
				fontStyle = (FontStyle)1
			};
		}
	}
	public static class PilotUI
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static WindowFunction <0>__Draw;
		}

		private const int WinId = 68301;

		public static Rect Rect = new Rect(100f, 470f, 300f, 230f);

		public static bool Visible = true;

		public static bool Collapsed = false;

		private static ConfigEntry<float> _left;

		private static ConfigEntry<float> _top;

		private static ConfigEntry<bool> _collapsed;

		public static void LoadFromConfig(ConfigFile cfg)
		{
			_left = cfg.Bind<float>("Window", "PilotLeft", 100f, (ConfigDescription)null);
			_top = cfg.Bind<float>("Window", "PilotTop", 470f, (ConfigDescription)null);
			_collapsed = cfg.Bind<bool>("Window", "PilotCollapsed", false, (ConfigDescription)null);
			((Rect)(ref Rect)).x = _left.Value;
			((Rect)(ref Rect)).y = _top.Value;
			Collapsed = _collapsed.Value;
			PilotConfigUI.LoadFromConfig(cfg);
		}

		public static void OnGUI()
		{
			//IL_0041: 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_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			PilotConfigUI.OnGUI();
			if (Visible && (!AutoPilotPlusPlugin.HidePanelWhenNotInSpace.Value || CruiseAssistPlusPlugin.InSpace))
			{
				((Rect)(ref Rect)).height = (Collapsed ? 40 : 230);
				Rect rect = Rect;
				object obj = <>O.<0>__Draw;
				if (obj == null)
				{
					WindowFunction val = Draw;
					<>O.<0>__Draw = val;
					obj = (object)val;
				}
				Rect = GUILayout.Window(68301, rect, (WindowFunction)obj, "AutoPilot+", Array.Empty<GUILayoutOption>());
				if (_left != null)
				{
					_left.Value = ((Rect)(ref Rect)).x;
					_top.Value = ((Rect)(ref Rect)).y;
					_collapsed.Value = Collapsed;
				}
			}
		}

		private static void Header()
		{
			GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
			if (GUILayout.Button(Collapsed ? "+" : "–", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(26f) }))
			{
				Collapsed = !Collapsed;
			}
			GUILayout.FlexibleSpace();
			if (GUILayout.Button("Config", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(60f) }))
			{
				PilotConfigUI.Visible = !PilotConfigUI.Visible;
			}
			if (GUILayout.Button("✕", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(26f) }))
			{
				Visible = false;
			}
			GUILayout.EndHorizontal();
		}

		private static void Draw(int id)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0049: 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)
			GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
			Header();
			if (!Collapsed)
			{
				bool flag = PilotExtension.State == PilotExtension.PState.Active;
				GUIStyle val = new GUIStyle(GUI.skin.label)
				{
					fontStyle = (FontStyle)1
				};
				val.normal.textColor = (flag ? Color.green : Color.gray);
				GUILayout.Label(flag ? "● ARMED" : "○ Inactive", val, Array.Empty<GUILayoutOption>());
				if (!string.IsNullOrEmpty(PilotExtension.LaunchStatus))
				{
					GUILayout.Label("Status: " + PilotExtension.LaunchStatus, Array.Empty<GUILayoutOption>());
				}
				GUILayout.Label($"Energy: {PilotExtension.EnergyPer:0}%   Speed: {PilotExtension.Speed:0}", Array.Empty<GUILayoutOption>());
				GUILayout.Label("Warper: " + (PilotExtension.HasWarper ? "yes" : "no") + "   Warp: " + PilotExtension.LastWarpReason, Array.Empty<GUILayoutOption>());
				GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
				bool value = AutoPilotPlusPlugin.MasterEnabled.Value;
				if (GUILayout.Button(value ? "On" : "Off", Array.Empty<GUILayoutOption>()))
				{
					AutoPilotPlusPlugin.MasterEnabled.Value = !value;
				}
				if (GUILayout.Button(flag ? "Disarm" : "Arm", Array.Empty<GUILayoutOption>()))
				{
					PilotExtension.ToggleArmed();
				}
				GUILayout.EndHorizontal();
				AutoPilotPlusPlugin.AutoStart.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoStart.Value, "Auto-arm on target select", Array.Empty<GUILayoutOption>());
				AutoPilotPlusPlugin.AutoLaunch.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoLaunch.Value, "Auto-launch from ground", Array.Empty<GUILayoutOption>());
				AutoPilotPlusPlugin.AutoLand.Value = GUILayout.Toggle(AutoPilotPlusPlugin.AutoLand.Value, "Auto-land on arrival", Array.Empty<GUILayoutOption>());
				AutoPilotPlusPlugin.IgnoreGravity.Value = GUILayout.Toggle(AutoPilotPlusPlugin.IgnoreGravity.Value, "Ignore gravity", Array.Empty<GUILayoutOption>());
				AutoPilotPlusPlugin.LocalWarp.Value = GUILayout.Toggle(AutoPilotPlusPlugin.LocalWarp.Value, "Allow local warp", Array.Empty<GUILayoutOption>());
			}
			GUILayout.EndVertical();
			GUI.DragWindow();
		}
	}
}
namespace AutoPilotPlus.Patches
{
	public static class VFInputPatch
	{
		[HarmonyPatch(/*Could not decode attribute arguments.*/)]
		[HarmonyPostfix]
		public static void SailSpeedUpPostfix(ref bool __result)
		{
			if (AutoPilotPlusPlugin.MasterEnabled != null && AutoPilotPlusPlugin.MasterEnabled.Value && PilotExtension.State == PilotExtension.PState.Active && PilotExtension.InputSailSpeedUp)
			{
				__result = true;
			}
		}
	}
}