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 CozyFurniture v1.0.8
CozyFurniture.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using CozyFurniture.NetcodePatcher; using GameNetcodeStuff; using HarmonyLib; using LethalLib.Modules; using Microsoft.CodeAnalysis; using Unity.Netcode; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CozyFurniture")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("A furniture for Lethal Company")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("CozyFurniture")] [assembly: AssemblyTitle("CozyFurniture")] [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; } } } namespace CozyFurniture { [Serializable] [HarmonyPatch] public class ConfigSync { public static bool isSynced; public static ConfigSync defaultConfig; public static ConfigSync instance; public bool syncUnlockEverything; public bool syncShareEverything; public bool syncSyncUnsharedEmotes; public bool syncEnableMovingWhileEmoting; public bool syncDisableRaritySystem; public int syncStartingEmoteCredits; public float syncAddEmoteCreditsMultiplier; public bool syncPurchaseEmotesWithDefaultCurrency; public float syncPriceMultiplierEmotesStore; public int syncBasePriceEmoteTier0; public int syncBasePriceEmoteTier1; public int syncBasePriceEmoteTier2; public int syncBasePriceEmoteTier3; public int syncNumEmotesStoreRotation; public float syncRotationChanceEmoteTier0; public float syncRotationChanceEmoteTier1; public float syncRotationChanceEmoteTier2; public float syncRotationChanceEmoteTier3; public bool syncEnableMaskedEnemiesEmoting; public float syncMaskedEnemiesEmoteChanceOnEncounter; public bool syncMaskedEnemiesAlwaysEmoteOnFirstEncounter; public bool syncOverrideStopAndStareDuration; public float syncMaskedEnemyEmoteRandomDelayMin; public float syncMaskedEnemyEmoteRandomDelayMax; public float syncMaskedEnemyEmoteRandomDurationMin; public float syncMaskedEnemyEmoteRandomDurationMax; public static Vector2 syncMaskedEnemyEmoteRandomDelay; public static Vector2 syncMaskedEnemyEmoteRandomDuration; public static HashSet<ulong> syncedClients; public ConfigSync() { if (syncUnlockEverything) { syncShareEverything = true; } } public Vector2 ParseVector2FromString(string str) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0067: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) Vector2 result = Vector2.zero; try { string[] array = str.Split(','); if (float.TryParse(array[0].Trim(' '), out var result2) && float.TryParse(array[1].Trim(' '), out var result3)) { result = new Vector2(Mathf.Min(Mathf.Abs(result2), Mathf.Abs(result3)), Mathf.Max(Mathf.Abs(result2), Mathf.Abs(result3))); } return result; } catch { } return Vector2.zero; } public static void BuildDefaultConfigSync() { defaultConfig = new ConfigSync(); instance = new ConfigSync(); } [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPostfix] public static void ResetValues() { isSynced = false; } private static void OnRequestConfigSyncClientRpc(ulong clientId, FastBufferReader reader) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0089: 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_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if (!NetworkManager.Singleton.IsClient) { return; } int num = default(int); ((FastBufferReader)(ref reader)).ReadValueSafe<int>(ref num, default(ForPrimitives)); if (((FastBufferReader)(ref reader)).TryBeginRead(num)) { byte[] data = new byte[num]; ((FastBufferReader)(ref reader)).ReadBytesSafe(ref data, num, 0); instance = DeserializeFromByteArray(data); if (instance.syncUnlockEverything) { instance.syncShareEverything = true; } syncMaskedEnemyEmoteRandomDelay = new Vector2(instance.syncMaskedEnemyEmoteRandomDelayMin, instance.syncMaskedEnemyEmoteRandomDelayMax); syncMaskedEnemyEmoteRandomDuration = new Vector2(instance.syncMaskedEnemyEmoteRandomDurationMin, instance.syncMaskedEnemyEmoteRandomDurationMax); isSynced = true; } } public static byte[] SerializeConfigToByteArray(ConfigSync config) { BinaryFormatter binaryFormatter = new BinaryFormatter(); MemoryStream memoryStream = new MemoryStream(); binaryFormatter.Serialize(memoryStream, config); return memoryStream.ToArray(); } public static ConfigSync DeserializeFromByteArray(byte[] data) { MemoryStream serializationStream = new MemoryStream(data); BinaryFormatter binaryFormatter = new BinaryFormatter(); return (ConfigSync)binaryFormatter.Deserialize(serializationStream); } } public class NetworkHandler : NetworkBehaviour { public static NetworkHandler Instance { get; private set; } public static event Action<string> LevelEvent; public override void OnNetworkSpawn() { NetworkHandler.LevelEvent = null; if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { NetworkHandler instance = Instance; if (instance != null) { ((Component)instance).gameObject.GetComponent<NetworkObject>().Despawn(true); } } Instance = this; ((NetworkBehaviour)this).OnNetworkSpawn(); } [ClientRpc] public void EventClientRpc(string eventName) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Invalid comparison between Unknown and I4 //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: 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_00ba: 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 != 2 && (networkManager.IsServer || networkManager.IsHost)) { ClientRpcParams val = default(ClientRpcParams); FastBufferWriter val2 = ((NetworkBehaviour)this).__beginSendClientRpc(506852059u, val, (RpcDelivery)0); bool flag = eventName != null; ((FastBufferWriter)(ref val2)).WriteValueSafe<bool>(ref flag, default(ForPrimitives)); if (flag) { ((FastBufferWriter)(ref val2)).WriteValueSafe(eventName, false); } ((NetworkBehaviour)this).__endSendClientRpc(ref val2, 506852059u, val, (RpcDelivery)0); } if ((int)base.__rpc_exec_stage == 2 && (networkManager.IsClient || networkManager.IsHost)) { NetworkHandler.LevelEvent?.Invoke(eventName); } } protected override void __initializeVariables() { ((NetworkBehaviour)this).__initializeVariables(); } [RuntimeInitializeOnLoadMethod] internal static void InitializeRPCS_NetworkHandler() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown NetworkManager.__rpc_func_table.Add(506852059u, new RpcReceiveHandler(__rpc_handler_506852059)); } private static void __rpc_handler_506852059(NetworkBehaviour target, FastBufferReader reader, __RpcParams rpcParams) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) NetworkManager networkManager = target.NetworkManager; if (networkManager != null && networkManager.IsListening) { bool flag = default(bool); ((FastBufferReader)(ref reader)).ReadValueSafe<bool>(ref flag, default(ForPrimitives)); string eventName = null; if (flag) { ((FastBufferReader)(ref reader)).ReadValueSafe(ref eventName, false); } target.__rpc_exec_stage = (__RpcExecStage)2; ((NetworkHandler)(object)target).EventClientRpc(eventName); target.__rpc_exec_stage = (__RpcExecStage)0; } } protected internal override string __getTypeName() { return "NetworkHandler"; } } [HarmonyPatch] public class NetworkObjectManager { private static GameObject networkPrefab; [HarmonyPostfix] [HarmonyPatch(typeof(GameNetworkManager), "Start")] public static void Init() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown if (!((Object)(object)networkPrefab != (Object)null)) { networkPrefab = (GameObject)Plugin.networkBundle.LoadAsset("ExampleNetworkHandler"); networkPrefab.AddComponent<NetworkHandler>(); NetworkManager.Singleton.AddNetworkPrefab(networkPrefab); } } [HarmonyPostfix] [HarmonyPatch(typeof(StartOfRound), "Awake")] private static void SpawnNetworkHandler() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { GameObject val = Object.Instantiate<GameObject>(networkPrefab, Vector3.zero, Quaternion.identity); val.GetComponent<NetworkObject>().Spawn(false); } } } [BepInPlugin("CozyFurniture", "CozyFurniture", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private static Plugin instance; public static AssetBundle bundle; public static AssetBundle networkBundle; public static GameObject shipObject; private readonly Harmony harmony = new Harmony("CozyFurniture"); internal ManualLogSource mls; private void Awake() { NetcodePatcher(); string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); bundle = AssetBundle.LoadFromFile(Path.Combine(directoryName, "ship")); shipObject = bundle.LoadAsset<GameObject>("Assets/ShipInside (1).prefab"); NetworkPrefabs.RegisterNetworkPrefab(shipObject); Utilities.FixMixerGroups(shipObject); SpawnNetworkManager(); if ((Object)(object)bundle == (Object)null) { mls.LogError((object)"Failed to load custom assets."); return; } if ((Object)(object)instance == (Object)null) { instance = this; } mls = Logger.CreateLogSource("CozyFurniture"); mls.LogInfo((object)"CozyFurniture initalized"); mls.LogInfo((object)("Mothership Asset: " + (object)bundle)); harmony.PatchAll(typeof(Plugin)); harmony.PatchAll(typeof(TerminalPatch)); harmony.PatchAll(typeof(SpacePatcher)); [ServerRpc] void SpawnNetworkManager() { string directoryName2 = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); string fileName = Path.GetFileName(directoryName2); networkBundle = AssetBundle.LoadFromFile(fileName); } } private static void NetcodePatcher() { Type[] types = Assembly.GetExecutingAssembly().GetTypes(); Type[] array = types; foreach (Type type in array) { MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic); MethodInfo[] array2 = methods; foreach (MethodInfo methodInfo in array2) { object[] customAttributes = methodInfo.GetCustomAttributes(typeof(RuntimeInitializeOnLoadMethodAttribute), inherit: false); if (customAttributes.Length != 0) { methodInfo.Invoke(null, null); } } } } private void Update() { } } [HarmonyPatch] public static class SpacePatcher { public static ManualLogSource mls; public static bool inSpace = false; public static Plugin pluginInstance; public static GameObject shipInstantiation; public static AutoParentToShip[] furnitureArray; public static HashSet<string> blacklistedFurnitureObjects = new HashSet<string>(); public static HashSet<AutoParentToShip> toggledFurniture = new HashSet<AutoParentToShip>(); public static GameObject shipRails; public static GameObject shipRailsPost; [HarmonyPatch(typeof(StartOfRound), "TeleportPlayerInShipIfOutOfRoomBounds")] [HarmonyPrefix] public static bool TeleportPlayerInShipIfOutOfRoomBounds() { if (inSpace) { return false; } return true; } [HarmonyPatch(typeof(StartOfRound), "Awake")] [HarmonyPostfix] public static void SpawnShip() { } [HarmonyPatch(typeof(ShipBuildModeManager), "PlayerMeetsConditionsToBuild")] [HarmonyPostfix] public static void PlayerMeetsConditionsToBuild(ref bool __result) { PlayerControllerB val = Object.FindObjectOfType<PlayerControllerB>(); __result = inSpace; } [HarmonyPostfix] [HarmonyPatch(typeof(RoundManager), "Awake")] private static void AwakeServerRpc() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_00ee: Unknown result type (might be due to invalid IL or missing references) NetworkHandler.LevelEvent += ReceivedEventFromServer; mls = Logger.CreateLogSource("CozyFurniture"); shipInstantiation = Object.Instantiate<GameObject>(Plugin.shipObject, new Vector3(-13.7527f, 0.96f, -15.52f), Quaternion.identity); NetworkPrefabs.RegisterNetworkPrefab(shipInstantiation); toggledFurniture = new HashSet<AutoParentToShip>(); mls.LogInfo((object)"Server side Starting game"); shipRails = GameObject.Find("ShipRails"); shipRailsPost = GameObject.Find("ShipRailPosts"); if ((Object)(object)shipInstantiation != (Object)null) { shipInstantiation.transform.Rotate(new Vector3(0f, 1f, 0f), 180f); shipInstantiation.transform.Rotate(new Vector3(1f, 0f, 0f), 270f); } blacklistedFurnitureObjects.Add("FileCabinet"); blacklistedFurnitureObjects.Add("Terminal"); blacklistedFurnitureObjects.Add("Bunkbeds"); blacklistedFurnitureObjects.Add("StorageCloset"); blacklistedFurnitureObjects.Add("Teleporter(Clone)"); blacklistedFurnitureObjects.Add("ShipHorn(Clone)"); blacklistedFurnitureObjects.Add("InverseTeleporter(Clone)"); blacklistedFurnitureObjects.Add("SignalTranslator(Clone)"); GameObject.Find("ShipRails").SetActive(true); GameObject.Find("ShipRailPosts").SetActive(true); } [HarmonyPostfix] [HarmonyPatch(typeof(RoundManager), "InitializeRandomNumberGenerators")] private static void SubscribeToHandler() { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) NetworkHandler.LevelEvent += ReceivedEventFromServer; inSpace = false; shipInstantiation.SetActive(false); furnitureArray = Object.FindObjectsOfType<AutoParentToShip>(); RoundManager.Instance.playersManager.shipDoorsAnimator.SetBool("Closed", true); shipRails.SetActive(true); shipRailsPost.SetActive(true); BoxCollider component = GameObject.Find("ShipInnerRoomBoundsTrigger").GetComponent<BoxCollider>(); component.center = new Vector3(0f, 0f, 0f); component.size = new Vector3(1f, 0f, 0.9999999f); mls.LogInfo((object)"Server side Starting game"); if (furnitureArray == null) { return; } mls.LogInfo((object)furnitureArray); mls.LogInfo((object)"Found furniture array"); AutoParentToShip[] array = furnitureArray; foreach (AutoParentToShip val in array) { if (!blacklistedFurnitureObjects.Contains(((Object)((Component)val).gameObject).name)) { ((Component)val).gameObject.SetActive(false); toggledFurniture.Add(val); } } } [HarmonyPostfix] [HarmonyPatch(typeof(RoundManager), "DespawnPropsAtEndOfRound")] private static void UnsubscribeFromHandler() { //IL_0063: 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) NetworkHandler.LevelEvent -= ReceivedEventFromServer; inSpace = true; mls = Logger.CreateLogSource("CozyFurniture"); Object.FindObjectOfType<HangarShipDoor>().SetDoorButtonsEnabled(true); BoxCollider component = GameObject.Find("ShipInnerRoomBoundsTrigger").GetComponent<BoxCollider>(); component.center = new Vector3(-0.487964f, 0f, 0f); component.size = new Vector3(1.975929f, 1f, 1f); furnitureArray = Object.FindObjectsOfType<AutoParentToShip>(); shipInstantiation.SetActive(true); shipRails.SetActive(false); shipRailsPost.SetActive(false); if (toggledFurniture == null || furnitureArray == null) { return; } mls.LogInfo((object)furnitureArray); mls.LogInfo((object)"Found furniture array"); foreach (AutoParentToShip item in toggledFurniture.ToList()) { if (!blacklistedFurnitureObjects.Contains(((Object)((Component)item).gameObject).name)) { ((Component)item).gameObject.SetActive(true); toggledFurniture.Remove(item); } } } private static void ReceivedEventFromServer(string eventName) { } private static void SendEventToClients(string eventName) { if (NetworkManager.Singleton.IsHost || NetworkManager.Singleton.IsServer) { NetworkHandler.Instance.EventClientRpc(eventName); } } } [HarmonyPatch] public static class TerminalPatch { public static ManualLogSource mls; public static Terminal terminalInstance; public static int currentFurnitureCredits; public static Dictionary<string, int> currentFurnitureCreditsByPlayer; public static List<TerminalNode> ShipFurnitureSelection = new List<TerminalNode>(); public static bool initializedTerminalNodes = false; private static string confirmFurnitureOpeningText = "You have requested to order a new piece of furniture."; [HarmonyPatch(typeof(Terminal), "Awake")] [HarmonyPostfix] public static void InitializeTerminal(Terminal __instance) { terminalInstance = __instance; currentFurnitureCreditsByPlayer = new Dictionary<string, int>(); if (!initializedTerminalNodes) { EditExistingTerminalNodesForFurniture(); } } [HarmonyPatch(typeof(Terminal), "RotateShipDecorSelection")] [HarmonyPrefix] public static bool HijackDecor() { NetworkHandler.LevelEvent += ReceivedEventFromServer; Random random = new Random(StartOfRound.Instance.randomMapSeed + 65); terminalInstance.ShipDecorSelection.Clear(); List<TerminalNode> list = new List<TerminalNode>(); List<TerminalNode> list2 = new List<TerminalNode>(); for (int i = 0; i < StartOfRound.Instance.unlockablesList.unlockables.Count; i++) { if (StartOfRound.Instance.unlockablesList.unlockables[i].IsPlaceable || (Object)(object)StartOfRound.Instance.unlockablesList.unlockables[i].suitMaterial == (Object)null) { if ((Object)(object)StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode != (Object)null && !StartOfRound.Instance.unlockablesList.unlockables[i].alwaysInStock) { list2.Add(StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode); StartOfRound.Instance.unlockablesList.unlockables[i].alwaysInStock = true; } } else if ((Object)(object)StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode != (Object)null && !StartOfRound.Instance.unlockablesList.unlockables[i].alwaysInStock) { list.Add(StartOfRound.Instance.unlockablesList.unlockables[i].shopSelectionNode); } } int num = random.Next(4, 6); for (int j = 0; j < num; j++) { if (list.Count <= 0) { break; } TerminalNode item = list2[random.Next(0, list2.Count)]; ShipFurnitureSelection.Add(item); list2.Remove(item); TerminalNode item2 = list[random.Next(0, list.Count)]; terminalInstance.ShipDecorSelection.Add(item2); list.Remove(item2); } return false; } private static void ReceivedEventFromServer(string eventName) { } [HarmonyPatch(typeof(Terminal), "LoadNewNodeIfAffordable")] [HarmonyPostfix] public static void GenerateFurniture(ref TerminalNode node) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (node.shipUnlockableID == -1) { return; } UnlockableItem val = StartOfRound.Instance.unlockablesList.unlockables[node.shipUnlockableID]; if (StartOfRound.Instance.inShipPhase || StartOfRound.Instance.shipHasLanded) { AnimatorStateInfo currentAnimatorStateInfo = StartOfRound.Instance.shipAnimator.GetCurrentAnimatorStateInfo(0); if (((AnimatorStateInfo)(ref currentAnimatorStateInfo)).tagHash == Animator.StringToHash("ShipIdle")) { if (!ShipFurnitureSelection.Contains(node) && !val.alwaysInStock && (!node.buyUnlockable || (Object)(object)val.shopSelectionNode == (Object)null)) { Debug.Log((object)("Not in stock, node: " + ((Object)node).name)); terminalInstance.LoadNewNode(terminalInstance.terminalNodes.specialNodes[16]); } return; } } terminalInstance.LoadNewNode(terminalInstance.terminalNodes.specialNodes[15]); } public static void EditExistingTerminalNodesForFurniture() { initializedTerminalNodes = true; foreach (TerminalNode specialNode in terminalInstance.terminalNodes.specialNodes) { if (((Object)specialNode).name == "Start") { string text = "Type \"Help\" for a list of commands."; int num = specialNode.displayText.IndexOf(text); if (num != -1) { num += text.Length; string value = "\n\n[CozyFurniture]\nType \"Furniture\" for a list of commands."; specialNode.displayText = specialNode.displayText.Insert(num, value); } else { Debug.LogError((object)"Failed to add furniture tip to terminal. Maybe an update broke it?"); } } else if (((Object)specialNode).name == "HelpCommands") { string value2 = "[numberOfItemsOnRoute]"; int num2 = specialNode.displayText.IndexOf(value2); if (num2 != -1) { string value3 = ">FURNITURE\nFor a list of Furniture commands.\n\n"; specialNode.displayText = specialNode.displayText.Insert(num2, value3); } } } } [HarmonyPatch(typeof(Terminal), "TextPostProcess")] [HarmonyPrefix] public static void TextPostProcessFurniture(ref string modifiedDisplayText, TerminalNode node) { if (modifiedDisplayText.Length > 0 && (modifiedDisplayText.Contains("[[[[furnitureUnlockablesSelectionList]]]]") || (modifiedDisplayText.Contains("[[[[") && modifiedDisplayText.Contains("]]]]")))) { int num = modifiedDisplayText.IndexOf("[[[["); int num2 = modifiedDisplayText.IndexOf("]]]]") + 3; string oldValue = modifiedDisplayText.Substring(num, num2 - num); string text = ""; text = text + "Remaining furniture credit balance: $" + currentFurnitureCredits + ".\n"; text += "\n"; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < ShipFurnitureSelection.Count; i++) { stringBuilder.Append($"\n{ShipFurnitureSelection[i].creatureName} // ${ShipFurnitureSelection[i].itemCost}"); } text += stringBuilder.ToString(); if (ShipFurnitureSelection == null || ShipFurnitureSelection.Count <= 0) { modifiedDisplayText = modifiedDisplayText.Replace("[[[[furnitureUnlockablesSelectionList]]]]", "[No items available]"); } modifiedDisplayText = modifiedDisplayText.Replace(oldValue, text); } } [HarmonyPatch(typeof(Terminal), "ParsePlayerSentence")] [HarmonyPrefix] public static bool ParsePlayerSentence(ref TerminalNode __result, Terminal __instance) { if (__instance.screenText.text.Length <= 0) { return true; } string text = __instance.screenText.text.Substring(__instance.screenText.text.Length - __instance.textAdded); string[] array = text.Split(' '); if (array.Length == 0) { return true; } if (!ConfigSync.isSynced) { if (text.StartsWith("furniture")) { __result = BuildTerminalNodeHomeFurniture(); return false; } return true; } if (text.StartsWith("furnitures")) { text = text.Replace("furnitures", "furniture"); } if (text.StartsWith("furniture")) { if (text == "furniture") { __result = BuildTerminalNodeHomeFurniture(); return false; } text = text.Substring(6); return true; } return true; } private static TerminalNode BuildTerminalNodeHomeFurniture() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown return new TerminalNode { displayText = "[CozyFurniture]\n\nStore\n------------------------------\n[[[[furnitureUnlockablesSelectionList]]]]\n\n", clearPreviousText = true, acceptAnything = false }; } private static TerminalNode BuildCustomTerminalNode(string displayText, bool clearPreviousText = false, bool acceptAnything = false, bool isConfirmationNode = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown return new TerminalNode { displayText = displayText, clearPreviousText = clearPreviousText, acceptAnything = false, isConfirmationNode = isConfirmationNode }; } } public static class PluginInfo { public const string PLUGIN_GUID = "CozyFurniture"; public const string PLUGIN_NAME = "CozyFurniture"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace CozyFurniture.NetcodePatcher { [AttributeUsage(AttributeTargets.Module)] internal class NetcodePatchedAssemblyAttribute : Attribute { } }