using System; using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HowToFish.ModAPI; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyVersion("0.0.0.0")] namespace HowToFish.ModMenu; internal sealed class ModRecord { internal string Guid; internal string Name; internal string Version; internal string Author; internal string Description; internal string Warning; internal BaseUnityPlugin Instance; internal List Settings = new List(); } internal static class ModCatalog { internal static List Discover() { Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (KeyValuePair pluginInfo in Chainloader.PluginInfos) { PluginInfo value = pluginInfo.Value; ModRecord modRecord = new ModRecord(); modRecord.Guid = value.Metadata.GUID; modRecord.Name = value.Metadata.Name; modRecord.Version = value.Metadata.Version.ToString(); modRecord.Instance = value.Instance; ModRecord modRecord2 = modRecord; ReadAssemblyMetadata(modRecord2); if ((Object)(object)modRecord2.Instance != (Object)null) { BaseUnityPlugin instance = modRecord2.Instance; IModSettingsProvider val = (IModSettingsProvider)(object)((instance is IModSettingsProvider) ? instance : null); if (val != null) { modRecord2.Description = val.Description; modRecord2.Warning = val.Warning; IEnumerable settings = val.GetSettings(); if (settings != null) { modRecord2.Settings.AddRange(settings); } } else { foreach (KeyValuePair item in modRecord2.Instance.Config) { modRecord2.Settings.Add(item.Value); } } } if (modRecord2.Guid.IndexOf("debugtools", StringComparison.OrdinalIgnoreCase) >= 0) { modRecord2.Warning = "DEVELOPMENT TOOL\nContains gameplay-changing debugging features.\nDo not use for leaderboard speedruns."; } dictionary[modRecord2.Guid] = modRecord2; } return dictionary.Values.OrderBy((ModRecord m) => m.Name, StringComparer.OrdinalIgnoreCase).ToList(); } private static void ReadAssemblyMetadata(ModRecord record) { try { Assembly assembly = (((Object)(object)record.Instance == (Object)null) ? null : ((object)record.Instance).GetType().Assembly); if (!(assembly == null)) { object[] customAttributes = assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), inherit: false); object[] customAttributes2 = assembly.GetCustomAttributes(typeof(AssemblyDescriptionAttribute), inherit: false); if (customAttributes.Length > 0) { record.Author = ((AssemblyCompanyAttribute)customAttributes[0]).Company; } if (customAttributes2.Length > 0) { record.Description = ((AssemblyDescriptionAttribute)customAttributes2[0]).Description; } } } catch { } } } internal sealed class NativeModMenu { private readonly ManualLogSource _log; private GameObject _entryButton; private GameObject _page; private GameObject _buttonTemplate; private GameObject _nativeSliderTemplate; private GameObject _nativeToggleTemplate; private GameObject _nativeInputTemplate; private Image _nativePanelStyle; private Image _nativeBackdropStyle; private Transform _mainCanvasRoot; private RectTransform _left; private RectTransform _right; private TextMeshProUGUI _title; private TextMeshProUGUI _details; private TextMeshProUGUI _notice; private GameObject _mainMenuPage; private GameObject _mainMenuTitle; private GameObject _discordButton; private bool _mainMenuPageWasActive; private bool _mainMenuTitleWasActive; private bool _discordButtonWasActive; private bool _mainMenuHidden; private List _mods = new List(); private ModRecord _selected; private float _nextProbe; private bool _open; private ConfigEntryBase _capture; private string _captureBuffer; private Button _resetButton; private float _resetConfirmUntil; internal NativeModMenu(ManualLogSource log) { _log = log; } internal void Tick() { if (_capture != null) { CaptureInput(); } if (_open && UnityInput.Current.GetKeyDown((KeyCode)27)) { Close(); } else if (!(Time.unscaledTime < _nextProbe)) { _nextProbe = Time.unscaledTime + 1f; if ((Object)(object)_entryButton == (Object)null && MainMenuManager.IsInMenu) { TryInject(); } if ((Object)(object)_entryButton != (Object)null) { _entryButton.SetActive(MainMenuManager.IsInMenu && !_open); } if (_open && !MainMenuManager.IsInMenu) { Close(); } } } internal void Dispose() { RestoreMainMenu(); if ((Object)(object)_page != (Object)null) { Object.Destroy((Object)(object)_page); } if ((Object)(object)_entryButton != (Object)null) { Object.Destroy((Object)(object)_entryButton); } } private void TryInject() { //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown try { CanvasManager val = Object.FindObjectOfType(true); if ((Object)(object)val == (Object)null) { return; } FieldInfo field = typeof(CanvasManager).GetField("_mainMenuCanvas", BindingFlags.Instance | BindingFlags.NonPublic); CanvasGroup val2 = (CanvasGroup)((field == null) ? null : /*isinst with value type is only supported in some contexts*/); if ((Object)(object)val2 == (Object)null) { return; } _mainCanvasRoot = ((Component)val2).transform; CaptureMainMenuObjects(val); TextMeshProUGUI val3 = FindMenuText(((Component)val2).transform, "Options"); if (!((Object)(object)val3 == (Object)null)) { Button componentInParent = ((Component)val3).GetComponentInParent