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 LethalMuseum v1.1.0
LethalMuseum.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalCompanyInputUtils.Api; using LethalConfig; using LethalConfig.ConfigItems; using LethalConfig.ConfigItems.Options; using LethalLib.Modules; using LethalMuseum.Dependencies.InputUtils; using LethalMuseum.Dependencies.LethalConfig; using LethalMuseum.Dependencies.LethalLib; using LethalMuseum.Dependencies.RuntimeIcons; using LethalMuseum.Helpers; using LethalMuseum.Objects; using LethalMuseum.Objects.Models; using LethalMuseum.Patches; using LethalMuseum.UI.Elements; using Microsoft.CodeAnalysis; using RuntimeIcons; using RuntimeIcons.Components; using RuntimeIcons.Utils; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.InputSystem; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: IgnoresAccessChecksTo("RuntimeIcons")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LethalMuseum")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+c6e43361ed4e1b04d1d67f336ee6bd3b662442f5")] [assembly: AssemblyProduct("LethalMuseum")] [assembly: AssemblyTitle("LethalMuseum")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LethalMuseum { public class Configuration { public readonly ConfigEntry<string> Blacklist; public readonly ConfigEntry<bool> AllowBaby; public readonly ConfigEntry<bool> AllowBody; public readonly ConfigEntry<bool> AutomaticIconGeneration; public Configuration(ConfigFile cfg) { Blacklist = cfg.Bind<string>("General", "itemBlacklist", "", "List of every item to disable by default"); AllowBaby = cfg.Bind<bool>("Items", "allowBabyItem", false, "Defines if the Maneater should count as an item to collect.\n\nThis can lead to problem from the tracker, but it is a fun challenge."); AllowBody = cfg.Bind<bool>("Items", "allowBodyItem", false, "Defines if the body of a dead player should count as an item to collect."); AutomaticIconGeneration = cfg.Bind<bool>("Dependency", "automaticIconGeneration", true, "Defines if this mod will force RuntimeIcons to automatically generate all the icons upon loading a game."); } } internal static class Constants { public const string MAIN_MENU_PARENT_PATH = "Canvas/MenuContainer"; public const string MAIN_MENU_SIBLING_BEFORE = "LobbyHostSettings"; public const string MAIN_MENU_CENTRAL_MENU_NAME = "MainButtons"; public const string IN_GAME_PARENT_PATH = "Systems/UI/Canvas"; public const string IN_GAME_SIBLING_BEFORE = "LoadingText"; public const int ITEMS_PER_PAGE = 16; public static Color BLACKED_COLOR = new Color(0.3f, 0.3f, 0.3f); } [BepInPlugin("LethalMuseum", "LethalMuseum", "1.1.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class LethalMuseum : BaseUnityPlugin { internal static GameObject? ITEMS_BOARD; internal static GameObject? MUSEUM_FORM; internal static Texture2D? MOD_ICON; private Harmony? Harmony; internal static Configuration? Configuration; private void Awake() { Logger.SetLogger(((BaseUnityPlugin)this).Logger); if (LoadAssets("lm-bundle")) { LoadConfiguration(((BaseUnityPlugin)this).Config); LoadDependencies(); Patch(); Logger.Info("LethalMuseum v1.1.0 has loaded!"); } } private static bool LoadAssets(string bundleName) { if (!Bundle.LoadBundle(bundleName)) { return false; } ITEMS_BOARD = Bundle.LoadAsset<GameObject>("ItemsBoard"); MUSEUM_FORM = Bundle.LoadAsset<GameObject>("MuseumForm"); MOD_ICON = Bundle.LoadAsset<Texture2D>("lm-icon"); return true; } private void Patch() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown Harmony = new Harmony("LethalMuseum"); Harmony.PatchAll(typeof(MenuManager_Patches)); Harmony.PatchAll(typeof(global::LethalMuseum.Patches.PlayerControllerB_Patches)); Harmony.PatchAll(typeof(StartOfRound_Patches)); if (global::LethalMuseum.Dependencies.RuntimeIcons.Dependency.Enabled) { Harmony.PatchAll(typeof(CameraQueueComponent_Patches)); Harmony.PatchAll(typeof(global::LethalMuseum.Dependencies.RuntimeIcons.PlayerControllerB_Patches)); Harmony.PatchAll(typeof(RenderingRequest_Patches)); } } private static void LoadDependencies() { CustomInputActions.Actions = new CustomInputActions(); ModdedItemIdentifier.LoadModdedItems(); if (ConfigToUI.Enabled) { ConfigToUI.AddConfigs(Configuration); } } private static void LoadConfiguration(ConfigFile file) { Configuration = new Configuration(file); Configuration.Blacklist.SettingChanged += delegate { Register.ApplyBlacklist(Configuration.Blacklist.Value); }; Register.ApplyBlacklist(Configuration.Blacklist.Value); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "LethalMuseum"; public const string PLUGIN_NAME = "LethalMuseum"; public const string PLUGIN_VERSION = "1.1.0"; } } namespace LethalMuseum.UI.Forms { public class ToggleForm : MonoBehaviour { [Header("Fields")] [SerializeField] private Transform? itemListContainer; [SerializeField] private GameObject? itemPrefab; [SerializeField] private GameObject? noItemText; [Header("Controls")] [SerializeField] private Toggle? allToggle; [SerializeField] private Toggle? scrapsToggle; [SerializeField] private Toggle? toolsToggle; [SerializeField] private Toggle? basesToggle; [SerializeField] private Toggle? variantsToggle; [SerializeField] private Toggle? oneHandedToggle; [SerializeField] private Toggle? twoHandedToggle; [SerializeField] private Toggle? conductiveToggle; [SerializeField] private Toggle? batteryToggle; [SerializeField] private Toggle? vanillaToggle; [SerializeField] private Toggle? moddedToggle; [Header("View")] [SerializeField] private Toggle? enabledToggle; [SerializeField] private Toggle? disabledToggle; [Header("Buttons")] [SerializeField] private Button? openBtn; [SerializeField] private Button? closeBtn; [Header("Animations")] [SerializeField] private Animator? animator; private static readonly int OpenMenu = Animator.StringToHash("openMenu"); private static readonly int CloseMenu = Animator.StringToHash("closeMenu"); private void Start() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown MenuManager val = Object.FindObjectOfType<MenuManager>(); Button? obj = openBtn; if (obj != null) { ((UnityEvent)obj.onClick).AddListener(new UnityAction(OpenForm)); } Button? obj2 = openBtn; if (obj2 != null) { ((UnityEvent)obj2.onClick).AddListener(new UnityAction(val.PlayConfirmSFX)); } Button? obj3 = closeBtn; if (obj3 != null) { ((UnityEvent)obj3.onClick).AddListener(new UnityAction(CloseForm)); } Button? obj4 = closeBtn; if (obj4 != null) { ((UnityEvent)obj4.onClick).AddListener(new UnityAction(val.PlayCancelSFX)); } ((UnityEvent<bool>)(object)allToggle?.onValueChanged).AddListener((UnityAction<bool>)onAllToggled); AddToggle(scrapsToggle, (ItemEntry item) => item.Item.isScrap); AddToggle(toolsToggle, (ItemEntry item) => !item.Item.isScrap); AddToggle(basesToggle, (ItemEntry item) => item.IsBase); AddToggle(variantsToggle, (ItemEntry item) => item.IsVariant); AddToggle(oneHandedToggle, (ItemEntry item) => !item.Item.twoHanded); AddToggle(twoHandedToggle, (ItemEntry item) => item.Item.twoHanded); AddToggle(conductiveToggle, (ItemEntry item) => item.Item.isConductiveMetal); AddToggle(batteryToggle, (ItemEntry item) => item.Item.requiresBattery); AddToggle(vanillaToggle, (ItemEntry item) => !item.IsModded); AddToggle(moddedToggle, (ItemEntry item) => item.IsModded); ((UnityEvent<bool>)(object)enabledToggle?.onValueChanged).AddListener((UnityAction<bool>)delegate { UpdateAllItems(); }); ((UnityEvent<bool>)(object)disabledToggle?.onValueChanged).AddListener((UnityAction<bool>)delegate { UpdateAllItems(); }); } private void OpenForm() { UpdateAllItems(); Animator? obj = animator; if (obj != null) { obj.SetTrigger(OpenMenu); } } private void CloseForm() { if (LethalMuseum.Configuration != null) { LethalMuseum.Configuration.Blacklist.Value = Register.GenerateBlacklist(); } Animator? obj = animator; if (obj != null) { obj.SetTrigger(CloseMenu); } } private void UpdateAllItems() { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown if ((Object)(object)itemListContainer == (Object)null) { return; } ItemEntry[] all = Register.GetAll(); foreach (Transform item2 in itemListContainer) { Transform val = item2; Object.Destroy((Object)(object)((Component)val).gameObject); } GameObject? obj = noItemText; if (obj != null) { obj.SetActive(all.Length == 0); } ItemEntry[] array = all; foreach (ItemEntry item in array) { if (ShowItem(item)) { AddItem(item); } } } private void AddItem(ItemEntry item) { if ((Object)(object)itemListContainer == (Object)null || (Object)(object)itemPrefab == (Object)null) { return; } GameObject val = Object.Instantiate<GameObject>(itemPrefab, itemListContainer, false); ((Object)val).name = item.Name; ItemList itemList = default(ItemList); if (val.TryGetComponent<ItemList>(ref itemList)) { itemList.SetItem(item); ItemList itemList2 = itemList; itemList2.OnActiveChanged = (Action<bool>)Delegate.Combine(itemList2.OnActiveChanged, (Action<bool>)delegate(bool isActive) { Register.SetItemEnable(item.ID, isActive); UpdateAllItems(); }); } } private bool ShowItem(ItemEntry item) { bool flag = Register.IsEnabled(item.ID); if ((Object)(object)enabledToggle != (Object)null && flag) { return enabledToggle.isOn; } if ((Object)(object)disabledToggle != (Object)null && !flag) { return disabledToggle.isOn; } return true; } private void AddToggle(Toggle? toggle, Func<ItemEntry, bool> condition) { Func<ItemEntry, bool> condition2 = condition; ((UnityEvent<bool>)(object)toggle?.onValueChanged).AddListener((UnityAction<bool>)delegate(bool isActive) { Register.ApplyFilter(condition2, isActive); UpdateAllItems(); }); } private void onAllToggled(bool isActive) { Register.ApplyFilter((ItemEntry _) => true, isActive); UpdateAllItems(); Toggle[] array = (Toggle[])(object)new Toggle[10] { scrapsToggle, toolsToggle, basesToggle, variantsToggle, oneHandedToggle, twoHandedToggle, conductiveToggle, batteryToggle, vanillaToggle, moddedToggle }; Toggle[] array2 = array; foreach (Toggle val in array2) { if (val != null) { val.SetIsOnWithoutNotify(isActive); } } } } } namespace LethalMuseum.UI.Elements { public class ItemBoard : MonoBehaviour { [SerializeField] private Image? icon; [SerializeField] private TMP_Text? text; [SerializeField] private Image? collectedBackground; private ItemEntry? shownItem; internal void SetItem(ItemEntry item) { shownItem = item; ((Object)((Component)this).gameObject).name = item.ID; UpdateSelf(); } internal void OnItemUpdate(string id) { if (shownItem.HasValue && !(shownItem.Value.ID != id)) { UpdateSelf(); } } private void UpdateSelf() { //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) if (shownItem.HasValue) { if ((Object)(object)icon != (Object)null) { ((Behaviour)icon).enabled = IsIconEnabled(shownItem.Value); icon.sprite = shownItem.Value.Icon; ((Graphic)icon).color = (shownItem.Value.IsBase ? Constants.BLACKED_COLOR : Color.white); } if ((Object)(object)text != (Object)null) { ((Behaviour)text).enabled = IsTextEnabled(shownItem.Value); text.text = shownItem.Value.Name; } if ((Object)(object)collectedBackground != (Object)null) { ((Behaviour)collectedBackground).enabled = Tracker.Instance?.IsCollected(shownItem.Value.ID) ?? false; } } } private static bool IsIconEnabled(ItemEntry item) { return item.IsBase || item.HasCustomIcon; } private static bool IsTextEnabled(ItemEntry item) { return item.IsBase || !item.HasCustomIcon; } } public class ItemList : MonoBehaviour { [SerializeField] private Image? icon; [SerializeField] private TMP_Text? text; [SerializeField] private Toggle? toggle; internal Action<bool>? OnActiveChanged; private void Start() { ((UnityEvent<bool>)(object)toggle?.onValueChanged).AddListener((UnityAction<bool>)ToggleItem); } internal void SetItem(ItemEntry item) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) ((Object)((Component)this).gameObject).name = item.ID; if ((Object)(object)icon != (Object)null) { ((Behaviour)icon).enabled = item.HasCustomIcon; icon.sprite = item.Icon; ((Graphic)icon).color = (item.IsBase ? Constants.BLACKED_COLOR : Color.white); } if ((Object)(object)text != (Object)null) { text.text = item.Name; ((Behaviour)text).enabled = !item.HasCustomIcon || item.IsBase; } if ((Object)(object)toggle != (Object)null) { toggle.isOn = Register.IsEnabled(item.ID); } } private void ToggleItem(bool isActive) { OnActiveChanged?.Invoke(isActive); } } public class ItemsBoard : MonoBehaviour { [Header("Items")] [SerializeField] private Transform? itemsContainer; [SerializeField] private GameObject? itemPrefab; [Header("Amounts")] [SerializeField] private TMP_Text? collectedAmountText; [SerializeField] private TMP_Text? totalAmountText; [SerializeField] private TMP_Text? percentAmountText; [Header("Pages")] [SerializeField] private TMP_Text? pageText; [SerializeField] private Graphic? leftPageIcon; [SerializeField] private Graphic? rightPageIcon; internal static ItemsBoard? Instance; private int pageIndex = 1; private event Action<string>? OnItemUpdated; private void Start() { Subscribe(); UpdatePage(); UpdateInformation(); Instance = this; } private void OnDestroy() { UnSubscribe(); if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } private void UpdateInformation() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) int num = Tracker.Instance?.GetCollectedCount() ?? 0; int registeredCount = Register.GetRegisteredCount(); if ((Object)(object)collectedAmountText != (Object)null) { collectedAmountText.text = num.ToString(); ((Graphic)collectedAmountText).color = ((num >= registeredCount) ? Color.green : Color.white); } if ((Object)(object)totalAmountText != (Object)null) { totalAmountText.text = registeredCount.ToString(); ((Graphic)totalAmountText).color = ((num >= registeredCount) ? Color.green : Color.white); } if ((Object)(object)percentAmountText != (Object)null) { if (num < registeredCount) { float num2 = ((registeredCount != 0) ? ((float)num / (float)registeredCount * 100f) : 0f); percentAmountText.text = $"{num2:N1}%"; ((Graphic)percentAmountText).color = Color.white; } else { percentAmountText.text = "100%"; ((Graphic)percentAmountText).color = Color.green; } } } private void OnPageMove(bool scrollLeft) { if (((Component)this).gameObject.activeSelf) { if (scrollLeft) { pageIndex--; } else { pageIndex++; } int pageCount = Register.GetPageCount(16); if (pageIndex < 1) { pageIndex = 1; Audio.PlayUI(GameNetworkManager.Instance?.buttonCancelSFX); } else if (pageIndex > pageCount) { pageIndex = pageCount; Audio.PlayUI(GameNetworkManager.Instance?.buttonCancelSFX); } else { Audio.PlayUI(GameNetworkManager.Instance?.buttonTuneSFX); UpdatePage(); } } } private void UpdatePage() { //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown TMP_Text? obj = pageText; if (obj != null) { obj.SetText(pageIndex.ToString(), true); } if ((Object)(object)leftPageIcon != (Object)null) { ((Behaviour)leftPageIcon).enabled = pageIndex > 1; } if ((Object)(object)rightPageIcon != (Object)null) { ((Behaviour)rightPageIcon).enabled = pageIndex < Register.GetPageCount(16); } if (!((Object)(object)itemsContainer != (Object)null) || !((Object)(object)itemPrefab != (Object)null)) { return; } ItemBoard @object = default(ItemBoard); foreach (Transform item2 in itemsContainer) { Transform val = item2; if (((Component)val).gameObject.TryGetComponent<ItemBoard>(ref @object)) { OnItemUpdated -= @object.OnItemUpdate; } Object.Destroy((Object)(object)((Component)val).gameObject); } ItemEntry[] page = Register.GetPage(pageIndex - 1, 16); ItemEntry[] array = page; ItemBoard itemBoard = default(ItemBoard); for (int i = 0; i < array.Length; i++) { ItemEntry item = array[i]; GameObject val2 = Object.Instantiate<GameObject>(itemPrefab, itemsContainer, false); ((Object)val2).name = item.Name; if (val2.TryGetComponent<ItemBoard>(ref itemBoard)) { itemBoard.SetItem(item); OnItemUpdated += itemBoard.OnItemUpdate; } } } public void UpdateItem(string id) { this.OnItemUpdated?.Invoke(id); } private void Subscribe() { if (CustomInputActions.Actions != null) { if (CustomInputActions.Actions.ToggleVisibilityKey != null) { CustomInputActions.Actions.ToggleVisibilityKey.performed += OnToggle; } if (CustomInputActions.Actions.PageLeftKey != null) { CustomInputActions.Actions.PageLeftKey.performed += MovePageLeft; } if (CustomInputActions.Actions.PageRightKey != null) { CustomInputActions.Actions.PageRightKey.performed += MovePageRight; } } if ((Object)(object)Tracker.Instance != (Object)null) { Tracker.Instance.OnCollected += OnCollected; Tracker.Instance.OnDiscarded += OnDiscarded; } } private void UnSubscribe() { if (CustomInputActions.Actions != null) { if (CustomInputActions.Actions.ToggleVisibilityKey != null) { CustomInputActions.Actions.ToggleVisibilityKey.performed -= OnToggle; } if (CustomInputActions.Actions.PageLeftKey != null) { CustomInputActions.Actions.PageLeftKey.performed -= MovePageLeft; } if (CustomInputActions.Actions.PageRightKey != null) { CustomInputActions.Actions.PageRightKey.performed -= MovePageRight; } } if ((Object)(object)Tracker.Instance != (Object)null) { Tracker.Instance.OnCollected -= OnCollected; Tracker.Instance.OnDiscarded -= OnDiscarded; } } private void OnToggle(CallbackContext ctx) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (!global::LethalMuseum.Dependencies.InputUtils.Dependency.Enabled || global::LethalMuseum.Dependencies.InputUtils.Dependency.AllowKeybind(ctx)) { bool flag = !((Component)this).gameObject.activeSelf; ((Component)this).gameObject.SetActive(flag); Audio.PlayUI((!flag) ? GameNetworkManager.Instance?.buttonCancelSFX : GameNetworkManager.Instance?.buttonPressSFX); } } private void OnCollected(string id) { UpdateItem(id); UpdateInformation(); } private void OnDiscarded(string id) { UpdateItem(id); UpdateInformation(); } private void MovePageRight(CallbackContext ctx) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (!global::LethalMuseum.Dependencies.InputUtils.Dependency.Enabled || global::LethalMuseum.Dependencies.InputUtils.Dependency.AllowKeybind(ctx)) { OnPageMove(scrollLeft: false); } } private void MovePageLeft(CallbackContext ctx) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) if (!global::LethalMuseum.Dependencies.InputUtils.Dependency.Enabled || global::LethalMuseum.Dependencies.InputUtils.Dependency.AllowKeybind(ctx)) { OnPageMove(scrollLeft: true); } } } } namespace LethalMuseum.Patches { [HarmonyPatch(typeof(MenuManager))] internal class MenuManager_Patches { private static GameObject? customUI; private static bool hasInitializedItems; [HarmonyPatch("Start")] [HarmonyPostfix] private static void Start_Postfix(MenuManager __instance) { if (!__instance.isInitScene) { CreateButton(); InitializeItems(); } } [HarmonyPatch("SetLoadingScreen")] [HarmonyPrefix] private static void SetLoadingScreen_Prefix(bool isLoading) { GameObject? obj = customUI; if (obj != null) { obj.SetActive(!isLoading); } } [HarmonyPatch("EnableUIPanel")] [HarmonyPrefix] private static void EnableUIPanel_Prefix(GameObject enablePanel) { GameObject? obj = customUI; if (obj != null) { obj.SetActive(((Object)enablePanel).name == "MainButtons"); } } [HarmonyPatch("DisableUIPanel")] [HarmonyPrefix] private static void DisableUIPanel_Prefix(GameObject enablePanel) { GameObject? obj = customUI; if (obj != null) { obj.SetActive(((Object)enablePanel).name != "MainButtons"); } } private static void CreateButton() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005c: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find("Canvas/MenuContainer"); if ((Object)(object)val == (Object)null) { Logger.Error("Could not find the container at 'Canvas/MenuContainer'."); return; } GameObject val2 = new GameObject("LethalMuseum_UI"); val2.transform.SetParent(val.transform, false); RectTransform val3 = val2.AddComponent<RectTransform>(); val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.one; val3.anchoredPosition = Vector2.zero; Vector2 offsetMin = (val3.offsetMax = Vector2.zero); val3.offsetMin = offsetMin; Transform obj = val.transform.Find("LobbyHostSettings"); int num = ((obj != null) ? obj.GetSiblingIndex() : (-1)); if (num != -1) { val2.transform.SetSiblingIndex(num); } if ((Object)(object)LethalMuseum.MUSEUM_FORM != (Object)null) { customUI = Object.Instantiate<GameObject>(LethalMuseum.MUSEUM_FORM, val2.transform, false); } else { Logger.Error("Could not spawn the main form."); } } private static void InitializeItems() { if (hasInitializedItems) { return; } Item[] array = Resources.FindObjectsOfTypeAll<Item>(); Item[] array2 = array; foreach (Item val in array2) { if (!((Object)(object)val == (Object)null)) { Register.RegisterItem(val); } } hasInitializedItems = true; } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerB_Patches { [HarmonyPatch("ConnectClientToPlayerObject")] [HarmonyPostfix] private static void ConnectClientToPlayerObject_Postfix(PlayerControllerB __instance) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find("Systems/UI/Canvas"); if ((Object)(object)val == (Object)null) { Logger.Error("Could not find the canvas."); return; } if ((Object)(object)LethalMuseum.ITEMS_BOARD == (Object)null) { Logger.Error("The asset for 'ITEMS_BOARD' was not loaded."); return; } GameObject val2 = new GameObject("LethalMuseum-InGameUI"); val2.transform.SetParent(val.transform, false); Transform obj = val.transform.Find("LoadingText"); int num = ((obj != null) ? obj.GetSiblingIndex() : (-1)); if (num >= 0) { val2.transform.SetSiblingIndex(num); } RectTransform val3 = val2.AddComponent<RectTransform>(); val3.anchorMin = Vector2.zero; val3.anchorMax = Vector2.one; val3.anchoredPosition = Vector2.zero; val3.offsetMin = Vector2.zero; val3.offsetMax = Vector2.zero; Object.Instantiate<GameObject>(LethalMuseum.ITEMS_BOARD, val2.transform, false); } [HarmonyPatch("SetItemInElevator")] [HarmonyPrefix] private static void SetItemInElevator_Prefix(bool droppedInShipRoom, bool droppedInElevator, GrabbableObject gObject) { if (!((Object)(object)gObject == (Object)null) && gObject.isInShipRoom != droppedInShipRoom) { if (droppedInShipRoom) { Tracker.Instance?.Collect(gObject); } else { Tracker.Instance?.Discard(gObject); } } } } [HarmonyPatch(typeof(StartOfRound))] internal class StartOfRound_Patches { [HarmonyPatch("ResetShip")] [HarmonyPostfix] private static void ResetShip_Postfix() { Logger.Info("RESET SHIP"); Tracker.Instance?.ResetCollected(); } [HarmonyPatch("AllPlayersHaveRevivedClientRpc")] [HarmonyPostfix] private static void AllPlayersHaveRevivedClientRpc_Postfix(StartOfRound __instance) { Tracker.Instance?.ResetCollected(); } } } namespace LethalMuseum.Objects { internal static class Identifier { public static string GetID(Item item) { if (ModdedItemIdentifier.GetModdedID(item, out string moddedID) && moddedID != null) { return moddedID; } return "Vanilla/" + item.itemName; } public static bool IsItemModded(Item item) { return ModdedItemIdentifier.IsItemModded(item); } public static bool IsItemAllowed(Item item) { if (item.lockedInDemo) { return false; } if ((Object)(object)item.spawnPrefab == (Object)null) { return false; } if (item.itemName == "Maneater") { return LethalMuseum.Configuration?.AllowBaby.Value ?? false; } if (item.itemName == "Body") { return LethalMuseum.Configuration?.AllowBody.Value ?? false; } return true; } public static ItemEntry[] GetEntries(Item item) { ItemEntry item2 = new ItemEntry(item); List<ItemEntry> list = new List<ItemEntry> { item2 }; for (int i = 0; i < item.materialVariants.Length; i++) { list.Add(item2.Material(i)); } for (int j = 0; j < item.meshVariants.Length; j++) { list.Add(item2.Mesh(j)); } return list.ToArray(); } public static ItemEntry[] GetEntries(GrabbableObject item) { ItemEntry item2 = new ItemEntry(item.itemProperties); List<ItemEntry> list = new List<ItemEntry> { item2 }; MeshRenderer val = default(MeshRenderer); if (((Component)item).TryGetComponent<MeshRenderer>(ref val)) { int num = Array.IndexOf(item.itemProperties.materialVariants, ((Renderer)val).sharedMaterial); if (num != -1) { list.Add(item2.Material(num)); } } MeshFilter val2 = default(MeshFilter); if (((Component)item).TryGetComponent<MeshFilter>(ref val2)) { int num2 = Array.IndexOf(item.itemProperties.meshVariants, (val2 != null) ? val2.mesh : null); if (num2 != -1) { list.Add(item2.Mesh(num2)); } } return list.ToArray(); } } internal static class Register { private static readonly SortedDictionary<string, ItemEntry> itemsData = new SortedDictionary<string, ItemEntry>(); private static readonly HashSet<string> disabledItems = new HashSet<string>(); private const char SEPARATION_CHARACTER = '|'; public static void RegisterItem(Item item, bool registerAsEnabled = true) { if (!Identifier.IsItemAllowed(item)) { return; } ItemEntry[] entries = Identifier.GetEntries(item); ItemEntry[] array = entries; for (int i = 0; i < array.Length; i++) { ItemEntry value = array[i]; if (!itemsData.TryAdd(value.ID, value)) { Logger.Debug("An item has already been registered under the value '" + value.ID + "'."); } else if (!disabledItems.Contains(value.ID)) { SetItemEnable(value.ID, registerAsEnabled); } } } public static void SetItemEnable(string id, bool isEnabled) { if (isEnabled) { disabledItems.Remove(id); } else { disabledItems.Add(id); } } public static void ApplyFilter(Func<ItemEntry, bool> condition, bool isEnabled) { foreach (var (id, arg) in itemsData) { if (condition(arg)) { SetItemEnable(id, isEnabled); } } } public static bool IsEnabled(string id) { return itemsData.ContainsKey(id) && !disabledItems.Contains(id); } public static string GenerateBlacklist() { StringBuilder stringBuilder = new StringBuilder(); int num = 0; foreach (string disabledItem in disabledItems) { stringBuilder.Append(disabledItem); if (num != disabledItems.Count - 1) { stringBuilder.Append('|'); } num++; } return stringBuilder.ToString(); } public static void ApplyBlacklist(string blacklist) { string[] array = blacklist.Split('|', StringSplitOptions.RemoveEmptyEntries); string[] array2 = array; foreach (string id in array2) { SetItemEnable(id, isEnabled: false); } } public static int GetRegisteredCount() { return itemsData.Count - disabledItems.Count; } public static ItemEntry[] GetAll() { ItemEntry[] array = new ItemEntry[itemsData.Count]; int num = 0; foreach (var (_, itemEntry2) in itemsData) { array[num] = itemEntry2; num++; } return array; } public static ItemEntry[] GetPage(int index, int pageSize) { int num = pageSize * index; List<ItemEntry> list = new List<ItemEntry>(); foreach (var (id, item) in itemsData) { if (!IsEnabled(id)) { continue; } if (num > 0) { num--; continue; } list.Add(item); if (list.Count < pageSize) { continue; } break; } return list.ToArray(); } public static int GetPageCount(int pageSize) { int registeredCount = GetRegisteredCount(); float num = (float)registeredCount / (float)pageSize; return Mathf.CeilToInt(num); } } public class Tracker : MonoBehaviour { internal static Tracker? Instance; private readonly Dictionary<string, uint> itemsCollected = new Dictionary<string, uint>(); public event Action<string>? OnCollected; public event Action<string>? OnDiscarded; private void Awake() { Instance = this; ResetCollected(); } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } public void Collect(GrabbableObject? item) { if (item == null) { return; } ItemEntry[] entries = Identifier.GetEntries(item); ItemEntry[] array = entries; for (int i = 0; i < array.Length; i++) { ItemEntry itemEntry = array[i]; if (Register.IsEnabled(itemEntry.ID)) { if (!itemsCollected.TryAdd(itemEntry.ID, 1u)) { itemsCollected[itemEntry.ID]++; } else { this.OnCollected?.Invoke(itemEntry.ID); } } } } public void Discard(GrabbableObject? item) { if (item == null) { return; } ItemEntry[] entries = Identifier.GetEntries(item); ItemEntry[] array = entries; for (int i = 0; i < array.Length; i++) { ItemEntry itemEntry = array[i]; if (Register.IsEnabled(itemEntry.ID) && itemsCollected.TryGetValue(itemEntry.ID, out var value)) { value--; if (value != 0) { itemsCollected[itemEntry.ID] = value; break; } itemsCollected.Remove(itemEntry.ID); this.OnDiscarded?.Invoke(itemEntry.ID); } } } public void ResetCollected() { if (itemsCollected.Count > 0) { string[] array = new string[itemsCollected.Count]; int num = 0; foreach (var (text2, _) in itemsCollected) { array[num] = text2; num++; } itemsCollected.Clear(); string[] array2 = array; foreach (string obj in array2) { this.OnDiscarded?.Invoke(obj); } } GrabbableObject[] array3 = Object.FindObjectsOfType<GrabbableObject>(); GrabbableObject[] array4 = array3; foreach (GrabbableObject val in array4) { if (val.isInShipRoom) { Collect(val); } } } public int GetCollectedCount() { return itemsCollected.Count; } public bool IsCollected(string id) { return itemsCollected.ContainsKey(id); } } } namespace LethalMuseum.Objects.Models { public readonly struct ItemEntry { public readonly Item Item; public readonly string ID; public readonly int MaterialIndex; public readonly int MeshIndex; public bool IsVariant => MaterialIndex != -1 || MeshIndex != -1; public bool HasVariants => Item.materialVariants.Length != 0 || Item.meshVariants.Length != 0; public bool IsBase => HasVariants && !IsVariant; public Sprite Icon => GetIcon(); public bool HasCustomIcon => GetHasCustomIcon(); public string Name => GetName(); public bool IsModded => Identifier.IsItemModded(Item); public ItemEntry(Item original) { Item = original; ID = Identifier.GetID(original); MaterialIndex = -1; MeshIndex = -1; } private ItemEntry(ItemEntry baseEntry, int materialIndex, int meshIndex) { Item = baseEntry.Item; string iD = Identifier.GetID(baseEntry.Item); if (materialIndex != -1) { ID = $"{iD}/base/{materialIndex}"; } else if (meshIndex != -1) { ID = $"{iD}/{meshIndex}/base"; } else { ID = iD; } MaterialIndex = materialIndex; MeshIndex = meshIndex; } public ItemEntry Mesh(int index) { return new ItemEntry(this, -1, index); } public ItemEntry Material(int index) { return new ItemEntry(this, index, -1); } private Sprite GetIcon() { if (!IsVariant) { return Item.itemIcon; } if (global::LethalMuseum.Dependencies.RuntimeIcons.Dependency.Enabled && global::LethalMuseum.Dependencies.RuntimeIcons.Dependency.HasCustomIcon(this, out Sprite sprite) && (Object)(object)sprite != (Object)null) { return sprite; } return Item.itemIcon; } private string GetName() { if (HasCustomIcon && IsBase) { return "Any"; } string text = Item.itemName ?? "Scrap"; if (IsVariant) { return text + " (Variant)"; } return text; } private bool GetHasCustomIcon() { Sprite icon = Icon; if ((Object)(object)icon == (Object)null) { return false; } if (((Object)icon).name == "ScrapItemIcon2") { return false; } if (global::LethalMuseum.Dependencies.RuntimeIcons.Dependency.Enabled && global::LethalMuseum.Dependencies.RuntimeIcons.Dependency.IsLoadingIcon(icon)) { return false; } return true; } } } namespace LethalMuseum.Helpers { internal static class Audio { public static void PlayUI(AudioClip? clip) { if (!((Object)(object)clip == (Object)null)) { AudioSource uIAudio = HUDManager.Instance.UIAudio; if (uIAudio != null) { uIAudio.PlayOneShot(clip); } } } } internal static class Bundle { private static AssetBundle? loadedBundle; public static bool LoadBundle(string name) { string location = Assembly.GetExecutingAssembly().Location; location = Path.GetDirectoryName(location) ?? throw new NullReferenceException(); location = Path.Combine(location, name); loadedBundle = AssetBundle.LoadFromFile(location); if ((Object)(object)loadedBundle == (Object)null) { Logger.Error("Failed to load custom assets."); return false; } return true; } public static T? LoadAsset<T>(string name) where T : Object { if ((Object)(object)loadedBundle == (Object)null) { Logger.Error("Tried to load asset from unloaded bundle."); return default(T); } T val = loadedBundle.LoadAsset<T>(name); if ((Object)(object)val == (Object)null) { Logger.Error("No asset named '" + name + "' was found."); } return val; } } internal static class Logger { private static ManualLogSource? log; public static void SetLogger(ManualLogSource logSource) { log = logSource; } private static void Log(LogLevel level, object? content) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ManualLogSource? obj = log; if (obj != null) { obj.Log(level, content ?? "null"); } } public static void Info(object? content) { Log((LogLevel)16, content); } public static void Debug(object? content) { Log((LogLevel)32, content); } public static void Error(object? content) { Log((LogLevel)2, content); } } } namespace LethalMuseum.Dependencies.RuntimeIcons { [HarmonyPatch(typeof(CameraQueueComponent))] internal class CameraQueueComponent_Patches { [HarmonyPatch("PullLastRender")] [HarmonyPostfix] private static void PullLastRender_Postfix(RenderingResult render, ref bool __result) { if (__result) { Dependency.OnRender(render.Request.GrabbableObject, render.Texture); } } } internal static class Dependency { private static readonly Dictionary<string, Sprite?> generatedIcons = new Dictionary<string, Sprite>(); private static readonly Dictionary<Item, Queue<ItemEntry>> spawnQueue = new Dictionary<Item, Queue<ItemEntry>>(); private static readonly Dictionary<string, GameObject> objectToClear = new Dictionary<string, GameObject>(); public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.github.lethalcompanymodding.runtimeicons"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static bool HasCustomIcon(ItemEntry entry, out Sprite? sprite) { return generatedIcons.TryGetValue(entry.ID, out sprite); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static bool IsLoadingIcon(Sprite sprite) { if ((Object)(object)sprite == (Object)(object)RuntimeIcons.LoadingSprite) { return true; } if ((Object)(object)sprite == (Object)(object)RuntimeIcons.LoadingSprite2) { return true; } return false; } internal static void OnRender(GrabbableObject item, Texture2D texture) { ItemEntry[] entries = Identifier.GetEntries(item); HashSet<Item> hashSet = new HashSet<Item>(); ItemEntry[] array = entries; for (int i = 0; i < array.Length; i++) { ItemEntry itemEntry = array[i]; if (!itemEntry.IsBase) { Sprite val = SpriteUtils.CreateSprite(texture); string name = (((Object)val.texture).name = "LethalMuseum+RuntimeIcons." + itemEntry.ID); ((Object)val).name = name; generatedIcons.Add(itemEntry.ID, val); if (objectToClear.Remove(itemEntry.ID, out GameObject value) && (Object)(object)value != (Object)null) { Object.Destroy((Object)(object)value); } if (hashSet.Add(itemEntry.Item)) { EnqueueNext(itemEntry.Item); } } } ItemEntry[] array2 = entries; for (int j = 0; j < array2.Length; j++) { ItemEntry itemEntry2 = array2[j]; if (hashSet.Contains(itemEntry2.Item)) { ItemsBoard.Instance?.UpdateItem(itemEntry2.ID); } } } internal static void TryEnqueueAll(ItemEntry[] entries) { Dictionary<Item, ItemEntry> dictionary = new Dictionary<Item, ItemEntry>(); for (int i = 0; i < entries.Length; i++) { ItemEntry itemEntry = entries[i]; if (itemEntry.IsBase || itemEntry.HasCustomIcon) { continue; } GameObject spawnPrefab = itemEntry.Item.spawnPrefab; if (!((Object)(object)((spawnPrefab != null) ? spawnPrefab.GetComponent<GrabbableObject>() : null) == (Object)null)) { if (dictionary.TryAdd(itemEntry.Item, itemEntry)) { spawnQueue.Add(itemEntry.Item, new Queue<ItemEntry>()); } else { spawnQueue[itemEntry.Item].Enqueue(itemEntry); } } } foreach (var (_, entry) in dictionary) { EnqueueEntry(entry); } } private static void EnqueueEntry(ItemEntry entry) { GrabbableObject component = Object.Instantiate<GameObject>(entry.Item.spawnPrefab).GetComponent<GrabbableObject>(); ((Behaviour)component).enabled = false; ((Object)((Component)component).gameObject).name = "LethalMuseum.processing-icon." + entry.ID; if (entry.IsVariant) { MeshRenderer val = default(MeshRenderer); if (entry.MaterialIndex != -1 && ((Component)component).TryGetComponent<MeshRenderer>(ref val)) { ((Renderer)val).sharedMaterial = entry.Item.materialVariants[entry.MaterialIndex]; } MeshFilter val2 = default(MeshFilter); if (entry.MeshIndex != -1 && ((Component)component).TryGetComponent<MeshFilter>(ref val2)) { val2.mesh = entry.Item.meshVariants[entry.MeshIndex]; } } objectToClear.Add(entry.ID, ((Component)component).gameObject); RuntimeIcons.RenderingStage.CameraQueue.EnqueueObject(component, RuntimeIcons.WarningSprite, 2L); } private static void EnqueueNext(Item item) { if (spawnQueue.TryGetValue(item, out Queue<ItemEntry> value)) { if (value.TryDequeue(out var result)) { EnqueueEntry(result); } if (value.Count == 0) { spawnQueue.Remove(item); } } } } [HarmonyPatch(typeof(PlayerControllerB))] internal class PlayerControllerB_Patches { [HarmonyPatch("ConnectClientToPlayerObject")] [HarmonyPostfix] private static void ConnectClientToPlayerObject_Postfix(PlayerControllerB __instance) { if (LethalMuseum.Configuration != null && LethalMuseum.Configuration.AutomaticIconGeneration.Value) { ItemEntry[] all = Register.GetAll(); Dependency.TryEnqueueAll(all); } } } [HarmonyPatch(typeof(RenderingRequest))] internal class RenderingRequest_Patches { [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPostfix] private static void Test(ref RenderingRequest __instance) { ItemEntry[] entries = Identifier.GetEntries(__instance.GrabbableObject); if (entries.Length != 0) { FieldInfo fieldInfo = AccessTools.Field(typeof(RenderingRequest), "ItemKey"); if (!(fieldInfo == null)) { fieldInfo.SetValueDirect(__makeref(__instance), entries[^1].ID); } } } [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPrefix] private static bool HasIcon_Prefix(ref RenderingRequest __instance, ref bool __result) { ItemEntry[] entries = Identifier.GetEntries(__instance.GrabbableObject); if (entries.Length == 0) { return false; } if (Dependency.HasCustomIcon(entries[^1], out Sprite _)) { __result = true; return true; } return false; } } } namespace LethalMuseum.Dependencies.LethalLib { internal static class ModdedItemIdentifier { private static Dictionary<Item, string>? _cachedModdedItems; public static void LoadModdedItems() { _cachedModdedItems = new Dictionary<Item, string>(); foreach (ScrapItem scrapItem in Items.scrapItems) { _cachedModdedItems.TryAdd(scrapItem.item, scrapItem.modName + "/" + scrapItem.item.itemName); } foreach (ShopItem shopItem in Items.shopItems) { _cachedModdedItems.TryAdd(shopItem.item, shopItem.modName + "/" + shopItem.item.itemName); } foreach (PlainItem plainItem in Items.plainItems) { _cachedModdedItems.TryAdd(plainItem.item, plainItem.modName + "/" + plainItem.item.itemName); } } public static bool GetModdedID(Item item, out string? moddedID) { moddedID = _cachedModdedItems?.GetValueOrDefault(item); return string.IsNullOrEmpty(moddedID); } public static bool IsItemModded(Item item) { return _cachedModdedItems?.ContainsKey(item) ?? false; } } } namespace LethalMuseum.Dependencies.LethalConfig { internal static class ConfigToUI { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddConfigs(Configuration? config) { //IL_0076: 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) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) if (config != null) { if ((Object)(object)LethalMuseum.MOD_ICON != (Object)null) { Sprite modIcon = Sprite.Create(LethalMuseum.MOD_ICON, new Rect(0f, 0f, (float)((Texture)LethalMuseum.MOD_ICON).width, (float)((Texture)LethalMuseum.MOD_ICON).height), new Vector2(0.5f, 0.5f)); LethalConfigManager.SetModIcon(modIcon); } LethalConfigManager.SetModDescription("Adds a built-in tracker for Museum%."); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(config.AllowBaby, new BoolCheckBoxOptions { Name = "Allow Baby", RequiresRestart = true })); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(config.AllowBody, new BoolCheckBoxOptions { Name = "Allow Body", RequiresRestart = true })); LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(config.AutomaticIconGeneration, new BoolCheckBoxOptions { Name = "Automatic Icon Generation", RequiresRestart = false })); LethalConfigManager.SkipAutoGenFor((ConfigEntryBase)(object)config.Blacklist); } } } } namespace LethalMuseum.Dependencies.InputUtils { internal class CustomInputActions : LcInputActions { internal static CustomInputActions? Actions; [InputAction(/*Could not decode attribute arguments.*/)] public InputAction? ToggleVisibilityKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction? PageLeftKey { get; set; } [InputAction(/*Could not decode attribute arguments.*/)] public InputAction? PageRightKey { get; set; } } internal static class Dependency { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.LethalCompanyInputUtils"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static bool AllowKeybind(CallbackContext ctx) { PlayerControllerB val = StartOfRound.Instance?.localPlayerController; if ((Object)(object)val == (Object)null) { return true; } if (val.inTerminalMenu) { return false; } if (val.isTypingChat) { return false; } return true; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }