Decompiled source of LethalOS v1.0.8

LethalOS.API.dll

Decompiled a year ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using LethalOS.API.Terminal;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;

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

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.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 LethalOS.API
{
	public class ModuleBase
	{
		public TerminalNode Node;

		public string DisplayName { get; private set; }

		public string DisplayDescription { get; private set; }

		public string Keyword { get; private set; }

		private bool RequiresHost { get; set; }

		private bool Toggled { get; set; }

		public bool Enabled { get; private set; }

		protected ModuleBase(string displayName, string displayDescription, string keyword, bool requiresHost = false, bool toggled = false)
		{
			DisplayName = displayName;
			DisplayDescription = displayDescription;
			Keyword = keyword;
			RequiresHost = requiresHost;
			Toggled = toggled;
		}

		public void ToggleModule()
		{
			GameNetworkManager instance = GameNetworkManager.Instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			if (RequiresHost && !instance.isHostingGame)
			{
				HUDManager.Instance.DisplayTip(DisplayName + " is Host Only!", "You can't enable this feature unless you're the host of the game, sorry.", true, false, "LC_Tip1");
				return;
			}
			Enabled = !Enabled;
			if (Toggled)
			{
				HUDManager.Instance.DisplayTip(DisplayName + " Toggled!", DisplayDescription ?? "", false, false, "LC_Tip1");
				OnEnabled();
				OnDisabled();
			}
			else if (Enabled)
			{
				HUDManager.Instance.DisplayTip(DisplayName + " Enabled!", DisplayDescription ?? "", false, false, "LC_Tip1");
				OnEnabled();
			}
			else
			{
				HUDManager.Instance.DisplayTip(DisplayName + " Disabled!", DisplayDescription ?? "", true, false, "LC_Tip1");
				OnDisabled();
			}
		}

		protected void ChangeScreenText(string newText, bool clearText = false)
		{
			Manager.ChangeScreenText(newText, clearText);
		}

		public void UpdateNode(TerminalNode newNode)
		{
			Manager.UpdateNode(Node, newNode);
		}

		public virtual void OnAdded()
		{
		}

		protected virtual void OnEnabled()
		{
		}

		protected virtual void OnDisabled()
		{
		}

		public virtual void OnUpdate()
		{
		}

		public virtual void OnFixedUpdate()
		{
		}

		public virtual void OnGui()
		{
		}
	}
	[BepInPlugin("verity.lethalos.api", "LethalOS API", "1.0.8")]
	internal class Plugin : BaseUnityPlugin
	{
		public static readonly Harmony Harmony = new Harmony("lethalos");

		public static ConfigEntry<bool>? _pocketTerminalEnabled;

		public static ManualLogSource LogSource { get; set; } = null;


		private void Awake()
		{
			//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_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			LogSource = ((BaseUnityPlugin)this).Logger;
			LogSource.LogInfo((object)"LethalOS API Loaded!");
			_pocketTerminalEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "PocketTerminalEnabled", false, "Enable/Disable Pocket Terminal");
			GameObject val = new GameObject("TerminalUtils");
			val.AddComponent<PluginLoader>();
			((Object)val).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)val);
		}
	}
	public class PluginLoader : MonoBehaviour
	{
		[HarmonyPatch(typeof(Terminal), "LoadNewNode")]
		public class TerminalPatch
		{
			public static void CatchNodesPostFix(TerminalNode node)
			{
				TerminalNode node2 = node;
				Manager.Modules.FirstOrDefault((ModuleBase module) => string.Equals(module.Keyword, ((Object)node2).name, StringComparison.CurrentCultureIgnoreCase))?.ToggleModule();
			}
		}

		private bool _terminalSetup;

		private void Awake()
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			SceneManager.sceneLoaded += SceneManagerOnsceneLoaded;
			if (Plugin._pocketTerminalEnabled.Value)
			{
				InputAction val = new InputAction((string)null, (InputActionType)0, "<Keyboard>/insert", (string)null, (string)null, (string)null);
				val.performed += OnInsertKeyPressed;
				val.Enable();
			}
		}

		private void OnInsertKeyPressed(CallbackContext obj)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			Terminal val = Object.FindObjectOfType<Terminal>();
			if (val != null)
			{
				MovementActions movement;
				if (!val.terminalInUse)
				{
					val.BeginUsingTerminal();
					movement = val.playerActions.Movement;
					((MovementActions)(ref movement)).Disable();
					HUDManager.Instance.ChangeControlTip(0, string.Empty, true);
				}
				else
				{
					val.QuitTerminal();
					movement = val.playerActions.Movement;
					((MovementActions)(ref movement)).Enable();
				}
			}
		}

		private void SceneManagerOnsceneLoaded(Scene arg0, LoadSceneMode arg1)
		{
			//IL_012b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0138: Expected O, but got Unknown
			if (((Scene)(ref arg0)).name.ToLower() == "samplescenerelay" && !_terminalSetup)
			{
				_terminalSetup = true;
				foreach (Menu menu3 in Manager.Menus)
				{
					Plugin.LogSource.LogInfo((object)("Menu Create: " + menu3.MenuName));
					Node.CreateMenuNode(menu3);
				}
				Menu menu2 = new Menu("Menus", "Showing Menus", "menus", "Verity");
				foreach (Category item in Manager.Menus.Select((Menu menu) => new Category(menu.MenuName + " - [Made by " + menu.ModAuthor + "]", menu.MenuDescription ?? "", "placeholder")))
				{
					menu2.AddCategory(item);
				}
				Node.CreateMenuNode(menu2);
				MethodInfo method = typeof(Terminal).GetMethod("LoadNewNode");
				MethodInfo method2 = typeof(TerminalPatch).GetMethod("CatchNodesPostFix");
				Plugin.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(method2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
			}
			Terminal val = Object.FindObjectOfType<Terminal>();
			if (val != null)
			{
				val.terminalNodes.specialNodes[13].displayText = ">MOONS\nTo see the list of moons the autopilot can route to.\n\n>STORE\nTo see the company store's selection of useful items.\n\n>BESTIARY\nTo see the list of wildlife on record.\n\n>STORAGE\nTo access objects placed into storage.\n\n>OTHER\nTo see the list of other commands.\n\n>MENUS\nTo see the list of menus created using LethalOS.\n\n";
				if (Plugin._pocketTerminalEnabled.Value)
				{
					val.terminalUIScreen.renderMode = (RenderMode)0;
					val.terminalUIScreen.scaleFactor = 2.35f;
				}
			}
		}

		private void Update()
		{
			foreach (ModuleBase item in Manager.Modules.Where((ModuleBase @base) => @base.Enabled))
			{
				item.OnUpdate();
			}
		}

		private void FixedUpdate()
		{
			foreach (ModuleBase item in Manager.Modules.Where((ModuleBase @base) => @base.Enabled))
			{
				item.OnFixedUpdate();
			}
		}

		private void OnGUI()
		{
			foreach (ModuleBase item in Manager.Modules.Where((ModuleBase @base) => @base.Enabled))
			{
				item.OnGui();
			}
		}
	}
}
namespace LethalOS.API.Terminal
{
	public class Category
	{
		public TerminalNode Node;

		public string Name { get; set; }

		public string Description { get; set; }

		public string Keyword { get; set; }

		private List<ModuleBase> Modules { get; set; }

		public Category(string name, string description, string keyword)
		{
			Name = name;
			Description = description;
			Keyword = keyword;
			Modules = new List<ModuleBase>();
		}

		public void AddModule(ModuleBase module)
		{
			Modules.Add(module);
		}

		public void UpdateNode(TerminalNode newNode)
		{
			Manager.UpdateNode(Node, newNode);
		}

		public ModuleBase GetModule<T>() where T : ModuleBase
		{
			Type type = typeof(T);
			return GetModules().FirstOrDefault((ModuleBase module) => type.IsInstanceOfType(module));
		}

		public ModuleBase GetModuleByName(string name)
		{
			string name2 = name;
			return GetModules().Find((ModuleBase @base) => string.Equals(@base.DisplayName, name2, StringComparison.CurrentCultureIgnoreCase));
		}

		public List<ModuleBase> GetModules()
		{
			return Modules;
		}
	}
	public abstract class Manager
	{
		internal static readonly List<Menu> Menus = new List<Menu>();

		internal static readonly List<ModuleBase> Modules = new List<ModuleBase>();

		internal static void AddMenu(Menu menu)
		{
			Menus.Add(menu);
			foreach (ModuleBase item in menu.GetCategories().SelectMany((Category category) => category.GetModules()))
			{
				Modules.Add(item);
			}
		}

		internal static void ChangeScreenText(string newText, bool clearText = false)
		{
			Terminal val = Object.FindObjectOfType<Terminal>();
			if (val != null)
			{
				TerminalNode val2 = ScriptableObject.CreateInstance<TerminalNode>();
				val2.displayText = newText + "\n\n";
				val2.clearPreviousText = clearText;
				((Object)val2).name = "placeholder";
				val.LoadNewNode(val2);
			}
		}

		internal static void UpdateNode(TerminalNode oldNode, TerminalNode newNode)
		{
			Terminal val = Object.FindObjectOfType<Terminal>();
			if (!((Object)(object)val == (Object)null))
			{
				val.terminalNodes.specialNodes.Add(oldNode);
				val.terminalNodes.specialNodes.Add(newNode);
			}
		}
	}
	public class Menu
	{
		public TerminalNode Node;

		public string MenuName { get; set; }

		public string MenuDescription { get; set; }

		public string MenuKeyword { get; set; }

		public string ModAuthor { get; set; }

		private List<Category> MenuCategories { get; set; }

		public Menu(string menuName, string menuDescription, string menuKeyword, string modAuthor)
		{
			MenuName = menuName;
			MenuDescription = menuDescription;
			MenuKeyword = menuKeyword;
			ModAuthor = modAuthor;
			MenuCategories = new List<Category>();
		}

		public void AddCategory(Category category)
		{
			MenuCategories.Add(category);
		}

		public void Finished()
		{
			Manager.AddMenu(this);
		}

		public void UpdateNode(TerminalNode newNode)
		{
			Manager.UpdateNode(Node, newNode);
		}

		public Category GetCategoryByName(string name)
		{
			string name2 = name;
			return GetCategories().Find((Category category) => string.Equals(category.Name, name2, StringComparison.CurrentCultureIgnoreCase));
		}

		public List<Category> GetCategories()
		{
			return MenuCategories;
		}
	}
	internal abstract class Node
	{
		private static readonly Regex Whitespace = new Regex("\\s+");

		public static void CreateMenuNode(Menu menu)
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = "[" + menu.MenuName + "]: " + menu.MenuDescription + "\nC:\\" + RemoveWhiteSpace(menu.MenuName) + ">\n\n";
			val.clearPreviousText = true;
			((Object)val).name = menu.MenuKeyword;
			foreach (Category category in menu.GetCategories())
			{
				TerminalNode val2 = val;
				val2.displayText = val2.displayText + ">" + category.Name.ToUpper() + "\n" + category.Description + "\n\n";
				CreateCategoryNode(category, menu);
			}
			menu.Node = val;
			AddNode(((Object)val).name, val);
		}

		private static void CreateCategoryNode(Category category, Menu menu)
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = "[" + menu.MenuName + "]: " + menu.MenuDescription + "\nC:\\" + RemoveWhiteSpace(menu.MenuName) + "\\" + category.Name + ">\n\n";
			val.clearPreviousText = true;
			((Object)val).name = category.Keyword;
			foreach (ModuleBase module in category.GetModules())
			{
				TerminalNode val2 = val;
				val2.displayText = val2.displayText + ">" + module.DisplayName.ToUpper() + "\n" + module.DisplayDescription + "\n\n";
			}
			foreach (ModuleBase module2 in category.GetModules())
			{
				CreateModuleNode(module2, val);
			}
			category.Node = val;
			AddNode(((Object)val).name, val);
		}

		private static void CreateModuleNode(ModuleBase moduleBase, TerminalNode categoryNode)
		{
			TerminalNode val = ScriptableObject.CreateInstance<TerminalNode>();
			val.displayText = categoryNode.displayText;
			val.clearPreviousText = true;
			((Object)val).name = moduleBase.Keyword;
			AddNode(((Object)val).name, val);
			moduleBase.Node = val;
			moduleBase.OnAdded();
		}

		private static void AddNode(string keyword, TerminalNode node)
		{
			Terminal val = Object.FindObjectOfType<Terminal>();
			TerminalKeyword val2 = ScriptableObject.CreateInstance<TerminalKeyword>();
			val2.word = keyword.ToLower();
			val2.isVerb = true;
			val2.specialKeywordResult = node;
			Array.Resize(ref val.terminalNodes.allKeywords, val.terminalNodes.allKeywords.Length + 1);
			val.terminalNodes.allKeywords[^1] = val2;
			val.terminalNodes.specialNodes.Add(node);
		}

		private static string RemoveWhiteSpace(string input)
		{
			return Whitespace.Replace(input, string.Empty);
		}
	}
}