Please disclose if your mod was created primarily 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 VediciToolkit v1.0.7
BepInEx/plugins/ConfigurationManager.dll
Decompiled 2 years agousing 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 System.Runtime.InteropServices; 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: AssemblyProduct("BepInEx.ConfigurationManager")] [assembly: AssemblyTitle("BepInEx.ConfigurationManager")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("https://github.com/BepInEx/BepInEx.ConfigurationManager")] [assembly: AssemblyCopyright("Copyright © 2019")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: AssemblyVersion("18.0.1.0")] namespace ConfigurationManager { 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<object>().ToArray(); return; } PropertyInfo property2 = type.GetProperty("MinValue", BindingFlags.Instance | BindingFlags.Public); if ((object)property2 != null) { PropertyInfo property3 = type.GetProperty("MaxValue", BindingFlags.Instance | BindingFlags.Public); if ((object)property3 == null) { throw new ArgumentNullException("maxProp"); } base.AcceptableValueRange = new KeyValuePair<object, object>(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; } } 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); } } internal static class SettingSearcher { private static readonly ICollection<string> _updateMethodNames = new string[4] { "Update", "FixedUpdate", "LateUpdate", "OnGUI" }; public static void CollectSettings(out IEnumerable<SettingEntryBase> results, out List<string> modsWithoutSettings, bool showDebug) { modsWithoutSettings = new List<string>(); try { results = GetBepInExCoreConfig(); } catch (Exception ex) { results = Enumerable.Empty<SettingEntryBase>(); ConfigurationManager.Logger.LogError((object)ex); } BaseUnityPlugin[] array = Utils.FindPlugins(); foreach (BaseUnityPlugin val in array) { Type type = ((object)val).GetType(); BepInPlugin metadata = val.Info.Metadata; if (type.GetCustomAttributes(typeof(BrowsableAttribute), inherit: false).Cast<BrowsableAttribute>().Any((BrowsableAttribute x) => !x.Browsable)) { modsWithoutSettings.Add(metadata.Name); continue; } List<SettingEntryBase> list = new List<SettingEntryBase>(); list.AddRange(GetPluginConfig(val).Cast<SettingEntryBase>()); list.RemoveAll((SettingEntryBase x) => x.Browsable == false); if (list.Count == 0) { modsWithoutSettings.Add(metadata.Name); } 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); } } } private static IEnumerable<SettingEntryBase> 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<KeyValuePair<ConfigDefinition, ConfigEntryBase>>)source).Select((Func<KeyValuePair<ConfigDefinition, ConfigEntryBase>, SettingEntryBase>)((KeyValuePair<ConfigDefinition, ConfigEntryBase> kvp) => new ConfigSettingEntry(kvp.Value, null) { IsAdvanced = true, PluginInfo = bepinMeta })); } private static IEnumerable<ConfigSettingEntry> GetPluginConfig(BaseUnityPlugin plugin) { return ((IEnumerable<KeyValuePair<ConfigDefinition, ConfigEntryBase>>)plugin.Config).Select((KeyValuePair<ConfigDefinition, ConfigEntryBase> kvp) => new ConfigSettingEntry(kvp.Value, plugin)); } } [BepInPlugin("com.bepis.bepinex.configurationmanager", "Configuration Manager", "18.0.1")] [Browsable(false)] public class ConfigurationManager : BaseUnityPlugin { private sealed class PluginSettingsData { public sealed class PluginSettingsGroupData { public string Name; public List<SettingEntryBase> Settings; } public BepInPlugin Info; public List<PluginSettingsGroupData> 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 = "18.0.1"; 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<SettingEntryBase> _allSettings; private List<PluginSettingsData> _filteredSetings = new List<PluginSettingsData>(); 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<bool> _showAdvanced; private readonly ConfigEntry<bool> _showKeybinds; private readonly ConfigEntry<bool> _showSettings; private readonly ConfigEntry<KeyboardShortcut> _keybind; private readonly ConfigEntry<bool> _hideSingleSection; private readonly ConfigEntry<bool> _pluginConfigCollapsedDefault; private bool _showDebug; internal Rect SettingWindowRect { get; private set; } internal static Texture2D TooltipBg { get; private set; } internal static Texture2D WindowBackground { get; private set; } 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<bool>(value)); } } public string SearchString { get { return _searchString; } private set { if (value == null) { value = string.Empty; } if (!(_searchString == value)) { _searchString = value; BuildFilteredSettingList(); } } } public event EventHandler<ValueChangedEventArgs<bool>> 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<bool>("Filtering", "Show advanced", false, (ConfigDescription)null); _showKeybinds = ((BaseUnityPlugin)this).Config.Bind<bool>("Filtering", "Show keybinds", true, (ConfigDescription)null); _showSettings = ((BaseUnityPlugin)this).Config.Bind<bool>("Filtering", "Show settings", true, (ConfigDescription)null); _keybind = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("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<bool>("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<bool>("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<SettingEntryBase> 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<SettingEntryBase> 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<string> nonDefaultCollpasingStateByPluginName = new HashSet<string>(); 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<BepInPlugin, SettingEntryBase> pluginSettings) { IEnumerable<PluginSettingsData.PluginSettingsGroupData> source2 = from eb in pluginSettings group eb by eb.Category into x orderby string.Equals(x.Key, "Keyboard shortcuts", StringComparison.Ordinal), 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) { return (object)x.SettingType == typeof(KeyboardShortcut); } 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_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown //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_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_0063: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0083: Expected O, but got Unknown //IL_0038: 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_0045: 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_00e0: 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) if (!DisplayingWindow) { return; } SetUnlockCursor(0, cursorVisible: true); Rect settingWindowRect; if (!_windowWasMoved) { if (GUI.Button(_screenRect, string.Empty, GUI.skin.box)) { settingWindowRect = SettingWindowRect; if (!((Rect)(ref settingWindowRect)).Contains(UnityInput.Current.mousePosition)) { DisplayingWindow = false; } } GUI.Box(SettingWindowRect, GUIContent.none, new GUIStyle { normal = new GUIStyleState { background = WindowBackground } }); } Rect val = GUILayout.Window(-68, SettingWindowRect, new WindowFunction(SettingsWindow), "Plugin / mod settings", (GUILayoutOption[])(object)new GUILayoutOption[0]); if (val != SettingWindowRect) { _windowWasMoved = true; SettingWindowRect = val; _tipsWindowWasMoved = true; } if (SettingFieldDrawer.SettingKeyboardShortcut) { return; } if (_windowWasMoved) { settingWindowRect = SettingWindowRect; if (!((Rect)(ref settingWindowRect)).Contains(UnityInput.Current.mousePosition)) { return; } } UnityInput.Current.ResetInputAxes(); } private static void DrawTooltip(Rect area) { //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_001b: 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_0021: 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_003b: Expected O, but got Unknown //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0067: 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_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(GUI.tooltip)) { Event current = Event.current; GUIStyle val = new GUIStyle { normal = new GUIStyleState { textColor = Color.white, background = TooltipBg }, wordWrap = true, alignment = (TextAnchor)4 }; float num = val.CalcHeight(new GUIContent(GUI.tooltip), 400f) + 10f; float num2 = ((current.mousePosition.x + 400f > ((Rect)(ref area)).width) ? (((Rect)(ref area)).width - 400f) : current.mousePosition.x); float num3 = ((current.mousePosition.y + 25f + num > ((Rect)(ref area)).height) ? (current.mousePosition.y - num) : (current.mousePosition.y + 25f)); GUI.Box(new Rect(num2, num3, 400f, num), GUI.tooltip, val); } } 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_0099: 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_009f: Expected O, but got Unknown //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: 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_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Expected O, but got Unknown //IL_014e: 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}", "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", 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Expected O, but got Unknown //IL_0080: 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) if (!setting.HideSettingName) { Color color = GUI.color; if (setting.IsAdvanced == true) { GUI.color = _advancedSettingColor; } GUILayout.Label(new GUIContent(setting.DispName.TrimStart(new char[1] { '!' }), 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; } if (setting.DefaultValue != null) { if (DefaultButton()) { setting.Set(setting.DefaultValue); } } else if (setting.SettingType.IsClass && DefaultButton()) { setting.Set(null); } static bool DefaultButton() { GUILayout.Space(5f); return GUILayout.Button("Reset", (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); } } private void Start() { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_000d: 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_0044: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(1, 1, (TextureFormat)5, false); val.SetPixel(0, 0, Color.black); val.Apply(); TooltipBg = val; Texture2D val2 = new Texture2D(1, 1, (TextureFormat)5, false); val2.SetPixel(0, 0, new Color(0.5f, 0.5f, 0.5f, 1f)); val2.Apply(); WindowBackground = val2; 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); } } } 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<object, object> AcceptableValueRange { get; protected set; } public bool? ShowRangeAsPercent { get; protected set; } public Action<ConfigEntryBase> 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<object, string> ObjToStr { get; internal set; } public Func<string, object> 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<SettingEntryBase> action = obj as Action<SettingEntryBase>; 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<KeyCode> _keysToCheck; private static readonly Dictionary<SettingEntryBase, ComboBox> _comboBoxCache; private static readonly Dictionary<SettingEntryBase, ColorCacheEntry> _colorCache; private static ConfigurationManager _instance; private static SettingEntryBase _currentKeyboardShortcutToSet; private static GUIStyle _categoryHeaderSkin; private static GUIStyle _pluginHeaderSkin; private readonly Dictionary<Type, bool> _canCovertCache = new Dictionary<Type, bool>(); public static Dictionary<Type, Action<SettingEntryBase>> SettingDrawHandlers { get; } public static bool SettingKeyboardShortcut => _currentKeyboardShortcutToSet != null; static SettingFieldDrawer() { _comboBoxCache = new Dictionary<SettingEntryBase, ComboBox>(); _colorCache = new Dictionary<SettingEntryBase, ColorCacheEntry>(); SettingDrawHandlers = new Dictionary<Type, Action<SettingEntryBase>> { { 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<SettingEntryBase, ColorCacheEntry> 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) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown if (_categoryHeaderSkin == null) { _categoryHeaderSkin = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)1, wordWrap = true, stretchWidth = true, fontSize = 14 }; } GUILayout.Label(text, _categoryHeaderSkin, (GUILayoutOption[])(object)new GUILayoutOption[0]); } public static bool DrawPluginHeader(GUIContent content, bool isCollapsed) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown if (_pluginHeaderSkin == null) { _pluginHeaderSkin = new GUIStyle(GUI.skin.label) { alignment = (TextAnchor)1, wordWrap = true, stretchWidth = true, 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 i = 0; while (i < array.Length) { GUILayout.BeginHorizontal((GUILayoutOption[])(object)new GUILayoutOption[0]); int num2 = 0; for (; i < array.Length; i++) { var anon = array[i]; if (anon.val != 0L) { int num3 = (int)GUI.skin.toggle.CalcSize(new GUIContent(anon.name)).x; num2 += num3; if (num2 > 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<object>().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<DescriptionAttribute>().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 = obj.ToString().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" : obj.ToString().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_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0126: 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<KeyCode>)(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...", "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<KeyCode>)(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<KeyCode, bool>)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_006c: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: 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_0138: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_016d: 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_0031: Expected O, but got Unknown //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) Color val = (Color)obj.Get(); if (!_colorCache.TryGetValue(obj, out var value)) { value = new ColorCacheEntry { Tex = new Texture2D(40, 10, (TextureFormat)5, false), Last = val }; value.Tex.FillTexture(val); _colorCache[obj] = value; } 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.Space(4f); if (val != value.Last) { obj.Set(val); value.Tex.FillTexture(val); value.Last = val; } GUILayout.Label((Texture)(object)value.Tex, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); } } public sealed class ValueChangedEventArgs<TValue> : EventArgs { public TValue NewValue { get; } public ValueChangedEventArgs(TValue newValue) { NewValue = newValue; } } } 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<int> 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_0041: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown //IL_0061: Expected O, but got Unknown //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_006e: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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); GUI.Box(val4, GUIContent.none, new GUIStyle { normal = new GUIStyleState { background = ConfigurationManager.WindowBackground } }); _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 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 BaseUnityPlugin[] FindPlugins() { return Chainloader.PluginInfos.Values.Select((PluginInfo x) => x.Instance).Union(Object.FindObjectsOfType(typeof(BaseUnityPlugin)).Cast<BaseUnityPlugin>()).ToArray(); } 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_000b: 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, color); } } tex.Apply(false); } public static void OpenLog() { List<string> list = new List<string>(); 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 path2 = list.Where(File.Exists).OrderByDescending(File.GetLastWriteTimeUtc).FirstOrDefault(); if (!TryOpen(path2)) { list.Clear(); list.AddRange(Directory.GetFiles(text, "LogOutput.log*", SearchOption.AllDirectories)); list.AddRange(Directory.GetFiles(text, "output_log.txt", SearchOption.AllDirectories)); path2 = list.Where(File.Exists).OrderByDescending(File.GetLastWriteTimeUtc).FirstOrDefault(); if (!TryOpen(path2)) { throw new FileNotFoundException("No log files were found"); } } static bool TryOpen(string path) { if (path == null) { return false; } try { Process.Start(path); return true; } catch { return false; } } } public static string GetWebsite(BaseUnityPlugin bepInPlugin) { if ((Object)(object)bepInPlugin == (Object)null) { return null; } try { string location = ((object)bepInPlugin).GetType().Assembly.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; object obj; if (bepInPlugin == null) { obj = null; } else { PluginInfo info = bepInPlugin.Info; 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(url); } catch (Exception ex) { ConfigurationManager.Logger.Log((LogLevel)12, (object)("Failed to open URL " + url + "\nCause: " + ex.Message)); } } } }
BepInEx/plugins/LethalCP_Vedici/LethalCP_Vedici.dll
Decompiled 2 years agousing System; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("LethalCP_Vedici")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("LethalCP_Vedici")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("37d493a1-b92e-4d7c-b7fb-eb60ce6bda23")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] namespace LethalCP_Vedici { [BepInPlugin("com.kivlan.LethalCP_Vedici", "LethalCP_Vedici", "1.0.7")] public class LethalCP_VediciPlugin : BaseUnityPlugin { private const string MyGUID = "com.kivlan.LethalCP_Vedici"; private const string PluginName = "LethalCP_Vedici"; private const string VersionString = "1.0.7"; private static string cfgNightVisionKey = "Night Vision Configuration"; private static string HideCommandMessagesKey = "Toggle Hide Command Messages"; private static string CustomTimeScaleKey = "Toggle Custom Time Scale"; private static string UseRandomTimeScaleKey = "Toggle Random Time Scale"; private static string MaximumTimeScaleKey = "Maximum Time Scale (Will use this value when random time scale is disabled)"; private static string MinimumTimeScaleKey = "Minimum Time Scale"; private static string NightVisionIntensityKey = "Brightness level of night vision"; private static string NightVisionRangeKey = "Range of night vision"; private static string SpeedMultiplierKey = "Sprint Speed Multiplier"; private static string MaxStaminaMultiplierKey = "Max Stamina Multiplier"; private static string StaminaRegenMultiplierKey = "Stamina Regen Multiplier"; private static string WeightStaminaMultiplierKey = "Weight Stamina Multiplier"; private static string CustomScrapValueMultiplierKey = "Scrap Value Multiplier"; private static string CustomScrapAmountMultiplierKey = "Scrap Amount Multiplier"; private static string CustomMapSizeMultiplierKey = "Map Size Multiplier"; private static string UseCustomMapSettingsKey = "Toggle Custom Map Settings"; private static string EnableCustomDeadlineKey = "Toggle Custom Deadline"; private static ConfigEntry<bool> cfgNightVision; private static ConfigEntry<bool> HideCommandMessages; private static ConfigEntry<bool> CustomTimeScale; private static ConfigEntry<bool> UseRandomTimeScale; private static ConfigEntry<float> MaximumTimeScale; private static ConfigEntry<float> MinimumTimeScale; private static ConfigEntry<float> NightVisionIntensity; private static ConfigEntry<float> NightVisionRange; private static ConfigEntry<float> SpeedMultiplier; private static ConfigEntry<float> MaxStaminaMultiplier; private static ConfigEntry<float> StaminaRegenMultiplier; private static ConfigEntry<float> WeightStaminaMultiplier; private static ConfigEntry<float> CustomScrapValueMultiplier; private static ConfigEntry<float> CustomScrapAmountMultiplier; private static ConfigEntry<float> CustomMapSizeMultiplier; private static ConfigEntry<bool> UseCustomMapSettings; private static ConfigEntry<bool> EnableCustomDeadline; private static readonly Harmony Harmony = new Harmony("com.kivlan.LethalCP_Vedici"); public static ManualLogSource Log = new ManualLogSource("LethalCP_Vedici"); private static PlayerControllerB playerRef; private static bool nightVision; private static float defaultNightVisionIntensity; private static float defaultNightVisionRange; private static Color nightVisionColor; private static bool isHost = true; private static float currentStaminaMeter; private static float currentWeight; private static SelectableLevel currentLevel; private static bool resetCustomMultiplier = false; private void Awake() { cfgNightVision = ((BaseUnityPlugin)this).Config.Bind<bool>("Player Settings", cfgNightVisionKey, false, (ConfigDescription)null); HideCommandMessages = ((BaseUnityPlugin)this).Config.Bind<bool>("UI Settings", HideCommandMessagesKey, true, (ConfigDescription)null); CustomTimeScale = ((BaseUnityPlugin)this).Config.Bind<bool>("Time Settings", CustomTimeScaleKey, false, (ConfigDescription)null); UseRandomTimeScale = ((BaseUnityPlugin)this).Config.Bind<bool>("Time Settings", UseRandomTimeScaleKey, false, (ConfigDescription)null); MaximumTimeScale = ((BaseUnityPlugin)this).Config.Bind<float>("Time Settings", MaximumTimeScaleKey, 2f, (ConfigDescription)null); MinimumTimeScale = ((BaseUnityPlugin)this).Config.Bind<float>("Time Settings", MinimumTimeScaleKey, 0.5f, (ConfigDescription)null); NightVisionIntensity = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", NightVisionIntensityKey, 1000f, (ConfigDescription)null); NightVisionRange = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", NightVisionRangeKey, 10000f, (ConfigDescription)null); SpeedMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", SpeedMultiplierKey, 1f, (ConfigDescription)null); MaxStaminaMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", MaxStaminaMultiplierKey, 1f, (ConfigDescription)null); StaminaRegenMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", StaminaRegenMultiplierKey, 1.5f, (ConfigDescription)null); WeightStaminaMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Player Settings", WeightStaminaMultiplierKey, 0.75f, (ConfigDescription)null); UseCustomMapSettings = ((BaseUnityPlugin)this).Config.Bind<bool>("Map Settings", UseCustomMapSettingsKey, false, (ConfigDescription)null); CustomScrapAmountMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map Settings", CustomScrapAmountMultiplierKey, 1f, (ConfigDescription)null); CustomScrapValueMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map Settings", CustomScrapValueMultiplierKey, 1f, (ConfigDescription)null); CustomMapSizeMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Map Settings", CustomMapSizeMultiplierKey, 1f, "Be careful when modifying this value since it will make the game laggy"); EnableCustomDeadline = ((BaseUnityPlugin)this).Config.Bind<bool>("Game Settings", EnableCustomDeadlineKey, false, (ConfigDescription)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: LethalCP_Vedici, VersionString: 1.0.7 is loading..."); Harmony.PatchAll(typeof(LethalCP_VediciPlugin)); Harmony.PatchAll(typeof(PlayerControllerB)); Harmony.PatchAll(typeof(HUDManager)); ((BaseUnityPlugin)this).Logger.LogInfo((object)"PluginName: LethalCP_Vedici, VersionString: 1.0.7 is loaded."); cfgNightVision.SettingChanged += nightVisionCFGChanged; Log = ((BaseUnityPlugin)this).Logger; } private void Update() { } private void ConfigSettingChanged(object sender, EventArgs e) { SettingChangedEventArgs val = (SettingChangedEventArgs)(object)((e is SettingChangedEventArgs) ? e : null); if (val != null) { } } private void nightVisionCFGChanged(object sender, EventArgs e) { if (isHost) { nightVision = cfgNightVision.Value; if (nightVision) { Log.LogInfo((object)"Night Vision Turned On"); } else { Log.LogInfo((object)"Night Vision Turned Off"); } } } [HarmonyPatch(typeof(PlayerControllerB), "Start")] [HarmonyPrefix] private static void getNightVision(ref PlayerControllerB __instance) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) playerRef = __instance; nightVision = ((Behaviour)playerRef.nightVision).enabled; defaultNightVisionIntensity = playerRef.nightVision.intensity; nightVisionColor = playerRef.nightVision.color; defaultNightVisionRange = playerRef.nightVision.range; if (cfgNightVision.Value) { playerRef.nightVision.color = Color.green; playerRef.nightVision.intensity = 1000f; playerRef.nightVision.range = 10000f; } } [HarmonyPatch(typeof(PlayerControllerB), "SetNightVisionEnabled")] [HarmonyPostfix] private static void updateNightVision() { //IL_0062: 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) if (nightVision) { playerRef.nightVision.color = Color.green; playerRef.nightVision.intensity = NightVisionIntensity.Value; playerRef.nightVision.range = NightVisionRange.Value; } else { playerRef.nightVision.color = nightVisionColor; playerRef.nightVision.intensity = defaultNightVisionIntensity; playerRef.nightVision.range = defaultNightVisionRange; } ((Behaviour)playerRef.nightVision).enabled = true; } [HarmonyPatch(typeof(TimeOfDay), "MoveGlobalTime")] [HarmonyPostfix] private static void customizableTimeScale(TimeOfDay __instance) { if (isHost && CustomTimeScale.Value) { __instance.globalTimeSpeedMultiplier = MaximumTimeScale.Value; if (UseRandomTimeScale.Value) { __instance.globalTimeSpeedMultiplier = Random.Range(MinimumTimeScale.Value, MaximumTimeScale.Value); } } } [HarmonyPatch(typeof(StartOfRound), "openingDoorsSequence")] [HarmonyPostfix] private static void customOpeningScreen() { if (isHost) { string text = "Modded Game"; string text2 = "Made with <3 by Stoichev"; HUDManager.Instance.DisplayTip(text, text2, false, false, "LC_Tip1"); } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPrefix] private static void updatePlayerMovementPrefix(PlayerControllerB __instance) { if (__instance.isPlayerControlled) { currentStaminaMeter = __instance.sprintMeter; currentWeight = __instance.carryWeight; __instance.carryWeight = Mathf.Max(__instance.carryWeight * WeightStaminaMultiplier.Value, 1f); } } [HarmonyPatch(typeof(PlayerControllerB), "Update")] [HarmonyPostfix] private static void updatePlayerMovementPostfix(PlayerControllerB __instance) { if (__instance.isPlayerControlled) { float num = __instance.sprintMeter - currentStaminaMeter; if (num < 0f) { __instance.sprintMeter = Mathf.Max(__instance.sprintMeter + num / MaxStaminaMultiplier.Value, 0f); } else if (num > 0f) { __instance.sprintMeter = Mathf.Min(__instance.sprintMeter + num * StaminaRegenMultiplier.Value, 1f); } __instance.carryWeight = currentWeight; } } [HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")] [HarmonyPrefix] private static void lateUpdatePlayerMovementPrefix(PlayerControllerB __instance) { if (__instance.isPlayerControlled) { currentStaminaMeter = __instance.sprintMeter; currentWeight = __instance.carryWeight; __instance.carryWeight = Mathf.Max(__instance.carryWeight * WeightStaminaMultiplier.Value, 1f); } } [HarmonyPatch(typeof(PlayerControllerB), "LateUpdate")] [HarmonyPostfix] private static void lateUpdatePlayerMovementPostfix(PlayerControllerB __instance) { if (__instance.isPlayerControlled) { float num = __instance.sprintMeter - currentStaminaMeter; if (num < 0f) { __instance.sprintMeter = Mathf.Max(__instance.sprintMeter + num / MaxStaminaMultiplier.Value, 0f); } else if (num > 0f) { __instance.sprintMeter = Mathf.Min(__instance.sprintMeter + num * StaminaRegenMultiplier.Value, 1f); } __instance.carryWeight = currentWeight; } } [HarmonyPatch(typeof(RoundManager), "LoadNewLevel")] [HarmonyPrefix] private static void LoadNewLevelPrefixPatch(RoundManager __instance, SelectableLevel newLevel) { currentLevel = newLevel; if (UseCustomMapSettings.Value) { if (resetCustomMultiplier) { Log.LogInfo((object)"Resetting Custom Multiplier Value"); __instance.scrapAmountMultiplier /= CustomScrapAmountMultiplier.Value; __instance.scrapValueMultiplier /= CustomScrapValueMultiplier.Value; __instance.mapSizeMultiplier /= CustomMapSizeMultiplier.Value; } __instance.scrapAmountMultiplier *= CustomScrapAmountMultiplier.Value; __instance.scrapValueMultiplier *= CustomScrapValueMultiplier.Value; __instance.mapSizeMultiplier *= CustomMapSizeMultiplier.Value; resetCustomMultiplier = true; } } [HarmonyPatch(typeof(TimeOfDay), "MoveGlobalTime")] [HarmonyPrefix] private static void InfiniteDeadline(ref float ___timeUntilDeadline) { if (isHost && EnableCustomDeadline.Value) { ___timeUntilDeadline = 999f; } } [HarmonyPatch(typeof(HUDManager), "SubmitChat_performed")] [HarmonyPrefix] private static void chatCommand(HUDManager __instance) { string text = __instance.chatTextField.text; string text2 = "/"; Log.LogInfo((object)text); if (!text.ToLower().StartsWith(text2.ToLower())) { return; } string text3 = "Default Title"; string text4 = "Default Body"; if (!isHost) { text3 = "Command"; text4 = "Unable to send command since you are not host."; HUDManager.Instance.DisplayTip(text3, text4, false, false, "LC_Tip1"); if (HideCommandMessages.Value) { __instance.chatTextField.text = ""; } return; } if (text.ToLower().Contains("night") || text.ToLower().Contains("vision")) { text4 = ((!toggleNightVision()) ? "Disabled Night Vision" : "Enabled Night Vision"); text3 = "Night Vision"; } if (text.ToLower().Contains("scan")) { int totalItems = 0; int totalValue = 0; findItemsOutsideShip(out totalItems, out totalValue); text3 = "Scan Result"; text4 = $"There are {totalItems} objects outside the ship, totalling at an approximate value of ${totalValue}."; } if (text.ToLower().Contains("player")) { int totalPlayerAlive = 0; int totalPlayerDead = 0; findTeamStatus(out totalPlayerAlive, out totalPlayerDead); text3 = "Scan Result"; text4 = $"There are {totalPlayerAlive} Player Alive and {totalPlayerDead} Player(s) Dead or Disconnected."; } if (text.ToLower().Contains("time")) { string text5 = HUDManager.Instance.SetClock(TimeOfDay.Instance.normalizedTimeOfDay, (float)TimeOfDay.Instance.numberOfHours, false); text3 = "Scan Result"; text4 = "Time at: " + text5; } if (text.ToLower().Contains("countenemy")) { int num = Object.FindObjectsOfType<EnemyAI>().Count(); text3 = "Scan Result"; text4 = $"There are approximately {num} enemy detected! (includes docile, turret & landmine)"; } HUDManager.Instance.DisplayTip(text3, text4, false, false, "LC_Tip1"); if (HideCommandMessages.Value) { __instance.chatTextField.text = ""; } } private static bool toggleNightVision() { if (isHost) { nightVision = !nightVision; cfgNightVision.Value = nightVision; } if (nightVision) { Log.LogInfo((object)"Night Vision Turned On"); } else { Log.LogInfo((object)"Night Vision Turned Off"); } return nightVision; } private static void findItemsOutsideShip(out int totalItems, out int totalValue) { Random random = new Random(StartOfRound.Instance.randomMapSeed + 91); totalValue = 0; totalItems = 0; int num = 0; GrabbableObject[] array = Object.FindObjectsOfType<GrabbableObject>(); for (int i = 0; i < array.Length; i++) { if (array[i].itemProperties.isScrap && !array[i].isInShipRoom && !array[i].isInElevator) { num += array[i].itemProperties.maxValue - array[i].itemProperties.minValue; totalValue += Mathf.Clamp(random.Next(array[i].itemProperties.minValue, array[i].itemProperties.maxValue), array[i].scrapValue - 6 * i, array[i].scrapValue + 9 * i); totalItems++; } } } private static void findTeamStatus(out int totalPlayerAlive, out int totalPlayerDead) { totalPlayerAlive = 0; totalPlayerDead = 0; PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>(); for (int i = 0; i < array.Length; i++) { if ((array[i].isPlayerDead || array[i].disconnectedMidGame) && array[i].isPlayerControlled) { totalPlayerDead++; } else if (array[i].isPlayerControlled) { totalPlayerAlive++; } } } } } namespace LethalCP_Vedici.Utils { internal static class ModUtils { } } namespace LethalCP_Vedici.MonoBehaviours { internal class LethalCP_VediciComponent : MonoBehaviour { public void Awake() { } public void Start() { } public void Update() { } public void LateUpdate() { } } }