using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using CruiseAssistPlus.Api;
using CruiseAssistPlus.Core;
using CruiseAssistPlus.Patches;
using CruiseAssistPlus.UI;
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("CruiseAssistPlus")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.2.3.0")]
[assembly: AssemblyInformationalVersion("0.2.3+6ddcac1f9144f7efbea1e2f4a6075e56662ddeb4")]
[assembly: AssemblyProduct("CruiseAssistPlus")]
[assembly: AssemblyTitle("CruiseAssistPlus")]
[assembly: AssemblyVersion("0.2.3.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 CruiseAssistPlus
{
[BepInPlugin("com.livinginstinkt.dsp.cruiseassistplus", "CruiseAssistPlus", "0.2.3")]
public class CruiseAssistPlusPlugin : BaseUnityPlugin
{
public const string Guid = "com.livinginstinkt.dsp.cruiseassistplus";
public const string Name = "CruiseAssistPlus";
public const string Version = "0.2.3";
internal static ManualLogSource Log;
internal static CruiseAssistPlusPlugin Instance;
internal static ConfigEntry<bool> Enabled;
internal static ConfigEntry<bool> RespectManualInput;
internal static ConfigEntry<float> TurnRate;
internal static ConfigEntry<float> MinTurnAngle;
internal static ConfigEntry<int> UIScale;
internal static ConfigEntry<bool> MiniView;
internal static ConfigEntry<bool> HideHudWhenNotInSpace;
internal static ConfigEntry<KeyboardShortcut> ToggleHudKey;
internal static ConfigEntry<bool> MarkVisited;
internal static ConfigEntry<bool> SelectFocus;
internal static ConfigEntry<bool> HideDuplicateHistory;
internal static ConfigEntry<bool> AutoDisableLockCursor;
internal static ConfigEntry<bool> DebugLog;
internal static ConfigEntry<bool> DebugWindow;
public static CruiseState State = CruiseState.Inactive;
public static StarData TargetStar;
public static PlanetData TargetPlanet;
public static VectorLF3 TargetUPos;
public static double TargetRange;
public static bool SuppressAutoArrival;
public static StarData SelectTargetStar;
public static PlanetData SelectTargetPlanet;
public static int SelectTargetAstroId;
public static StarData ReticuleTargetStar;
public static PlanetData ReticuleTargetPlanet;
public static readonly List<int> History = new List<int>();
public static readonly List<int> Bookmark = new List<int>();
private static readonly List<INavigatorExtension> _extensions = new List<INavigatorExtension>();
private Harmony _harmony;
private static int _lastIndicatorAstroId = -1;
private static long _lastErrorLogTick;
public static bool NavEnabled
{
get
{
if (Enabled != null)
{
return Enabled.Value;
}
return false;
}
}
public static bool InSpace
{
get
{
if (GameMain.mainPlayer != null)
{
return GameMain.mainPlayer.sailing;
}
return false;
}
}
public static IReadOnlyList<INavigatorExtension> Extensions => _extensions;
private void Awake()
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c6: Expected O, but got Unknown
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0100: Expected O, but got Unknown
//IL_015f: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
Instance = this;
Enabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Master switch. When off, sailing behaves exactly like vanilla.");
RespectManualInput = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "RespectManualInput", true, "When true, cruise steering yields the moment you provide movement input. If the mod seems to do nothing on the current game version, try setting this false (a Unity input change can make the game report phantom input every tick).");
TurnRate = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "TurnRate", 1.6f, new ConfigDescription("Steering aggressiveness numerator (slerp = TurnRate / max(MinTurnAngle, angle)).", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
MinTurnAngle = ((BaseUnityPlugin)this).Config.Bind<float>("Tuning", "MinTurnAngle", 10f, new ConfigDescription("Angle floor for the slerp denominator; larger = gentler turns.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(1f, 90f), Array.Empty<object>()));
UIScale = ((BaseUnityPlugin)this).Config.Bind<int>("UI", "UIScale", 150, new ConfigDescription("HUD scale percent.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(80, 240), Array.Empty<object>()));
MiniView = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "MiniView", false, "Use the compact HUD layout.");
HideHudWhenNotInSpace = ((BaseUnityPlugin)this).Config.Bind<bool>("UI", "HideHudWhenNotInSpace", false, "Auto-hide the CruiseAssist+ HUD while walking/building on a planet; show it in space.");
ToggleHudKey = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("UI", "ToggleHudKey", new KeyboardShortcut((KeyCode)288, Array.Empty<KeyCode>()), "Hotkey to show/hide the CruiseAssist+ HUD (use it to reopen a closed HUD).");
MarkVisited = ((BaseUnityPlugin)this).Config.Bind<bool>("Setting", "MarkVisited", true, "Record visited planets in History.");
SelectFocus = ((BaseUnityPlugin)this).Config.Bind<bool>("Setting", "SelectFocus", true, "Focus the starmap when picking a target.");
HideDuplicateHistory = ((BaseUnityPlugin)this).Config.Bind<bool>("Setting", "HideDuplicateHistory", true, "Collapse repeats in History.");
AutoDisableLockCursor = ((BaseUnityPlugin)this).Config.Bind<bool>("Setting", "AutoDisableLockCursor", false, "Auto-unlock the cursor when the sail panel opens (easier window interaction).");
DebugLog = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugLog", false, "Verbose per-tick diagnostic logging (target resolution, guard trips, steering, arrival). Turn on to see WHY navigation is or isn't acting.");
DebugWindow = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "DebugWindow", false, "Show the on-screen debug overlay.");
MainUI.LoadFromConfig(((BaseUnityPlugin)this).Config);
_harmony = new Harmony("com.livinginstinkt.dsp.cruiseassistplus");
_harmony.PatchAll(typeof(PlayerMovePatches));
_harmony.PatchAll(typeof(GameMainPatches));
_harmony.PatchAll(typeof(UISailPanelPatch));
Log.LogInfo((object)"CruiseAssistPlus v0.2.3 loaded.");
}
private void OnDestroy()
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
_harmony = null;
}
public static void RegisterExtension(INavigatorExtension ext)
{
if (ext != null && !_extensions.Contains(ext))
{
_extensions.Add(ext);
ManualLogSource log = Log;
if (log != null)
{
log.LogInfo((object)("Registered navigator extension: " + ext.GetType().FullName));
}
}
}
public static void UnregisterExtension(Type type)
{
_extensions.RemoveAll((INavigatorExtension e) => e.GetType() == type);
}
internal static void Dbg(string msg)
{
if (DebugLog != null && DebugLog.Value)
{
Log.LogInfo((object)("[dbg] " + msg));
}
}
internal static void ThrottledError(string where, Exception e)
{
long gameTick = GameMain.gameTick;
if (gameTick - _lastErrorLogTick >= 120)
{
_lastErrorLogTick = gameTick;
Log.LogError((object)(where + ": " + e.GetType().Name + ": " + e.Message));
}
}
private void Update()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
try
{
KeyboardShortcut value = ToggleHudKey.Value;
if (((KeyboardShortcut)(ref value)).IsDown())
{
MainUI.Visible = !MainUI.Visible;
}
PollIndicatorAndHistory();
}
catch (Exception e)
{
ThrottledError("Update", e);
}
}
private static void PollIndicatorAndHistory()
{
if (GameMain.mainPlayer == null || GameMain.galaxy == null)
{
return;
}
int indicatorAstroId = GameMain.mainPlayer.navigation.indicatorAstroId;
if (indicatorAstroId != _lastIndicatorAstroId)
{
_lastIndicatorAstroId = indicatorAstroId;
if (indicatorAstroId != 0 && SelectTargetAstroId != indicatorAstroId)
{
SetSelectionFromAstroId(indicatorAstroId, fromIndicator: true);
}
}
if (!MarkVisited.Value || GameMain.localPlanet == null)
{
return;
}
int pid = GameMain.localPlanet.id;
if (History.Count != 0 && History[History.Count - 1] == pid)
{
return;
}
if (HideDuplicateHistory.Value)
{
History.RemoveAll((int x) => x == pid);
}
if (History.Count >= 128)
{
History.RemoveAt(0);
}
History.Add(pid);
SaveState();
}
public static void SetSelectionFromAstroId(int astroId, bool fromIndicator = false)
{
SelectTargetAstroId = astroId;
Astro.Resolve(GameMain.galaxy, astroId, out var star, out var planet);
SelectTargetStar = star;
SelectTargetPlanet = planet;
if (!fromIndicator && GameMain.mainPlayer != null)
{
GameMain.mainPlayer.navigation.indicatorAstroId = astroId;
}
NotifyTargetChanged(astroId);
Dbg($"selection set astroId={astroId} star={((star != null) ? star.displayName : null)} planet={((planet != null) ? planet.displayName : null)}");
}
public static void SelectStar(StarData star, PlanetData planet)
{
if (star == null && planet == null)
{
ClearSelection();
}
else
{
SetSelectionFromAstroId(planet?.id ?? (star.id * 100));
}
}
public static void ClearSelection()
{
SelectTargetStar = null;
SelectTargetPlanet = null;
SelectTargetAstroId = 0;
if (GameMain.mainPlayer != null)
{
GameMain.mainPlayer.navigation.indicatorAstroId = 0;
}
NotifyTargetChanged(0);
foreach (INavigatorExtension extension in _extensions)
{
try
{
extension.SetInactive();
}
catch
{
}
}
Dbg("selection cleared");
}
private static void NotifyTargetChanged(int astroId)
{
foreach (INavigatorExtension extension in _extensions)
{
try
{
extension.OnTargetChanged(astroId);
}
catch
{
}
}
}
internal static void CruiseTick(PlayerMove_Sail move)
{
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: 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)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0162: Unknown result type (might be due to invalid IL or missing references)
//IL_0167: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0175: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_017e: Unknown result type (might be due to invalid IL or missing references)
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: 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_00e7: Unknown result type (might be due to invalid IL or missing references)
State = CruiseState.Inactive;
if (!NavEnabled)
{
return;
}
Player player = ((PlayerAction)move).player;
if (player == null || !player.sailing || !ResolveActiveTarget(player))
{
return;
}
foreach (INavigatorExtension extension in _extensions)
{
if (extension.OperateSail(move))
{
return;
}
}
if (RespectManualInput.Value)
{
PlayerController controller = ((PlayerAction)move).controller;
if ((Object)(object)controller != (Object)null && Mathf.Abs(controller.input0.x) + Mathf.Abs(controller.input0.y) + Mathf.Abs(controller.input1.x) + Mathf.Abs(controller.input1.y) > 0.05f)
{
Dbg($"manual input present in0={controller.input0} in1={controller.input1} -> yield");
return;
}
}
double magnitude = ((VectorLF3)(ref move.visual_uvel)).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 = TurnRate.Value / Mathf.Max(MinTurnAngle.Value, num);
Vector3 val2 = VectorLF3.op_Implicit(((VectorLF3)(ref val)).normalized * magnitude);
player.uVelocity = VectorLF3.op_Implicit(Vector3.Slerp(VectorLF3.op_Implicit(player.uVelocity), val2, num2));
State = CruiseState.Guiding;
Dbg($"cruise steer angle={num:0.0} t={num2:0.000} speed={magnitude:0} range={Astro.RangeToString(TargetRange)}");
}
}
public static bool ResolveActiveTarget(Player player)
{
//IL_00e9: Unknown result type (might be due to invalid IL or missing references)
//IL_00ee: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010f: Unknown result type (might be due to invalid IL or missing references)
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
TargetStar = null;
TargetPlanet = null;
StarData localStar = GameMain.localStar;
PlanetData localPlanet = GameMain.localPlanet;
if (SelectTargetStar != null)
{
if (localStar != null && SelectTargetStar.id == localStar.id)
{
if (SelectTargetPlanet == null)
{
if (localPlanet != null && !SuppressAutoArrival)
{
Dbg("arrived (system goal) -> clear");
ClearSelection();
return false;
}
TargetStar = SelectTargetStar;
}
else if (localPlanet != null && SelectTargetPlanet.id == localPlanet.id)
{
if (!SuppressAutoArrival)
{
Dbg("arrived (planet goal) -> clear");
ClearSelection();
return false;
}
TargetPlanet = SelectTargetPlanet;
}
else
{
TargetPlanet = SelectTargetPlanet;
}
}
else
{
TargetStar = SelectTargetStar;
}
}
else if (ReticuleTargetPlanet != null)
{
TargetPlanet = ReticuleTargetPlanet;
}
else if (ReticuleTargetStar != null)
{
TargetStar = ReticuleTargetStar;
}
if (TargetPlanet != null)
{
TargetUPos = TargetPlanet.uPosition;
}
else
{
if (TargetStar == null)
{
return false;
}
TargetUPos = TargetStar.uPosition;
}
VectorLF3 val = TargetUPos - player.uPosition;
TargetRange = ((VectorLF3)(ref val)).magnitude;
return true;
}
internal static void ForwardFly(PlayerMove_Fly m)
{
foreach (INavigatorExtension extension in _extensions)
{
try
{
if (extension.OperateFly(m))
{
break;
}
}
catch (Exception e)
{
ThrottledError("OperateFly", e);
}
}
}
internal static void ForwardDrift(PlayerMove_Drift m)
{
foreach (INavigatorExtension extension in _extensions)
{
try
{
if (extension.OperateDrift(m))
{
break;
}
}
catch (Exception e)
{
ThrottledError("OperateDrift", e);
}
}
}
internal static void ForwardWalk(PlayerMove_Walk m)
{
foreach (INavigatorExtension extension in _extensions)
{
try
{
if (extension.OperateWalk(m))
{
break;
}
}
catch (Exception e)
{
ThrottledError("OperateWalk", e);
}
}
}
public static void SaveState()
{
if ((Object)(object)Instance == (Object)null || GameMain.galaxy == null)
{
return;
}
try
{
int seed = GameMain.galaxy.seed;
((BaseUnityPlugin)Instance).Config.Bind<string>("Save", $"History_{seed}", "", (ConfigDescription)null).Value = string.Join(",", History);
((BaseUnityPlugin)Instance).Config.Bind<string>("Save", $"Bookmark_{seed}", "", (ConfigDescription)null).Value = string.Join(",", Bookmark);
}
catch (Exception e)
{
ThrottledError("SaveState", e);
}
}
public static void LoadState()
{
if ((Object)(object)Instance == (Object)null || GameMain.galaxy == null)
{
return;
}
try
{
int seed = GameMain.galaxy.seed;
History.Clear();
Bookmark.Clear();
ParseIds(((BaseUnityPlugin)Instance).Config.Bind<string>("Save", $"History_{seed}", "", (ConfigDescription)null).Value, History);
ParseIds(((BaseUnityPlugin)Instance).Config.Bind<string>("Save", $"Bookmark_{seed}", "", (ConfigDescription)null).Value, Bookmark);
Dbg($"loaded state seed={seed} history={History.Count} bookmarks={Bookmark.Count}");
}
catch (Exception e)
{
ThrottledError("LoadState", e);
}
}
private static void ParseIds(string csv, List<int> into)
{
if (string.IsNullOrEmpty(csv))
{
return;
}
string[] array = csv.Split(new char[1] { ',' });
for (int i = 0; i < array.Length; i++)
{
if (int.TryParse(array[i], out var result) && result != 0)
{
into.Add(result);
}
}
}
private void OnGUI()
{
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_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)
if ((Object)(object)GameMain.instance == (Object)null || GameMain.mainPlayer == null || (Object)(object)UIRoot.instance == (Object)null || (Object)(object)UIRoot.instance.uiGame == (Object)null || !((Component)UIRoot.instance.uiGame).gameObject.activeSelf)
{
return;
}
try
{
float num = (float)UIScale.Value / 100f;
Matrix4x4 matrix = GUI.matrix;
GUIUtility.ScaleAroundPivot(new Vector2(num, num), Vector2.zero);
MainUI.OnGUI();
StarListUI.OnGUI();
ConfigUI.OnGUI();
if (DebugWindow.Value)
{
DebugUI.OnGUI();
}
foreach (INavigatorExtension extension in _extensions)
{
try
{
extension.OnGUI();
}
catch
{
}
}
GUI.matrix = matrix;
}
catch (Exception e)
{
ThrottledError("OnGUI", e);
}
}
}
}
namespace CruiseAssistPlus.UI
{
public static class ConfigUI
{
[CompilerGenerated]
private static class <>O
{
public static WindowFunction <0>__Draw;
}
private const int WinId = 68203;
public static Rect Rect = new Rect(450f, 100f, 320f, 340f);
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", "ConfigLeft", 450f, (ConfigDescription)null);
_top = cfg.Bind<float>("Window", "ConfigTop", 100f, (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(68203, rect, (WindowFunction)obj, "CruiseAssist+ 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)
{
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
_ = CruiseAssistPlusPlugin.Instance;
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.MiniView.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.MiniView.Value, "Compact HUD", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.HideHudWhenNotInSpace.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.HideHudWhenNotInSpace.Value, "Hide HUD when not in space", Array.Empty<GUILayoutOption>());
GUILayout.Label($"Reopen HUD hotkey: {CruiseAssistPlusPlugin.ToggleHudKey.Value}", Array.Empty<GUILayoutOption>());
GUILayout.Label($"UI Scale: {CruiseAssistPlusPlugin.UIScale.Value}%", Array.Empty<GUILayoutOption>());
int num = (int)GUILayout.HorizontalSlider((float)CruiseAssistPlusPlugin.UIScale.Value, 80f, 240f, Array.Empty<GUILayoutOption>());
num = Mathf.RoundToInt((float)num / 5f) * 5;
CruiseAssistPlusPlugin.UIScale.Value = num;
GUILayout.Space(6f);
CruiseAssistPlusPlugin.RespectManualInput.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.RespectManualInput.Value, "Yield to manual input", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.MarkVisited.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.MarkVisited.Value, "Record visited (History)", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.HideDuplicateHistory.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.HideDuplicateHistory.Value, "Collapse duplicate history", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.AutoDisableLockCursor.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.AutoDisableLockCursor.Value, "Unlock cursor on sail panel", Array.Empty<GUILayoutOption>());
GUILayout.Space(6f);
GUILayout.Label($"Turn rate: {CruiseAssistPlusPlugin.TurnRate.Value:0.0}", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.TurnRate.Value = GUILayout.HorizontalSlider(CruiseAssistPlusPlugin.TurnRate.Value, 0.2f, 5f, Array.Empty<GUILayoutOption>());
GUILayout.Label($"Min turn angle: {CruiseAssistPlusPlugin.MinTurnAngle.Value:0}", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.MinTurnAngle.Value = GUILayout.HorizontalSlider(CruiseAssistPlusPlugin.MinTurnAngle.Value, 1f, 45f, Array.Empty<GUILayoutOption>());
GUILayout.Space(6f);
CruiseAssistPlusPlugin.DebugLog.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.DebugLog.Value, "Verbose debug logging", Array.Empty<GUILayoutOption>());
CruiseAssistPlusPlugin.DebugWindow.Value = GUILayout.Toggle(CruiseAssistPlusPlugin.DebugWindow.Value, "Show debug overlay", Array.Empty<GUILayoutOption>());
GUILayout.EndVertical();
GUI.DragWindow();
}
}
public static class DebugUI
{
[CompilerGenerated]
private static class <>O
{
public static WindowFunction <0>__Draw;
}
private const int WinId = 68204;
public static Rect Rect = new Rect(780f, 100f, 300f, 260f);
public static void OnGUI()
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_001a: Unknown result type (might be due to invalid IL or missing references)
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0025: Expected O, but got Unknown
Rect rect = Rect;
object obj = <>O.<0>__Draw;
if (obj == null)
{
WindowFunction val = Draw;
<>O.<0>__Draw = val;
obj = (object)val;
}
Rect = GUILayout.Window(68204, rect, (WindowFunction)obj, "CruiseAssist+ Debug", Array.Empty<GUILayoutOption>());
}
private static void Draw(int id)
{
//IL_007b: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: 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_0187: Unknown result type (might be due to invalid IL or missing references)
Player mainPlayer = GameMain.mainPlayer;
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
GUILayout.Label($"State: {CruiseAssistPlusPlugin.State}", Array.Empty<GUILayoutOption>());
GUILayout.Label($"Enabled: {CruiseAssistPlusPlugin.NavEnabled}", Array.Empty<GUILayoutOption>());
GUILayout.Label($"Extensions: {CruiseAssistPlusPlugin.Extensions.Count}", Array.Empty<GUILayoutOption>());
if (mainPlayer != null)
{
GUILayout.Label($"move state: {mainPlayer.movementState} sailing: {mainPlayer.sailing} warping: {mainPlayer.warping}", Array.Empty<GUILayoutOption>());
PlanetData localPlanet = GameMain.localPlanet;
VectorLF3 val;
if (localPlanet != null)
{
val = mainPlayer.uPosition - localPlanet.uPosition;
double num = ((VectorLF3)(ref val)).magnitude - (double)localPlanet.realRadius;
string arg = (((Object)(object)mainPlayer.controller != (Object)null) ? $" horzSpeed: {mainPlayer.controller.horzSpeed:0.0}" : "");
GUILayout.Label($"altitude: {num:0} m{arg}", Array.Empty<GUILayoutOption>());
}
else
{
GUILayout.Label("altitude: - (in space)", Array.Empty<GUILayoutOption>());
}
val = mainPlayer.uVelocity;
GUILayout.Label($"uVel: {((VectorLF3)(ref val)).magnitude:0.0}", Array.Empty<GUILayoutOption>());
if ((Object)(object)mainPlayer.controller != (Object)null)
{
GUILayout.Label($"input0: {mainPlayer.controller.input0}\ninput1: {mainPlayer.controller.input1}", Array.Empty<GUILayoutOption>());
}
}
StarData localStar = GameMain.localStar;
GUILayout.Label("localStar: " + (((localStar != null) ? localStar.displayName : null) ?? "-"), Array.Empty<GUILayoutOption>());
PlanetData localPlanet2 = GameMain.localPlanet;
GUILayout.Label("localPlanet: " + (((localPlanet2 != null) ? localPlanet2.displayName : null) ?? "-"), Array.Empty<GUILayoutOption>());
PlanetData targetPlanet = CruiseAssistPlusPlugin.TargetPlanet;
StarData targetStar = CruiseAssistPlusPlugin.TargetStar;
GUILayout.Label("target: " + ((targetPlanet != null) ? targetPlanet.displayName : ((targetStar != null) ? targetStar.displayName : "-")), Array.Empty<GUILayoutOption>());
GUILayout.Label("range: " + Astro.RangeToString(CruiseAssistPlusPlugin.TargetRange), Array.Empty<GUILayoutOption>());
GUILayout.Label($"indicatorAstroId: {((mainPlayer != null) ? mainPlayer.navigation.indicatorAstroId : 0)}", Array.Empty<GUILayoutOption>());
GUILayout.EndVertical();
GUI.DragWindow();
}
}
public static class MainUI
{
[CompilerGenerated]
private static class <>O
{
public static WindowFunction <0>__Draw;
}
private const int WinId = 68201;
public static Rect Rect = new Rect(100f, 100f, 400f, 150f);
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", "MainLeft", 100f, (ConfigDescription)null);
_top = cfg.Bind<float>("Window", "MainTop", 100f, (ConfigDescription)null);
_collapsed = cfg.Bind<bool>("Window", "MainCollapsed", false, (ConfigDescription)null);
((Rect)(ref Rect)).x = _left.Value;
((Rect)(ref Rect)).y = _top.Value;
Collapsed = _collapsed.Value;
StarListUI.LoadFromConfig(cfg);
ConfigUI.LoadFromConfig(cfg);
}
public static void OnGUI()
{
//IL_0068: 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_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0088: Expected O, but got Unknown
if (Visible && (!CruiseAssistPlusPlugin.HideHudWhenNotInSpace.Value || CruiseAssistPlusPlugin.InSpace))
{
bool value = CruiseAssistPlusPlugin.MiniView.Value;
((Rect)(ref Rect)).width = (value ? 280 : 400);
((Rect)(ref Rect)).height = (Collapsed ? 40 : (value ? 96 : 168));
Rect rect = Rect;
object obj = <>O.<0>__Draw;
if (obj == null)
{
WindowFunction val = Draw;
<>O.<0>__Draw = val;
obj = (object)val;
}
Rect = GUILayout.Window(68201, rect, (WindowFunction)obj, "CruiseAssist+", 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) }))
{
ConfigUI.Visible = !ConfigUI.Visible;
}
if (GUILayout.Button("✕", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(26f) }))
{
Visible = false;
}
GUILayout.EndHorizontal();
}
private static void Draw(int id)
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
//IL_006c: 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_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
GUILayout.BeginVertical(Array.Empty<GUILayoutOption>());
Header();
if (!Collapsed)
{
bool flag = CruiseAssistPlusPlugin.State == CruiseState.Guiding;
StarData targetStar = CruiseAssistPlusPlugin.TargetStar;
PlanetData targetPlanet = CruiseAssistPlusPlugin.TargetPlanet;
string text = ((targetPlanet != null) ? targetPlanet.displayName : ((targetStar != null) ? targetStar.displayName : "(no target)"));
GUIStyle val = new GUIStyle(GUI.skin.label);
val.normal.textColor = (flag ? Color.cyan : Color.white);
val.fontStyle = (FontStyle)1;
GUILayout.Label("Target: " + text, val, Array.Empty<GUILayoutOption>());
if (targetStar != null || targetPlanet != null)
{
double targetRange = CruiseAssistPlusPlugin.TargetRange;
double num;
if (GameMain.mainPlayer == null)
{
num = 0.0;
}
else
{
VectorLF3 uVelocity = GameMain.mainPlayer.uVelocity;
num = ((VectorLF3)(ref uVelocity)).magnitude;
}
double speed = num;
GUILayout.Label("Range: " + Astro.RangeToString(targetRange) + " ETA: " + Astro.EtaToString(targetRange, speed), Array.Empty<GUILayoutOption>());
}
else if (!CruiseAssistPlusPlugin.NavEnabled)
{
GUILayout.Label("<disabled>", Array.Empty<GUILayoutOption>());
}
else
{
GUILayout.Label("Pick a target from the star list.", Array.Empty<GUILayoutOption>());
}
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
bool value = CruiseAssistPlusPlugin.Enabled.Value;
if (GUILayout.Button(value ? "Enabled" : "Disabled", Array.Empty<GUILayoutOption>()))
{
CruiseAssistPlusPlugin.Enabled.Value = !value;
}
if (GUILayout.Button("Stars", Array.Empty<GUILayoutOption>()))
{
StarListUI.Visible = !StarListUI.Visible;
}
if (GUILayout.Button("Cancel", Array.Empty<GUILayoutOption>()))
{
CruiseAssistPlusPlugin.ClearSelection();
}
GUILayout.EndHorizontal();
bool flag2 = false;
foreach (INavigatorExtension extension in CruiseAssistPlusPlugin.Extensions)
{
string text2 = null;
try
{
text2 = extension.PanelLabel;
}
catch
{
}
if (string.IsNullOrEmpty(text2))
{
continue;
}
if (!flag2)
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
flag2 = true;
}
if (GUILayout.Button(text2, Array.Empty<GUILayoutOption>()))
{
try
{
extension.TogglePanel();
}
catch
{
}
}
}
if (flag2)
{
GUILayout.EndHorizontal();
}
}
GUILayout.EndVertical();
GUI.DragWindow();
}
}
public static class StarListUI
{
[CompilerGenerated]
private static class <>O
{
public static WindowFunction <0>__Draw;
}
private const int WinId = 68202;
public static Rect Rect = new Rect(100f, 260f, 340f, 420f);
public static bool Visible = false;
private static readonly string[] Tabs = new string[3] { "Stars", "History", "Bookmark" };
private static int _tab;
private static Vector2 _scroll;
private static int _expandedStarId = -1;
private static ConfigEntry<float> _left;
private static ConfigEntry<float> _top;
private static ConfigEntry<int> _tabCfg;
private static StarData[] _sorted;
private static int _sortCooldown;
public static void LoadFromConfig(ConfigFile cfg)
{
_left = cfg.Bind<float>("Window", "StarListLeft", 100f, (ConfigDescription)null);
_top = cfg.Bind<float>("Window", "StarListTop", 260f, (ConfigDescription)null);
_tabCfg = cfg.Bind<int>("Window", "StarListTab", 0, (ConfigDescription)null);
((Rect)(ref Rect)).x = _left.Value;
((Rect)(ref Rect)).y = _top.Value;
_tab = _tabCfg.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(68202, rect, (WindowFunction)obj, "CruiseAssist+ Stars", Array.Empty<GUILayoutOption>());
if (_left != null)
{
_left.Value = ((Rect)(ref Rect)).x;
_top.Value = ((Rect)(ref Rect)).y;
_tabCfg.Value = _tab;
}
}
}
private static void Draw(int id)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
_tab = GUILayout.Toolbar(_tab, Tabs, Array.Empty<GUILayoutOption>());
_scroll = GUILayout.BeginScrollView(_scroll, Array.Empty<GUILayoutOption>());
Player mainPlayer = GameMain.mainPlayer;
switch (_tab)
{
case 0:
DrawStars(mainPlayer);
break;
case 1:
DrawIdList(mainPlayer, CruiseAssistPlusPlugin.History, reverse: true, bookmarkTab: false);
break;
case 2:
DrawIdList(mainPlayer, CruiseAssistPlusPlugin.Bookmark, reverse: false, bookmarkTab: true);
break;
}
GUILayout.EndScrollView();
GUI.DragWindow();
}
private static void DrawStars(Player player)
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: 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_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
GalaxyData galaxy = GameMain.galaxy;
if (galaxy == null || galaxy.stars == null)
{
return;
}
if (_sorted == null || --_sortCooldown <= 0)
{
VectorLF3 p = player?.uPosition ?? VectorLF3.zero;
_sorted = galaxy.stars.Where((StarData s) => s != null).OrderBy(delegate(StarData s)
{
//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)
VectorLF3 val4 = s.uPosition - p;
return ((VectorLF3)(ref val4)).magnitude;
}).ToArray();
_sortCooldown = 60;
}
StarData[] sorted = _sorted;
foreach (StarData val in sorted)
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
double num2;
if (player == null)
{
num2 = 0.0;
}
else
{
VectorLF3 val2 = val.uPosition - player.uPosition;
num2 = ((VectorLF3)(ref val2)).magnitude;
}
double units = num2;
if (GUILayout.Button(val.displayName, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(150f) }))
{
CruiseAssistPlusPlugin.SelectStar(val, null);
}
GUILayout.Label(Astro.RangeToString(units), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(90f) });
if (GUILayout.Button((_expandedStarId == val.id) ? "-" : "+", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(24f) }))
{
_expandedStarId = ((_expandedStarId == val.id) ? (-1) : val.id);
}
GUILayout.EndHorizontal();
if (_expandedStarId != val.id || val.planets == null)
{
continue;
}
PlanetData[] planets = val.planets;
foreach (PlanetData val3 in planets)
{
if (val3 != null)
{
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
GUILayout.Space(20f);
if (GUILayout.Button(val3.displayName, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(150f) }))
{
CruiseAssistPlusPlugin.SelectStar(val, val3);
}
DrawBookmarkToggle(val3.id);
GUILayout.EndHorizontal();
}
}
}
}
private static void DrawIdList(Player player, List<int> ids, bool reverse, bool bookmarkTab)
{
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
GalaxyData galaxy = GameMain.galaxy;
if (galaxy == null)
{
return;
}
List<int> list = (reverse ? Enumerable.Reverse(ids).ToList() : ids.ToList());
for (int i = 0; i < list.Count; i++)
{
int num = list[i];
PlanetData val = galaxy.PlanetById(num);
if (val == null)
{
continue;
}
GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>());
if (GUILayout.Button(val.displayName, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(150f) }))
{
CruiseAssistPlusPlugin.SelectStar(val.star, val);
}
double units;
if (player == null)
{
units = 0.0;
}
else
{
VectorLF3 val2 = val.uPosition - player.uPosition;
units = ((VectorLF3)(ref val2)).magnitude;
}
GUILayout.Label(Astro.RangeToString(units), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(80f) });
DrawBookmarkToggle(num);
if (bookmarkTab)
{
if (GUILayout.Button("^", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(22f) }))
{
Move(ids, num, -1);
}
if (GUILayout.Button("v", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(22f) }))
{
Move(ids, num, 1);
}
}
GUILayout.EndHorizontal();
}
}
private static void DrawBookmarkToggle(int planetId)
{
bool flag = CruiseAssistPlusPlugin.Bookmark.Contains(planetId);
if (GUILayout.Button(flag ? "★" : "☆", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(26f) }))
{
if (flag)
{
CruiseAssistPlusPlugin.Bookmark.Remove(planetId);
}
else if (CruiseAssistPlusPlugin.Bookmark.Count < 128)
{
CruiseAssistPlusPlugin.Bookmark.Add(planetId);
}
CruiseAssistPlusPlugin.SaveState();
}
}
private static void Move(List<int> list, int id, int delta)
{
int num = list.IndexOf(id);
int num2 = num + delta;
if (num >= 0 && num2 >= 0 && num2 < list.Count)
{
list.RemoveAt(num);
list.Insert(num2, id);
CruiseAssistPlusPlugin.SaveState();
}
}
}
}
namespace CruiseAssistPlus.Patches
{
public static class GameMainPatches
{
[HarmonyPatch(typeof(GameMain), "Begin")]
[HarmonyPostfix]
public static void BeginPostfix()
{
CruiseAssistPlusPlugin.LoadState();
}
[HarmonyPatch(typeof(GameMain), "Pause")]
[HarmonyPrefix]
public static void PausePrefix()
{
CruiseAssistPlusPlugin.SaveState();
}
[HarmonyPatch(typeof(GameMain), "End")]
[HarmonyPrefix]
public static void EndPrefix()
{
CruiseAssistPlusPlugin.SaveState();
}
}
public static class PlayerMovePatches
{
[HarmonyPatch(typeof(PlayerMove_Sail), "GameTick")]
[HarmonyPrefix]
public static void SailPrefix(PlayerMove_Sail __instance)
{
try
{
CruiseAssistPlusPlugin.CruiseTick(__instance);
}
catch (Exception e)
{
CruiseAssistPlusPlugin.ThrottledError("SailPrefix", e);
}
}
[HarmonyPatch(typeof(PlayerMove_Fly), "GameTick")]
[HarmonyPrefix]
public static void FlyPrefix(PlayerMove_Fly __instance)
{
CruiseAssistPlusPlugin.ForwardFly(__instance);
}
[HarmonyPatch(typeof(PlayerMove_Drift), "GameTick")]
[HarmonyPrefix]
public static void DriftPrefix(PlayerMove_Drift __instance)
{
CruiseAssistPlusPlugin.ForwardDrift(__instance);
}
[HarmonyPatch(typeof(PlayerMove_Walk), "GameTick")]
[HarmonyPrefix]
public static void WalkPrefix(PlayerMove_Walk __instance)
{
CruiseAssistPlusPlugin.ForwardWalk(__instance);
}
}
public static class UISailPanelPatch
{
[HarmonyPatch(typeof(UISailPanel), "_OnOpen")]
[HarmonyPrefix]
public static void OnOpenPrefix()
{
if (CruiseAssistPlusPlugin.AutoDisableLockCursor != null && CruiseAssistPlusPlugin.AutoDisableLockCursor.Value && (Object)(object)UIRoot.instance != (Object)null && (Object)(object)UIRoot.instance.uiGame != (Object)null)
{
UIRoot.instance.uiGame.disableLockCursor = true;
}
}
[HarmonyPatch(typeof(UISailPanel), "_OnClose")]
[HarmonyPrefix]
public static void OnClosePrefix()
{
CruiseAssistPlusPlugin.SaveState();
}
}
}
namespace CruiseAssistPlus.Core
{
public enum CruiseState
{
Inactive,
Guiding
}
public static class Astro
{
public const double UnitsPerAU = 40000.0;
public const double AUPerLightYear = 63241.077;
public static bool IsPlanet(int astroId)
{
if (astroId != 0)
{
return astroId % 100 != 0;
}
return false;
}
public static bool IsStar(int astroId)
{
if (astroId != 0)
{
return astroId % 100 == 0;
}
return false;
}
public static int StarIdOf(int astroId)
{
return astroId / 100;
}
public static void Resolve(GalaxyData galaxy, int astroId, out StarData star, out PlanetData planet)
{
star = null;
planet = null;
if (galaxy != null && astroId != 0)
{
if (IsPlanet(astroId))
{
planet = galaxy.PlanetById(astroId);
star = planet?.star;
}
else
{
star = galaxy.StarById(StarIdOf(astroId));
}
}
}
public static string RangeToString(double units)
{
if (units < 0.0)
{
units = 0.0;
}
double num = units / 40000.0;
if (num < 0.01)
{
return $"{units:0} m";
}
if (num < 31620.5385)
{
return $"{num:0.00} AU";
}
return $"{num / 63241.077:0.000} ly";
}
public static string EtaToString(double units, double speed)
{
if (speed <= 1.0)
{
return "--";
}
double num = units / speed;
if (double.IsNaN(num) || double.IsInfinity(num) || num > 359999.0)
{
return "--";
}
TimeSpan timeSpan = TimeSpan.FromSeconds(num);
if (timeSpan.TotalHours >= 1.0)
{
return $"{(int)timeSpan.TotalHours:00}:{timeSpan.Minutes:00}:{timeSpan.Seconds:00}";
}
return $"{timeSpan.Minutes:00}:{timeSpan.Seconds:00}";
}
}
}
namespace CruiseAssistPlus.Api
{
public interface INavigatorExtension
{
string PanelLabel { get; }
bool OperateSail(PlayerMove_Sail move);
bool OperateFly(PlayerMove_Fly move);
bool OperateDrift(PlayerMove_Drift move);
bool OperateWalk(PlayerMove_Walk move);
void OnTargetChanged(int astroId);
void SetInactive();
void OnGUI();
void TogglePanel();
}
}