Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of TumultuousTime v1.0.2
TumultuousTime.dll
Decompiled a year ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Reflection.Emit; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using CruiserTerminal.CTerminal; using CruiserTerminal.Patches; using FovAdjust; using GameNetcodeStuff; using HarmonyLib; using InteractiveTerminalAPI.UI; using LethalConstellations.PluginCore; using LethalLevelLoader; using LobbyCompatibility.Enums; using LobbyCompatibility.Features; using Microsoft.CodeAnalysis; using OpenBodyCams; using OpenLib; using OpenLib.Common; using OpenLib.Compat; using OpenLib.ConfigManager; using OpenLib.CoreMethods; using OpenLib.Events; using OpenLib.Menus; using ShipInventory.Helpers; using ShipInventory.Objects; using TMPro; using TerminalStuff; using TerminalStuff.Compatibility; using TerminalStuff.EventSub; using TerminalStuff.PluginCore; using TerminalStuff.SpecialStuff; using TerminalStuff.VisualCore; using TumultuousTime.NetcodePatcher; using TwoRadarMaps; using Unity.Netcode; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.InputSystem.LowLevel; using UnityEngine.TextCore.LowLevel; using UnityEngine.UI; using UnityEngine.Video; using WeatherRegistry; using WeatherTweaks; using suitsTerminal; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("darmuhsTerminalStuff")] [assembly: AssemblyDescription("https://github.com/darmuh/TerminalStuff")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("darmuhsTerminalStuff")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("e2700abc-7bc7-4bd0-b787-effe68445b6a")] [assembly: AssemblyFileVersion("1.0.0")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: NetcodePatchedAssembly] internal class <Module> { static <Module>() { } } namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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; } } } [HarmonyPatch] public class NetObject { private static GameObject networkPrefab; [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "Start")] public static void Init() { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown if (ConfigSettings.ModNetworking.Value && !((Object)(object)networkPrefab != (Object)null)) { AssetBundle val = AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("TerminalStuff.darmuhngo")); networkPrefab = (GameObject)val.LoadAsset("darmuhNGO"); networkPrefab.AddComponent<NetHandler>(); NetworkManager.Singleton.AddNetworkPrefab(networkPrefab); } } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "Awake")] private static void SpawnNetworkHandler() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (ConfigSettings.ModNetworking.Value && (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer)) { GameObject val = Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity); val.GetComponent<NetworkObject>().Spawn(false); } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace TutorialNameSpace { internal class Tutorial { internal static void AddMyCommands() { AddingThings.AddBasicCommand("command1", "command1", "command 1 text", false, true, "", ""); } internal static void OnTerminalAwake(Terminal instance) { AddMyCommands(); } internal static void Subscribers() { EventManager.TerminalAwake.AddListener((ParameterEvent<Terminal>)OnTerminalAwake); } } } namespace TerminalStuff { internal class AdminCommands { internal static PlayerControllerB playerToKick; internal static bool kickEnum; internal static string KickPlayersAsk() { TerminalGeneral.CancelConfirmation = true; playerToKick = null; string afterKeyword = StringStuff.GetAfterKeyword(StringStuff.GetKeywordsPerConfigItem(ConfigSettings.KickKeywords.Value)); if (!AmIHost(out var displayText)) { return displayText; } if (afterKeyword.Length < 1) { string text = PlayerNameAndIDList(); return "You must specify a player name or ID to kick them!\r\n\tKickable Players:\r\n(id) PlayerName" + text + "\r\n\r\n"; } if (ulong.TryParse(afterKeyword, out var result)) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.playerClientId == result && (Object)(object)StartOfRound.Instance.localPlayerController != (Object)(object)val && val.isPlayerControlled) { TerminalGeneral.CancelConfirmation = false; playerToKick = val; displayText = "Kick " + val.playerUsername + " from the lobby?\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\r\n\r\n"; Plugin.MoreLogs("valid player to kick from id"); return displayText; } } } else { Plugin.Spam("ulong failed parse"); string text2 = afterKeyword.ToLower(); PlayerControllerB[] allPlayerScripts2 = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val2 in allPlayerScripts2) { if (val2.playerUsername.ToLower() == text2) { TerminalGeneral.CancelConfirmation = false; playerToKick = val2; return "Kick " + val2.playerUsername + " from the lobby?\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\r\n\r\n"; } } } return "Unable to find player to kick by name or id - " + afterKeyword + "\r\n\r\n"; } private static string PlayerNameAndIDList() { StringBuilder stringBuilder = new StringBuilder(); PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if ((Object)(object)StartOfRound.Instance.localPlayerController != (Object)(object)val && val.isPlayerControlled) { stringBuilder.Append($"\r\n({val.playerClientId}) {val.playerUsername}\r\n"); } } return stringBuilder.ToString(); } internal static bool AmIHost(out string displayText) { displayText = ""; if (((NetworkBehaviour)GameNetworkManager.Instance.localPlayerController).IsHost) { return true; } displayText = "You do not have permission to kick players from this lobby, you are NOT the host.\r\n\r\n"; Plugin.Log.LogWarning((object)"Somehow non-host player could try to kick others, error handled."); return false; } internal static string KickPlayerConfirm() { int playerToKickID = GetPlayerToKickID(playerToKick); ((MonoBehaviour)Plugin.instance.Terminal).StartCoroutine(KickYes(playerToKickID)); return "Kick Player Action Confirmed.\r\n\r\n\tKicking player: " + playerToKick.playerUsername + "\r\n\r\n"; } internal static string KickPlayerDeny() { string result = "Cancelling kick player action for player:" + playerToKick.playerUsername + "\r\n\r\n"; playerToKick = null; return result; } internal static int GetPlayerToKickID(PlayerControllerB matchingPlayer) { int result = -1; for (int i = 0; i < StartOfRound.Instance.allPlayerScripts.Count(); i++) { if (StartOfRound.Instance.allPlayerScripts[i].playerUsername == matchingPlayer.playerUsername) { result = i; break; } } return result; } internal static IEnumerator KickYes(int playerNum) { if (!kickEnum) { kickEnum = true; Plugin.Spam("We made it to the kick event!!"); Plugin.Spam("playerObjIdForTerminal = " + playerNum); Plugin.instance.Terminal.QuitTerminal(true); yield return (object)new WaitForSeconds(0.1f); StartOfRound.Instance.KickPlayer(playerNum); Plugin.Spam("kicked"); kickEnum = false; } } } internal class DropCommands { internal static bool validDropValue = false; internal static int DropCost = 50; internal static void GrantRandomShopItem() { List<Item> list = Plugin.instance.Terminal.buyableItemsList.ToList(); if (list == null || list.Count == 0) { Plugin.Log.LogDebug((object)"No items available in the shop!"); return; } Random random = new Random(); Item val = list[random.Next(list.Count)]; int num = list.IndexOf(val); Plugin.instance.Terminal.BuyItemsServerRpc(new int[1] { num }, Plugin.instance.Terminal.groupCredits, Plugin.instance.Terminal.numberOfItemsInDropship); Plugin.Log.LogDebug((object)("Granted item: " + val.itemName + " for free!")); } internal static string Ask2Drop() { Plugin.Log.LogDebug((object)"Ask2Drop invoked"); if (Plugin.instance.Terminal.groupCredits < DropCost) { TerminalGeneral.CancelConfirmation = true; validDropValue = false; string result = $"Unable to drop an item...\r\n\tYou don't have enough credits! Cost: ■{DropCost}.\r\n\r\n"; Plugin.WARNING("Not enough credits for drop command!"); return result; } validDropValue = true; return $"Drop a random item for ■{DropCost} credits?\n\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } internal static string DropConfirm() { if (validDropValue) { Plugin.Log.LogDebug((object)"Valid drop value detected, processing drop..."); ProcessDrop(out var displayText); return displayText; } Plugin.Log.LogDebug((object)"Attempting to confirm invalid drop. Returning error."); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static string DropDeny() { if (validDropValue) { Plugin.Log.LogDebug((object)"Valid drop value detected, but drop has been canceled."); validDropValue = false; return $"Drop for ■{DropCost} credits has been canceled.\r\n"; } Plugin.Log.LogDebug((object)"Attempting to deny invalid drop. Returning error."); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static void ProcessDrop(out string displayText) { Terminal terminal = Plugin.instance.Terminal; if (DropCost > terminal.groupCredits) { displayText = $"Not enough credits for drop. Cost: ■{DropCost}.\n\n"; return; } terminal.groupCredits -= DropCost; NetHandler.Instance.SyncCreditsServerRpc(terminal.groupCredits, terminal.numberOfItemsInDropship); GrantRandomShopItem(); validDropValue = false; displayText = $"Random item dropped successfully. ■{DropCost} credits have been deducted.\r\n\r\n"; Plugin.Log.LogDebug((object)"Drop processed successfully."); } } public static class SharedState { public static bool PlayerHasEnteredTheFacility { get; set; } public static bool RoundStarted { get; set; } } [HarmonyPatch(typeof(StartOfRound))] [HarmonyPatch("Update")] public class PlayerEnteredPatch { public static List<SpawnableEnemyWithRarity> allEnemies; public static List<SpawnableEnemyWithRarity> outsideEnemies; public static List<SpawnableEnemyWithRarity> daytimeEnemies; public static ReadOnlyCollection<SpawnableEnemyWithRarity> lockedAllEnemies; public static ReadOnlyCollection<SpawnableEnemyWithRarity> lockedOutsideEnemies; public static ReadOnlyCollection<SpawnableEnemyWithRarity> lockedDaytimeEnemies; [HarmonyPostfix] public static void Postfix(ref StartOfRound __instance) { if (TimeOfDay.Instance.currentDayTime == 0f) { if (SharedState.PlayerHasEnteredTheFacility) { SharedState.PlayerHasEnteredTheFacility = false; } if (RoundManager.Instance.scrapAmountMultiplier != 0.5f) { Plugin.Log.LogDebug((object)("RoundManager.Instance.scrapAmountMultiplier is " + RoundManager.Instance.scrapAmountMultiplier)); RoundManager.Instance.scrapAmountMultiplier = 0.5f; Plugin.Log.LogDebug((object)("RoundManager.Instance.scrapAmountMultiplier is now " + RoundManager.Instance.scrapAmountMultiplier)); } if (SharedState.RoundStarted) { SharedState.RoundStarted = false; } } else if (TimeOfDay.Instance.currentDayTime == 100f) { if (!SharedState.RoundStarted) { SharedState.RoundStarted = true; } if (allEnemies == null && outsideEnemies == null && daytimeEnemies == null) { allEnemies = new List<SpawnableEnemyWithRarity>(); outsideEnemies = new List<SpawnableEnemyWithRarity>(); daytimeEnemies = new List<SpawnableEnemyWithRarity>(); SelectableLevel[] levels = __instance.levels; foreach (SelectableLevel val in levels) { foreach (SpawnableEnemyWithRarity enemy2 in val.Enemies) { if (!allEnemies.Exists((SpawnableEnemyWithRarity e) => e.enemyType.enemyName == enemy2.enemyType.enemyName)) { allEnemies.Add(enemy2); } } foreach (SpawnableEnemyWithRarity enemy3 in val.OutsideEnemies) { if (!outsideEnemies.Exists((SpawnableEnemyWithRarity e) => e.enemyType.enemyName == enemy3.enemyType.enemyName)) { outsideEnemies.Add(enemy3); } } foreach (SpawnableEnemyWithRarity enemy in val.DaytimeEnemies) { if (!daytimeEnemies.Exists((SpawnableEnemyWithRarity e) => e.enemyType.enemyName == enemy.enemyType.enemyName)) { daytimeEnemies.Add(enemy); } } } lockedAllEnemies = new ReadOnlyCollection<SpawnableEnemyWithRarity>(allEnemies); lockedOutsideEnemies = new ReadOnlyCollection<SpawnableEnemyWithRarity>(outsideEnemies); lockedDaytimeEnemies = new ReadOnlyCollection<SpawnableEnemyWithRarity>(daytimeEnemies); } SelectableLevel[] levels2 = __instance.levels; foreach (SelectableLevel val2 in levels2) { foreach (SpawnableEnemyWithRarity enemy4 in val2.Enemies) { Plugin.Log.LogDebug((object)$"BEFORE Enemy: {enemy4.enemyType.enemyName}, Rarity: {enemy4.rarity}\n"); if (enemy4.rarity == 1) { enemy4.rarity = 100; } else if (enemy4.rarity < 20) { enemy4.rarity = 50; } else { enemy4.rarity = Random.Range(1, 101); } Plugin.Log.LogDebug((object)$"AFTER Enemy: {enemy4.enemyType.enemyName}, Rarity: {enemy4.rarity}\n"); } foreach (SpawnableEnemyWithRarity outsideEnemy in val2.OutsideEnemies) { Plugin.Log.LogDebug((object)$"BEFORE Enemy: {outsideEnemy.enemyType.enemyName}, Rarity: {outsideEnemy.rarity}\n"); if (outsideEnemy.rarity == 1) { outsideEnemy.rarity = 100; } else if (outsideEnemy.rarity < 20) { outsideEnemy.rarity = 50; } else { outsideEnemy.rarity = Random.Range(1, 101); } Plugin.Log.LogDebug((object)$"AFTER Enemy: {outsideEnemy.enemyType.enemyName}, Rarity: {outsideEnemy.rarity}\n"); } foreach (SpawnableEnemyWithRarity daytimeEnemy in val2.DaytimeEnemies) { Plugin.Log.LogDebug((object)$"BEFORE Enemy: {daytimeEnemy.enemyType.enemyName}, Rarity: {daytimeEnemy.rarity}\n"); if (daytimeEnemy.rarity == 1) { daytimeEnemy.rarity = 100; } else if (daytimeEnemy.rarity < 20) { daytimeEnemy.rarity = 50; } else { daytimeEnemy.rarity = Random.Range(1, 101); } Plugin.Log.LogDebug((object)$"AFTER Enemy: {daytimeEnemy.enemyType.enemyName}, Rarity: {daytimeEnemy.rarity}\n"); } } } for (int k = 0; k < __instance.allPlayerScripts.Length; k++) { if (__instance.allPlayerScripts[k].isInsideFactory) { SharedState.PlayerHasEnteredTheFacility = true; break; } } } } internal class RerollCommands { internal static bool validRerollValue = false; internal static int RerollCost = 30; private static void respawnLoot() { GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>(); Plugin.Log.LogDebug((object)$"RerollScrapCommand: Found {array.Length} GrabbableObject(s)."); for (int i = 0; i < array.Length; i++) { if (array[i].isInShipRoom) { Plugin.Log.LogDebug((object)("RerollScrapCommand: Skipping item " + ((Object)((Component)array[i]).gameObject).name + " (In ship room).")); continue; } if (array[i].itemProperties.itemName.Equals("Apparatus") || array[i].itemProperties.itemName.Equals("Hive")) { Plugin.Log.LogDebug((object)("RerollScrapCommand: Skipping item " + ((Object)((Component)array[i]).gameObject).name + " (Apparatus or Hive).")); continue; } NetworkObject component = ((Component)array[i]).gameObject.GetComponent<NetworkObject>(); if (array[i].itemProperties.isScrap) { if ((Object)(object)component != (Object)null && component.IsSpawned) { Plugin.Log.LogDebug((object)("RerollScrapCommand: Despawning item " + ((Object)((Component)array[i]).gameObject).name + ".")); component.Despawn(true); } else { Plugin.Log.LogDebug((object)("RerollScrapCommand: Destroying item " + ((Object)((Component)array[i]).gameObject).name + " (Not networked or not spawned).")); Object.Destroy((Object)(object)((Component)array[i]).gameObject); } } } Settings.ScrapMultipliers = false; Plugin.Log.LogDebug((object)("BEFORE RANDOMIZATION RoundManager.Instance.scrapAmountMultiplier is" + RoundManager.Instance.scrapAmountMultiplier)); float num = Random.Range(0.5f, 1.5f); RoundManager.Instance.scrapAmountMultiplier = num; Plugin.Log.LogDebug((object)("AFTER RANDOMIZATION RoundManager.Instance.scrapAmountMultiplier is" + RoundManager.Instance.scrapAmountMultiplier)); RoundManager.Instance.SpawnScrapInLevel(); Plugin.Log.LogDebug((object)$"Scrap rerolled with multiplier: {num}"); } internal static string Ask2Reroll() { Plugin.Log.LogDebug((object)"Ask2Reroll invoked"); if (Plugin.instance.Terminal.groupCredits < RerollCost) { TerminalGeneral.CancelConfirmation = true; validRerollValue = false; string result = $"Unable to reroll at this time...\r\n\tYou don't have enough credits! Cost: ■{RerollCost}.\r\n\r\n"; Plugin.WARNING("Not enough credits for reroll command!"); return result; } if (SharedState.PlayerHasEnteredTheFacility) { TerminalGeneral.CancelConfirmation = true; validRerollValue = false; Plugin.Log.LogDebug((object)"RerollScrapCommand: A player has entered the facility."); return "A Player has entered the facility this round, you cannot reroll.\r\n"; } if (!SharedState.RoundStarted) { TerminalGeneral.CancelConfirmation = true; validRerollValue = false; Plugin.Log.LogDebug((object)"RerollScrapCommand: Ship has not landed."); return "Round not started, you cannot reroll.\r\n"; } validRerollValue = true; return $"Reroll scrap for ■{RerollCost} credits?\n\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } internal static string RerollConfirm() { if (validRerollValue) { Plugin.Log.LogDebug((object)"Valid reroll value detected, processing reroll..."); ProcessReroll(out var displayText); return displayText; } Plugin.Log.LogDebug((object)"Attempting to confirm invalid reroll. Returning error."); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static string RerollDeny() { if (validRerollValue) { Plugin.Log.LogDebug((object)"Valid reroll value detected, but reroll has been canceled."); validRerollValue = false; return $"Reroll for ■{RerollCost} credits has been canceled.\r\n"; } Plugin.Log.LogDebug((object)"Attempting to deny invalid reroll. Returning error."); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static void ProcessReroll(out string displayText) { Terminal terminal = Plugin.instance.Terminal; if (RerollCost > terminal.groupCredits) { displayText = $"Not enough credits for reroll. Cost: ■{RerollCost}.\n\n"; return; } terminal.groupCredits -= RerollCost; NetHandler.Instance.SyncCreditsServerRpc(terminal.groupCredits, terminal.numberOfItemsInDropship); respawnLoot(); validRerollValue = false; displayText = $"Scrap rerolled successfully. ■{RerollCost} credits have been deducted.\r\n\r\n"; Plugin.Log.LogDebug((object)"Reroll processed successfully."); } } internal class LevelCommands { internal static List<string> bannedWeather = new List<string>(); internal static List<string> bannedWeatherConfig = new List<string>(); internal static string RouteRandomCommand() { if (Plugin.instance.Terminal.groupCredits < ConfigSettings.RouteRandomCost.Value) { return $"You cannot afford to run the 'route random' command.\r\n\r\n\tRoute Random Cost: [{ConfigSettings.RouteRandomCost.Value}]\r\n\tYour credits: <color=#BD3131>[{Plugin.instance.Terminal.groupCredits}]</color>\r\n\r\n\r\n"; } bannedWeatherConfig = StringStuff.GetKeywordsPerConfigItem(ConfigSettings.RouteRandomBannedWeather.Value); bannedWeather = StringStuff.GetListToLower(bannedWeatherConfig); List<SelectableLevel> list = new List<SelectableLevel>(); SelectableLevel[] moonsCatalogueList = Plugin.instance.Terminal.moonsCatalogueList; foreach (SelectableLevel val in moonsCatalogueList) { list.Add(val); Plugin.MoreLogs("Added " + val.PlanetName + " to valid random planets"); } if (list.Count < 1) { return "Route Random was unable to select a valid moon and you have not been charged.\r\n\r\nThis may be due to all moons have banned weather attributes...\r\n\r\n\r\n"; } Random random = new Random(); int index = random.Next(0, list.Count); Plugin.MoreLogs(list[index].PlanetName + " has been chosen!"); StartOfRound.Instance.ChangeLevelServerRpc(list[index].levelID, Plugin.instance.Terminal.groupCredits); StartOfRound.Instance.SetMapScreenInfoToCurrentLevel(); int num = CostCommands.CalculateNewCredits(Plugin.instance.Terminal.groupCredits, ConfigSettings.RouteRandomCost.Value, Plugin.instance.Terminal); return $"Your new balance is ■{num} Credits.\r\n\r\nRoute Random has chosen {list[index].PlanetName}!\r\n\r\n\tEnjoy!\r\n\r\n"; } } internal class AllTheLootStuff { internal static string GetLootSimple() { Plugin.Spam("calculating loot value next"); float num = CalculateLootValue(); string text; if (Plugin.instance.ShipInventory) { int inventoryValue = ShipInventoryCompat.GetInventoryValue(); text = $"Total Value on Ship: ${num}\n\nTotal Value in Ship Inventory: ${inventoryValue}"; } else { text = $"Total Value on Ship: ${num}"; } Plugin.Spam("loot calculated"); return text + "\n\n"; } internal static string DetailedLootCommand() { LoadGrabbablesOnShip.LoadAllItems(); StringBuilder stringBuilder = new StringBuilder(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); int totalCredsWorth = 0; foreach (GrabbableObject item in LoadGrabbablesOnShip.ItemsOnShip) { string itemName = item.itemProperties.itemName; int scrapValue = item.scrapValue; if (item.itemProperties.isScrap) { string text = $"{itemName} ({scrapValue} credits)"; Plugin.Spam(text + "added to output"); totalCredsWorth += scrapValue; dictionary[text] = ((!dictionary.TryGetValue(text, out var value)) ? 1 : (value + 1)); } } foreach (KeyValuePair<string, int> item2 in dictionary) { if (item2.Value > 1) { stringBuilder.AppendLine($"{item2.Key} [x{item2.Value}]"); } else { stringBuilder.AppendLine(item2.Key ?? ""); } } if (Plugin.instance.ShipInventory) { ShipInventoryCompat.GetInventoryItems(out var itemsInventory); StringBuilder arg = ShipInventoryItems(itemsInventory, ref totalCredsWorth); return $"Scrap on ship (not stored):\n\n{stringBuilder}Scrap stored in Ship Inventory:\n\n{arg}\n\n\tTotal Value: {totalCredsWorth}\n\n"; } return $"Scrap on ship:\n\n{stringBuilder}\n\n\tTotal Value: {totalCredsWorth}\n\n"; } private static StringBuilder ShipInventoryItems(List<Item> inventory, ref int totalCredsWorth) { StringBuilder stringBuilder = new StringBuilder(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (Item item in inventory) { if (item.isScrap) { string itemName = item.itemName; int creditsWorth = item.creditsWorth; string text = $"{itemName} ({creditsWorth} credits)"; Plugin.Spam(text + "added to output"); totalCredsWorth += creditsWorth; dictionary[text] = ((!dictionary.TryGetValue(text, out var value)) ? 1 : (value + 1)); } } foreach (KeyValuePair<string, int> item2 in dictionary) { if (item2.Value > 1) { stringBuilder.AppendLine($"{item2.Key} [x{item2.Value}]"); } else { stringBuilder.AppendLine(item2.Key ?? ""); } } return stringBuilder; } private static float CalculateLootValue() { List<GrabbableObject> list = (from obj in GameObject.Find("/Environment/HangarShip").GetComponentsInChildren<GrabbableObject>() where ((Object)obj).name != "ClipboardManual" && ((Object)obj).name != "StickyNoteItem" && ((Object)obj).name != "Key(Clone)" select obj).ToList(); Plugin.Log.LogDebug((object)"Calculating total ship scrap value."); CollectionExtensions.Do<GrabbableObject>((IEnumerable<GrabbableObject>)list, (Action<GrabbableObject>)delegate(GrabbableObject scrap) { Plugin.Log.LogDebug((object)$"{((Object)scrap).name} - ${scrap.scrapValue}"); }); return list.Sum((GrabbableObject scrap) => scrap.scrapValue); } } internal class ColorCommands { internal static Color? CustomFlashColor; internal static string flashLightColor; internal static bool usingHexCode; internal static bool RainbowFlash; internal static void FlashLightCommandAction(out string displayText) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0024: 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) RainbowFlash = false; Color val = (Color)(((??)CustomFlashColor) ?? Color.white); Plugin.MoreLogs($"got {flashLightColor} - {val}"); displayText = "The next time you turn on your flashlight, the color will be set to " + flashLightColor + "!\r\n\r\n"; } internal static void SetCustomColor(string colorKeyword, out Color? customColor) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_02b5: Unknown result type (might be due to invalid IL or missing references) //IL_036c: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_0314: Unknown result type (might be due to invalid IL or missing references) //IL_0319: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_034a: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_0393: Unknown result type (might be due to invalid IL or missing references) //IL_032e: Unknown result type (might be due to invalid IL or missing references) //IL_0333: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) if (IsHexColorCode(colorKeyword)) { usingHexCode = true; customColor = HexToColor("#" + colorKeyword); return; } string text = colorKeyword.ToLower(); if (1 == 0) { } Color? val = text switch { "white" => Color.white, "red" => Color.red, "blue" => Color.blue, "yellow" => Color.yellow, "cyan" => Color.cyan, "magenta" => Color.magenta, "green" => Color.green, "purple" => Color32.op_Implicit(new Color32((byte)144, (byte)100, (byte)254, (byte)1)), "lime" => Color32.op_Implicit(new Color32((byte)166, (byte)254, (byte)0, (byte)1)), "pink" => Color32.op_Implicit(new Color32((byte)242, (byte)0, (byte)254, (byte)1)), "maroon" => Color32.op_Implicit(new Color32((byte)114, (byte)3, (byte)3, (byte)1)), "orange" => Color32.op_Implicit(new Color32(byte.MaxValue, (byte)117, (byte)24, (byte)1)), "sasstro" => Color32.op_Implicit(new Color32((byte)212, (byte)148, (byte)180, (byte)1)), "samstro" => Color32.op_Implicit(new Color32((byte)180, (byte)203, (byte)240, (byte)1)), _ => null, }; if (1 == 0) { } customColor = val; } internal static bool IsHexColorCode(string input) { return Regex.IsMatch(input, "^(?:[0-9a-fA-F]{3}){1,2}$"); } internal static Color HexToColor(string hex) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) Color result = default(Color); ColorUtility.TryParseHtmlString(hex, ref result); return result; } internal static string ShipColorBase() { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) string afterKeyword = StringStuff.GetAfterKeyword(StringStuff.GetKeywordsPerConfigItem(ConfigSettings.ScolorKeywords.Value)); if (afterKeyword.Length < 1) { string result = ShipColorList(); Plugin.WARNING("not enough words for the command!"); return result; } if (afterKeyword.ToLower().Contains("list")) { string result2 = ShipColorList(); Plugin.MoreLogs("list requested"); return result2; } string[] words = afterKeyword.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (!ShipColorCommon(words, out var displayText, out var targetColor, out var newColor)) { return displayText; } if (afterKeyword.ToLower().Contains("all")) { NetHandler.Instance.ShipColorALLServerRpc(newColor, targetColor); return displayText; } if (afterKeyword.ToLower().Contains("front")) { NetHandler.Instance.ShipColorFRONTServerRpc(newColor, targetColor); return displayText; } if (afterKeyword.ToLower().Contains("mid")) { NetHandler.Instance.ShipColorMIDServerRpc(newColor, targetColor); return displayText; } if (afterKeyword.ToLower().Contains("back")) { NetHandler.Instance.ShipColorBACKServerRpc(newColor, targetColor); return displayText; } Plugin.WARNING("failed to grab specific part of ship lights to change"); return ShipColorList(); } internal static bool ShipColorCommon(string[] words, out string displayText, out string targetColor, out Color newColor) { //IL_0026: 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_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: 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_007e: Unknown result type (might be due to invalid IL or missing references) if (words.Length < 2) { displayText = ShipColorList(); Plugin.MoreLogs("not enough words for the command, returning list!"); targetColor = string.Empty; newColor = Color.white; return false; } targetColor = words[1]; Plugin.MoreLogs("Attempting to set " + words[0] + " ship light colors to " + targetColor); SetCustomColor(targetColor, out var customColor); if (customColor.HasValue && targetColor != null) { newColor = customColor.Value; displayText = "Color of " + words[0] + " ship lights set to " + targetColor + "!\r\n\r\n"; return true; } targetColor = ""; newColor = Color.white; displayText = "Unable to set " + words[0] + " ship light color...\r\n\tInvalid color [" + targetColor + "] detected!\r\n\r\n"; Plugin.WARNING("invalid color for the color command!"); return false; } internal static string ShipColorList() { string text = StringStuff.GetKeywordsPerConfigItem(ConfigSettings.ScolorKeywords.Value)[0]; return "========= Ship Lights Color Options List =========\r\nColor Name: \"command used\"\r\n\r\nDefault: \"" + text + " all normal\" or \"" + text + " all default\"\r\nRed: \"" + text + " back red\"\r\nGreen: \"" + text + " mid green\"\r\nBlue: \"" + text + " front blue\"\r\nYellow: \"" + text + " middle yellow\"\r\nCyan: \"" + text + " all cyan\"\r\nMagenta: \"" + text + " back magenta\"\r\nPurple: \"" + text + " mid purple\"\r\nLime: \"" + text + " all lime\"\r\nPink: \"" + text + " front pink\"\r\nMaroon: \"" + text + " middle maroon\"\r\nOrange: \"" + text + " back orange\"\r\nSasstro's Color: \"" + text + " all sasstro\"\r\nSamstro's Color: \"" + text + " all samstro\"\r\nANY HEXCODE: \"" + text + " all FF00FF\"\r\n\r\n\r\n"; } internal static string FlashColorBase() { string afterKeyword = StringStuff.GetAfterKeyword(StringStuff.GetKeywordsPerConfigItem(ConfigSettings.FcolorKeywords.Value)); if (afterKeyword.Length < 1) { string result = FlashColorList(); Plugin.WARNING("getting list, not enough words for color command!"); return result; } if (afterKeyword.ToLower().Contains("list")) { string result = FlashColorList(); Plugin.MoreLogs("displaying flashcolor list"); return result; } if (afterKeyword.ToLower().Contains("rainbow")) { string result = FlashColorRainbow(); Plugin.MoreLogs("running rainbow command"); return result; } if (afterKeyword.ToLower().Contains("normal") || afterKeyword.ToLower().Contains("default")) { Plugin.MoreLogs("Player no longer wants a custom flashlight color!"); CustomFlashColor = null; RainbowFlash = false; return "Flashlight color preference set back to default!\n\nFlashlight's with the default color will no longer be updated!\r\n\r\n"; } string text = afterKeyword.TrimStart(Array.Empty<char>()); Plugin.MoreLogs("Attempting to set flashlight color to " + text); SetCustomColor(text, out CustomFlashColor); flashLightColor = text; if (CustomFlashColor.HasValue) { Plugin.MoreLogs("Using flashlight color: " + text); NetHandler.Instance.endFlashRainbow = true; FlashLightCommandAction(out var displayText); return displayText; } string result2 = "Unable to set flashlight color...\r\n\tInvalid color: [" + text + "] detected!\r\n\r\n"; Plugin.WARNING("invalid color for the color command!"); return result2; } internal static string FlashColorList() { string text = StringStuff.GetKeywordsPerConfigItem(ConfigSettings.FcolorKeywords.Value)[0]; return "========= Flashlight Color Options List =========\r\nColor Name: \"command used\"\r\n\r\nDefault: \"" + text + " normal\" or \"" + text + " default\"\r\nRed: \"" + text + " red\"\r\nGreen: \"" + text + " green\"\r\nBlue: \"" + text + " blue\"\r\nYellow: \"" + text + " yellow\"\r\nCyan: \"" + text + " cyan\"\r\nMagenta: \"" + text + " magenta\"\r\nPurple: \"" + text + " purple\"\r\nLime: \"" + text + " lime\"\r\nPink: \"" + text + " pink\"\r\nMaroon: \"" + text + " maroon\"\r\nOrange: \"" + text + " orange\"\r\nSasstro's Color: \"" + text + " sasstro\"\r\nSamstro's Color: \"" + text + " samstro\"\r\n\r\nRainbow Color (animated): \"" + text + " rainbow\"\r\nANY HEXCODE: \"" + text + " FF00FF\"\r\n\r\n"; } internal static string FlashColorRainbow() { if (DoIhaveFlash(StartOfRound.Instance.localPlayerController)) { NetHandler.Instance.CycleThroughRainbowFlash(); return "Flashlight color set to Rainbow Mode! (performance may vary)\r\n\r\n"; } RainbowFlash = true; return "The next flashlight you hold will be set to rainbow mode! (performance may vary)\r\n\r\n"; } private static bool DoIhaveFlash(PlayerControllerB player) { GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>(); GrabbableObject[] array2 = array; foreach (GrabbableObject val in array2) { if ((Object)(object)val.playerHeldBy != (Object)null && val.playerHeldBy.playerUsername == player.playerUsername && ((Object)((Component)val).gameObject).name.Contains("Flashlight")) { return true; } } return false; } } internal class CostCommands { internal static bool vitalsUpgradeEnabled = false; internal static bool enemyScanUpgradeEnabled = false; internal static List<int> storeCart = new List<int>(); internal static string currentPackList; internal static string currentPackName; internal static string buyPackName; internal static Dictionary<Item, int> itemsIndexed = new Dictionary<Item, int>(); internal static bool CheckUnlockableStatus(string itemName) { foreach (UnlockableItem unlockable in StartOfRound.Instance.unlockablesList.unlockables) { if (unlockable.unlockableName == itemName && (unlockable.alreadyUnlocked || unlockable.hasBeenUnlockedByPlayer)) { Plugin.Spam("Upgrade: " + itemName + " already unlocked. Setting variable to true"); return true; } } Plugin.Spam("Upgrade: " + itemName + " is NOT unlocked already"); return false; } internal static bool CheckUnlockableStatus(int itemID) { if (itemID >= StartOfRound.Instance.unlockablesList.unlockables.Count) { return false; } UnlockableItem val = StartOfRound.Instance.unlockablesList.unlockables[itemID]; if (!val.alreadyUnlocked && !val.hasBeenUnlockedByPlayer) { Plugin.Spam($"Upgrade ID: {itemID} has not been unlocked. Setting variable to true"); return true; } return false; } internal static void UpdateUnlockStatus() { enemyScanUpgradeEnabled = false; vitalsUpgradeEnabled = false; foreach (string item in SaveManager.AllUpgradesUnlocked) { Plugin.Spam("Updating upgrade status for " + item); if (item == "BioscanPatch") { enemyScanUpgradeEnabled = true; } else if (item == "VitalsPatch") { vitalsUpgradeEnabled = true; } else { Plugin.WARNING("Unexpected upgrade unlock name [ " + item + " ]"); } } } internal static string BioscanCommand() { if ((Object)(object)RoundManager.Instance != (Object)null) { int count = RoundManager.Instance.SpawnedEnemies.Count; int groupCredits = Plugin.instance.Terminal.groupCredits; int value = ConfigSettings.BioScanCost.Value; string result; if (ShouldRunBioscan2(groupCredits, value)) { int newCreds = CalculateNewCredits(groupCredits, value, Plugin.instance.Terminal); List<EnemyAI> livingEnemiesList = GetLivingEnemiesList(); string text = FilterLivingEnemies(livingEnemiesList); string bioscanResult = GetBioscanResult(count, value, newCreds, text); result = bioscanResult; Plugin.MoreLogs("Living Enemies(filtered): " + text); return result; } if (groupCredits >= value) { int newCreds2 = CalculateNewCredits(groupCredits, value, Plugin.instance.Terminal); string basicBioscanResult = GetBasicBioscanResult(count, value, newCreds2); result = basicBioscanResult; Plugin.MoreLogs("v1 scanner utilized, only numbers shown"); return result; } result = "Not enough credits to run Biomatter Scanner.\r\n"; Plugin.MoreLogs("brokeboy detected"); return result; } return "Cannot scan for Biomatter at this time.\r\n"; } private static bool ShouldRunBioscan2(int getCreds, int costCreds) { return enemyScanUpgradeEnabled && getCreds >= costCreds; } private static string GetBasicBioscanResult(int scannedEnemies, int costCreds, int newCreds) { return $"Biomatter scanner charged {costCreds} credits and has detected [{scannedEnemies}] non-employee organic objects.\r\n\r\nYour new balance is ■{newCreds} Credits.\r\n"; } private static List<EnemyAI> GetLivingEnemiesList() { return RoundManager.Instance.SpawnedEnemies.Where((EnemyAI enemy) => !enemy.isEnemyDead).ToList(); } private static string FilterLivingEnemies(List<EnemyAI> livingEnemies) { string input = string.Join(Environment.NewLine, livingEnemies.Select((EnemyAI enemy) => ((object)enemy).ToString())); string pattern = "\\([^)]*\\)"; return Regex.Replace(input, pattern, string.Empty); } private static string GetBioscanResult(int scannedEnemies, int costCreds, int newCreds, string filteredLivingEnemiesString) { string text = $"Biomatter scanner charged {costCreds} credits and has detected [{scannedEnemies}] non-employee organic objects.\r\n\r\n"; if (!string.IsNullOrEmpty(filteredLivingEnemiesString)) { text += $"Your new balance is ■{newCreds} Credits.\r\n\r\nDetailed scan has defined these objects as the following in the registry: \r\n{filteredLivingEnemiesString}\r\n"; } else { text += $"Your new balance is ■{newCreds} Credits.\r\n"; Plugin.MoreLogs("v1 scanner utilized, only numbers shown"); } return text; } internal static string VitalsCommand() { PlayerControllerB targetedPlayer = GameStuff.TerminalMapRenderer.targetedPlayer; if ((Object)(object)targetedPlayer == (Object)null) { return "Vitals command malfunctioning...\n\n"; } int groupCredits = Plugin.instance.Terminal.groupCredits; int costCreds = GetCostCreds(vitalsUpgradeEnabled); string playerUsername = targetedPlayer.playerUsername; Plugin.MoreLogs("playername: " + playerUsername); if (ShouldDisplayVitals(targetedPlayer, groupCredits, costCreds)) { int newCreds = CalculateNewCredits(groupCredits, costCreds, Plugin.instance.Terminal); string vitalsInfo = GetVitalsInfo(targetedPlayer); string creditsInfo = GetCreditsInfo(newCreds); if (!vitalsUpgradeEnabled) { return $"Charged ■{costCreds} Credits. \n{vitalsInfo}\n{creditsInfo}"; } return vitalsInfo + "\n" + creditsInfo; } return ConfigSettings.VitalsPoorString.Value + "\n"; } internal static int GetCostCreds(bool upgradeStatus) { if (!upgradeStatus) { return ConfigSettings.VitalsCost.Value; } return 0; } internal static string AskBioscanUpgrade() { if (!enemyScanUpgradeEnabled) { return $"Purchase the BioScanner 2.0 Upgrade Patch?\nThis software update is available for {ConfigSettings.BioScanUpgradeCost.Value} Credits.\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } TerminalGeneral.CancelConfirmation = true; return "BioScanner software has already been updated to the latest patch (2.0).\r\n\r\n"; } internal static string AskVitalsUpgrade() { if (!vitalsUpgradeEnabled) { return $"Purchase the Vitals Scanner 2.0 Patch?\nThis software update is available for {ConfigSettings.VitalsUpgradeCost.Value} Credits.\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } TerminalGeneral.CancelConfirmation = true; return "Vitals Scanner software has already been updated to the latest patch (2.0).\r\n\r\n"; } private static int GetIndexNum(Item givenItem) { int num = 0; Item[] buyableItemsList = Plugin.instance.Terminal.buyableItemsList; foreach (Item val in buyableItemsList) { if ((Object)(object)givenItem == (Object)(object)val) { return num; } num++; } return -1; } private static bool TryGetItemToBuy(string itemName, out Item itemValue) { int num = 0; Item[] buyableItemsList = Plugin.instance.Terminal.buyableItemsList; foreach (Item val in buyableItemsList) { if (val.itemName.ToLower().Contains(itemName)) { Plugin.Spam($"{val.itemName} found matching to {itemName} at index: [{num}]"); if (itemsIndexed.ContainsKey(val)) { Plugin.Spam(itemName + " already indexed"); } else { itemsIndexed.Add(val, num); Plugin.Spam("indexed item: " + itemName); } itemValue = val; return true; } Plugin.Spam($"{val.itemName} at index [{num}] does not match config item {itemName}"); num++; } itemValue = null; return false; } private static int GetTotalCost(Dictionary<Item, int> itemsToPurchase, Dictionary<Item, int> itemsIndexed, out int itemCount) { int num = 0; itemCount = 0; if (itemsIndexed.Count == 0 || itemsToPurchase.Count == 0) { return num; } foreach (KeyValuePair<Item, int> item in itemsToPurchase) { int num2 = itemsToPurchase[item.Key]; int num3 = item.Key.creditsWorth * (Plugin.instance.Terminal.itemSalesPercentages[itemsIndexed[item.Key]] / 100); num3 *= num2; num += num3; itemCount += num2; Plugin.Spam($"Added {num3} to total: {num} (total item count: {itemCount})"); } Plugin.MoreLogs($"Total Cost: [{num}]"); return num; } private static int GetUpgradesTotalCost(List<TerminalNode> upgradeList, out int itemCount) { int num = 0; itemCount = 0; foreach (TerminalNode upgrade in upgradeList) { num += upgrade.itemCost; itemCount++; Plugin.Spam($"Adding {upgrade.itemCost} to total: {num}"); } Plugin.Spam($"totalCost: {num}"); return num; } internal static string AskPurchasePack() { itemsIndexed.Clear(); List<string> itemList = StringStuff.GetItemList(currentPackList); Dictionary<Item, int> itemsToPurchase = new Dictionary<Item, int>(); StringBuilder packAsk = new StringBuilder(); packAsk.AppendLine("Would you like to purchase the [" + currentPackName + "] PurchasePack?\r\n\r\n\tContents:\r\n"); PurchasePackContents(itemList, ref itemsToPurchase, ref packAsk, out var upgradeItems); int itemCount; int num = GetTotalCost(itemsToPurchase, itemsIndexed, out itemCount); if (upgradeItems.Count > 0) { int itemCount2; int upgradesTotalCost = GetUpgradesTotalCost(upgradeItems, out itemCount2); Plugin.Spam($"Adding {upgradesTotalCost} to {num}"); num += upgradesTotalCost; } if (num <= Plugin.instance.Terminal.groupCredits) { packAsk.AppendLine($"\r\n\tTotal Cost: ■{num}({itemCount} items)\r\n\r\nPlease CONFIRM or DENY.\n"); buyPackName = currentPackName; return packAsk.ToString(); } Plugin.MoreLogs("not enough credits to purchase, sending to cannot afford display"); TerminalGeneral.CancelConfirmation = true; return $"You cannot afford the {currentPackName} PurchasePack ({itemCount} items).\r\n\r\n\tTotal Cost: ■<color=#BD3131>{num}</color>\r\n\r\n"; } private static int GetNameCount(List<string> itemList, string itemName) { int num = 0; foreach (string item in itemList) { if (item == itemName) { num++; Plugin.Spam($"Count for {item} - {num}"); } } Plugin.MoreLogs($"Final Count: {itemName} - {num}"); return num; } internal static int GetCostFromList(List<string> itemList) { int num = 0; foreach (string item in itemList) { TerminalNode UpgradeNode; if (TryGetItem(item, out var itemValue)) { Plugin.Spam(item + " is a valid item, getting cost"); int indexNum = GetIndexNum(itemValue); int num2 = itemValue.creditsWorth * (Plugin.instance.Terminal.itemSalesPercentages[indexNum] / 100); Plugin.Spam($"Adding {num2} to {num}"); num += num2; } else if (TryGetUpgrade(item, out UpgradeNode)) { Plugin.Spam("Upgrade detected"); if ((Object)(object)UpgradeNode == (Object)null) { Plugin.Spam("returned upgradeItem terminalNode is null for some reason"); } else if (CheckUnlockableStatus(UpgradeNode.shipUnlockableID)) { Plugin.Spam($"list contains ship upgrade {UpgradeNode.creatureName}, adding value {UpgradeNode.itemCost} to {num}"); num += UpgradeNode.itemCost; } } } Plugin.MoreLogs($"total cost of list: {num}"); return num; } private static bool TryGetItem(string itemName, out Item itemValue) { Item[] buyableItemsList = Plugin.instance.Terminal.buyableItemsList; foreach (Item val in buyableItemsList) { if (val.itemName.ToLower().Contains(itemName)) { itemValue = val; return true; } } itemValue = null; return false; } private static bool TryGetUpgrade(string upgradeName, out TerminalNode UpgradeNode) { UpgradeNode = null; Plugin.Spam("TryGetUpgrade from " + upgradeName); Plugin.Spam("iterating through Plugin.Allnodes"); foreach (TerminalNode allnode in Plugin.Allnodes) { if ((Object)(object)allnode != (Object)null && allnode.creatureName != null && allnode.creatureName.ToLower().StartsWith(upgradeName.ToLower()) && allnode.shipUnlockableID > 0 && CheckUnlockableStatus(allnode.shipUnlockableID)) { Plugin.Spam($"unlockableID: {allnode.shipUnlockableID}"); Plugin.Spam("creatureName: " + allnode.creatureName + " matching " + upgradeName); UpgradeNode = allnode; return true; } } return false; } private static void PurchasePackContents(List<string> itemList, ref Dictionary<Item, int> itemsToPurchase, ref StringBuilder packAsk, out List<TerminalNode> upgradeItems) { List<string> list = new List<string>(); upgradeItems = new List<TerminalNode>(); foreach (string item in itemList) { TerminalNode UpgradeNode; if (TryGetItemToBuy(item, out var itemValue)) { Plugin.Spam(item + " is a valid item, adding to pack purchase"); int nameCount = GetNameCount(itemList, item); if (nameCount > 1 && !list.Contains(itemValue.itemName)) { packAsk.AppendLine($"{itemValue.itemName} x{nameCount}"); } else if (nameCount <= 1) { packAsk.AppendLine(itemValue.itemName ?? ""); } if (!list.Contains(itemValue.itemName)) { list.Add(itemValue.itemName); } if (!itemsToPurchase.ContainsKey(itemValue)) { itemsToPurchase.Add(itemValue, nameCount); } } else if (TryGetUpgrade(item, out UpgradeNode) && !upgradeItems.Contains(UpgradeNode) && CheckUnlockableStatus(UpgradeNode.shipUnlockableID)) { packAsk.AppendLine(UpgradeNode.creatureName ?? ""); upgradeItems.Add(UpgradeNode); Plugin.Spam("list contains ship upgrades, adding to custom list and returning containsUpgrades true"); } } } internal static int GetItemListCost(string rawList) { List<string> itemList = StringStuff.GetItemList(rawList); return GetCostFromList(itemList); } internal static string CompletePurchasePack() { itemsIndexed.Clear(); bool costDeducted = false; List<string> itemList = StringStuff.GetItemList(currentPackList); Dictionary<Item, int> itemsToPurchase = new Dictionary<Item, int>(); StringBuilder packAsk = new StringBuilder(); packAsk.AppendLine("You have purchased the " + buyPackName + " PurchasePack!\r\n\r\n\tContents:\r\n"); PurchasePackContents(itemList, ref itemsToPurchase, ref packAsk, out var upgradeItems); int itemCount; int num = GetTotalCost(itemsToPurchase, itemsIndexed, out itemCount); if (upgradeItems.Count > 0) { int itemCount2; int upgradesTotalCost = GetUpgradesTotalCost(upgradeItems, out itemCount2); Plugin.Spam($"Adding {upgradesTotalCost} to {num}"); num += upgradesTotalCost; } if (num > Plugin.instance.Terminal.groupCredits) { Plugin.MoreLogs("not enough credits to purchase, sending to error message"); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } int[] array = BuyItems(itemsIndexed, itemsToPurchase); if (array.Length > 9) { MegaPurchase(array, num, out costDeducted); } else { Terminal terminal = Plugin.instance.Terminal; int[] array2 = array; int num2 = 0; int[] array3 = new int[array2.Length]; int[] array4 = array2; foreach (int num3 in array4) { array3[num2] = num3; num2++; } terminal.BuyItemsServerRpc(array3, Plugin.instance.Terminal.groupCredits - num, Plugin.instance.Terminal.numberOfItemsInDropship + itemCount); costDeducted = true; } if (upgradeItems.Count > 0) { foreach (TerminalNode item in upgradeItems) { StartOfRound.Instance.BuyShipUnlockableServerRpc(item.shipUnlockableID, Plugin.instance.Terminal.groupCredits); Plugin.MoreLogs("Unlocking " + item.creatureName); } if (!costDeducted) { int[] array5 = Array.Empty<int>(); Terminal terminal2 = Plugin.instance.Terminal; int[] array6 = array5; int num4 = 0; int[] array7 = new int[array6.Length]; int[] array8 = array6; foreach (int num3 in array8) { array7[num4] = num3; num4++; } terminal2.BuyItemsServerRpc(array7, Plugin.instance.Terminal.groupCredits - num, Plugin.instance.Terminal.numberOfItemsInDropship); } } packAsk.AppendLine($"\r\n\r\nYour new balance is ■{Plugin.instance.Terminal.groupCredits} credits\r\n\r\n\tEnjoy!\r\n"); Plugin.instance.Terminal.PlayTerminalAudioServerRpc(0); return packAsk.ToString(); } private static void MegaPurchase(int[] fullItemList, int totalCost, out bool costDeducted) { int num = 0; List<int> list = new List<int>(); foreach (int item in fullItemList) { if (num < 9) { list.Add(item); num++; Plugin.Spam($"count: {num}"); continue; } Plugin.instance.Terminal.BuyItemsServerRpc(list.ToArray(), Plugin.instance.Terminal.groupCredits, Plugin.instance.Terminal.numberOfItemsInDropship + 9); Plugin.Spam($"purchased {num} items"); num = 0; list.Clear(); list.Add(item); num++; } if (list.Count > 0) { Plugin.instance.Terminal.BuyItemsServerRpc(list.ToArray(), Plugin.instance.Terminal.groupCredits, Plugin.instance.Terminal.numberOfItemsInDropship + list.Count); Plugin.Spam($"purchased another {list.Count} items"); } int[] array = Array.Empty<int>(); Terminal terminal = Plugin.instance.Terminal; int[] array2 = array; int num2 = 0; int[] array3 = new int[array2.Length]; int[] array4 = array2; foreach (int num3 in array4) { array3[num2] = num3; num2++; } terminal.BuyItemsServerRpc(array3, Plugin.instance.Terminal.groupCredits - totalCost, Plugin.instance.Terminal.numberOfItemsInDropship); costDeducted = true; Plugin.Spam("end of megapurchase"); } private static int[] BuyItems(Dictionary<Item, int> itemsIndexed, Dictionary<Item, int> itemCounts) { List<int> list = new List<int>(); foreach (KeyValuePair<Item, int> item in itemsIndexed) { int num = itemCounts[item.Key]; for (int i = 0; i < num; i++) { list.Add(item.Value); Plugin.Spam($"Adding {item.Key} to order list ({i})"); } } return list.ToArray(); } internal static string PerformBioscanUpgrade() { if (!enemyScanUpgradeEnabled) { int num = Plugin.instance.Terminal.groupCredits - ConfigSettings.BioScanUpgradeCost.Value; string result = $"Biomatter Scanner software has been updated to the latest patch (2.0) and now provides more detailed information!\r\n\r\nYour new balance is ■{num} Credits\r\n"; SaveManager.NewUnlock("BioscanPatch"); Plugin.instance.Terminal.SyncGroupCreditsServerRpc(num, Plugin.instance.Terminal.numberOfItemsInDropship); Plugin.instance.Terminal.PlayTerminalAudioServerRpc(0); return result; } return "BioScanner software has already been updated to the latest patch (2.0).\r\n\r\n"; } internal static string GetRefund() { int numberOfItemsInDropship = Plugin.instance.Terminal.numberOfItemsInDropship; Item[] buyableItemsList = Plugin.instance.Terminal.buyableItemsList; List<string> list = new List<string>(); int num = 0; Plugin.MoreLogs($"buyables: {buyableItemsList.Length}, deliverables: {numberOfItemsInDropship}, items: {storeCart.Count}"); if (numberOfItemsInDropship > 0) { foreach (int item in storeCart) { if (item <= buyableItemsList.Length) { int indexNum = GetIndexNum(buyableItemsList[item]); int num2 = buyableItemsList[item].creditsWorth * (Plugin.instance.Terminal.itemSalesPercentages[indexNum] / 100); num += num2; string itemName = buyableItemsList[item].itemName; list.Add(itemName + "\n"); Plugin.Spam($"Adding {itemName} ${num2} to refund list"); } else { Plugin.Spam("Unable to add item to refund list"); } } Plugin.Spam($"old creds: {Plugin.instance.Terminal.groupCredits}"); int num3 = Plugin.instance.Terminal.groupCredits + num; Plugin.instance.Terminal.groupCredits = num3; Plugin.Spam($"new creds: {num3}"); Plugin.instance.Terminal.orderedItemsFromTerminal.Clear(); storeCart.Clear(); NetHandler.Instance.SyncDropShipServerRpc(isRefund: true); NetHandler.Instance.SyncCreditsServerRpc(num3, 0); string arg = ListToStringBuild(list); Plugin.MoreLogs($"Refund total: ${num}"); string result = $"Cancelling order for:\n{arg}\nYou have been refunded ■{num} Credits!\r\n"; Plugin.instance.Terminal.PlayTerminalAudioServerRpc(0); return result; } return "No ordered items detected on the dropship.\n\n"; } private static string ListToStringBuild(List<string> list) { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < list.Count; i++) { stringBuilder.Append(list[i]); } return stringBuilder.ToString(); } internal static string PerformVitalsUpgrade() { if (!vitalsUpgradeEnabled) { int num = Plugin.instance.Terminal.groupCredits - ConfigSettings.VitalsUpgradeCost.Value; SaveManager.NewUnlock("VitalsPatch"); string result = $"Vitals Scanner software has been updated to the latest patch (2.0) and no longer requires credits to scan.\r\n\r\nYour new balance is ■{num} credits\r\n"; Plugin.instance.Terminal.SyncGroupCreditsServerRpc(num, Plugin.instance.Terminal.numberOfItemsInDropship); Plugin.instance.Terminal.PlayTerminalAudioServerRpc(0); return result; } return "Update already purchased.\n"; } private static bool ShouldDisplayVitals(PlayerControllerB playerInfo, int getCreds, int costCreds) { return !playerInfo.isPlayerDead && (getCreds >= costCreds || vitalsUpgradeEnabled); } internal static int CalculateNewCredits(int getCreds, int costCreds, Terminal frompatch) { int num = (frompatch.groupCredits = getCreds - costCreds); NetHandler.Instance.SyncCreditsServerRpc(num, frompatch.numberOfItemsInDropship); return num; } private static string GetVitalsInfo(PlayerControllerB playerInfo) { int health = playerInfo.health; float carryWeight = playerInfo.carryWeight; float insanityLevel = playerInfo.insanityLevel; bool flag = playerInfo.ItemSlots.Any((GrabbableObject item) => item is FlashlightItem); float num = Mathf.RoundToInt(Mathf.Clamp(carryWeight - 1f, 0f, 100f) * 105f); string text = $"{playerInfo.playerUsername} Vitals:\n\n Health: {health}\n Weight: {num}\n Sanity: {insanityLevel}"; if (flag) { float num2 = Mathf.RoundToInt(playerInfo.pocketedFlashlight.insertedBattery.charge * 100f); text += $"\n Flashlight Battery Percentage: {num2}%"; } return text; } private static string GetCreditsInfo(int newCreds) { return $"Your new balance is ■{newCreds} Credits.\r\n"; } } internal class DynamicCommands { internal static bool newParsedValue; internal static bool validFovNum; internal static bool fovEnum; public static int ParsedValue { get; internal set; } public static string Linktext { get; internal set; } internal static string BindKeyToCommand() { string[] words = StringStuff.GetWords(); ShortcutBindings.BindToCommand(words, words.Length, out var displayText); return displayText; } internal static string UnBindKeyToCommand() { string[] words = StringStuff.GetWords(); ShortcutBindings.UnbindKey(words, words.Length, out var displayText); return displayText; } internal static string FovPrompt() { if (!Plugin.instance.FovAdjust) { validFovNum = false; string result = "Unable to change your fov at this time...\r\n\tRequired mod [FOVAdjust] is not loaded!\r\n\r\n"; Plugin.WARNING("not enough words for the fov command!"); return result; } string afterKeyword = StringStuff.GetAfterKeyword(StringStuff.GetKeywordsPerConfigItem(ConfigSettings.FovKeywords.Value)); if (afterKeyword.Length < 1) { validFovNum = false; string result2 = "Unable to change your fov at this time...\r\n\tInvalid input detected, no digits were provided!\r\n\r\n"; Plugin.WARNING("not enough words for the fov command!"); return result2; } if (int.TryParse(afterKeyword, out var result3)) { newParsedValue = true; validFovNum = true; Plugin.Spam("))))))))))))))))))Integer Established"); ParsedValue = result3; return $"Set your FOV to {ParsedValue}?\n\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } validFovNum = false; string result4 = "Unable to change your fov at this time...\r\n\tInvalid input detected!\n\tInput: " + afterKeyword + "\r\n\r\n"; Plugin.WARNING("there are no digits for the fov command!"); return result4; } internal static string FovConfirm() { if (validFovNum) { Plugin.MoreLogs("Valid fov value detected, returning fov command action"); FovNodeText(out var displayText); return displayText; } Plugin.MoreLogs("attempting to confirm invalid fov. Returning error"); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static string FovDeny() { if (validFovNum) { Plugin.MoreLogs("Valid fov value detected, but fov has been canceled"); return $"Fov change to {ParsedValue} has been canceled.\r\n\r\n\r\n"; } Plugin.MoreLogs("attempting to confirm invalid fov. Returning error"); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } private static void FovNodeText(out string displayText) { TerminalNode currentNode = Plugin.instance.Terminal.currentNode; if (!Plugin.instance.FovAdjust) { displayText = "FovAdjust mod is not installed, command can not be run.\r\n"; return; } int parsedValue = ParsedValue; float num = parsedValue; if (num != 0f && num >= 66f && num <= 130f && newParsedValue) { currentNode.clearPreviousText = true; displayText = "Setting FOV to - " + parsedValue + "\n\n"; ((MonoBehaviour)Plugin.instance.Terminal).StartCoroutine(FovEnum(Plugin.instance.Terminal, num)); } else { displayText = "Fov can only be set between 66 and 130\n"; } } private static IEnumerator FovEnum(Terminal term, float number) { if (!fovEnum) { fovEnum = true; yield return (object)new WaitForSeconds(0.5f); FovAdjustStuff.FovAdjustFunc(term, number); fovEnum = false; } } } internal class BMX_LobbyCompat { public static void SetCompat(bool isNetworked) { Version version = Assembly.GetExecutingAssembly().GetName().Version; if (isNetworked) { PluginHelper.RegisterPlugin("NeoUmbreon.TumultuousTime", version, (CompatibilityLevel)2, (VersionStrictness)3); } else { PluginHelper.RegisterPlugin("NeoUmbreon.TumultuousTime", version, (CompatibilityLevel)0, (VersionStrictness)3); } } } internal class FovAdjustStuff { [MethodImpl(MethodImplOptions.NoInlining)] internal static void FovAdjustFunc(Terminal instance, float number) { instance.QuitTerminal(true); number = Mathf.Clamp(number, 66f, 130f); PlayerControllerBPatches.newTargetFovBase = number; PlayerControllerBPatches.calculateVisorStuff(); DynamicCommands.newParsedValue = false; } } internal class GambaCommands { internal static bool validGambleValue; internal static string Ask2Gamble() { Plugin.MoreLogs("Ask2Gamble"); string afterKeyword = StringStuff.GetAfterKeyword(StringStuff.GetKeywordsPerConfigItem(ConfigSettings.GambleKeywords.Value)); if (afterKeyword.Length < 1) { TerminalGeneral.CancelConfirmation = true; validGambleValue = false; string result = "Unable to gamble at this time...\r\n\tInvalid input detected, no digits were provided!\r\n\r\n"; Plugin.WARNING("not enough words for the gamble command!"); return result; } if (int.TryParse(afterKeyword, out var result2)) { if (result2 < 0 || result2 > 100) { return BadInputGamble(afterKeyword); } DynamicCommands.newParsedValue = true; validGambleValue = true; Plugin.MoreLogs("))))))))))))))))))Integer Established"); DynamicCommands.ParsedValue = result2; return $"Gamble {DynamicCommands.ParsedValue}% of your credits?\n\n\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n"; } return BadInputGamble(afterKeyword); } internal static string BadInputGamble(string val) { TerminalGeneral.CancelConfirmation = true; validGambleValue = false; string result = "Unable to gamble at this time...\r\n\tInvalid input detected!\r\n\tInput: " + val + "\r\n\r\n"; Plugin.WARNING("there are no digits for the gamble command!"); return result; } internal static string GambleConfirm() { if (validGambleValue) { Plugin.MoreLogs("Valid gamble value detected, returning gamble command action"); BasicGambleCommand(out var displayText); return displayText; } Plugin.MoreLogs("attempting to confirm invalid gamble. Returning error"); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static string GambleDeny() { if (validGambleValue) { Plugin.MoreLogs("Valid gamble value detected, but gamble has been canceled"); return $"Gamble for {DynamicCommands.ParsedValue}% of your credits has been canceled.\r\n\r\n\r\n"; } Plugin.MoreLogs("attempting to confirm invalid gamble. Returning error"); return Plugin.instance.Terminal.terminalNodes.specialNodes[5].displayText; } internal static void BasicGambleCommand(out string displayText) { float num = DynamicCommands.ParsedValue; if (!DynamicCommands.newParsedValue || num < 0f || num > 100f) { Plugin.MoreLogs("Invalid percentage value. Telling user."); displayText = "Invalid gamble percentage, please input a value between 0 and 100.\n\n"; return; } if (Plugin.instance.Terminal.groupCredits <= ConfigSettings.GambleMinimum.Value) { Plugin.MoreLogs("Invalid percentage value. Telling user."); displayText = ConfigSettings.GamblePoorString.Value + "\n\n"; return; } (int, string) tuple = Gamble(Plugin.instance.Terminal.groupCredits, num); Plugin.instance.Terminal.groupCredits = tuple.Item1; NetHandler.Instance.SyncCreditsServerRpc(tuple.Item1, Plugin.instance.Terminal.numberOfItemsInDropship); DynamicCommands.newParsedValue = false; displayText = tuple.Item2; } private static (int newGroupCredits, string displayText) Gamble(int currentGroupCredits, float percentage) { percentage = Mathf.Clamp(percentage, 0f, 100f); int num = (int)((float)currentGroupCredits * (percentage / 100f)); float value = Random.value; float value2 = Random.value; if (value < value2) { string item = $"Congratulations! You won ■{num} credits!\r\n\r\nYour new balance is ■{currentGroupCredits + num} Credits.\r\n"; return (currentGroupCredits + num, item); } int num2 = currentGroupCredits - num; if (ConfigSettings.GamblePityMode.Value && num2 == 0) { if (ConfigSettings.GamblePityCredits.Value <= 60) { string item2 = $"Sorry, you lost ■{num} credits.\n\nHowever, you've received {ConfigSettings.GamblePityCredits.Value} Pity Credits.\r\n\r\nYour new balance is ■{ConfigSettings.GamblePityCredits.Value} Credits.\r\n"; return (ConfigSettings.GamblePityCredits.Value, item2); } string item3 = $"Sorry, you lost ■{num} credits.\n\nUnfortunately we're also fresh out of Pity Credits due to malicious actors.\r\n\r\nYour new balance is ■{num2} Credits.\r\n"; return (currentGroupCredits - num, item3); } string item4 = $"Sorry, you lost ■{num} credits.\r\n\r\nYour new balance is ■{num2} Credits.\r\n"; return (currentGroupCredits - num, item4); } } internal class BoolStuff { internal static bool ListenForShortCuts() { if (!ConfigSettings.TerminalShortcuts.Value || ShortcutBindings.keyActions.Count < 1) { return false; } if (Plugin.instance.suitsTerminal && SuitsTerminalCompatibility.CheckForSuitsMenu()) { return false; } if (MoonsPlus.inMoonsMenu) { return false; } if (!Plugin.instance.Terminal.terminalInUse) { return false; } if (!ConfigSettings.TerminalShortcuts.Value || ShortcutBindings.stopForAnyReason) { return false; } return true; } internal static bool AnyKeyIsPressed() { //IL_001f: 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_0046: Unknown result type (might be due to invalid IL or missing references) foreach (KeyValuePair<Key, string> keyAction in ShortcutBindings.keyActions) { if (((ButtonControl)Keyboard.current[keyAction.Key]).isPressed) { ShortcutBindings.keyBeingPressed = keyAction.Key; Plugin.MoreLogs($"Key detected in use: {keyAction.Key}"); return true; } } return false; } internal static void ResetEnumBools() { TerminalStart.delayStartEnum = false; TerminalEvents.quitTerminalEnum = false; ShipControls.leverEnum = false; DynamicCommands.fovEnum = false; NetHandler.rainbowFlashEnum = false; AdminCommands.kickEnum = false; WalkieTerm.walkieEnum = false; } internal static bool ShouldAddCamsLogic() { if (ConfigSettings.TerminalCams.Value) { return true; } if (ConfigSettings.TerminalMap.Value) { return true; } if (ConfigSettings.TerminalMinicams.Value) { return true; } if (ConfigSettings.TerminalMinimap.Value) { return true; } if (ConfigSettings.TerminalOverlay.Value) { return true; } return false; } internal static bool MapCameraUsed() { if (!StartOfRound.Instance.localPlayerController.isInHangarShipRoom) { return false; } if (Plugin.instance.isOnMap || Plugin.instance.isOnMiniCams || Plugin.instance.isOnMiniMap || Plugin.instance.isOnOverlay || Object.op_Implicit((Object)(object)Plugin.instance.Terminal.displayingPersistentImage)) { return true; } return false; } internal static bool ShouldEnableImage(TerminalNode node) { Plugin.Spam("ShouldEnableImage? - " + ((Object)node).name); if (Plugin.instance.suitsTerminal && SuitsTerminalCompatibility.CheckForSuitsMenu()) { SplitViewChecks.ResetPluginInstanceBools(); SplitViewChecks.DisableSplitView("neither"); return false; } if ((Object)(object)node.displayVideo != (Object)null) { return true; } if (ViewCommands.AnyActiveMonitoring()) { return true; } if (Plugin.instance.isOnMirror) { return true; } if ((Object)(object)Plugin.instance.Terminal.currentNode == (Object)null) { return false; } if (MoreCamStuff.excludedNames.Contains(((Object)node).name) && !MoreCamStuff.HideCams() && ((Behaviour)Plugin.instance.Terminal.terminalImage).enabled) { return true; } return false; } internal static bool AnyMonitoringModesEnabled() { return ConfigSettings.TerminalMap.Value || ConfigSettings.TerminalCams.Value || ConfigSettings.TerminalOverlay.Value || ConfigSettings.TerminalMinimap.Value || ConfigSettings.TerminalMinicams.Value; } } internal class Misc { internal static PlayerControllerB GetPlayerFromName(string playerName) { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.playerUsername.ToLower() == playerName.ToLower()) { return val; } } return null; } internal static PlayerControllerB GetPlayerUsingTerminal() { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (!val.isPlayerDead && (Object)(object)val.currentTriggerInAnimationWith == (Object)(object)Plugin.instance.Terminal.terminalTrigger) { Plugin.MoreLogs("Player: " + val.playerUsername + " detected using terminal."); return val; } } return null; } internal static int HostClientID() { PlayerControllerB[] allPlayerScripts = StartOfRound.Instance.allPlayerScripts; foreach (PlayerControllerB val in allPlayerScripts) { if (val.isHostPlayerObject) { Plugin.MoreLogs($"Player: {val.playerUsername} is the host, client ID: {val.playerClientId}."); return (int)val.playerClientId; } } return -1; } } internal class StringStuff { internal static string[] GetWords() { string text = Plugin.instance.Terminal.screenText.text.Substring(Plugin.instance.Terminal.screenText.text.Length - Plugin.instance.Terminal.textAdded); return text.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); } internal static string GetAfterKeyword(List<string> keywords) { string text = Plugin.instance.Terminal.screenText.text.Substring(Plugin.instance.Terminal.screenText.text.Length - Plugin.instance.Terminal.textAdded); foreach (string keyword in keywords) { if (text.StartsWith(keyword, ignoreCase: true, null)) { return text.Replace(keyword, ""); } } return ""; } internal static List<string> GetKeywordsPerConfigItem(string configItem) { List<string> result = new List<string>(); if (configItem.Length > 0) { result = (from item in configItem.Split(new char[1] { ';' }) select item.TrimStart(Array.Empty<char>())).ToList(); } return result; } internal static List<int> GetNumberListFromStringList(List<string> stringList) { List<int> list = new List<int>(); foreach (string @string in stringList) { if (int.TryParse(@string, out var result)) { list.Add(result); } else { Plugin.WARNING("Could not parse " + @string + " to integer"); } } return list; } internal static List<string> GetItemList(string rawList) { List<string> result = new List<string>(); if (rawList.Length > 0) { result = (from item in rawList.Split(new char[1] { ',' }) select item.TrimStart(Array.Empty<char>())).ToList(); } return result; } internal static Dictionary<string, string> GetKeywordAndItemNames(string configItem) { Dictionary<string, string> result = new Dictionary<string, string>(); if (configItem.Length > 0) { result = (from item in configItem.Split(new char[1] { ';' }) select item.Trim() into item select item.Split(new char[1] { ':' })).ToDictionary((string[] pair) => pair[0].Trim(), (string[] pair) => pair[1].Trim()); } return result; } internal static List<string> GetListToLower(List<string> stringList) { List<string> list = new List<string>(); foreach (string @string in stringList) { list.Add(@string.ToLower()); } return list; } } internal class AutoComplete { internal static int AutoCompleteIndex = -1; internal static List<string> AutoCompleteResults = new List<string>(); internal static List<string> GetMatchingKeywords(string input) { List<string> list = new List<string>(); list.Add(input); Plugin.Spam("added " + input + " to automcomplete list"); TerminalKeyword[] allKeywords = Plugin.instance.Terminal.terminalNodes.allKeywords; foreach (TerminalKeyword val in allKeywords) { if (val.word.ToLower().Contains(input)) { list.Add(val.word); Plugin.Spam("adding matching word: " + val.word + " to autocomplete list"); } } if (GameStuff.otherModWords.Count > 0) { foreach (string otherModWord in GameStuff.otherModWords) { if (otherModWord.ToLower().Contains(input)) { list.Add(otherModWord); Plugin.Spam("adding otherModWord: " + otherModWord + " to autocomplete list"); } } } return list; } internal static bool CheckCurrentInput(List<string> matchList, string input) { if (!matchList.Contains(input)) { AutoCompleteIndex = -1; return false; } return true; } internal static string ShowMatchingKeywords(List<string> matchList, ref int currentIndex) { Plugin.Spam($"Matching Words: {matchList.Count}"); if (matchList.Count < 1) { Plugin.Spam("matchList count is 0"); currentIndex = 0; return string.Empty; } if (matchList.Count > ConfigSettings.TerminalAutoCompleteMaxCount.Value) { Plugin.Spam("matchList count is too high"); currentIndex = -1; return matchList[0].ToString(); } if (currentIndex == -1) { currentIndex = 1; } if (currentIndex > matchList.Count - 1) { Plugin.Spam("setting autocompleteindex to 0"); currentIndex = -1; return matchList[0].ToString(); } string result = matchList[currentIndex].ToString(); currentIndex++; return result; } } internal class TerminalHistory { internal static List<string> CommandHistory = new List<string>(); internal static int historyIndex = 0; internal static void AddToCommandHistory(string command) { if (ConfigSettings.TerminalHistory.Value) { if (CommandHistory.Count < ConfigSettings.TerminalHistoryMaxCount.Value) { CommandHistory.Add(command); } else { CommandHistory.RemoveAt(0); CommandHistory.Add(command); } Plugin.Spam("Added " + command + " to CommandHistory List"); } } internal static int PreviousIndex() { if (CommandHistory.Count < 1) { Plugin.Spam("CommandHistory.Count < 1"); historyIndex = 0; return historyIndex; } if (historyIndex == 0) { historyIndex = CommandHistory.Count - 1; } else { historyIndex--; } return historyIndex; } internal static int NextIndex() { if (CommandHistory.Count < 1) { Plugin.Spam("CommandHistory.Count < 1"); historyIndex = 0; return historyIndex; } if (historyIndex == CommandHistory.Count - 1) { historyIndex = 0; } else { historyIndex++; } return historyIndex; } internal static string GetFromCommandHistory(ref int currentIndex) { string empty = string.Empty; if (CommandHistory.Count < 1) { return empty; } if (CommandHistory.Count > currentIndex) { empty = CommandHistory[currentIndex]; } else { empty = CommandHistory[0]; currentIndex = 0; } return empty; } } internal class throwawaycode { } internal class AlwaysOnStuff { internal static bool delayOff; internal static ScreenSettings screenSettings; internal static void IsPlayerDead() { if (StartOfRound.Instance.localPlayerController.isPlayerDead && DisableScreenOnDeath() && ((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf) { ((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.SetActive(false); } } internal static void OnSpecateShipCheck() { if (!DisableScreenOnDeath() && screenSettings.Dynamic) { Plugin.Spam($"Spectated Player detected in ship [ {StartOfRound.Instance.localPlayerController.spectatedPlayerScript.isInHangarShipRoom} ]"); if (screenSettings.inUse && !((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf && !((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf && StartOfRound.Instance.localPlayerController.spectatedPlayerScript.isInHangarShipRoom && Plugin.instance.Terminal.placeableObject.inUse) { SetScreenPlus(visible: true); } if (!((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf && StartOfRound.Instance.localPlayerController.spectatedPlayerScript.isInHangarShipRoom) { SetScreenPlus(visible: true); } else if (((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf && !StartOfRound.Instance.localPlayerController.spectatedPlayerScript.isInHangarShipRoom) { SetScreenPlus(visible: false); } } } internal static void SetScreenPlus(bool visible) { ((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.SetActive(visible); if (!StartOfRound.Instance.inShipPhase && !TerminalEvents.clockDisabledByCommand) { TerminalClockStuff.SetClockVisible(visible); } else { TerminalClockStuff.SetClockVisible(visible: false); } if ((ViewCommands.AnyActiveMonitoring() && Plugin.instance.splitViewCreated) || Plugin.instance.isOnMirror) { Plugin.MoreLogs("Adjusting camera views to screen status"); SplitViewChecks.ShowCameraView(visible); } } internal static void PlayerShipChanged() { if ((Object)(object)StartOfRound.Instance.localPlayerController == (Object)null || screenSettings == null) { return; } Plugin.Spam($"Player detected in ship change - {StartOfRound.Instance.localPlayerController.isInHangarShipRoom}"); if (StartOfRound.Instance.localPlayerController.isPlayerDead && DisableScreenOnDeath() && ((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf) { SetScreenPlus(visible: false); } if (StartOfRound.Instance.localPlayerController.isInHangarShipRoom) { if (screenSettings.Dynamic && !screenSettings.inUse) { if (!((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf) { SetScreenPlus(visible: true); } } else if (screenSettings.inUse && TerminalUpdatePatch.inUse && !((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf) { SetScreenPlus(visible: true); } } else { if (!screenSettings.Dynamic) { return; } Plugin.Spam($"disabling screen - screenSetting Dynamic {screenSettings.Dynamic}"); if (((Component)Plugin.instance.Terminal.terminalUIScreen).gameObject.activeSelf) { if (ConfigSettings.ScreenOffDelay.Value < 1) { SetScreenPlus(visible: false); } else { ((MonoBehaviour)Plugin.instance).StartCoroutine(DelayScreenOff(ConfigSettings.ScreenOffDelay.Value)); } } } } internal static IEnumerator DelayScreenOff(int delay) { if (!delayOff) { delayOff = true; yield return (object)new WaitForSeconds((float)delay); if (!StartOfRound.Instance.localPlayerController.isInHangarShipRoom) { SetScreenPlus(visible: false); } delayOff = false; } } internal static bool DisableScreenOnDeath() { if (ConfigSettings.ScreenOnWhileDead.Value) { return false; } return StartOfRound.Instance.localPlayerController.isPlayerDead; } } internal class ScreenSettings { internal bool AlwaysOn; internal bool Dynamic; internal bool inUse; internal void Update(string setting) { if (setting.ToLower() == "alwayson") { AlwaysOn = true; Dynamic = false; inUse = false; } else if (setting.ToLower() == "inship") { AlwaysOn = true; Dynamic = true; inUse = false; } else if (setting.ToLower() == "inuse") { AlwaysOn = true; Dynamic = true; inUse = true; } else { AlwaysOn = false; Dynamic = false; inUse = false; } Plugin.Spam("ScreenSettings set to: " + setting); } internal ScreenSettings(string setting) { Update(setting); } } internal class PlayerCamsCompatibility { internal static Texture PlayerCamTexture() { Plugin.MoreLogs("Setting camstexture to monitor, both Solo's body cam and Rick Arg's Helmet cam use the same texture"); return ((Renderer)GameObject.Find("Environment/HangarShip/ShipModels2b/MonitorWall/Cube.001").GetComponent<MeshRenderer>()).materials[2].mainTexture; } } internal class MenuBuild { internal static List<TerminalMenuCategory> myMenuCategories = new List<TerminalMenuCategory>(); internal static List<TerminalMenuItem> myMenuItems = new List<TerminalMenuItem>(); internal static TerminalMenu myMenu; internal static void CategoryList() { Dictionary<string, string> dictionary = new Dictionary<string, string>(); myMenuItems.Clear(); myMenuItems = MenuBuild.TerminalMenuItems(ConfigSetup.defaultManaged); AddMenuItems(ConfigSettings.TerminalStuffBools, myMenuItems); if (MenuBuild.ShouldAddCategoryNameToMainMenu(myMenuItems, "COMFORT")) { dictionary.Add("COMFORT", "Improves the terminal user experience."); } if (MenuBuild.ShouldAddCategoryNameToMainMenu(myMenuItems, "EXTRAS")) { dictionary.Add("EXTRAS", "Adds extra functionality to the ship terminal."); } if (MenuBuild.ShouldAddCategoryNameToMainMenu(myMenuItems, "CONTROLS")) { dictionary.Add("CONTROLS", "Gives terminal more control of the ship's systems."); } if (MenuBuild.ShouldAddCategoryNameToMainMenu(myMenuItems, "FUN")) { dictionary.Add("FUN", "Type \"fun\" for a list of these [FUN]ctional commands."); } if (dictionary.Count == 0) { Plugin.WARNING("No enabled commands? ending menu creation"); } myMenuCategories = MenuBuild.InitCategories(dictionary); CreateDarmuhsTerminalStuffMenus(); } internal static void CreateDarmuhsTerminalStuffMenus() { Plugin.Spam("START CreateDarmuhsTerminalStuffMenus"); TerminalStart.InitiateTerminalStuff(); if (!ConfigSettings.CreateMoreMenus.Value) { TerminalKeyword val = default(TerminalKeyword); if (!DynamicBools.TryGetKeyword("other", ref val)) { return; } { foreach (TerminalMenuItem myMenuItem in myMenuItems) { if (myMenuItem.itemKeywords.Count == 0) { Plugin.WARNING(myMenuItem.ItemName + " has no keywords!!"); continue; } if (myMenuItem == null) { Plugin.WARNING("NULL ITEM IN myMenuItems!!!"); continue; } AddingThings.AddToExistingNodeText("\n>" + CommonStringStuff.GetKeywordsForMenuItem(myMenuItem.itemKeywords).ToUpper() + "\n" + myMenuItem.itemDescription, ref val.specialKeywordResult); Plugin.Spam(myMenuItem.ItemName + " keywords added to other menu"); } return; } } myMenu = MenuBuild.AssembleMainMenu("darmuhsTerminalStuff", "more", ConfigSettings.MoreMenuText.Value, myMenuCategories, myMenuItems, false, ""); AddingThings.AddToHelpCommand(ConfigSettings.MoreHintText.Value); TerminalNode val2 = default(TerminalNode); if (LogicHandling.TryGetFromAllNodes("OtherCommands", ref val2)) { AddingThings.AddToExistingNodeText("\n" + ConfigSettings.MoreHintText.Value, ref val2); } Plugin.Spam($"myMenu info:\nMenuName: {myMenu.MenuName}\nmyMenu.Categories.Count: {myMenu.Categories.Count}\n"); if (ConfigSettings.FauxMoreMenu.Value) { MenuBuild.CreateCategoryFauxCommands(myMenu, ConfigSetup.defaultListing); } else { MenuBuild.CreateCategoryCommands(myMenu, ConfigSettings.TerminalStuffMain); } Plugin.Spam("END CreateDarmuhsTerminalStuffMenus"); } internal static void AddMenuItems(List<ManagedConfig> managedItems, TerminalMenu myMenu) { if (myMenu.menuItems.Count == 0) { return; } foreach (ManagedConfig managedItem in managedItems) { if (managedItem.menuItem != null && !myMenu.menuItems.Contains(managedItem.menuItem)) { myMenu.menuItems.Add(managedItem.menuItem); } } } internal static void AddMenuItems(List<ManagedConfig> managedItems, List<TerminalMenuItem> myMenuItems) { if (myMenuItems.Count == 0) { return; } foreach (ManagedConfig managedItem in managedItems) { if (managedItem.menuItem != null && !myMenuItems.Contains(managedItem.menuItem)) { myMenuItems.Add(managedItem.menuItem); } } } internal static void RefreshMyMenu() { if (myMenu != null) { myMenu.menuItems.Clear(); myMenuItems.Clear(); myMenuItems = MenuBuild.TerminalMenuItems(ConfigSetup.defaultManaged); myMenu.menuItems = myMenuItems; AddMenuItems(ConfigSettings.TerminalStuffBools, myMenu); MenuBuild.UpdateCategories(myMenu); } } internal static void ClearMyMenustuff() { TerminalMenu obj = myMenu; if (obj != null) { obj.Delete(); } myMenuItems.Clear(); myMenuCategories.Clear(); } } internal class MoreCommands { private static Dictionary<string, PluginInfo> PluginsLoaded = new Dictionary<string, PluginInfo>(); internal static bool keepAlwaysOnDisabled = false; internal static string CurrentLobbyName { get; private set; } internal static string GetItemsOnShip() { LoadGrabbablesOnShip.LoadAllItems(); StringBuilder stringBuilder = new StringBuilder(); Dictionary<string, int> dictionary = new Dictionary<string, int>(); foreach (GrabbableObject item in LoadGrabbablesOnShip.ItemsOnShip) { string itemName = item.itemProperties.itemName; if (!item.itemProperties.isScrap && !item.isHeld) { dictionary[itemName] = ((!dictionary.TryGetValue(itemName, out var value)) ? 1 : (value + 1)); } } foreach (KeyValuePair<string, int> item2 in dictionary) { if (item2.Value > 1) { stringBuilder.AppendLine($"{item2.Key} x{item2.Value}"); } else { stringBuilder.AppendLine(item2.Key ?? ""); } } return $"Items on ship:\n\n{stringBuilder}\n\n"; } private static string ReturnLobbyName() { if (GameNetworkManager.Instance.steamLobbyName != null && GameNetworkManager.Instance.steamLobbyName != string.Empty) { CurrentLobbyName = GameNetworkManager.Instance.steamLobbyName; return "Lobby Name: " + CurrentLobbyName + "\n"; } return "Unable to determine Lobby Name. \n"; } internal static string GetLobbyName() { return ReturnLobbyName(); } internal static string ModListCommand() { PluginsLoaded = Chainloader.PluginInfos; string text = string.Join("\n", PluginsLoaded.Select((KeyValuePair<string, PluginInfo> kvp) => $"{kvp.Value.Metadata.Name}, Version: {kvp.Value.Metadata.Version}")); return "Mod List:\n\n" + text + "\n\n"; } internal static string HealCommand() { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) int health = GameNetworkManager.Instance.localPlayerController.health; if (health >= 100) { Plugin.MoreLogs($"Health = {health}"); return ConfigSettings.HealIsFullString.Value + "\n"; } Plugin.MoreLogs($"Health before = {health}"); GameNetworkManager.Instance.localPlayerController.DamagePlayer(-100, false, true, (CauseOfDeath)0, 0, false, default(Vector3)); GameNetworkManager.Instance.localPlayerController.MakeCriticallyInjured(false); int health2 = GameNetworkManager.Instance.localPlayerController.health; string result = $"{ConfigSettings.HealString.Value}\nHealth: {GameNetworkManager.Instance.localPlayerController.health}\r\n"; Plugin.MoreLogs($"Health now = {health2}"); return result; } internal static string DangerCommand() { if (StartOfRound.Instance.shipDoorsEnabled) { string riskLevel = StartOfRound.Instance.currentLevel.riskLevel; return "Current Danger Level: " + riskLevel + "\n\n"; } return "Still in orbit.\n\n"; } internal static string FirstLinkDo() { int linkID = 0; return ExternalLink(linkID); } internal static string SecondLinkDo() { int linkID = 1; return ExternalLink(linkID); } internal static string FirstLinkAsk() { int linkID = 0; return LinksAsk(linkID); } internal static string SecondLinkAsk() { int linkID = 1; return LinksAsk(linkID); } internal static string FirstLinkDeny() { int linkID = 0; return LinksDeny(linkID); } internal static string SecondLinkDeny() { int linkID = 1; return LinksDeny(linkID); } internal static void GetLinkText(int linkID) { if (linkID == 0) { DynamicCommands.Linktext = ConfigSettings.CustomLink.Value; } else { DynamicCommands.Linktext = ConfigSettings.CustomLink2.Value; } } internal static string ExternalLink(int linkID) { GetLinkText(linkID); string result = "Taking you to " + DynamicCommands.Linktext + " now...\n"; Application.OpenURL(DynamicCommands.Linktext); ((MonoBehaviour)Plugin.instance.Terminal).StartCoroutine(TerminalEvents.TerminalQuitter(Plugin.instance.Terminal)); return result; } internal static string LinksAsk(int linkID) { GetLinkText(linkID); return "Would you like to be taken to the following link?\n\n\t" + DynamicCommands.Linktext + "\n\n\n\n\n\n\n\n\n\nPlease CONFIRM or DENY.\n\n"; } internal static string LinksDeny(int linkID) { GetLinkText(linkID); return "You have cancelled visiting the site:\n\n\t" + DynamicCommands.Linktext + "\n\n"; } internal static string AlwaysOnDisplay() { if (!TerminalStart.alwaysOnDisplay && ConfigSettings.NetworkedNodes.Value && ConfigSettings.ModNetworking.Value) { keepAlwaysOnDisabled = false; NetHandler.Instance.AoDServerRpc(aod: true); return "Terminal Always-on Display [ENABLED]\r\n"; } if (TerminalStart.alwaysOnDisplay && ConfigSettings.NetworkedNodes.Value && ConfigSettings.ModNetworking.Value) { keepAlwaysOnDisabled = true; NetHandler.Instance.AoDServerRpc(aod: false); return "Terminal Always-on Display [DISABLED]\r\n"; } if (!TerminalStart.alwaysOnDisplay && !ConfigSettings.NetworkedNodes.Value) { keepAlwaysOnDisabled = false; TerminalStart.alwaysOnDisplay = true; return "Terminal Always-on Display [ENABLED]\r\n"; } if (TerminalStart.alwaysOnDisplay && !ConfigSettings.NetworkedNodes.Value) { keepAlwaysOnDisabled = true; TerminalStart.alwaysOnDisplay = false; return "Terminal Always-on Display [DISABLED]\r\n"; } Plugin.Log.LogError((object)"report this as a bug with alwayson please"); return "alwayson failed to initiate, report this as a bug please."; } } public class NetHandler : NetworkBehaviour { public static CustomEvent ShipReset = new CustomEvent(); internal static Terminal patchTerminal = null; internal static bool netNodeSet = false; internal bool endFlashRainbow = false; internal static TerminalNode netNode = AddingThings.CreateDummyNode("", true, ""); internal static bool rainbowFlashEnum = false; internal static NetHandler Instance { get; private set; } [ServerRpc(RequireOwnership = false)] internal void NodeLoadServerRpc(string topRightText, string nodeName, string nodeText, int nodeNumber = -1) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Invalid comparison between Unknown and I4 //IL_005f: 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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = ((NetworkBehaviour)this).NetworkManager; if (networkManager == null || !networkManager.IsListening) { return; } if ((int)base.__rpc_exec_stage != 1 && (networkManager.IsClient || networkManager.IsHost)) { ServerRpcParams val = default(ServerRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendServerRpc(2239934374u, val, (RpcDelivery)0); bool flag = topRightText != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(topRightText, false); } bool flag2 = nodeName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag2, default(ForPrimitives)); if (flag2) { ((FastBufferWriter)(ref val2)).WriteValueSafe(nodeName, false); } bool flag3 = nodeText != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag3, default(ForPrimitives)); if (flag3) { ((FastBufferWriter)(ref val2)).WriteValueSafe(nodeText, false); } BytePacker.WriteValueBitPacked(val2, nodeNumber); ((NetworkBehaviour)this).__endSendServerRpc(ref val2, 2239934374u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage != 1 || (!networkManager.IsServer && !networkManager.IsHost)) { return; } NetworkManager networkManager2 = ((NetworkBehaviour)this).NetworkManager; if (netNodeSet && (networkManager2.IsHost || networkManager2.IsServer)) { Plugin.MoreLogs("RPC called from host, sending to client RPC "); NodeLoadClientRpc(topRightText, nodeName, nodeText, fromHost: true, nodeNumber); return; } if ((!netNodeSet && networkManager2.IsHost) || networkManager2.IsServer) { Plugin.MoreLogs($"Host: attempting to sync node {nodeName}/{nodeNumber}"); SyncNodes(topRightText, nodeName, nodeText, nodeNumber); } else { Plugin.MoreLogs("Server: This should only be coming from clients"); NodeLoadClientRpc(topRightText, nodeName, nodeText, fromHost: true, nodeNumber); } Plugin.MoreLogs("Server: Attempting to sync nodes between clients."); } [ClientRpc] internal void NodeLoadClientRpc(string topRightText, string nodeName, string nodeText, bool fromHost, int nodeNumber = -1) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Invalid comparison between Unknown and I4 //IL_005f: 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_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (mig