using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ConfigurationManager.Utilities; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("https://github.com/BepInEx/BepInEx.ConfigurationManager")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Copyright © 2019 / LGPL-3.0")] [assembly: AssemblyFileVersion("19.0.0.0")] [assembly: AssemblyInformationalVersion("19.0+cc8bd456e22e5968bdfeeea8ad87d78ae17ea3a3")] [assembly: AssemblyProduct("BepInEx.ConfigurationManager")] [assembly: AssemblyTitle("Universal in-game configuration manager for BepInEx plugins")] [assembly: AssemblyVersion("19.0.0.0")] namespace ConfigurationManager { internal static class SettingSearcher { private static readonly ICollection _updateMethodNames = new string[4] { "Update", "FixedUpdate", "LateUpdate", "OnGUI" }; public static BaseUnityPlugin[] FindPlugins() { return (from x in Chainloader.PluginInfos.Values select x.Instance into plugin where (Object)(object)plugin != (Object)null select plugin).Union(Object.FindObjectsOfType(typeof(BaseUnityPlugin)).Cast()).ToArray(); } public static void CollectSettings(out IEnumerable results, out List modsWithoutSettings, bool showDebug) { modsWithoutSettings = new List(); try { results = GetBepInExCoreConfig(); } catch (Exception ex) { results = Enumerable.Empty(); ConfigurationManager.Logger.LogError((object)ex); } BaseUnityPlugin[] array = FindPlugins(); foreach (BaseUnityPlugin val in array) { try { Type type = ((object)val).GetType(); BepInPlugin metadata = val.Info.Metadata; string item = ((metadata != null) ? metadata.Name : null) ?? ((object)val).GetType().FullName; if (type.GetCustomAttributes(typeof(BrowsableAttribute), inherit: false).Cast().Any((BrowsableAttribute x) => !x.Browsable)) { modsWithoutSettings.Add(item); continue; } List list = new List(); list.AddRange(GetPluginConfig(val).Cast()); list.RemoveAll((SettingEntryBase x) => x.Browsable == false); if (list.Count == 0) { modsWithoutSettings.Add(item); } if (showDebug && type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Any((MethodInfo x) => _updateMethodNames.Contains(x.Name))) { PropertySettingEntry propertySettingEntry = new PropertySettingEntry(val, type.GetProperty("enabled"), val); propertySettingEntry.DispName = "!Allow plugin to run on every frame"; propertySettingEntry.Description = "Disabling this will disable some or all of the plugin's functionality.\nHooks and event-based functionality will not be disabled.\nThis setting will be lost after game restart."; propertySettingEntry.IsAdvanced = true; list.Add(propertySettingEntry); } if (list.Count > 0) { results = results.Concat(list); } } catch (Exception ex2) { object obj; if (val == null) { obj = null; } else { PluginInfo info = val.Info; if (info == null) { obj = null; } else { BepInPlugin metadata2 = info.Metadata; obj = ((metadata2 != null) ? metadata2.Name : null); } } if (obj == null) { obj = ((object)val)?.GetType().FullName; } string text = (string)obj; ConfigurationManager.Logger.LogError((object)("Failed to collect settings of the following plugin: " + text)); ConfigurationManager.Logger.LogError((object)ex2); } } } private static IEnumerable GetBepInExCoreConfig() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown PropertyInfo property = typeof(ConfigFile).GetProperty("CoreConfig", BindingFlags.Static | BindingFlags.NonPublic); if ((object)property == null) { throw new ArgumentNullException("coreConfigProp"); } ConfigFile source = (ConfigFile)property.GetValue(null, null); BepInPlugin bepinMeta = new BepInPlugin("BepInEx", "BepInEx", typeof(Chainloader).Assembly.GetName().Version.ToString()); return ((IEnumerable>)source).Select((Func, SettingEntryBase>)((KeyValuePair kvp) => new ConfigSettingEntry(kvp.Value, null) { IsAdvanced = true, PluginInfo = bepinMeta })); } private static IEnumerable GetPluginConfig(BaseUnityPlugin plugin) { return ((IEnumerable>)plugin.Config).Select((KeyValuePair kvp) => new ConfigSettingEntry(kvp.Value, plugin)); } } internal sealed class ConfigSettingEntry : SettingEntryBase { public ConfigEntryBase Entry { get; } public override Type SettingType => Entry.SettingType; public ConfigSettingEntry(ConfigEntryBase entry, BaseUnityPlugin owner) { Entry = entry; DispName = entry.Definition.Key; base.Category = entry.Definition.Section; ConfigDescription description = entry.Description; base.Description = ((description != null) ? description.Description : null); TypeConverter converter = TomlTypeConverter.GetConverter(entry.SettingType); if (converter != null) { base.ObjToStr = (object o) => converter.ConvertToString(o, entry.SettingType); base.StrToObj = (string s) => converter.ConvertToObject(s, entry.SettingType); } ConfigDescription description2 = entry.Description; AcceptableValueBase val = ((description2 != null) ? description2.AcceptableValues : null); if (val != null) { GetAcceptableValues(val); } base.DefaultValue = entry.DefaultValue; ConfigDescription description3 = entry.Description; SetFromAttributes((description3 != null) ? description3.Tags : null, owner); } private void GetAcceptableValues(AcceptableValueBase values) { Type type = ((object)values).GetType(); PropertyInfo property = type.GetProperty("AcceptableValues", BindingFlags.Instance | BindingFlags.Public); if ((object)property != null) { base.AcceptableValues = ((IEnumerable)property.GetValue(values, null)).Cast().ToArray(); return; } PropertyInfo property2 = type.GetProperty("MinValue", BindingFlags.Instance | BindingFlags.Public); PropertyInfo property3 = type.GetProperty("MaxValue", BindingFlags.Instance | BindingFlags.Public); if ((object)property2 != null && (object)property3 != null) { base.AcceptableValueRange = new KeyValuePair(property2.GetValue(values, null), property3.GetValue(values, null)); base.ShowRangeAsPercent = ((base.AcceptableValueRange.Key.Equals(0) || base.AcceptableValueRange.Key.Equals(1)) && base.AcceptableValueRange.Value.Equals(100)) || (base.AcceptableValueRange.Key.Equals(0f) && base.AcceptableValueRange.Value.Equals(1f)); } } public override object Get() { return Entry.BoxedValue; } protected override void SetValue(object newVal) { Entry.BoxedValue = newVal; } } [BepInPlugin("com.bepis.bepinex.configurationmanager", "Configuration Manager", "19.0")] [Browsable(false)] public class ConfigurationManager : BaseUnityPlugin { private sealed class PluginSettingsData { public sealed class PluginSettingsGroupData { public string Name; public List Settings; } public BepInPlugin Info; public List Categories; public int Height; public string Website; private bool _collapsed; public bool Collapsed { get { return _collapsed; } set { _collapsed = value; Height = 0; } } } public const string GUID = "com.bepis.bepinex.configurationmanager"; public const string Version = "19.0"; internal static ManualLogSource Logger; private static SettingFieldDrawer _fieldDrawer; private static readonly Color _advancedSettingColor = new Color(1f, 0.95f, 0.67f, 1f); private const int WindowId = -68; private const string SearchBoxName = "searchBox"; private bool _focusSearchBox; private string _searchString = string.Empty; public bool OverrideHotkey; private bool _displayingWindow; private bool _obsoleteCursor; private string _modsWithoutSettings; private List _allSettings; private List _filteredSetings = new List(); private bool _windowWasMoved; private bool _tipsPluginHeaderWasClicked; private bool _tipsWindowWasMoved; private Rect _screenRect; private Vector2 _settingWindowScrollPos; private int _tipsHeight; private PropertyInfo _curLockState; private PropertyInfo _curVisible; private int _previousCursorLockState; private bool _previousCursorVisible; private readonly ConfigEntry _showAdvanced; private readonly ConfigEntry _showKeybinds; private readonly ConfigEntry _showSettings; private readonly ConfigEntry _keybind; private readonly ConfigEntry _hideSingleSection; private readonly ConfigEntry _pluginConfigCollapsedDefault; private bool _showDebug; internal Rect SettingWindowRect { get; private set; } public bool IsWindowFullscreen { get { if (DisplayingWindow) { return !_windowWasMoved; } return false; } } internal int LeftColumnWidth { get; private set; } internal int RightColumnWidth { get; private set; } public bool DisplayingWindow { get { return _displayingWindow; } set { if (_displayingWindow == value) { return; } _displayingWindow = value; SettingFieldDrawer.ClearCache(); if (_displayingWindow) { CalculateWindowRect(); BuildSettingList(); _focusSearchBox = true; if ((object)_curLockState != null) { _previousCursorLockState = (_obsoleteCursor ? Convert.ToInt32((bool)_curLockState.GetValue(null, null)) : ((int)_curLockState.GetValue(null, null))); _previousCursorVisible = (bool)_curVisible.GetValue(null, null); } } else if (!_previousCursorVisible || _previousCursorLockState != 0) { SetUnlockCursor(_previousCursorLockState, _previousCursorVisible); } this.DisplayingWindowChanged?.Invoke(this, new ValueChangedEventArgs(value)); } } public string SearchString { get { return _searchString; } private set { if (value == null) { value = string.Empty; } if (!(_searchString == value)) { _searchString = value; BuildFilteredSettingList(); } } } public event EventHandler> DisplayingWindowChanged; public ConfigurationManager() { //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; _fieldDrawer = new SettingFieldDrawer(this); _showAdvanced = ((BaseUnityPlugin)this).Config.Bind("Filtering", "Show advanced", false, (ConfigDescription)null); _showKeybinds = ((BaseUnityPlugin)this).Config.Bind("Filtering", "Show keybinds", true, (ConfigDescription)null); _showSettings = ((BaseUnityPlugin)this).Config.Bind("Filtering", "Show settings", true, (ConfigDescription)null); _keybind = ((BaseUnityPlugin)this).Config.Bind("General", "Show config manager", new KeyboardShortcut((KeyCode)282, (KeyCode[])(object)new KeyCode[0]), new ConfigDescription("The shortcut used to toggle the config manager window on and off.\nThe key can be overridden by a game-specific plugin if necessary, in that case this setting is ignored.", (AcceptableValueBase)null, new object[0])); _hideSingleSection = ((BaseUnityPlugin)this).Config.Bind("General", "Hide single sections", false, new ConfigDescription("Show section title for plugins with only one section", (AcceptableValueBase)null, new object[0])); _pluginConfigCollapsedDefault = ((BaseUnityPlugin)this).Config.Bind("General", "Plugin collapsed default", true, new ConfigDescription("If set to true plugins will be collapsed when opening the configuration manager window", (AcceptableValueBase)null, new object[0])); } public static void RegisterCustomSettingDrawer(Type settingType, Action onGuiDrawer) { if ((object)settingType == null) { throw new ArgumentNullException("settingType"); } if (onGuiDrawer == null) { throw new ArgumentNullException("onGuiDrawer"); } if (SettingFieldDrawer.SettingDrawHandlers.ContainsKey(settingType)) { Logger.LogWarning((object)("Tried to add a setting drawer for type " + settingType.FullName + " while one already exists.")); } else { SettingFieldDrawer.SettingDrawHandlers[settingType] = onGuiDrawer; } } public void BuildSettingList() { SettingSearcher.CollectSettings(out var results, out var modsWithoutSettings, _showDebug); _modsWithoutSettings = string.Join(", ", (from x in modsWithoutSettings select x.TrimStart(new char[1] { '!' }) into x orderby x select x).ToArray()); _allSettings = results.ToList(); BuildFilteredSettingList(); } private void BuildFilteredSettingList() { IEnumerable source = _allSettings; string[] searchStrings = SearchString.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (searchStrings.Length != 0) { source = source.Where((SettingEntryBase x) => ContainsSearchString(x, searchStrings)); } else { if (!_showAdvanced.Value) { source = source.Where((SettingEntryBase x) => x.IsAdvanced != true); } if (!_showKeybinds.Value) { source = source.Where((SettingEntryBase x) => !IsKeyboardShortcut(x)); } if (!_showSettings.Value) { source = source.Where((SettingEntryBase x) => x.IsAdvanced == true || IsKeyboardShortcut(x)); } } bool settingsAreCollapsed = _pluginConfigCollapsedDefault.Value; HashSet nonDefaultCollpasingStateByPluginName = new HashSet(); foreach (PluginSettingsData filteredSeting in _filteredSetings) { if (filteredSeting.Collapsed != settingsAreCollapsed) { nonDefaultCollpasingStateByPluginName.Add(filteredSeting.Info.Name); } } _filteredSetings = (from x in (from x in source group x by x.PluginInfo).Select(delegate(IGrouping pluginSettings) { List originalCategoryOrder = pluginSettings.Select((SettingEntryBase x) => x.Category).Distinct().ToList(); IEnumerable source2 = from x in pluginSettings group x by x.Category into x orderby originalCategoryOrder.IndexOf(x.Key), x.Key select new PluginSettingsData.PluginSettingsGroupData { Name = x.Key, Settings = (from set in x orderby set.Order descending, set.DispName select set).ToList() }; string website = Utils.GetWebsite(pluginSettings.First().PluginInstance); return new PluginSettingsData { Info = pluginSettings.Key, Categories = source2.ToList(), Collapsed = (nonDefaultCollpasingStateByPluginName.Contains(pluginSettings.Key.Name) ? (!settingsAreCollapsed) : settingsAreCollapsed), Website = website }; }) orderby x.Info.Name select x).ToList(); } private static bool IsKeyboardShortcut(SettingEntryBase x) { if ((object)x.SettingType != typeof(KeyboardShortcut)) { return (object)x.SettingType == typeof(KeyCode); } return true; } private static bool ContainsSearchString(SettingEntryBase setting, string[] searchStrings) { string combinedSearchTarget = setting.PluginInfo.Name + "\n" + setting.PluginInfo.GUID + "\n" + setting.DispName + "\n" + setting.Category + "\n" + setting.Description + "\n" + setting.DefaultValue?.ToString() + "\n" + setting.Get(); return searchStrings.All((string s) => combinedSearchTarget.IndexOf(s, StringComparison.InvariantCultureIgnoreCase) >= 0); } private void CalculateWindowRect() { //IL_005d: 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) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_008a: 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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Min(Screen.width, 650); int num2 = ((Screen.height < 560) ? Screen.height : (Screen.height - 100)); int num3 = Mathf.RoundToInt((float)(Screen.width - num) / 2f); int num4 = Mathf.RoundToInt((float)(Screen.height - num2) / 2f); SettingWindowRect = new Rect((float)num3, (float)num4, (float)num, (float)num2); _screenRect = new Rect(0f, 0f, (float)Screen.width, (float)Screen.height); Rect settingWindowRect = SettingWindowRect; LeftColumnWidth = Mathf.RoundToInt(((Rect)(ref settingWindowRect)).width / 2.5f); settingWindowRect = SettingWindowRect; RightColumnWidth = (int)((Rect)(ref settingWindowRect)).width - LeftColumnWidth - 115; _windowWasMoved = false; } private void OnGUI() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: 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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_0074: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_00de: Unknown result type (might be due to invalid IL or missing references) if (!DisplayingWindow) { return; } SetUnlockCursor(0, cursorVisible: true); Vector2 val = Vector2.op_Implicit(UnityInput.Current.mousePosition); val.y = (float)Screen.height - val.y; Rect settingWindowRect; if (!_windowWasMoved) { if (GUI.Button(_screenRect, string.Empty, GUI.skin.box)) { settingWindowRect = SettingWindowRect; if (!((Rect)(ref settingWindowRect)).Contains(val)) { DisplayingWindow = false; } } ImguiUtils.DrawWindowBackground(SettingWindowRect); } Rect val2 = GUILayout.Window(-68, SettingWindowRect, new WindowFunction(SettingsWindow), "Plugin / mod settings", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (val2 != SettingWindowRect) { _windowWasMoved = true; SettingWindowRect = val2; _tipsWindowWasMoved = true; } if (SettingFieldDrawer.SettingKeyboardShortcut) { return; } if (_windowWasMoved) { settingWindowRect = SettingWindowRect; if (!((Rect)(ref settingWindowRect)).Contains(val)) { return; } } UnityInput.Current.ResetInputAxes(); } private static void DrawTooltip(Rect area) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_009b: 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_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) string tooltip = GUI.tooltip; if (!string.IsNullOrEmpty(tooltip)) { GUIStyle val = GUI.skin.box.CreateCopy(); val.wordWrap = true; val.alignment = (TextAnchor)4; GUIContent val2 = new GUIContent(tooltip); float num = val.CalcHeight(val2, 400f) + 10f; Vector2 mousePosition = Event.current.mousePosition; float num2 = ((mousePosition.x + 400f > ((Rect)(ref area)).width) ? (((Rect)(ref area)).width - 400f) : mousePosition.x); float num3 = ((mousePosition.y + 25f + num > ((Rect)(ref area)).height) ? (mousePosition.y - num) : (mousePosition.y + 25f)); Rect val3 = default(Rect); ((Rect)(ref val3))..ctor(num2, num3, 400f, num); ImguiUtils.DrawContolBackground(val3, Color.black); val.Draw(val3, val2, -1); } } private void SettingsWindow(int id) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Invalid comparison between Unknown and I4 //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Invalid comparison between Unknown and I4 //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_018d: Unknown result type (might be due to invalid IL or missing references) DrawWindowHeader(); _settingWindowScrollPos = GUILayout.BeginScrollView(_settingWindowScrollPos, false, true, (GUILayoutOption[])(object)new GUILayoutOption[0]); float y = _settingWindowScrollPos.y; Rect val = SettingWindowRect; float height = ((Rect)(ref val)).height; GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[0]); if (string.IsNullOrEmpty(SearchString)) { DrawTips(); if (_tipsHeight == 0 && (int)Event.current.type == 7) { val = GUILayoutUtility.GetLastRect(); _tipsHeight = (int)((Rect)(ref val)).height; } } int num = _tipsHeight; foreach (PluginSettingsData filteredSeting in _filteredSetings) { if (filteredSeting.Height == 0 || ((float)(num + filteredSeting.Height) >= y && (float)num <= y + height)) { try { DrawSinglePlugin(filteredSeting); } catch (ArgumentException) { } if (filteredSeting.Height == 0 && (int)Event.current.type == 7) { val = GUILayoutUtility.GetLastRect(); filteredSeting.Height = (int)((Rect)(ref val)).height; } } else { try { GUILayout.Space((float)filteredSeting.Height); } catch (ArgumentException) { } } num += filteredSeting.Height; } if (_showDebug) { GUILayout.Space(10f); GUILayout.Label("Plugins with no options available: " + _modsWithoutSettings, (GUILayoutOption[])(object)new GUILayoutOption[0]); } else { GUILayout.Space(70f); } GUILayout.EndVertical(); GUILayout.EndScrollView(); if (!SettingFieldDrawer.DrawCurrentDropdown()) { DrawTooltip(SettingWindowRect); } GUI.DragWindow(); } private void DrawTips() { string text = ((!_tipsPluginHeaderWasClicked) ? "Tip: Click plugin names to expand. Click setting and group names to see their descriptions." : ((!_tipsWindowWasMoved) ? "Tip: You can drag this window to move it. It will stay open while you interact with the game." : null)); if (text != null) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label(text, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.EndHorizontal(); } } private void DrawWindowHeader() { //IL_00a2: 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_00a8: 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) GUILayout.BeginHorizontal(GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUI.enabled = SearchString == string.Empty; bool flag = GUILayout.Toggle(_showSettings.Value, "Normal settings", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (_showSettings.Value != flag) { _showSettings.Value = flag; BuildFilteredSettingList(); } flag = GUILayout.Toggle(_showKeybinds.Value, "Keyboard shortcuts", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (_showKeybinds.Value != flag) { _showKeybinds.Value = flag; BuildFilteredSettingList(); } Color color = GUI.color; GUI.color = _advancedSettingColor; flag = GUILayout.Toggle(_showAdvanced.Value, "Advanced settings", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (_showAdvanced.Value != flag) { _showAdvanced.Value = flag; BuildFilteredSettingList(); } GUI.color = color; GUI.enabled = true; GUILayout.Space(8f); flag = GUILayout.Toggle(_showDebug, "Debug info", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (_showDebug != flag) { _showDebug = flag; BuildSettingList(); } if (GUILayout.Button("Open Log", (GUILayoutOption[])(object)new GUILayoutOption[0])) { try { Utils.OpenLog(); } catch (SystemException ex) { Logger.Log((LogLevel)10, (object)ex.Message); } } GUILayout.Space(8f); if (GUILayout.Button("Close", (GUILayoutOption[])(object)new GUILayoutOption[0])) { DisplayingWindow = false; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("Search: ", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUI.SetNextControlName("searchBox"); SearchString = GUILayout.TextField(SearchString, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (_focusSearchBox) { GUI.FocusWindow(-68); GUI.FocusControl("searchBox"); _focusSearchBox = false; } if (GUILayout.Button("Clear", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { SearchString = string.Empty; } GUILayout.Space(8f); if (GUILayout.Button(_pluginConfigCollapsedDefault.Value ? "Expand All" : "Collapse All", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { bool flag2 = !_pluginConfigCollapsedDefault.Value; _pluginConfigCollapsedDefault.Value = flag2; foreach (PluginSettingsData filteredSeting in _filteredSetings) { filteredSeting.Collapsed = flag2; } _tipsPluginHeaderWasClicked = true; } GUILayout.EndHorizontal(); } private void DrawSinglePlugin(PluginSettingsData plugin) { //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Expected O, but got Unknown //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: 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_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Expected O, but got Unknown //IL_0150: Unknown result type (might be due to invalid IL or missing references) GUILayout.BeginVertical(GUI.skin.box, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUIContent content = (_showDebug ? new GUIContent($"{plugin.Info.Name.TrimStart(new char[1] { '!' })} {plugin.Info.Version}", (Texture)null, "GUID: " + plugin.Info.GUID) : new GUIContent($"{plugin.Info.Name.TrimStart(new char[1] { '!' })} {plugin.Info.Version}")); bool flag = !string.IsNullOrEmpty(SearchString); bool flag2 = plugin.Website != null; if (flag2) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Space(29f); } if (SettingFieldDrawer.DrawPluginHeader(content, plugin.Collapsed && !flag) && !flag) { _tipsPluginHeaderWasClicked = true; plugin.Collapsed = !plugin.Collapsed; } if (flag2) { Color color = GUI.color; GUI.color = Color.gray; if (GUILayout.Button(new GUIContent("URL", (Texture)null, plugin.Website), GUI.skin.label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { Utils.OpenWebsite(plugin.Website); } GUI.color = color; GUILayout.EndHorizontal(); } if (flag || !plugin.Collapsed) { foreach (PluginSettingsData.PluginSettingsGroupData category in plugin.Categories) { if (!string.IsNullOrEmpty(category.Name) && (plugin.Categories.Count > 1 || !_hideSingleSection.Value)) { SettingFieldDrawer.DrawCategoryHeader(category.Name); } foreach (SettingEntryBase setting in category.Settings) { DrawSingleSetting(setting); GUILayout.Space(2f); } } } GUILayout.EndVertical(); } private void DrawSingleSetting(SettingEntryBase setting) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); try { DrawSettingName(setting); _fieldDrawer.DrawSettingValue(setting); DrawDefaultButton(setting); } catch (Exception arg) { Logger.Log((LogLevel)2, (object)$"Failed to draw setting {setting.DispName} - {arg}"); GUILayout.Label("Failed to draw this field, check log for details.", (GUILayoutOption[])(object)new GUILayoutOption[0]); } GUILayout.EndHorizontal(); } private void DrawSettingName(SettingEntryBase setting) { //IL_0009: 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) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!setting.HideSettingName) { Color color = GUI.color; if (setting.IsAdvanced == true) { GUI.color = _advancedSettingColor; } GUILayout.Label(new GUIContent(setting.DispName.TrimStart(new char[1] { '!' }), (Texture)null, setting.Description), (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width((float)LeftColumnWidth), GUILayout.MaxWidth((float)LeftColumnWidth) }); GUI.color = color; } } private static void DrawDefaultButton(SettingEntryBase setting) { if (setting.HideDefaultButton) { return; } object defaultValue = setting.DefaultValue; if (defaultValue != null || setting.SettingType.IsClass) { GUILayout.Space(5f); if (GUILayout.Button("Reset", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { setting.Set(defaultValue); } } } private void Start() { Type typeFromHandle = typeof(Cursor); _curLockState = typeFromHandle.GetProperty("lockState", BindingFlags.Static | BindingFlags.Public); _curVisible = typeFromHandle.GetProperty("visible", BindingFlags.Static | BindingFlags.Public); if ((object)_curLockState == null && (object)_curVisible == null) { _obsoleteCursor = true; _curLockState = typeof(Screen).GetProperty("lockCursor", BindingFlags.Static | BindingFlags.Public); _curVisible = typeof(Screen).GetProperty("showCursor", BindingFlags.Static | BindingFlags.Public); } try { ((BaseUnityPlugin)this).Config.Save(); } catch (IOException ex) { Logger.Log((LogLevel)12, (object)("WARNING: Failed to write to config directory, expect issues!\nError message:" + ex.Message)); } catch (UnauthorizedAccessException ex2) { Logger.Log((LogLevel)12, (object)("WARNING: Permission denied to write to config directory, expect issues!\nError message:" + ex2.Message)); } } private void Update() { //IL_001f: 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) if (DisplayingWindow) { SetUnlockCursor(0, cursorVisible: true); } if (!OverrideHotkey) { KeyboardShortcut value = _keybind.Value; if (((KeyboardShortcut)(ref value)).IsDown()) { DisplayingWindow = !DisplayingWindow; } } } private void LateUpdate() { if (DisplayingWindow) { SetUnlockCursor(0, cursorVisible: true); } } private void SetUnlockCursor(int lockState, bool cursorVisible) { if ((object)_curLockState != null) { if (_obsoleteCursor) { _curLockState.SetValue(null, Convert.ToBoolean(lockState), null); } else { _curLockState.SetValue(null, lockState, null); } _curVisible.SetValue(null, cursorVisible, null); } } } internal class PropertySettingEntry : SettingEntryBase { private Type _settingType; public object Instance { get; internal set; } public PropertyInfo Property { get; internal set; } public override string DispName { get { if (!string.IsNullOrEmpty(base.DispName)) { return base.DispName; } return Property.Name; } protected internal set { base.DispName = value; } } public override Type SettingType => _settingType ?? (_settingType = Property.PropertyType); public PropertySettingEntry(object instance, PropertyInfo settingProp, BaseUnityPlugin pluginInstance) { SetFromAttributes(settingProp.GetCustomAttributes(inherit: false), pluginInstance); if (!base.Browsable.HasValue) { base.Browsable = settingProp.CanRead && settingProp.CanWrite; } base.ReadOnly = settingProp.CanWrite; Property = settingProp; Instance = instance; } public override object Get() { return Property.GetValue(Instance, null); } protected override void SetValue(object newVal) { Property.SetValue(Instance, newVal, null); } } public abstract class SettingEntryBase { public delegate void CustomHotkeyDrawerFunc(ConfigEntryBase setting, ref bool isCurrentlyAcceptingInput); private static readonly PropertyInfo[] _myProperties = typeof(SettingEntryBase).GetProperties(BindingFlags.Instance | BindingFlags.Public); public object[] AcceptableValues { get; protected set; } public KeyValuePair AcceptableValueRange { get; protected set; } public bool? ShowRangeAsPercent { get; protected set; } public Action CustomDrawer { get; private set; } public CustomHotkeyDrawerFunc CustomHotkeyDrawer { get; private set; } public bool? Browsable { get; protected set; } public string Category { get; protected set; } public object DefaultValue { get; protected set; } public bool HideDefaultButton { get; protected set; } public bool HideSettingName { get; protected set; } public string Description { get; protected internal set; } public virtual string DispName { get; protected internal set; } public BepInPlugin PluginInfo { get; protected internal set; } public bool? ReadOnly { get; protected set; } public abstract Type SettingType { get; } public BaseUnityPlugin PluginInstance { get; private set; } public bool? IsAdvanced { get; internal set; } public int Order { get; protected set; } public Func ObjToStr { get; internal set; } public Func StrToObj { get; internal set; } public abstract object Get(); public void Set(object newVal) { if (ReadOnly != true) { SetValue(newVal); } } protected abstract void SetValue(object newVal); internal void SetFromAttributes(object[] attribs, BaseUnityPlugin pluginInstance) { PluginInstance = pluginInstance; PluginInfo = ((pluginInstance != null) ? pluginInstance.Info.Metadata : null); if (attribs == null || attribs.Length == 0) { return; } foreach (object obj in attribs) { if (obj == null) { continue; } if (!(obj is DisplayNameAttribute displayNameAttribute)) { if (!(obj is CategoryAttribute categoryAttribute)) { if (!(obj is DescriptionAttribute descriptionAttribute)) { if (!(obj is DefaultValueAttribute defaultValueAttribute)) { if (!(obj is ReadOnlyAttribute readOnlyAttribute)) { if (!(obj is BrowsableAttribute browsableAttribute)) { Action action = obj as Action; if (action == null) { if (obj is string text) { switch (text) { case "ReadOnly": ReadOnly = true; break; case "Browsable": Browsable = true; break; case "Unbrowsable": case "Hidden": Browsable = false; break; case "Advanced": IsAdvanced = true; break; } continue; } Type type = obj.GetType(); if (!(type.Name == "ConfigurationManagerAttributes")) { break; } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (var item in from my in _myProperties join other in fields on my.Name equals other.Name select new { my, other }) { try { object obj2 = item.other.GetValue(obj); if (obj2 != null) { if ((object)item.my.PropertyType != item.other.FieldType && typeof(Delegate).IsAssignableFrom(item.my.PropertyType)) { obj2 = Delegate.CreateDelegate(item.my.PropertyType, ((Delegate)obj2).Target, ((Delegate)obj2).Method); } item.my.SetValue(this, obj2, null); } } catch (Exception ex) { ConfigurationManager.Logger.LogWarning((object)("Failed to copy value " + item.my.Name + " from provided tag object " + type.FullName + " - " + ex.Message)); } } } else { CustomDrawer = delegate { action(this); }; } } else { Browsable = browsableAttribute.Browsable; } } else { ReadOnly = readOnlyAttribute.IsReadOnly; } } else { DefaultValue = defaultValueAttribute.Value; } } else { Description = descriptionAttribute.Description; } } else { Category = categoryAttribute.Category; } } else { DispName = displayNameAttribute.DisplayName; } } } } internal class SettingFieldDrawer { private sealed class ColorCacheEntry { public Color Last; public Texture2D Tex; } private static IEnumerable _keysToCheck; private static readonly Dictionary _comboBoxCache; private static readonly Dictionary _colorCache; private static ConfigurationManager _instance; private static SettingEntryBase _currentKeyboardShortcutToSet; private static GUIStyle _categoryHeaderSkin; private static GUIStyle _pluginHeaderSkin; private readonly Dictionary _canCovertCache = new Dictionary(); private static bool _drawColorHex; public static Dictionary> SettingDrawHandlers { get; } public static bool SettingKeyboardShortcut => _currentKeyboardShortcutToSet != null; static SettingFieldDrawer() { _comboBoxCache = new Dictionary(); _colorCache = new Dictionary(); SettingDrawHandlers = new Dictionary> { { typeof(bool), DrawBoolField }, { typeof(KeyboardShortcut), DrawKeyboardShortcut }, { typeof(KeyCode), DrawKeyCode }, { typeof(Color), DrawColor }, { typeof(Vector2), DrawVector2 }, { typeof(Vector3), DrawVector3 }, { typeof(Vector4), DrawVector4 }, { typeof(Quaternion), DrawQuaternion } }; } public SettingFieldDrawer(ConfigurationManager instance) { _instance = instance; } public void DrawSettingValue(SettingEntryBase setting) { if (setting.CustomDrawer != null) { setting.CustomDrawer((setting is ConfigSettingEntry configSettingEntry) ? configSettingEntry.Entry : null); } else if (setting.CustomHotkeyDrawer != null) { bool isCurrentlyAcceptingInput = _currentKeyboardShortcutToSet == setting; bool flag = isCurrentlyAcceptingInput; setting.CustomHotkeyDrawer((setting is ConfigSettingEntry configSettingEntry2) ? configSettingEntry2.Entry : null, ref isCurrentlyAcceptingInput); if (isCurrentlyAcceptingInput != flag) { _currentKeyboardShortcutToSet = (isCurrentlyAcceptingInput ? setting : null); } } else if (setting.ShowRangeAsPercent.HasValue && setting.AcceptableValueRange.Key != null) { DrawRangeField(setting); } else if (setting.AcceptableValues != null) { DrawListField(setting); } else if (!DrawFieldBasedOnValueType(setting)) { if (setting.SettingType.IsEnum) { DrawEnumField(setting); } else { DrawUnknownField(setting, _instance.RightColumnWidth); } } } public static void ClearCache() { _comboBoxCache.Clear(); foreach (KeyValuePair item in _colorCache) { Object.Destroy((Object)(object)item.Value.Tex); } _colorCache.Clear(); } public static void DrawCenteredLabel(string text, params GUILayoutOption[] options) { GUILayout.BeginHorizontal(options); GUILayout.FlexibleSpace(); GUILayout.Label(text, (GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } public static void DrawCategoryHeader(string text) { if (_categoryHeaderSkin == null) { _categoryHeaderSkin = GUI.skin.label.CreateCopy(); _categoryHeaderSkin.alignment = (TextAnchor)1; _categoryHeaderSkin.wordWrap = true; _categoryHeaderSkin.stretchWidth = true; _categoryHeaderSkin.fontSize = 14; } GUILayout.Label(text, _categoryHeaderSkin, (GUILayoutOption[])(object)new GUILayoutOption[0]); } public static bool DrawPluginHeader(GUIContent content, bool isCollapsed) { if (_pluginHeaderSkin == null) { _pluginHeaderSkin = GUI.skin.label.CreateCopy(); _pluginHeaderSkin.alignment = (TextAnchor)1; _pluginHeaderSkin.wordWrap = true; _pluginHeaderSkin.stretchWidth = true; _pluginHeaderSkin.fontSize = 15; } if (isCollapsed) { content.text += "\n..."; } return GUILayout.Button(content, _pluginHeaderSkin, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); } public static bool DrawCurrentDropdown() { if (ComboBox.CurrentDropdownDrawer != null) { ComboBox.CurrentDropdownDrawer(); ComboBox.CurrentDropdownDrawer = null; return true; } return false; } private static void DrawListField(SettingEntryBase setting) { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) object[] acceptableValues = setting.AcceptableValues; if (acceptableValues.Length == 0) { throw new ArgumentException("AcceptableValueListAttribute returned an empty list of acceptable values. You need to supply at least 1 option."); } if (!setting.SettingType.IsInstanceOfType(acceptableValues.FirstOrDefault((object x) => x != null))) { throw new ArgumentException("AcceptableValueListAttribute returned a list with items of type other than the settng type itself."); } if ((object)setting.SettingType == typeof(KeyCode)) { DrawKeyCode(setting); return; } Rect settingWindowRect = _instance.SettingWindowRect; DrawComboboxField(setting, acceptableValues, ((Rect)(ref settingWindowRect)).yMax); } private static bool DrawFieldBasedOnValueType(SettingEntryBase setting) { if (SettingDrawHandlers.TryGetValue(setting.SettingType, out var value)) { value(setting); return true; } return false; } private static void DrawBoolField(SettingEntryBase setting) { bool flag = (bool)setting.Get(); bool flag2 = GUILayout.Toggle(flag, flag ? "Enabled" : "Disabled", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (flag2 != flag) { setting.Set(flag2); } } private static void DrawEnumField(SettingEntryBase setting) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) if (setting.SettingType.GetCustomAttributes(typeof(FlagsAttribute), inherit: false).Any()) { DrawFlagsField(setting, Enum.GetValues(setting.SettingType), _instance.RightColumnWidth); return; } Array values = Enum.GetValues(setting.SettingType); Rect settingWindowRect = _instance.SettingWindowRect; DrawComboboxField(setting, values, ((Rect)(ref settingWindowRect)).yMax); } private static void DrawFlagsField(SettingEntryBase setting, IList enumValues, int maxWidth) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_0091: Unknown result type (might be due to invalid IL or missing references) long num = Convert.ToInt64(setting.Get()); var array = (from Enum x in enumValues select new { name = x.ToString(), val = Convert.ToInt64(x) }).ToArray(); GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MaxWidth((float)maxWidth) }); int num2 = 0; while (num2 < array.Length) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); int num3 = 0; for (; num2 < array.Length; num2++) { var anon = array[num2]; if (anon.val != 0L) { int num4 = (int)GUI.skin.toggle.CalcSize(new GUIContent(anon.name)).x; num3 += num4; if (num3 > maxWidth) { break; } GUI.changed = false; bool flag = GUILayout.Toggle((num & anon.val) == anon.val, anon.name, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); if (GUI.changed) { long value = (flag ? (num | anon.val) : (num & ~anon.val)); setting.Set(Enum.ToObject(setting.SettingType, value)); } } } GUILayout.EndHorizontal(); } GUI.changed = false; GUILayout.EndVertical(); GUILayout.FlexibleSpace(); } private static void DrawComboboxField(SettingEntryBase setting, IList list, float windowYmax) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: 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) GUIContent val = ObjectToGuiContent(setting.Get()); Rect rect = GUILayoutUtility.GetRect(val, GUI.skin.button, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (!_comboBoxCache.TryGetValue(setting, out var value)) { value = new ComboBox(rect, val, list.Cast().Select(ObjectToGuiContent).ToArray(), GUI.skin.button, windowYmax); _comboBoxCache[setting] = value; } else { value.Rect = rect; value.ButtonContent = val; } value.Show(delegate(int id) { if (id >= 0 && id < list.Count) { setting.Set(list[id]); } }); } private static GUIContent ObjectToGuiContent(object x) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown if (x is Enum) { Type type = x.GetType(); DescriptionAttribute descriptionAttribute = type.GetMember(x.ToString()).FirstOrDefault()?.GetCustomAttributes(typeof(DescriptionAttribute), inherit: false).Cast().FirstOrDefault(); if (descriptionAttribute == null) { return new GUIContent(x.ToString().ToProperCase()); } return new GUIContent(descriptionAttribute.Description); } return new GUIContent(x.ToString()); } private static void DrawRangeField(SettingEntryBase setting) { object obj = setting.Get(); float num = (float)Convert.ToDouble(obj, CultureInfo.InvariantCulture); float num2 = (float)Convert.ToDouble(setting.AcceptableValueRange.Key, CultureInfo.InvariantCulture); float num3 = (float)Convert.ToDouble(setting.AcceptableValueRange.Value, CultureInfo.InvariantCulture); float num4 = GUILayout.HorizontalSlider(num, num2, num3, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (Math.Abs(num4 - num) > Mathf.Abs(num3 - num2) / 1000f) { object newVal = Convert.ChangeType(num4, setting.SettingType, CultureInfo.InvariantCulture); setting.Set(newVal); } if (setting.ShowRangeAsPercent == true) { DrawCenteredLabel(Mathf.Round(100f * Mathf.Abs(num4 - num2) / Mathf.Abs(num3 - num2)) + "%", GUILayout.Width(50f)); return; } string text = Convert.ToString(obj, CultureInfo.InvariantCulture).AppendZeroIfFloat(setting.SettingType); string text2 = GUILayout.TextField(text, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) }); if (!(text2 != text)) { return; } try { float num5 = (float)Convert.ToDouble(text2, CultureInfo.InvariantCulture); float num6 = Mathf.Clamp(num5, num2, num3); setting.Set(Convert.ChangeType(num6, setting.SettingType, CultureInfo.InvariantCulture)); } catch (FormatException) { } } private void DrawUnknownField(SettingEntryBase setting, int rightColumnWidth) { if (setting.ObjToStr != null && setting.StrToObj != null) { string text = setting.ObjToStr(setting.Get()).AppendZeroIfFloat(setting.SettingType); string text2 = GUILayout.TextField(text, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width((float)rightColumnWidth), GUILayout.MaxWidth((float)rightColumnWidth) }); if (text2 != text) { setting.Set(setting.StrToObj(text2)); } } else { object obj = setting.Get(); string text3 = ((obj == null) ? "NULL" : Convert.ToString(obj, CultureInfo.InvariantCulture).AppendZeroIfFloat(setting.SettingType)); if (CanCovert(text3, setting.SettingType)) { string text4 = GUILayout.TextField(text3, (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width((float)rightColumnWidth), GUILayout.MaxWidth((float)rightColumnWidth) }); if (text4 != text3) { setting.Set(Convert.ChangeType(text4, setting.SettingType, CultureInfo.InvariantCulture)); } } else { GUILayout.TextArea(text3, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MaxWidth((float)rightColumnWidth) }); } } GUILayout.FlexibleSpace(); } private bool CanCovert(string value, Type type) { if (_canCovertCache.ContainsKey(type)) { return _canCovertCache[type]; } try { object obj = Convert.ChangeType(value, type); _canCovertCache[type] = true; return true; } catch { _canCovertCache[type] = false; return false; } } private static void DrawKeyCode(SettingEntryBase setting) { //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Expected O, but got Unknown //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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) if (_currentKeyboardShortcutToSet == setting) { GUILayout.Label("Press any key", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUIUtility.keyboardControl = -1; IInputSystem current = UnityInput.Current; if (_keysToCheck == null) { _keysToCheck = current.SupportedKeyCodes.Except((IEnumerable)(object)new KeyCode[2] { (KeyCode)323, default(KeyCode) }).ToArray(); } foreach (KeyCode item in _keysToCheck) { if (current.GetKeyUp(item)) { setting.Set(item); _currentKeyboardShortcutToSet = null; break; } } if (GUILayout.Button("Cancel", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { _currentKeyboardShortcutToSet = null; } } else { object[] acceptableValues = setting.AcceptableValues; Array list = ((acceptableValues != null && acceptableValues.Length > 1) ? setting.AcceptableValues : Enum.GetValues(setting.SettingType)); Rect settingWindowRect = _instance.SettingWindowRect; DrawComboboxField(setting, list, ((Rect)(ref settingWindowRect)).yMax); if (GUILayout.Button(new GUIContent("Set...", (Texture)null, "Set the key by pressing any key on your keyboard."), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { _currentKeyboardShortcutToSet = setting; } } } private static void DrawKeyboardShortcut(SettingEntryBase setting) { //IL_0125: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) if (_currentKeyboardShortcutToSet == setting) { GUILayout.Label("Press any key combination", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUIUtility.keyboardControl = -1; IInputSystem current = UnityInput.Current; if (_keysToCheck == null) { _keysToCheck = current.SupportedKeyCodes.Except((IEnumerable)(object)new KeyCode[2] { (KeyCode)323, default(KeyCode) }).ToArray(); } foreach (KeyCode item in _keysToCheck) { if (current.GetKeyUp(item)) { setting.Set((object)new KeyboardShortcut(item, _keysToCheck.Where((Func)current.GetKey).ToArray())); _currentKeyboardShortcutToSet = null; break; } } if (GUILayout.Button("Cancel", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { _currentKeyboardShortcutToSet = null; } } else { if (GUILayout.Button(setting.Get().ToString(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) })) { _currentKeyboardShortcutToSet = setting; } if (GUILayout.Button("Clear", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { setting.Set(KeyboardShortcut.Empty); _currentKeyboardShortcutToSet = null; } } } private static void DrawVector2(SettingEntryBase obj) { //IL_0006: 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_000c: 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_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: 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) Vector2 val = (Vector2)obj.Get(); Vector2 val2 = val; val.x = DrawSingleVectorSlider(val.x, "X"); val.y = DrawSingleVectorSlider(val.y, "Y"); if (val != val2) { obj.Set(val); } } private static void DrawVector3(SettingEntryBase obj) { //IL_0006: 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_000c: 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_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (Vector3)obj.Get(); Vector3 val2 = val; val.x = DrawSingleVectorSlider(val.x, "X"); val.y = DrawSingleVectorSlider(val.y, "Y"); val.z = DrawSingleVectorSlider(val.z, "Z"); if (val != val2) { obj.Set(val); } } private static void DrawVector4(SettingEntryBase obj) { //IL_0006: 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_000c: 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_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Vector4 val = (Vector4)obj.Get(); Vector4 val2 = val; val.x = DrawSingleVectorSlider(val.x, "X"); val.y = DrawSingleVectorSlider(val.y, "Y"); val.z = DrawSingleVectorSlider(val.z, "Z"); val.w = DrawSingleVectorSlider(val.w, "W"); if (val != val2) { obj.Set(val); } } private static void DrawQuaternion(SettingEntryBase obj) { //IL_0006: 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_000c: 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_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) Quaternion val = (Quaternion)obj.Get(); Quaternion val2 = val; val.x = DrawSingleVectorSlider(val.x, "X"); val.y = DrawSingleVectorSlider(val.y, "Y"); val.z = DrawSingleVectorSlider(val.z, "Z"); val.w = DrawSingleVectorSlider(val.w, "W"); if (val != val2) { obj.Set(val); } } private static float DrawSingleVectorSlider(float setting, string label) { GUILayout.Label(label, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); float.TryParse(GUILayout.TextField(setting.ToString("F", CultureInfo.InvariantCulture), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }), NumberStyles.Any, CultureInfo.InvariantCulture, out var result); return result; } private static void DrawColor(SettingEntryBase obj) { //IL_0006: 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_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: 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_02df: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: Unknown result type (might be due to invalid IL or missing references) //IL_02f7: 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) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0122: Unknown result type (might be due to invalid IL or missing references) Color val = (Color)obj.Get(); GUI.changed = false; if (!_colorCache.TryGetValue(obj, out var value)) { Texture2D tex = new Texture2D(100, 20, (TextureFormat)5, false); value = new ColorCacheEntry { Tex = tex, Last = val }; FillTex(val, tex); _colorCache[obj] = value; } GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label((Texture)(object)value.Tex, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); string text = (_drawColorHex ? ("#" + ColorUtility.ToHtmlStringRGBA(val)) : $"{val.r:F2} {val.g:F2} {val.b:F2} {val.a:F2}"); string text2 = GUILayout.TextField(text, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (GUI.changed && text != text2) { if (_drawColorHex) { Color val2 = default(Color); if (ColorUtility.TryParseHtmlString(text2, ref val2)) { val = val2; } } else { string[] array = text2.Split(new char[1] { ' ' }); if (array.Length == 4 && float.TryParse(array[0], out var result) && float.TryParse(array[1], out var result2) && float.TryParse(array[2], out var result3) && float.TryParse(array[3], out var result4)) { ((Color)(ref val))..ctor(result, result2, result3, result4); } } } _drawColorHex = GUILayout.Toggle(_drawColorHex, "Hex", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); GUILayout.Label("R", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); val.r = GUILayout.HorizontalSlider(val.r, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.Label("G", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); val.g = GUILayout.HorizontalSlider(val.g, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.Label("B", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); val.b = GUILayout.HorizontalSlider(val.b, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.Label("A", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); val.a = GUILayout.HorizontalSlider(val.a, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.EndHorizontal(); GUILayout.EndVertical(); if (val != value.Last) { obj.Set(val); FillTex(val, value.Tex); value.Last = val; } static void FillTex(Color color, Texture2D tex2) { //IL_0000: 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) if (color.a < 1f) { tex2.FillTextureCheckerboard(); } tex2.FillTexture(color); } } } public sealed class ValueChangedEventArgs : EventArgs { public TValue NewValue { get; } public ValueChangedEventArgs(TValue newValue) { NewValue = newValue; } } internal static class Constants { public const string Version = "19.0"; public const string Name = "BepInEx.ConfigurationManager"; public const string Description = "Universal in-game configuration manager for BepInEx plugins"; public const string Website = "https://github.com/BepInEx/BepInEx.ConfigurationManager"; public const string Copyright = "Copyright © 2019 / LGPL-3.0"; } } namespace ConfigurationManager.Utilities { internal class ComboBox { private static bool forceToUnShow; private static int useControlID = -1; private readonly string buttonStyle; private bool isClickedComboButton; private readonly GUIContent[] listContent; private readonly GUIStyle listStyle; private readonly int _windowYmax; private Vector2 _scrollPosition = Vector2.zero; public Rect Rect { get; set; } public GUIContent ButtonContent { get; set; } public static Action CurrentDropdownDrawer { get; set; } public ComboBox(Rect rect, GUIContent buttonContent, GUIContent[] listContent, GUIStyle listStyle, float windowYmax) { //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_0012: Unknown result type (might be due to invalid IL or missing references) Rect = rect; ButtonContent = buttonContent; this.listContent = listContent; buttonStyle = "button"; this.listStyle = listStyle; _windowYmax = (int)windowYmax; } public void Show(Action onItemSelected) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Invalid comparison between Unknown and I4 //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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) //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) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0114: 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_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) if (forceToUnShow) { forceToUnShow = false; isClickedComboButton = false; } bool flag = false; int controlID = GUIUtility.GetControlID((FocusType)2); Vector2 val = Vector2.zero; if ((int)Event.current.GetTypeForControl(controlID) == 1 && isClickedComboButton) { flag = true; val = Event.current.mousePosition; } if (GUI.Button(Rect, ButtonContent, GUIStyle.op_Implicit(buttonStyle))) { if (useControlID == -1) { useControlID = controlID; isClickedComboButton = false; } if (useControlID != controlID) { forceToUnShow = true; useControlID = controlID; } isClickedComboButton = true; } if (isClickedComboButton) { GUI.enabled = false; GUI.color = new Color(1f, 1f, 1f, 2f); Rect rect = Rect; float x = ((Rect)(ref rect)).x; rect = Rect; Vector2 location = GUIUtility.GUIToScreenPoint(new Vector2(x, ((Rect)(ref rect)).y + listStyle.CalcHeight(listContent[0], 1f))); rect = Rect; Vector2 val2 = default(Vector2); ((Vector2)(ref val2))..ctor(((Rect)(ref rect)).width, listStyle.CalcHeight(listContent[0], 1f) * (float)listContent.Length); Rect innerRect = new Rect(0f, 0f, val2.x, val2.y); Rect outerRectScreen = new Rect(location.x, location.y, val2.x, val2.y); if (((Rect)(ref outerRectScreen)).yMax > (float)_windowYmax) { ((Rect)(ref outerRectScreen)).height = (float)_windowYmax - ((Rect)(ref outerRectScreen)).y; ref Rect reference = ref outerRectScreen; ((Rect)(ref reference)).width = ((Rect)(ref reference)).width + 20f; } if (val != Vector2.zero && ((Rect)(ref outerRectScreen)).Contains(GUIUtility.GUIToScreenPoint(val))) { flag = false; } CurrentDropdownDrawer = delegate { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: 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_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) GUI.enabled = true; Vector2 val3 = GUIUtility.ScreenToGUIPoint(location); Rect val4 = default(Rect); ((Rect)(ref val4))..ctor(val3.x, val3.y, ((Rect)(ref outerRectScreen)).width, ((Rect)(ref outerRectScreen)).height); ImguiUtils.DrawContolBackground(val4); _scrollPosition = GUI.BeginScrollView(val4, _scrollPosition, innerRect, false, false); int num = GUI.SelectionGrid(innerRect, -1, listContent, 1, listStyle); if (num != -1) { onItemSelected(num); isClickedComboButton = false; } GUI.EndScrollView(true); }; } if (flag) { isClickedComboButton = false; } } } internal static class ImguiUtils { private static Texture2D _tooltipBg; private static Texture2D _windowBackground; public static void DrawWindowBackground(Rect position) { //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0069: Expected O, but got Unknown //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_windowBackground)) { Texture2D val = new Texture2D(1, 1, (TextureFormat)5, false); val.SetPixel(0, 0, new Color(0.5f, 0.5f, 0.5f, 1f)); val.Apply(); _windowBackground = val; } GUI.Box(position, GUIContent.none, new GUIStyle { normal = new GUIStyleState { background = _windowBackground } }); } public static void DrawContolBackground(Rect position, Color color = default(Color)) { //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_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown //IL_0055: Expected O, but got Unknown //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0019: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)_tooltipBg)) { Texture2D val = new Texture2D(1, 1, (TextureFormat)5, false); val.SetPixel(0, 0, Color.black); val.Apply(); _tooltipBg = val; } GUI.Box(position, GUIContent.none, new GUIStyle { normal = new GUIStyleState { background = _tooltipBg } }); } } internal static class Utils { public static string ToProperCase(this string str) { if (string.IsNullOrEmpty(str)) { return string.Empty; } if (str.Length < 2) { return str; } string text = str.Substring(0, 1).ToUpper(); for (int i = 1; i < str.Length; i++) { if (char.IsUpper(str[i])) { text += " "; } text += str[i]; } return text; } public static string AppendZero(this string s) { if (s.Contains(".")) { return s; } return s + ".0"; } public static string AppendZeroIfFloat(this string s, Type type) { if ((object)type != typeof(float) && (object)type != typeof(double) && (object)type != typeof(decimal)) { return s; } return s.AppendZero(); } public static void FillTexture(this Texture2D tex, Color color) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //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_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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) if (color.a < 1f) { for (int i = 0; i < ((Texture)tex).width; i++) { for (int j = 0; j < ((Texture)tex).height; j++) { Color pixel = tex.GetPixel(i, j); Color val = Color.Lerp(pixel, color, color.a); val.a = Mathf.Max(pixel.a, color.a); tex.SetPixel(i, j, val); } } } else { for (int k = 0; k < ((Texture)tex).width; k++) { for (int l = 0; l < ((Texture)tex).height; l++) { tex.SetPixel(k, l, color); } } } tex.Apply(false); } public static void FillTextureCheckerboard(this Texture2D tex) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < ((Texture)tex).width; i++) { for (int j = 0; j < ((Texture)tex).height; j++) { tex.SetPixel(i, j, ((i / 10 + j / 10) % 2 == 1) ? Color.black : Color.white); } } tex.Apply(false); } public static void OpenLog() { List list = new List(); string text = Path.Combine(Application.dataPath, ".."); list.Add(Path.Combine(text, "output_log.txt")); list.Add(Path.Combine(Application.dataPath, "output_log.txt")); PropertyInfo property = typeof(Application).GetProperty("consoleLogPath", BindingFlags.Static | BindingFlags.Public); if ((object)property != null) { string item = property.GetValue(null, null) as string; list.Add(item); } if (Directory.Exists(Application.persistentDataPath)) { string item2 = Directory.GetFiles(Application.persistentDataPath, "output_log.txt", SearchOption.AllDirectories).FirstOrDefault(); list.Add(item2); } string path = list.Where(File.Exists).OrderByDescending(File.GetLastWriteTimeUtc).FirstOrDefault(); if (!TryOpen(path)) { list.Clear(); list.AddRange(Directory.GetFiles(text, "LogOutput.log*", SearchOption.AllDirectories)); list.AddRange(Directory.GetFiles(text, "output_log.txt", SearchOption.AllDirectories)); path = list.Where(File.Exists).OrderByDescending(File.GetLastWriteTimeUtc).FirstOrDefault(); if (!TryOpen(path)) { throw new FileNotFoundException("No log files were found"); } } static bool TryOpen(string text2) { if (text2 == null) { return false; } try { Process.Start(new ProcessStartInfo(text2) { UseShellExecute = true }); return true; } catch { return false; } } } public static string GetWebsite(BaseUnityPlugin bepInPlugin) { if ((Object)(object)bepInPlugin == (Object)null) { return null; } try { string location = bepInPlugin.Info.Location; if (!File.Exists(location)) { return null; } FileVersionInfo versionInfo = FileVersionInfo.GetVersionInfo(location); return new string[5] { versionInfo.CompanyName, versionInfo.FileDescription, versionInfo.Comments, versionInfo.LegalCopyright, versionInfo.LegalTrademarks }.FirstOrDefault((string x) => Uri.IsWellFormedUriString(x, UriKind.Absolute)); } catch (Exception ex) { ManualLogSource logger = ConfigurationManager.Logger; PluginInfo info = bepInPlugin.Info; object obj; if (info == null) { obj = null; } else { BepInPlugin metadata = info.Metadata; obj = ((metadata != null) ? metadata.Name : null); } logger.LogWarning((object)("Failed to get URI for " + (string?)obj + " - " + ex.Message)); return null; } } public static void OpenWebsite(string url) { try { if (string.IsNullOrEmpty(url)) { throw new Exception("Empty URL"); } Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); } catch (Exception ex) { ConfigurationManager.Logger.Log((LogLevel)12, (object)("Failed to open URL " + url + "\nCause: " + ex.Message)); } } public static GUIStyle CreateCopy(this GUIStyle original) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown return new GUIStyle(original); } } }