Decompiled source of ConfigurationManager v1.0.20
ConfigurationManager.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using ConfigurationManager.Utilities; using HarmonyLib; using JetBrains.Annotations; using LitJson; using Microsoft.CodeAnalysis; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ConfigurationManager")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ConfigurationManager")] [assembly: AssemblyCopyright("Copyright © 2024")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("0bac4d10-1d45-4b13-861c-48bae48536e9")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] 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 (property != null) { base.AcceptableValues = ((IEnumerable)property.GetValue(values, null)).Cast<object>().ToArray(); return; } PropertyInfo property2 = type.GetProperty("MinValue", BindingFlags.Instance | BindingFlags.Public); PropertyInfo property3 = type.GetProperty("MaxValue", BindingFlags.Instance | BindingFlags.Public); if (property2 != null && property3 != null) { 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 bool ShouldBeHidden() { return ConfigurationManager.hiddenSettings.Value.Contains(base.PluginInfo.GUID + "=" + Entry.Definition.Section + "=" + Entry.Definition.Key); } } internal class LegacySettingEntry : SettingEntryBase { private Type _settingType; public override string DispName { get { return string.IsNullOrEmpty(base.DispName) ? Property.Name : base.DispName; } protected internal set { base.DispName = value; } } public object Instance { get; internal set; } public PropertyInfo Property { get; internal set; } public override Type SettingType => _settingType ?? (_settingType = Property.PropertyType); public object Wrapper { get; internal set; } private LegacySettingEntry() { } public override object Get() { return Property.GetValue(Instance, null); } protected override void SetValue(object newVal) { Property.SetValue(Instance, newVal, null); } public static LegacySettingEntry FromConfigWrapper(object instance, PropertyInfo settingProp, BepInPlugin pluginInfo, BaseUnityPlugin pluginInstance) { try { object value = settingProp.GetValue(instance, null); if (value == null) { ConfigurationManager.LogInfo($"Skipping ConfigWrapper entry because it's null : {instance} | {settingProp.Name} | {((pluginInfo != null) ? pluginInfo.Name : null)}"); return null; } PropertyInfo property = value.GetType().GetProperty("Value", BindingFlags.Instance | BindingFlags.Public); LegacySettingEntry legacySettingEntry = new LegacySettingEntry(); legacySettingEntry.SetFromAttributes(settingProp.GetCustomAttributes(inherit: false), pluginInstance); if (property == null) { ConfigurationManager.LogInfo("Failed to find property Value of ConfigWrapper"); return null; } legacySettingEntry.Browsable = property.CanRead && property.CanWrite && legacySettingEntry.Browsable != false; legacySettingEntry.Property = property; legacySettingEntry.Instance = value; legacySettingEntry.Wrapper = value; if (legacySettingEntry.DispName == "Value") { legacySettingEntry.DispName = value.GetType().GetProperty("Key", BindingFlags.Instance | BindingFlags.Public)?.GetValue(value, null) as string; } if (string.IsNullOrEmpty(legacySettingEntry.Category)) { string text = value.GetType().GetProperty("Section", BindingFlags.Instance | BindingFlags.Public)?.GetValue(value, null) as string; if (text != ((pluginInfo != null) ? pluginInfo.GUID : null)) { legacySettingEntry.Category = text; } } object strToObj = value.GetType().GetField("_strToObj", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(value); if (strToObj != null) { MethodInfo inv2 = strToObj.GetType().GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); if (inv2 != null) { legacySettingEntry.StrToObj = (string s) => inv2.Invoke(strToObj, new object[1] { s }); } } object objToStr = value.GetType().GetField("_objToStr", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(value); if (objToStr != null) { MethodInfo inv = objToStr.GetType().GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); if (inv != null) { legacySettingEntry.ObjToStr = (object o) => inv.Invoke(objToStr, new object[1] { o }) as string; } } else { legacySettingEntry.ObjToStr = (object o) => o.ToString(); } return legacySettingEntry; } catch (SystemException ex) { ConfigurationManager.LogInfo($"Failed to create ConfigWrapper entry : {instance} | {settingProp?.Name} | {((pluginInfo != null) ? pluginInfo.Name : null)} | Error: {ex.Message}"); return null; } } public static LegacySettingEntry FromNormalProperty(object instance, PropertyInfo settingProp, BepInPlugin pluginInfo, BaseUnityPlugin pluginInstance) { LegacySettingEntry legacySettingEntry = new LegacySettingEntry(); legacySettingEntry.SetFromAttributes(settingProp.GetCustomAttributes(inherit: false), pluginInstance); if (!legacySettingEntry.Browsable.HasValue) { legacySettingEntry.Browsable = settingProp.CanRead && settingProp.CanWrite; } legacySettingEntry.ReadOnly = settingProp.CanWrite; legacySettingEntry.Property = settingProp; legacySettingEntry.Instance = instance; return legacySettingEntry; } } internal class PropertySettingEntry : SettingEntryBase { private Type _settingType; public object Instance { get; internal set; } public PropertyInfo Property { get; internal set; } public override string DispName { get { return string.IsNullOrEmpty(base.DispName) ? Property.Name : base.DispName; } 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); private static readonly FieldInfo[] _myFields = typeof(SettingEntryBase).GetFields(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) { object obj2 = obj; object obj3 = obj2; if (obj3 == null) { continue; } if (!(obj3 is DisplayNameAttribute displayNameAttribute)) { if (!(obj3 is CategoryAttribute categoryAttribute)) { if (!(obj3 is DescriptionAttribute descriptionAttribute)) { if (!(obj3 is DefaultValueAttribute defaultValueAttribute)) { if (!(obj3 is ReadOnlyAttribute readOnlyAttribute)) { if (!(obj3 is BrowsableAttribute browsableAttribute)) { Action<SettingEntryBase> action = obj3 as Action<SettingEntryBase>; if (action == null) { if (obj3 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; } PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (var item in from my in _myProperties join other in properties on my.Name equals other.Name select new { my, other }) { try { object value = item.other.GetValue(obj); if (value != null) { item.my.SetValue(this, value); } } catch (Exception ex) { ConfigurationManager.LogInfo("Failed to copy value " + item.my.Name + " from provided tag object " + type.FullName + " - " + ex.Message); } } foreach (var item2 in from my in _myFields join other in properties on my.Name equals other.Name select new { my, other }) { try { object value2 = item2.other.GetValue(obj); if (value2 != null) { item2.my.SetValue(this, value2); } } catch (Exception ex2) { ConfigurationManager.LogInfo("Failed to copy value " + item2.my.Name + " from provided tag object " + type.FullName + " - " + ex2.Message); } } FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public); foreach (var item3 in from my in _myFields join other in fields on my.Name equals other.Name select new { my, other }) { try { object value3 = item3.other.GetValue(obj); if (value3 != null) { item3.my.SetValue(this, value3); } } catch (Exception ex3) { ConfigurationManager.LogInfo("Failed to copy value " + item3.my.Name + " from provided tag object " + type.FullName + " - " + ex3.Message); } } foreach (var item4 in from my in _myProperties join other in fields on my.Name equals other.Name select new { my, other }) { try { object value4 = item4.other.GetValue(obj); if (value4 != null) { item4.my.SetValue(this, value4); } } catch (Exception ex4) { ConfigurationManager.LogInfo("Failed to copy value " + item4.my.Name + " from provided tag object " + type.FullName + " - " + ex4.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; public static readonly HashSet<string> customFieldDrawerFailed; 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>(); customFieldDrawerFailed = new HashSet<string>(); 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) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) GUI.backgroundColor = ConfigurationManager._widgetBackgroundColor.Value; if (DrawCustomField(setting)) { return; } 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 bool DrawCustomField(SettingEntryBase setting) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (IsSettingFailedToCustomDraw(setting)) { return false; } Color contentColor = GUI.contentColor; bool result = true; try { GUI.contentColor = (setting.Get().ToString().Equals(setting.DefaultValue.ToString(), StringComparison.OrdinalIgnoreCase) ? ConfigurationManager._fontColorValueDefault.Value : ConfigurationManager._fontColorValueChanged.Value); 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 { result = false; } } catch (Exception e) { SetSettingFailedToCustomDraw(setting, e); result = false; } GUI.contentColor = contentColor; return result; } public static bool IsSettingFailedToCustomDraw(SettingEntryBase setting) { if (setting == null) { return false; } return customFieldDrawerFailed.Contains(GetSettingID(setting)); } public static void SetSettingFailedToCustomDraw(SettingEntryBase setting, Exception e = null) { string settingID = GetSettingID(setting); customFieldDrawerFailed.Add(settingID); if (e != null) { ConfigurationManager.LogWarning(settingID + "\n" + e); } } public static string GetSettingID(SettingEntryBase setting) { return setting.PluginInfo.GUID + "-" + setting.Category + "-" + setting.DispName; } public static void ClearCache() { ClearComboboxCache(); foreach (KeyValuePair<SettingEntryBase, ColorCacheEntry> item in _colorCache) { Object.Destroy((Object)(object)item.Value.Tex); } _colorCache.Clear(); } public static void ClearComboboxCache() { _comboBoxCache.Clear(); } public static void DrawCenteredLabel(string text, GUIStyle labelStyle, params GUILayoutOption[] options) { GUILayout.BeginHorizontal(options); GUILayout.FlexibleSpace(); GUILayout.Label(text, labelStyle, Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } public static void DrawCategoryHeader(string text) { GUILayout.Label(text, ConfigurationManagerStyles.GetCategoryStyle(), Array.Empty<GUILayoutOption>()); } public static bool DrawPluginHeader(GUIContent content) { return GUILayout.Button(content, ConfigurationManagerStyles.GetHeaderStyle(), (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) { 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 (setting.SettingType == typeof(KeyCode)) { DrawKeyCode(setting); } else { DrawComboboxField(setting, acceptableValues, ((Rect)(ref _instance.currentWindowRect)).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) { //IL_0006: 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_002d: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) GUI.backgroundColor = ConfigurationManager._widgetBackgroundColor.Value; bool flag = (bool)setting.Get(); Color backgroundColor = GUI.backgroundColor; if (flag) { GUI.backgroundColor = ConfigurationManager._enabledBackgroundColor.Value; } bool flag2 = GUILayout.Toggle(flag, flag ? ConfigurationManager._enabledText.Value : ConfigurationManager._disabledText.Value, ConfigurationManagerStyles.GetToggleStyle(setting), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (flag2 != flag) { setting.Set(flag2); } if (flag) { GUI.backgroundColor = backgroundColor; } } private static void DrawEnumField(SettingEntryBase setting) { if (setting.SettingType.GetCustomAttributes(typeof(FlagsAttribute), inherit: false).Any()) { DrawFlagsField(setting, Enum.GetValues(setting.SettingType), (int)((float)_instance.RightColumnWidth * 0.8f)); } else { DrawComboboxField(setting, Enum.GetValues(setting.SettingType), ((Rect)(ref _instance.currentWindowRect)).yMax); } } private static void DrawFlagsField(SettingEntryBase setting, IList enumValues, int maxWidth) { //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) long num = Convert.ToInt64(setting.Get()); long num2 = Convert.ToInt64(setting.DefaultValue); 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(Array.Empty<GUILayoutOption>()); int num3 = 0; for (; i < array.Length; i++) { var anon = array[i]; if (anon.val != 0) { int num4 = (int)GUI.skin.toggle.CalcSize(new GUIContent(anon.name)).x; num3 += num4; if (num3 > maxWidth) { break; } GUI.changed = false; bool flag = (num & anon.val) == anon.val; bool flag2 = (num2 & anon.val) == anon.val; bool flag3 = GUILayout.Toggle(flag, anon.name, ConfigurationManagerStyles.GetToggleStyle(flag == flag2), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); if (GUI.changed) { long value = (flag3 ? (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_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_00c3: 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) GUIContent val = ObjectToGuiContent(setting.Get()); Rect rect = GUILayoutUtility.GetRect(val, ConfigurationManagerStyles.GetButtonStyle(), (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(), ObjectToGuiContent(setting.DefaultValue), ConfigurationManagerStyles.GetButtonStyle(), ConfigurationManagerStyles.GetButtonStyle(isDefaulValue: false), ConfigurationManagerStyles.GetBoxStyle(), ConfigurationManagerStyles.GetComboBoxStyle(), 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_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Expected O, but got Unknown //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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(descriptionAttribute.Description); } return new GUIContent(x.ToString().ToProperCase()); } 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 = DrawCenteredHorizontalSlider(num, num2, num3); if ((double)Math.Abs(num4 - num) >= (double)Mathf.Abs(num3 - num2) / Math.Pow(10.0, ConfigurationManager._rangePrecision.Value + 2)) { object newVal = Convert.ChangeType(Utils.RoundWithPrecision(num4, ConfigurationManager._rangePrecision.Value), setting.SettingType, CultureInfo.InvariantCulture); setting.Set(newVal); } if (setting.ShowRangeAsPercent == true) { DrawCenteredLabel(Mathf.Round(100f * Mathf.Abs(num4 - num2) / Mathf.Abs(num3 - num2)) + "%", ConfigurationManagerStyles.GetLabelStyle(setting), GUILayout.Width(50f)); return; } string text = obj.ToString().AppendZeroIfFloat(setting.SettingType); string text2 = GUILayout.TextField(text, ConfigurationManagerStyles.GetTextStyle(setting), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.Width(50f) }); if (!(text2 != text)) { return; } try { float num5 = (float)Convert.ToDouble(text2, CultureInfo.InvariantCulture); float value = Mathf.Clamp(num5, num2, num3); setting.Set(Convert.ChangeType(Utils.RoundWithPrecision(value, ConfigurationManager._rangePrecision.Value), setting.SettingType, CultureInfo.InvariantCulture)); } catch (FormatException) { } } private static float DrawCenteredHorizontalSlider(float converted, float leftValue, float rightValue) { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.FlexibleSpace(); GUILayout.Space(4f); float result = GUILayout.HorizontalSlider(converted, leftValue, rightValue, ConfigurationManagerStyles.GetSliderStyle(), ConfigurationManagerStyles.GetThumbStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.EndHorizontal(); return result; } private void DrawUnknownField(SettingEntryBase setting, int rightColumnWidth) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) if (setting.ObjToStr != null && setting.StrToObj != null) { string text = setting.ObjToStr(setting.Get()).AppendZeroIfFloat(setting.SettingType); if (Utility.IsNullOrWhiteSpace(text) && setting.DefaultValue.ToString() != "") { GUI.backgroundColor = ConfigurationManager._fontColorValueChanged.Value; } string text2 = GUILayout.TextField(text, ConfigurationManagerStyles.GetTextStyle(setting), (GUILayoutOption[])(object)new GUILayoutOption[1] { 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 (Utility.IsNullOrWhiteSpace(text3) && setting.DefaultValue.ToString() != "") { GUI.backgroundColor = ConfigurationManager._fontColorValueChanged.Value; } if (CanCovert(text3, setting.SettingType)) { string text4 = GUILayout.TextField(text3, ConfigurationManagerStyles.GetTextStyle(setting), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.MaxWidth((float)rightColumnWidth) }); if (text4 != text3) { try { setting.Set(Convert.ChangeType(text4, setting.SettingType, CultureInfo.InvariantCulture)); } catch { } } } else { GUILayout.TextArea(text3, ConfigurationManagerStyles.GetTextStyle(setting), (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_0141: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) if (_currentKeyboardShortcutToSet == setting) { GUILayout.Label(ConfigurationManager._shortcutKeysText.Value, ConfigurationManagerStyles.GetLabelStyle(), (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(ConfigurationManager._cancelText.Value, ConfigurationManagerStyles.GetButtonStyle(), (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)); DrawComboboxField(setting, list, ((Rect)(ref _instance.currentWindowRect)).yMax); if (GUILayout.Button(new GUIContent(ConfigurationManager._shortcutKeyText.Value), ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { _currentKeyboardShortcutToSet = setting; } } } private static void DrawKeyboardShortcut(SettingEntryBase setting) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) object obj = setting.Get(); if (obj.GetType() == typeof(KeyCode)) { obj = (object)new KeyboardShortcut((KeyCode)obj, Array.Empty<KeyCode>()); } if (_currentKeyboardShortcutToSet == setting) { GUILayout.Label(ConfigurationManager._shortcutKeysText.Value, ConfigurationManagerStyles.GetButtonStyle(), (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(ConfigurationManager._cancelText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { _currentKeyboardShortcutToSet = null; } } else { if (GUILayout.Button(setting.Get().ToString(), ConfigurationManagerStyles.GetButtonStyle(setting), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) })) { _currentKeyboardShortcutToSet = setting; } if (GUILayout.Button(ConfigurationManager._clearText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { setting.Set(KeyboardShortcut.Empty); _currentKeyboardShortcutToSet = null; } } } private static void DrawVector2(SettingEntryBase obj) { //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_000d: 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_000f: 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_003b: 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_0089: 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_0095: Unknown result type (might be due to invalid IL or missing references) Vector2 val = (Vector2)obj.Get(); Vector2 val2 = val; bool integerValuesOnly = val.x % 1f == 0f && val.y % 1f == 0f; val.x = DrawSingleVectorSlider(val.x, "X", ((Vector2)obj.DefaultValue).x, integerValuesOnly); val.y = DrawSingleVectorSlider(val.y, "Y", ((Vector2)obj.DefaultValue).y, integerValuesOnly); if (val != val2) { obj.Set(val); } } private static void DrawVector3(SettingEntryBase obj) { //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_000d: 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_000f: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) Vector3 val = (Vector3)obj.Get(); Vector3 val2 = val; bool integerValuesOnly = val.x % 1f == 0f && val.y % 1f == 0f && val.z % 1f == 0f; val.x = DrawSingleVectorSlider(val.x, "X", ((Vector3)obj.DefaultValue).x, integerValuesOnly); val.y = DrawSingleVectorSlider(val.y, "Y", ((Vector3)obj.DefaultValue).y, integerValuesOnly); val.z = DrawSingleVectorSlider(val.z, "Z", ((Vector3)obj.DefaultValue).z, integerValuesOnly); if (val != val2) { obj.Set(val); } } private static void DrawVector4(SettingEntryBase obj) { //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_000d: 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_000f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0100: 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_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) Vector4 val = (Vector4)obj.Get(); Vector4 val2 = val; bool integerValuesOnly = val.x % 1f == 0f && val.y % 1f == 0f && val.z % 1f == 0f && val.w % 1f == 0f; val.x = DrawSingleVectorSlider(val.x, "X", ((Vector4)obj.DefaultValue).x, integerValuesOnly); val.y = DrawSingleVectorSlider(val.y, "Y", ((Vector4)obj.DefaultValue).y, integerValuesOnly); val.z = DrawSingleVectorSlider(val.z, "Z", ((Vector4)obj.DefaultValue).z, integerValuesOnly); val.w = DrawSingleVectorSlider(val.w, "W", ((Vector4)obj.DefaultValue).w, integerValuesOnly); if (val != val2) { obj.Set(val); } } private static void DrawQuaternion(SettingEntryBase obj) { //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_000d: 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_000f: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0100: 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_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) Quaternion val = (Quaternion)obj.Get(); Quaternion val2 = val; bool integerValuesOnly = val.x % 1f == 0f && val.y % 1f == 0f && val.z % 1f == 0f && val.w % 1f == 0f; val.x = DrawSingleVectorSlider(val.x, "X", ((Quaternion)obj.DefaultValue).x, integerValuesOnly); val.y = DrawSingleVectorSlider(val.y, "Y", ((Quaternion)obj.DefaultValue).y, integerValuesOnly); val.z = DrawSingleVectorSlider(val.z, "Z", ((Quaternion)obj.DefaultValue).z, integerValuesOnly); val.w = DrawSingleVectorSlider(val.w, "W", ((Quaternion)obj.DefaultValue).w, integerValuesOnly); if (val != val2) { obj.Set(val); } } private static float DrawSingleVectorSlider(float setting, string label, float defaultValue, bool integerValuesOnly) { GUILayout.Label(label, ConfigurationManagerStyles.GetLabelStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); int num = ((!(ConfigurationManager._vectorDynamicPrecision.Value && integerValuesOnly)) ? Math.Abs(ConfigurationManager._vectorPrecision.Value) : 0); string text = GUILayout.TextField(setting.ToString("F" + num, CultureInfo.InvariantCulture), ConfigurationManagerStyles.GetTextStyle(setting, defaultValue), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }).Replace(',', '.'); if (num == 0 && text.EndsWith('.')) { text = text + string.Empty.PadRight(Math.Abs(ConfigurationManager._vectorPrecision.Value - 1), '0') + 1; } float.TryParse(text, NumberStyles.Any, CultureInfo.InvariantCulture, out var result); return result; } private static void DrawColor(SettingEntryBase obj) { //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_0030: 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_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Invalid comparison between Unknown and I4 //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_0191: 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_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) Color value = (Color)obj.Get(); GUILayout.BeginVertical(ConfigurationManagerStyles.GetBoxStyle(), Array.Empty<GUILayoutOption>()); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); bool isDefaultValue = DrawHexField(ref value, (Color)obj.DefaultValue); GUILayout.Space(3f); GUIHelper.BeginColor(value); GUILayout.Label(string.Empty, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (!_colorCache.TryGetValue(obj, out var value2)) { value2 = new ColorCacheEntry { Tex = new Texture2D(40, 10, (TextureFormat)5, false), Last = value }; value2.Tex.FillTexture(value); _colorCache[obj] = value2; } if ((int)Event.current.type == 7) { GUI.DrawTexture(GUILayoutUtility.GetLastRect(), (Texture)(object)value2.Tex); } GUIHelper.EndColor(); GUILayout.Space(3f); GUILayout.EndHorizontal(); GUILayout.Space(2f); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); DrawColorField("R", ref value, ref value.r, isDefaultValue); GUILayout.Space(3f); DrawColorField("G", ref value, ref value.g, isDefaultValue); GUILayout.Space(3f); DrawColorField("B", ref value, ref value.b, isDefaultValue); GUILayout.Space(3f); DrawColorField("A", ref value, ref value.a, isDefaultValue); if (value != value2.Last) { obj.Set(value); value2.Tex.FillTexture(value); value2.Last = value; } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } private static bool DrawHexField(ref Color value, Color defaultValue) { //IL_0007: 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) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) string text = "#" + ColorUtility.ToHtmlStringRGBA(value); string text2 = GUILayout.TextField(text, ConfigurationManagerStyles.GetTextStyle(value, defaultValue), (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.MaxWidth(Mathf.Clamp(95f * (float)ConfigurationManagerStyles.fontSize / 14f, 80f, 180f)), GUILayout.ExpandWidth(false) }); Color val = default(Color); if (text2 != text && ColorUtility.TryParseHtmlString(text2, ref val)) { value = val; } return ConfigurationManagerStyles.IsEqualColorConfig(value, defaultValue); } private static void DrawColorField(string fieldLabel, ref Color settingColor, ref float settingValue, bool isDefaultValue) { GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(fieldLabel, ConfigurationManagerStyles.GetLabelStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); string text = settingValue.ToString("0.000"); SetColorValue(ref settingColor, float.Parse(GUILayout.TextField(text, ConfigurationManagerStyles.GetTextStyle(isDefaultValue), (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.MaxWidth(45f), GUILayout.ExpandWidth(true) }))); GUILayout.EndHorizontal(); GUILayout.Space(1f); SetColorValue(ref settingColor, GUILayout.HorizontalSlider(settingValue, 0f, 1f, (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) })); GUILayout.EndVertical(); void SetColorValue(ref Color color, float value) { switch (fieldLabel) { case "R": color.r = RoundTo000(); break; case "G": color.g = RoundTo000(); break; case "B": color.b = RoundTo000(); break; case "A": color.a = RoundTo000(); break; } float RoundTo000() { return Utils.RoundWithPrecision(value, 3); } } } } internal static class SettingSearcher { private static readonly ICollection<string> _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<BaseUnityPlugin>()).ToArray(); } public static void CollectSettings(out IEnumerable<SettingEntryBase> results, out List<string> modsWithoutSettings, bool showDebug) { modsWithoutSettings = new List<string>(); try { results = GetBepInExCoreConfig(); } catch (Exception data) { results = Enumerable.Empty<SettingEntryBase>(); ConfigurationManager.LogError(data); } BaseUnityPlugin[] array = FindPlugins(); foreach (BaseUnityPlugin val in array) { 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<BrowsableAttribute>().Any((BrowsableAttribute x) => !x.Browsable)) { modsWithoutSettings.Add(item); 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(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); } } } private static IEnumerable<SettingEntryBase> GetBepInExCoreConfig() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown PropertyInfo property = typeof(ConfigFile).GetProperty("CoreConfig", BindingFlags.Static | BindingFlags.NonPublic); if (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)); } } public class ConfigurationManagerStyles { private static GUIStyle windowStyle; private static GUIStyle labelStyle; private static GUIStyle labelStyleValueDefault; private static GUIStyle labelStyleValueChanged; private static GUIStyle textStyleValueDefault; private static GUIStyle textStyleValueChanged; private static GUIStyle toggleStyle; private static GUIStyle toggleStyleValueDefault; private static GUIStyle toggleStyleValueChanged; private static GUIStyle buttonStyle; private static GUIStyle buttonStyleValueDefault; private static GUIStyle buttonStyleValueChanged; private static GUIStyle comboBoxStyle; private static GUIStyle boxStyle; private static GUIStyle sliderStyle; private static GUIStyle thumbStyle; private static GUIStyle categoryHeaderStyle; private static GUIStyle pluginHeaderStyle; private static GUIStyle backgroundStyle; private static GUIStyle tooltipStyle; public static int fontSize = 14; public static void CreateStyles() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_0071: 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_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown //IL_00c9: 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) //IL_00f8: Expected O, but got Unknown //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Expected O, but got Unknown //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Expected O, but got Unknown //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0234: 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_0263: Expected O, but got Unknown //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_02a7: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Expected O, but got Unknown //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_033a: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_035c: Expected O, but got Unknown //IL_0361: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Expected O, but got Unknown //IL_0375: Unknown result type (might be due to invalid IL or missing references) //IL_037f: Expected O, but got Unknown //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_03a8: Unknown result type (might be due to invalid IL or missing references) //IL_03c8: Unknown result type (might be due to invalid IL or missing references) //IL_03d2: Expected O, but got Unknown //IL_03e1: Unknown result type (might be due to invalid IL or missing references) //IL_03fb: Unknown result type (might be due to invalid IL or missing references) //IL_040b: Unknown result type (might be due to invalid IL or missing references) //IL_0415: Expected O, but got Unknown //IL_043f: Unknown result type (might be due to invalid IL or missing references) //IL_0459: Unknown result type (might be due to invalid IL or missing references) //IL_046e: Unknown result type (might be due to invalid IL or missing references) //IL_0478: Expected O, but got Unknown //IL_0487: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04c6: Unknown result type (might be due to invalid IL or missing references) //IL_04d0: Expected O, but got Unknown //IL_04f4: Unknown result type (might be due to invalid IL or missing references) //IL_052d: Unknown result type (might be due to invalid IL or missing references) //IL_05b7: Unknown result type (might be due to invalid IL or missing references) //IL_05c1: Expected O, but got Unknown //IL_05d0: Unknown result type (might be due to invalid IL or missing references) //IL_060a: Unknown result type (might be due to invalid IL or missing references) //IL_0614: Expected O, but got Unknown //IL_0623: Unknown result type (might be due to invalid IL or missing references) //IL_0675: Unknown result type (might be due to invalid IL or missing references) //IL_067f: Expected O, but got Unknown //IL_0689: Unknown result type (might be due to invalid IL or missing references) //IL_0693: Expected O, but got Unknown ConfigurationManager._textSize.Value = Mathf.Clamp(ConfigurationManager._textSize.Value, 10, 30); if (fontSize != ConfigurationManager._textSize.Value) { fontSize = ConfigurationManager._textSize.Value; SettingFieldDrawer.ClearCache(); } windowStyle = new GUIStyle(GUI.skin.window); windowStyle.normal.textColor = ConfigurationManager._fontColor.Value; windowStyle.fontSize = fontSize; windowStyle.onNormal.textColor = ConfigurationManager._fontColor.Value; labelStyle = new GUIStyle(GUI.skin.label); labelStyle.normal.textColor = ConfigurationManager._fontColor.Value; labelStyle.fontSize = fontSize; labelStyleValueDefault = new GUIStyle(GUI.skin.label); labelStyleValueDefault.normal.textColor = ConfigurationManager._fontColorValueDefault.Value; labelStyleValueDefault.fontSize = fontSize; labelStyleValueChanged = new GUIStyle(GUI.skin.label); labelStyleValueChanged.normal.textColor = ConfigurationManager._fontColorValueChanged.Value; labelStyleValueChanged.fontSize = fontSize; textStyleValueDefault = new GUIStyle(GUI.skin.textArea); textStyleValueDefault.normal.textColor = ConfigurationManager._fontColorValueDefault.Value; textStyleValueDefault.fontSize = fontSize; textStyleValueChanged = new GUIStyle(GUI.skin.textArea); GUIStyle obj = textStyleValueChanged; obj.name += "changed"; textStyleValueChanged.normal.textColor = ConfigurationManager._fontColorValueChanged.Value; textStyleValueChanged.fontSize = fontSize; buttonStyle = new GUIStyle(GUI.skin.button); buttonStyle.normal.textColor = ConfigurationManager._fontColor.Value; buttonStyle.onNormal.textColor = ConfigurationManager._fontColor.Value; buttonStyle.fontSize = fontSize; buttonStyleValueDefault = new GUIStyle(GUI.skin.button); GUIStyle obj2 = buttonStyleValueDefault; obj2.name += "default"; buttonStyleValueDefault.normal.textColor = ConfigurationManager._fontColorValueDefault.Value; buttonStyleValueDefault.onNormal.textColor = ConfigurationManager._fontColorValueDefault.Value; buttonStyleValueDefault.fontSize = fontSize; buttonStyleValueChanged = new GUIStyle(GUI.skin.button); GUIStyle obj3 = buttonStyleValueChanged; obj3.name += "changed"; buttonStyleValueChanged.normal.textColor = ConfigurationManager._fontColorValueChanged.Value; buttonStyleValueChanged.onNormal.textColor = ConfigurationManager._fontColorValueChanged.Value; buttonStyleValueChanged.fontSize = fontSize; categoryHeaderStyle = new GUIStyle(labelStyle) { alignment = (TextAnchor)1, wordWrap = true, stretchWidth = true }; pluginHeaderStyle = new GUIStyle(categoryHeaderStyle); toggleStyle = new GUIStyle(GUI.skin.toggle); toggleStyle.normal.textColor = ConfigurationManager._fontColor.Value; toggleStyle.onNormal.textColor = ConfigurationManager._fontColor.Value; toggleStyle.fontSize = fontSize; toggleStyleValueDefault = new GUIStyle(toggleStyle); toggleStyleValueDefault.normal.textColor = ConfigurationManager._fontColorValueDefault.Value; toggleStyleValueDefault.onNormal.textColor = ConfigurationManager._fontColorValueDefault.Value; toggleStyleValueChanged = new GUIStyle(toggleStyle); GUIStyle obj4 = toggleStyleValueChanged; obj4.name += "changed"; toggleStyleValueChanged.normal.textColor = ConfigurationManager._fontColorValueChanged.Value; toggleStyleValueChanged.onNormal.textColor = ConfigurationManager._fontColorValueChanged.Value; boxStyle = new GUIStyle(GUI.skin.box); boxStyle.normal.textColor = ConfigurationManager._fontColor.Value; boxStyle.onNormal.textColor = ConfigurationManager._fontColor.Value; boxStyle.fontSize = fontSize; comboBoxStyle = new GUIStyle(GUI.skin.button); comboBoxStyle.normal = boxStyle.normal; comboBoxStyle.normal.textColor = ConfigurationManager._fontColorValueDefault.Value; comboBoxStyle.hover.background = comboBoxStyle.normal.background; comboBoxStyle.hover.textColor = ConfigurationManager._fontColorValueChanged.Value; comboBoxStyle.fontSize = fontSize; comboBoxStyle.border = boxStyle.border; comboBoxStyle.stretchHeight = true; comboBoxStyle.padding.top = 1; comboBoxStyle.padding.bottom = 1; comboBoxStyle.margin.top = 0; comboBoxStyle.margin.bottom = 0; backgroundStyle = new GUIStyle(GUI.skin.box); backgroundStyle.normal.textColor = ConfigurationManager._fontColor.Value; backgroundStyle.fontSize = fontSize; backgroundStyle.normal.background = ConfigurationManager.EntryBackground; tooltipStyle = new GUIStyle(GUI.skin.box); tooltipStyle.normal.textColor = ConfigurationManager._fontColor.Value; tooltipStyle.fontSize = fontSize; tooltipStyle.wordWrap = true; tooltipStyle.alignment = (TextAnchor)4; tooltipStyle.normal.background = ConfigurationManager.TooltipBackground; sliderStyle = new GUIStyle(GUI.skin.horizontalSlider); thumbStyle = new GUIStyle(GUI.skin.horizontalSliderThumb); } public static GUIStyle GetWindowStyle() { return windowStyle; } public static GUIStyle GetCategoryStyle() { return categoryHeaderStyle; } public static GUIStyle GetHeaderStyle() { return pluginHeaderStyle; } public static GUIStyle GetSliderStyle() { return sliderStyle; } public static GUIStyle GetThumbStyle() { return thumbStyle; } public static GUIStyle GetBoxStyle() { return boxStyle; } public static GUIStyle GetTooltipStyle() { return tooltipStyle; } public static GUIStyle GetBackgroundStyle() { return backgroundStyle; } public static GUIStyle GetComboBoxStyle() { return comboBoxStyle; } public static GUIStyle GetToggleStyle() { return toggleStyle; } public static GUIStyle GetToggleStyle(bool isDefaulValue = true) { return isDefaulValue ? toggleStyleValueDefault : toggleStyleValueChanged; } public static GUIStyle GetToggleStyle(SettingEntryBase setting) { return GetToggleStyle(IsDefaultValue(setting)); } public static GUIStyle GetLabelStyle() { return labelStyle; } public static GUIStyle GetLabelStyle(bool isDefaulValue = true) { return isDefaulValue ? labelStyleValueDefault : labelStyleValueChanged; } public static GUIStyle GetLabelStyle(SettingEntryBase setting) { return GetLabelStyle(IsDefaultValue(setting)); } public static GUIStyle GetButtonStyle() { return buttonStyle; } public static GUIStyle GetButtonStyle(bool isDefaulValue = true) { return isDefaulValue ? buttonStyleValueDefault : buttonStyleValueChanged; } public static GUIStyle GetButtonStyle(SettingEntryBase setting) { return GetButtonStyle(IsDefaultValue(setting)); } public static GUIStyle GetTextStyle(bool isDefaulValue = true) { return isDefaulValue ? textStyleValueDefault : textStyleValueChanged; } public static GUIStyle GetTextStyle(SettingEntryBase setting) { return GetTextStyle(IsDefaultValue(setting)); } public static GUIStyle GetTextStyle(float setting, float defaultValue) { return GetTextStyle(setting == defaultValue); } public static GUIStyle GetTextStyle(Color setting, Color defaultValue) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) return GetTextStyle(IsEqualColorConfig(setting, defaultValue)); } public static bool IsEqualColorConfig(Color setting, Color defaultValue) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) return ColorUtility.ToHtmlStringRGBA(setting) == ColorUtility.ToHtmlStringRGBA(defaultValue); } private static bool IsDefaultValue(SettingEntryBase setting) { return setting.Get().ToString() == setting.DefaultValue.ToString(); } } [BepInPlugin("_shudnal.ConfigurationManager", "Valheim Configuration Manager", "1.0.20")] [BepInIncompatibility("com.bepis.bepinex.configurationmanager")] public class ConfigurationManager : BaseUnityPlugin { public enum ReadOnlyStyle { Ignored, Colored, Disabled, Hidden } private sealed class PluginSettingsData { public sealed class PluginSettingsGroupData { public string Name; public List<SettingEntryBase> Settings; } public BepInPlugin Info; public List<PluginSettingsGroupData> Categories; private bool _collapsed; public bool Collapsed { get { return _collapsed; } set { _collapsed = value; Height = 0; } } public int Height { get; set; } } public enum PreventInput { Off, Player, All } [HarmonyPatch(typeof(PlayerController), "TakeInput")] [HarmonyPriority(0)] public static class PlayerController_TakeInput_PreventInput { public static void Postfix(ref bool __result) { if (PreventPlayerInput()) { __result = __result && !instance.DisplayingWindow; } } } [HarmonyPatch(typeof(TextInput), "IsVisible")] [HarmonyPriority(0)] public static class TextInput_IsVisible_PreventInput { public static void Postfix(ref bool __result) { if (PreventPlayerInput()) { __result = __result || instance.DisplayingWindow; } } } [HarmonyPatch] public static class Inventory_PreventAllInput { private static IEnumerable<MethodBase> TargetMethods() { yield return AccessTools.Method(typeof(InventoryGrid), "OnLeftClick", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(InventoryGrid), "OnRightClick", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(InventoryGui), "OnSelectedItem", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(InventoryGui), "OnRightClickItem", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(Toggle), "OnSubmit", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(Toggle), "OnPointerClick", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(Player), "UseHotbarItem", (Type[])null, (Type[])null); } [HarmonyPriority(800)] private static bool Prefix() { return !PreventPlayerInput() || !instance.DisplayingWindow; } } [HarmonyPatch] public static class Button_PreventAllInput { private static IEnumerable<MethodBase> TargetMethods() { yield return AccessTools.Method(typeof(Button), "OnPointerClick", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(Button), "OnSubmit", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(Button), "Press", (Type[])null, (Type[])null); } [HarmonyPriority(800)] private static bool Prefix(Button __instance) { return !PreventPlayerInput() || !instance.DisplayingWindow || ((Object)__instance).name == "Configuration Manager"; } } [HarmonyPatch] public static class ZInput_PreventAllInput { private static IEnumerable<MethodBase> TargetMethods() { yield return AccessTools.Method(typeof(ZInput), "ShouldAcceptInputFromSource", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetKey", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetKeyUp", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetKeyDown", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetButton", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetButtonDown", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetButtonUp", (Type[])null, (Type[])null); } [HarmonyPriority(800)] private static bool Prefix(ref bool __result) { return !PreventAllInput() || !instance.DisplayingWindow || (__result = false); } } [HarmonyPatch] public static class ZInput_PreventPlayerInput { private static IEnumerable<MethodBase> TargetMethods() { yield return AccessTools.Method(typeof(ZInput), "GetMouseButton", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetMouseButtonDown", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetMouseButtonUp", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetRadialTap", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetRadialMultiTap", (Type[])null, (Type[])null); } [HarmonyPriority(800)] private static bool Prefix(ref bool __result) { return !PreventPlayerInput() || !instance.DisplayingWindow || (__result = false); } } [HarmonyPatch] public static class ZInput_Float_PreventMouseInput { private static IEnumerable<MethodBase> TargetMethods() { yield return AccessTools.Method(typeof(ZInput), "GetJoyLeftStickX", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetJoyLeftStickY", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetJoyRTrigger", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetJoyLTrigger", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetJoyRightStickX", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetJoyRightStickY", (Type[])null, (Type[])null); yield return AccessTools.Method(typeof(ZInput), "GetMouseScrollWheel", (Type[])null, (Type[])null); } [HarmonyPriority(0)] private static void Postfix(ref float __result) { if (PreventPlayerInput() && instance.DisplayingWindow) { __result = 0f; } } } [HarmonyPatch(typeof(ZInput), "GetMouseDelta")] public static class ZInput_GetMouseDelta_PreventMouseInput { [HarmonyPriority(0)] public static void Postfix(ref Vector2 __result) { //IL_001a: 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 (PreventPlayerInput() && instance.DisplayingWindow) { __result = Vector2.zero; } } } [HarmonyPatch(typeof(FejdStartup), "Start")] public static class FejdStartup_Start_MenuButton { public static void Postfix() { instance.SetupMenuButton(); } } [HarmonyPatch(typeof(Menu), "Start")] public static class Menu_Start_MenuButton { public static void Postfix() { instance.SetupMenuButton(); } } internal const int _headerSize = 20; public const string GUID = "_shudnal.ConfigurationManager"; public const string pluginName = "Valheim Configuration Manager"; public const string Version = "1.0.20"; internal static ConfigurationManager instance; private static SettingFieldDrawer _fieldDrawer; 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>(); public Rect currentWindowRect; private Vector2 _settingWindowScrollPos; private bool _showDebug; private bool _windowWasMoved; private PropertyInfo _curLockState; private PropertyInfo _curVisible; private int _previousCursorLockState; private bool _previousCursorVisible; public static ConfigEntry<bool> _showAdvanced; public static ConfigEntry<bool> _showKeybinds; public static ConfigEntry<bool> _showSettings; public static ConfigEntry<bool> _loggingEnabled; public static ConfigEntry<ReadOnlyStyle> _readOnlyStyle; public static ConfigEntry<KeyboardShortcut> _keybind; public static ConfigEntry<bool> _hideSingleSection; public static ConfigEntry<bool> _pluginConfigCollapsedDefault; public static ConfigEntry<Vector2> _windowPosition; public static ConfigEntry<Vector2> _windowSize; public static ConfigEntry<int> _textSize; public static ConfigEntry<bool> _orderPluginByGuid; public static ConfigEntry<int> _rangePrecision; public static ConfigEntry<int> _vectorPrecision; public static ConfigEntry<bool> _vectorDynamicPrecision; public static ConfigEntry<string> _windowTitle; public static ConfigEntry<string> _normalText; public static ConfigEntry<string> _shortcutsText; public static ConfigEntry<string> _advancedText; public static ConfigEntry<string> _closeText; public static ConfigEntry<string> _searchText; public static ConfigEntry<string> _reloadText; public static ConfigEntry<string> _resetText; public static ConfigEntry<string> _resetSettingText; public static ConfigEntry<string> _expandText; public static ConfigEntry<string> _collapseText; public static ConfigEntry<string> _clearText; public static ConfigEntry<string> _cancelText; public static ConfigEntry<string> _enabledText; public static ConfigEntry<string> _disabledText; public static ConfigEntry<string> _shortcutKeyText; public static ConfigEntry<string> _shortcutKeysText; public static ConfigEntry<string> _noOptionsPluginsText; public static ConfigEntry<Color> _windowBackgroundColor; public static ConfigEntry<Color> _tooltipBackgroundColor; public static ConfigEntry<Color> _entryBackgroundColor; public static ConfigEntry<Color> _fontColor; public static ConfigEntry<Color> _fontColorValueChanged; public static ConfigEntry<Color> _fontColorValueDefault; public static ConfigEntry<Color> _widgetBackgroundColor; public static ConfigEntry<Color> _enabledBackgroundColor; public static ConfigEntry<Color> _readOnlyColor; internal const string menuButtonName = "Configuration Manager"; internal static string hiddenSettingsFileName = "_shudnal.ConfigurationManager.hiddensettings.json"; public static ConfigEntry<bool> _pauseGame; public static ConfigEntry<PreventInput> _preventInput; public static ConfigEntry<bool> _showMainMenuButton; public static ConfigEntry<string> _mainMenuButtonCaption; private static readonly Harmony harmony = new Harmony("_shudnal.ConfigurationManager"); internal static readonly ConfigSync configSync = new ConfigSync("_shudnal.ConfigurationManager") { DisplayName = "Valheim Configuration Manager", CurrentVersion = "1.0.20", MinimumRequiredVersion = "1.0.20" }; internal static readonly CustomSyncedValue<List<string>> hiddenSettings = new CustomSyncedValue<List<string>>(configSync, "Hidden settings", new List<string>()); private static DirectoryInfo pluginDirectory; private static DirectoryInfo configDirectory; public Rect DefaultWindowRect { get; private set; } internal Rect SettingWindowRect { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) return currentWindowRect; } private set { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) currentWindowRect = value; } } public bool IsWindowFullscreen => DisplayingWindow; internal static Texture2D WindowBackground { get; private set; } internal static Texture2D EntryBackground { get; private set; } internal static Texture2D TooltipBackground { 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) { BuildSettingList(); _focusSearchBox = false; if (_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; private void OnGUI() { //IL_0030: 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_0052: 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_0066: Expected O, but got Unknown //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Expected O, but got Unknown //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0145: 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_0187: Unknown result type (might be due to invalid IL or missing references) if (DisplayingWindow) { CreateBackgrounds(); ConfigurationManagerStyles.CreateStyles(); SetUnlockCursor(0, cursorVisible: true); ((Rect)(ref currentWindowRect)).size = _windowSize.Value; ((Rect)(ref currentWindowRect)).position = _windowPosition.Value; GUI.Box(currentWindowRect, GUIContent.none, new GUIStyle()); GUI.backgroundColor = _windowBackgroundColor.Value; RightColumnWidth = Mathf.RoundToInt(Mathf.Clamp(((Rect)(ref currentWindowRect)).width / 2.5f * (float)ConfigurationManagerStyles.fontSize / 12f, ((Rect)(ref currentWindowRect)).width * 0.5f, ((Rect)(ref currentWindowRect)).width * 0.8f)); LeftColumnWidth = Mathf.RoundToInt(Mathf.Clamp(((Rect)(ref currentWindowRect)).width - (float)RightColumnWidth - 100f, ((Rect)(ref currentWindowRect)).width * 0.2f, ((Rect)(ref currentWindowRect)).width * 0.5f)) - 15; currentWindowRect = GUILayout.Window(-68, currentWindowRect, new WindowFunction(SettingsWindow), _windowTitle.Value, ConfigurationManagerStyles.GetWindowStyle(), Array.Empty<GUILayoutOption>()); if (!UnityInput.Current.GetKeyDown((KeyCode)323) && (((Rect)(ref currentWindowRect)).x != _windowPosition.Value.x || ((Rect)(ref currentWindowRect)).y != _windowPosition.Value.y)) { SaveCurrentSizeAndPosition(); } } } internal void SaveCurrentSizeAndPosition() { //IL_000c: 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_0046: 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_0076: 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_00af: Unknown result type (might be due to invalid IL or missing references) _windowSize.Value = new Vector2(Mathf.Clamp(((Rect)(ref currentWindowRect)).size.x, 500f, (float)Screen.width), Mathf.Clamp(((Rect)(ref currentWindowRect)).size.y, 200f, (float)Screen.height)); _windowPosition.Value = new Vector2(Mathf.Clamp(((Rect)(ref currentWindowRect)).position.x, 0f, (float)Screen.width - _windowSize.Value.x / 4f), Mathf.Clamp(((Rect)(ref currentWindowRect)).position.y, 0f, (float)(Screen.height - 20))); ((BaseUnityPlugin)this).Config.Save(); SettingFieldDrawer.ClearComboboxCache(); } private void SettingsWindow(int id) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Invalid comparison between Unknown and I4 //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) GUI.DragWindow(new Rect(0f, 0f, ((Rect)(ref currentWindowRect)).width, 20f)); DrawWindowHeader(); _settingWindowScrollPos = GUILayout.BeginScrollView(_settingWindowScrollPos, false, true, Array.Empty<GUILayoutOption>()); float y = _settingWindowScrollPos.y; float height = ((Rect)(ref currentWindowRect)).height; GUILayout.BeginVertical(Array.Empty<GUILayoutOption>()); int num = 0; 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) { Rect lastRect = GUILayoutUtility.GetLastRect(); filteredSeting.Height = (int)((Rect)(ref lastRect)).height; } } else { try { if (filteredSeting.Height > 0) { GUILayout.Space((float)filteredSeting.Height); } } catch (ArgumentException) { } } num += filteredSeting.Height; } GUILayout.Space(20f); GUILayout.Label(_noOptionsPluginsText.Value + ": " + _modsWithoutSettings, ConfigurationManagerStyles.GetLabelStyle(), Array.Empty<GUILayoutOption>()); GUILayout.Space(10f); GUILayout.EndVertical(); GUILayout.EndScrollView(); if (!SettingFieldDrawer.DrawCurrentDropdown()) { DrawTooltip(currentWindowRect); } currentWindowRect = Utils.ResizeWindow(id, currentWindowRect, out var sizeChanged); if (sizeChanged) { SaveCurrentSizeAndPosition(); } } private void DrawWindowHeader() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) GUI.backgroundColor = _entryBackgroundColor.Value; GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUI.enabled = SearchString == string.Empty; bool flag = GUILayout.Toggle(_showSettings.Value, _normalText.Value, ConfigurationManagerStyles.GetToggleStyle(), Array.Empty<GUILayoutOption>()); if (_showSettings.Value != flag) { _showSettings.Value = flag; BuildFilteredSettingList(); } flag = GUILayout.Toggle(_showKeybinds.Value, _shortcutsText.Value, ConfigurationManagerStyles.GetToggleStyle(), Array.Empty<GUILayoutOption>()); if (_showKeybinds.Value != flag) { _showKeybinds.Value = flag; BuildFilteredSettingList(); } flag = GUILayout.Toggle(_showAdvanced.Value, _advancedText.Value, ConfigurationManagerStyles.GetToggleStyle(), Array.Empty<GUILayoutOption>()); if (_showAdvanced.Value != flag) { _showAdvanced.Value = flag; BuildFilteredSettingList(); } GUI.enabled = true; flag = GUILayout.Toggle(_showDebug, "Debug mode", ConfigurationManagerStyles.GetToggleStyle(), Array.Empty<GUILayoutOption>()); if (_showDebug != flag) { _showDebug = flag; BuildSettingList(); } if (GUILayout.Button(_closeText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { DisplayingWindow = false; } GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label(_searchText.Value, ConfigurationManagerStyles.GetLabelStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); GUI.SetNextControlName("searchBox"); SearchString = GUILayout.TextField(SearchString, ConfigurationManagerStyles.GetTextStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) }); if (_focusSearchBox) { GUI.FocusWindow(-68); GUI.FocusControl("searchBox"); _focusSearchBox = false; } Color backgroundColor = GUI.backgroundColor; GUI.backgroundColor = _widgetBackgroundColor.Value; if (GUILayout.Button(_clearText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { SearchString = string.Empty; } GUI.backgroundColor = backgroundColor; GUILayout.Space(8f); if (GUILayout.Button(_pluginConfigCollapsedDefault.Value ? _expandText.Value : _collapseText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) })) { bool flag2 = !_pluginConfigCollapsedDefault.Value; _pluginConfigCollapsedDefault.Value = flag2; foreach (PluginSettingsData filteredSeting in _filteredSetings) { filteredSeting.Collapsed = flag2; } } GUILayout.EndHorizontal(); } private void DrawSinglePlugin(PluginSettingsData plugin) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: 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_00b1: Expected O, but got Unknown //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) GUI.backgroundColor = _entryBackgroundColor.Value; GUILayout.BeginVertical(ConfigurationManagerStyles.GetBackgroundStyle(), Array.Empty<GUILayoutOption>()); GUIContent content = (_showDebug ? new GUIContent(plugin.Info.Name.TrimStart('!') + " " + plugin.Info.Version, "GUID: " + plugin.Info.GUID) : new GUIContent(plugin.Info.Name.TrimStart('!') + " " + plugin.Info.Version)); bool flag = !string.IsNullOrEmpty(SearchString); if (SettingFieldDrawer.DrawPluginHeader(content) && !flag) { plugin.Collapsed = !plugin.Collapsed; } 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.BeginHorizontal(Array.Empty<GUILayoutOption>()); Color backgroundColor = GUI.backgroundColor; GUI.backgroundColor = _widgetBackgroundColor.Value; if (GUILayout.Button(_reloadText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) })) { using (List<PluginSettingsData.PluginSettingsGroupData>.Enumerator enumerator3 = plugin.Categories.GetEnumerator()) { if (enumerator3.MoveNext()) { PluginSettingsData.PluginSettingsGroupData current3 = enumerator3.Current; using List<SettingEntryBase>.Enumerator enumerator4 = current3.Settings.GetEnumerator(); if (enumerator4.MoveNext()) { SettingEntryBase current4 = enumerator4.Current; current4.PluginInstance.Config.Reload(); } } } BuildFilteredSettingList(); } if (GUILayout.Button(_resetText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(true) })) { foreach (PluginSettingsData.PluginSettingsGroupData category2 in plugin.Categories) { foreach (SettingEntryBase setting2 in category2.Settings) { setting2.Set(setting2.DefaultValue); } } BuildFilteredSettingList(); } GUI.backgroundColor = backgroundColor; GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } private void DrawSingleSetting(SettingEntryBase setting) { //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_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) Color contentColor = GUI.contentColor; bool enabled = GUI.enabled; if (setting.ReadOnly == true && _readOnlyStyle.Value != 0) { if (enabled) { GUI.enabled = _readOnlyStyle.Value != ReadOnlyStyle.Disabled; } if (_readOnlyStyle.Value == ReadOnlyStyle.Colored) { GUI.contentColor = _readOnlyColor.Value; } } GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); try { DrawSettingName(setting); _fieldDrawer.DrawSettingValue(setting); DrawDefaultButton(setting); } catch (Exception arg) { ((BaseUnityPlugin)this).Logger.Log((LogLevel)2, (object)$"Failed to draw setting {setting.DispName} - {arg}"); GUILayout.Label("Failed to draw this field, check log for details.", ConfigurationManagerStyles.GetLabelStyle(), Array.Empty<GUILayoutOption>()); } GUILayout.EndHorizontal(); if (enabled && !ComboBox.IsShown()) { GUI.enabled = enabled; } GUI.contentColor = contentColor; } private void DrawSettingName(SettingEntryBase setting) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown if (!setting.HideSettingName) { GUILayout.Label(new GUIContent(setting.DispName.TrimStart('!'), setting.Description), ConfigurationManagerStyles.GetLabelStyle(), (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width((float)LeftColumnWidth), GUILayout.MaxWidth((float)LeftColumnWidth) }); } } private static void DrawDefaultButton(SettingEntryBase setting) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (setting.HideDefaultButton) { return; } GUI.backgroundColor = _widgetBackgroundColor.Value; if (setting.DefaultValue != null) { if (DrawDefaultButton()) { setting.Set(setting.DefaultValue); } } else if (setting.SettingType.IsClass && DrawDefaultButton()) { setting.Set(null); } static bool DrawDefaultButton() { GUILayout.Space(5f); return GUILayout.Button(_resetSettingText.Value, ConfigurationManagerStyles.GetButtonStyle(), (GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); } } public void BuildSettingList() { SettingSearcher.CollectSettings(out var results, out var modsWithoutSettings, _showDebug); _modsWithoutSettings = string.Join(", ", (from x in modsWithoutSettings select x.TrimStart('!') into x orderby x select x).ToArray()); _allSettings = results.ToList(); BuildFilteredSettingList(); } public void BuildFilteredSettingList() { IEnumerable<SettingEntryBase> source = _allSettings; string[] searchStrings = SearchString.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (_readOnlyStyle.Value == ReadOnlyStyle.Hidden) { source = source.Where((SettingEntryBase x) => x.ReadOnly != true); } if (HideSettings()) { source = source.Where((SettingEntryBase x) => !(x as ConfigSettingEntry).ShouldBeHidden()); } if (SearchString.Length > 1 && 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() }; return new PluginSettingsData { Info = pluginSettings.Key, Categories = source2.ToList(), Collapsed = (nonDefaultCollpasingStateByPluginName.Contains(pluginSettings.Key.Name) ? (!settingsAreCollapsed) : settingsAreCollapsed) }; }) orderby _orderPluginByGuid.Value ? x.Info.GUID : x.Info.Name select x).ToList(); } private static bool IsKeyboardShortcut(SettingEntryBase x) { return 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 CalculateDefaultWindowRect() { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005f: 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_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) int num = Mathf.Min(Screen.width, 650); int num2 = Mathf.Min(Screen.height, 800); int num3 = Mathf.RoundToInt((float)(Screen.width - num) / 2f); int num4 = Mathf.RoundToInt((float)(Screen.height - num2) / 2f); DefaultWindowRect = new Rect((float)num3, (float)num4, (float)num, (float)num2); Rect defaultWindowRect = DefaultWindowRect; LeftColumnWidth = Mathf.RoundToInt(((Rect)(ref defaultWindowRect)).width / 2.5f); defaultWindowRect = DefaultWindowRect; RightColumnWidth = (int)((Rect)(ref defaultWindowRect)).width - LeftColumnWidth - 115; } private static void DrawTooltip(Rect area) { //IL_001c: 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_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_004b: Expected O, but got