Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of InLobbyConfig v1.7.1
plugins/InLobbyConfig/InLobbyConfig.dll
Decompiled 6 months agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using InLobbyConfig.Components; using InLobbyConfig.Components.TMP; using InLobbyConfig.FieldControllers; using InLobbyConfig.Fields; using MonoMod.RuntimeDetour; using RoR2; using RoR2.UI; using RoR2.UI.SkinControllers; using ScrollableLobbyUI; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace InLobbyConfig { internal static class AssetBundleHelper { public static AssetBundle MainAssetBundle { get; private set; } internal static void LoadAssetBundle() { MainAssetBundle = AssetBundle.LoadFromFile(GetBundlePath("kingenderbrine_inlobbyconfig")); } internal static void UnloadAssetBundle() { if (Object.op_Implicit((Object)(object)MainAssetBundle)) { MainAssetBundle.Unload(true); } } private static string GetBundlePath(string bundleName) { return Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)InLobbyConfigPlugin.Instance).Info.Location), bundleName); } internal static GameObject LoadPrefab(string name) { AssetBundle mainAssetBundle = MainAssetBundle; if (mainAssetBundle == null) { return null; } return mainAssetBundle.LoadAsset<GameObject>("Assets/Resources/Prefabs/" + name + ".prefab"); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.KingEnderBrine.InLobbyConfig", "In Lobby Config", "1.7.1")] public class InLobbyConfigPlugin : BaseUnityPlugin { internal static InLobbyConfigPlugin Instance { get; private set; } internal static ManualLogSource InstanceLogger { get { InLobbyConfigPlugin instance = Instance; if (instance == null) { return null; } return ((BaseUnityPlugin)instance).Logger; } } internal static bool IsScrollableLobbyUILoaded { get; private set; } private void Awake() { Instance = this; } private void Start() { //IL_0043: Unknown result type (might be due to invalid IL or missing references) IsScrollableLobbyUILoaded = Chainloader.PluginInfos.ContainsKey("com.KingEnderBrine.ScrollableLobbyUI"); AssetBundleHelper.LoadAssetBundle(); new Hook((MethodBase)typeof(CharacterSelectController).GetMethod("Awake", (BindingFlags)(-1)), typeof(ConfigPanelController).GetMethod("CharacterSelectControllerAwake", (BindingFlags)(-1))); Language.collectLanguageRootFolders += CollectLanguageRootFolders; } private static void CollectLanguageRootFolders(List<string> folders) { folders.Add(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)Instance).Info.Location), "Language")); } } internal static class LanguageTokens { public const string IN_LOBBY_CONFIG_POPOUT_PANEL_NAME = "IN_LOBBY_CONFIG_POPOUT_PANEL_NAME"; } public static class ModConfigCatalog { private static readonly HashSet<ModConfigEntry> entries = new HashSet<ModConfigEntry>(); public static ReadOnlyCollection<ModConfigEntry> ReadonlyList => new ReadOnlyCollection<ModConfigEntry>(entries.ToList()); public static void Add(ModConfigEntry entry) { if (entry != null) { entries.Add(entry); } } public static void Remove(ModConfigEntry entry) { entries.Remove(entry); } } public class ModConfigEntry { public string DisplayName { get; set; } public BooleanConfigField EnableField { get; set; } public Dictionary<string, IEnumerable<IConfigField>> SectionFields { get; } = new Dictionary<string, IEnumerable<IConfigField>>(); public Dictionary<string, BooleanConfigField> SectionEnableFields { get; } = new Dictionary<string, BooleanConfigField>(); } } namespace InLobbyConfig.Fields { public abstract class BaseConfigField<T> : IConfigField { public abstract GameObject FieldPrefab { get; } public string DisplayName { get; } public TooltipContent Tooltip { get; } protected Func<T> ValueAccessor { get; } protected Action<T> OnValueChangedCallback { get; } public BaseConfigField(string displayName, Func<T> valueAccessor, Action<T> onValueChanged) { DisplayName = displayName; ValueAccessor = valueAccessor; OnValueChangedCallback = onValueChanged; } public BaseConfigField(string displayName, string tooltip, Func<T> valueAccessor, Action<T> onValueChanged) : this(displayName, valueAccessor, onValueChanged) { //IL_0016: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (!string.IsNullOrEmpty(tooltip)) { Tooltip = new TooltipContent { titleColor = Color.black, overrideTitleText = displayName, bodyColor = Color.black, overrideBodyText = tooltip }; } } public BaseConfigField(string displayName, TooltipContent tooltip, Func<T> valueAccessor, Action<T> onValueChanged) : this(displayName, valueAccessor, onValueChanged) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) Tooltip = tooltip; } object IConfigField.GetValue() { return GetValue(); } public virtual T GetValue() { return ValueAccessor(); } public virtual void OnValueChanged(T newValue) { OnValueChangedCallback?.Invoke(newValue); } } public abstract class BaseInputConfigField<T> : BaseConfigField<T> { protected Action<T> OnEndEditCallback { get; } public BaseInputConfigField(string displayName, Func<T> valueAccessor, Action<T> onValueChanged = null, Action<T> onEndEdit = null) : base(displayName, valueAccessor, onValueChanged) { OnEndEditCallback = onEndEdit; } public BaseInputConfigField(string displayName, string tooltip, Func<T> valueAccessor, Action<T> onValueChanged = null, Action<T> onEndEdit = null) : base(displayName, tooltip, valueAccessor, onValueChanged) { OnEndEditCallback = onEndEdit; } public BaseInputConfigField(string displayName, TooltipContent tooltip, Func<T> valueAccessor, Action<T> onValueChanged, Action<T> onEndEdit = null) : base(displayName, tooltip, valueAccessor, onValueChanged) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) OnEndEditCallback = onEndEdit; } public virtual void OnEndEdit(T newValue) { OnEndEditCallback?.Invoke(newValue); } } public abstract class BaseNumberInputConfigField<T> : BaseInputConfigField<T> where T : struct { public T? Minimum { get; } public T? Maximum { get; } public BaseNumberInputConfigField(string displayName, Func<T> valueAccessor, Action<T> onValueChanged = null, Action<T> onEndEdit = null, T? minimum = null, T? maximum = null) : base(displayName, valueAccessor, onValueChanged, onEndEdit) { Minimum = minimum; Maximum = maximum; } public BaseNumberInputConfigField(string displayName, string tooltip, Func<T> valueAccessor, Action<T> onValueChanged = null, Action<T> onEndEdit = null, T? minimum = null, T? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { Minimum = minimum; Maximum = maximum; } public BaseNumberInputConfigField(string displayName, TooltipContent tooltip, Func<T> valueAccessor, Action<T> onValueChanged = null, Action<T> onEndEdit = null, T? minimum = null, T? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) Minimum = minimum; Maximum = maximum; } } public class BooleanConfigField : BaseConfigField<bool> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("BooleanFieldPrefab"); } return fieldPrefab; } } public BooleanConfigField(string displayName, Func<bool> valueAccessor, Action<bool> onValueChanged = null) : base(displayName, valueAccessor, onValueChanged) { } public BooleanConfigField(string displayName, string tooltip, Func<bool> valueAccessor, Action<bool> onValueChanged = null) : base(displayName, tooltip, valueAccessor, onValueChanged) { } public BooleanConfigField(string displayName, TooltipContent tooltip, Func<bool> valueAccessor, Action<bool> onValueChanged) : base(displayName, tooltip, valueAccessor, onValueChanged) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) } public class ColorConfigField : BaseInputConfigField<Color> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("ColorFieldPrefab"); } return fieldPrefab; } } public bool ShowAlpha { get; set; } public ColorConfigField(string displayName, Func<Color> valueAccessor, Action<Color> onValueChanged = null, Action<Color> onEndEdit = null, bool showAlpha = true) : base(displayName, valueAccessor, onValueChanged, onEndEdit) { ShowAlpha = showAlpha; } public ColorConfigField(string displayName, string tooltip, Func<Color> valueAccessor, Action<Color> onValueChanged = null, Action<Color> onEndEdit = null, bool showAlpha = true) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { ShowAlpha = showAlpha; } public ColorConfigField(string displayName, TooltipContent tooltip, Func<Color> valueAccessor, Action<Color> onValueChanged = null, Action<Color> onEndEdit = null, bool showAlpha = true) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) ShowAlpha = showAlpha; } } public static class ConfigFieldUtilities { public static ModConfigEntry CreateFromBepInExConfigFile(ConfigFile file, string displayName) { return CreateFromBepInExConfigFile(file, displayName, tryToFindEnabledField: true, tryToFindSectionEnabledField: true); } public static ModConfigEntry CreateFromBepInExConfigFile(ConfigFile file, string displayName, bool tryToFindEnabledField) { return CreateFromBepInExConfigFile(file, displayName, tryToFindEnabledField, tryToFindSectionEnabledField: true); } public static ModConfigEntry CreateFromBepInExConfigFile(ConfigFile file, string displayName, bool tryToFindEnabledField, bool tryToFindSectionEnabledField) { ModConfigEntry modConfigEntry = new ModConfigEntry { DisplayName = displayName }; foreach (KeyValuePair<ConfigDefinition, ConfigEntryBase> item in file) { if (tryToFindEnabledField && modConfigEntry.EnableField == null && item.Key.Key.Equals("enabled", StringComparison.InvariantCultureIgnoreCase) && item.Value.BoxedValue is bool) { modConfigEntry.EnableField = CreateBooleanConfigField(item.Value as ConfigEntry<bool>); continue; } if (tryToFindSectionEnabledField && !modConfigEntry.SectionEnableFields.ContainsKey(item.Key.Section) && item.Key.Key.Equals("sectionEnabled", StringComparison.InvariantCultureIgnoreCase) && item.Value.BoxedValue is bool) { modConfigEntry.SectionEnableFields[item.Key.Section] = CreateBooleanConfigField(item.Value as ConfigEntry<bool>); continue; } IConfigField configField = ProcessConfigRow(item.Value); if (configField == null) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)("Config [" + displayName + "]. Not found prefab that can be associated with `" + item.Key.Key + "` field.")); } else { if (!modConfigEntry.SectionFields.TryGetValue(item.Key.Section, out var value)) { IEnumerable<IConfigField> enumerable2 = (modConfigEntry.SectionFields[item.Key.Section] = new List<IConfigField>()); value = enumerable2; } (value as List<IConfigField>).Add(configField); } } return modConfigEntry; } public static IConfigField CreateFromBepInExConfigEntry<T>(ConfigEntry<T> configEntry) { return ProcessConfigRow((ConfigEntryBase)(object)configEntry); } private static IConfigField ProcessConfigRow(ConfigEntryBase configEntry) { try { if (configEntry.Description.AcceptableValues != null) { IConfigField configField = CreateSelectConfigField(configEntry); if (configField != null) { return configField; } } if (configEntry.BoxedValue is bool) { return CreateBooleanConfigField(configEntry as ConfigEntry<bool>); } if (configEntry.BoxedValue is Enum) { return CreateEnumConfigField(configEntry); } if (configEntry.BoxedValue is int) { return CreateIntConfigField(configEntry as ConfigEntry<int>); } if (configEntry.BoxedValue is float) { return CreateFloatConfigField(configEntry as ConfigEntry<float>); } if (configEntry.BoxedValue is string) { return CreateStringConfigField(configEntry as ConfigEntry<string>); } if (configEntry.BoxedValue is Color) { return CreateColorConfigField(configEntry as ConfigEntry<Color>); } } catch (Exception ex) { InLobbyConfigPlugin.InstanceLogger.LogError((object)ex); } return null; } private static IConfigField CreateSelectConfigField(ConfigEntryBase configEntry) { AcceptableValueBase acceptableValues = configEntry.Description.AcceptableValues; if (((object)acceptableValues).GetType().GetGenericTypeDefinition() != typeof(AcceptableValueList<string>).GetGenericTypeDefinition()) { return null; } Dictionary<object, string> options = new Dictionary<object, string>(); foreach (object item in ((object)acceptableValues).GetType().GetProperty("AcceptableValues").GetValue(acceptableValues) as IList) { options[item] = item?.ToString(); } return new SelectConfigField(configEntry.Definition.Key, configEntry.Description.Description, ValueAccessor, OptionsAccessor, OnEndEdit); void OnEndEdit(object newValue) { configEntry.BoxedValue = newValue; } IDictionary<object, string> OptionsAccessor() { return options; } object ValueAccessor() { return configEntry.BoxedValue; } } private static BooleanConfigField CreateBooleanConfigField(ConfigEntry<bool> configEntry) { return new BooleanConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, OnValueChanged); void OnValueChanged(bool newValue) { configEntry.Value = newValue; } bool ValueAccessor() { return configEntry.Value; } } private static StringConfigField CreateStringConfigField(ConfigEntry<string> configEntry) { return new StringConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit); void OnEndEdit(string newValue) { configEntry.Value = newValue; } string ValueAccessor() { return configEntry.Value; } } private static ColorConfigField CreateColorConfigField(ConfigEntry<Color> configEntry) { return new ColorConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit); void OnEndEdit(Color newValue) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) configEntry.Value = newValue; } Color ValueAccessor() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return configEntry.Value; } } private static IntConfigField CreateIntConfigField(ConfigEntry<int> configEntry) { if (((ConfigEntryBase)configEntry).Description.AcceptableValues is AcceptableValueRange<int> val) { return new IntConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit, val.MinValue, val.MaxValue); } return new IntConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit); void OnEndEdit(int newValue) { configEntry.Value = newValue; } int ValueAccessor() { return configEntry.Value; } } private static FloatConfigField CreateFloatConfigField(ConfigEntry<float> configEntry) { if (((ConfigEntryBase)configEntry).Description.AcceptableValues is AcceptableValueRange<float> val) { return new FloatConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit, val.MinValue, val.MaxValue); } return new FloatConfigField(((ConfigEntryBase)configEntry).Definition.Key, ((ConfigEntryBase)configEntry).Description.Description, ValueAccessor, null, OnEndEdit); void OnEndEdit(float newValue) { configEntry.Value = newValue; } float ValueAccessor() { return configEntry.Value; } } private static EnumConfigField CreateEnumConfigField(ConfigEntryBase configEntry) { return new EnumConfigField(configEntry.SettingType, configEntry.Definition.Key, configEntry.Description.Description, ValueAccessor, OnEndEdit); void OnEndEdit(Enum newValue) { configEntry.BoxedValue = newValue; } Enum ValueAccessor() { return (Enum)configEntry.BoxedValue; } } } public class EnumConfigField : SelectConfigField { public Type EnumType { get; } public EnumConfigField(Type enumType, string displayName, Func<Enum> valueAccessor, Action<Enum> onValueChanged = null) : base(displayName, valueAccessor, () => GetEnumOptions(enumType), delegate(object v) { onValueChanged?.Invoke((Enum)v); }) { EnumType = enumType; } public EnumConfigField(Type enumType, string displayName, string tooltip, Func<Enum> valueAccessor, Action<Enum> onValueChanged = null) : base(displayName, tooltip, valueAccessor, () => GetEnumOptions(enumType), delegate(object v) { onValueChanged?.Invoke((Enum)v); }) { EnumType = enumType; } public EnumConfigField(Type enumType, string displayName, TooltipContent tooltip, Func<Enum> valueAccessor, Action<Enum> onValueChanged = null) : base(displayName, tooltip, valueAccessor, () => GetEnumOptions(enumType), delegate(object v) { onValueChanged?.Invoke((Enum)v); }) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) EnumType = enumType; } private static IDictionary<object, string> GetEnumOptions(Type enumType) { return Enum.GetValues(enumType).Cast<Enum>().ToDictionary((Func<Enum, object>)((Enum v) => v), (Func<Enum, string>)((Enum v) => v.ToString())); } } public class EnumConfigField<T> : EnumConfigField where T : Enum { protected new Action<T> OnValueChangedCallback { get; } protected new Func<T> ValueAccessor { get; } public EnumConfigField(string displayName, Func<T> valueAccessor, Action<T> onValueChanged = null) : base(typeof(T), displayName, () => valueAccessor()) { ValueAccessor = valueAccessor; OnValueChangedCallback = onValueChanged; } public EnumConfigField(string displayName, string tooltip, Func<T> valueAccessor, Action<T> onValueChanged = null) : base(typeof(T), displayName, tooltip, () => valueAccessor()) { ValueAccessor = valueAccessor; OnValueChangedCallback = onValueChanged; } public EnumConfigField(string displayName, TooltipContent tooltip, Func<T> valueAccessor, Action<T> onValueChanged = null) : base(typeof(T), displayName, tooltip, () => valueAccessor()) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) ValueAccessor = valueAccessor; OnValueChangedCallback = onValueChanged; } public void OnValueChanged(T newValue) { OnValueChangedCallback?.Invoke(newValue); } public override void OnValueChanged(object newValue) { OnValueChangedCallback?.Invoke((T)newValue); } public new T GetValue() { return ValueAccessor(); } } public class FloatConfigField : BaseNumberInputConfigField<float> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("FloatFieldPrefab"); } return fieldPrefab; } } public FloatConfigField(string displayName, Func<float> valueAccessor, Action<float> onValueChanged = null, Action<float> onEndEdit = null, float? minimum = null, float? maximum = null) : base(displayName, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { } public FloatConfigField(string displayName, string tooltip, Func<float> valueAccessor, Action<float> onValueChanged = null, Action<float> onEndEdit = null, float? minimum = null, float? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { } public FloatConfigField(string displayName, TooltipContent tooltip, Func<float> valueAccessor, Action<float> onValueChanged = null, Action<float> onEndEdit = null, float? minimum = null, float? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) } public interface IConfigField { GameObject FieldPrefab { get; } string DisplayName { get; } TooltipContent Tooltip { get; } object GetValue(); } public class IntConfigField : BaseNumberInputConfigField<int> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("IntFieldPrefab"); } return fieldPrefab; } } public IntConfigField(string displayName, Func<int> valueAccessor, Action<int> onValueChanged = null, Action<int> onEndEdit = null, int? minimum = null, int? maximum = null) : base(displayName, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { } public IntConfigField(string displayName, string tooltip, Func<int> valueAccessor, Action<int> onValueChanged = null, Action<int> onEndEdit = null, int? minimum = null, int? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { } public IntConfigField(string displayName, TooltipContent tooltip, Func<int> valueAccessor, Action<int> onValueChanged = null, Action<int> onEndEdit = null, int? minimum = null, int? maximum = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit, minimum, maximum) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) } public class SelectConfigField : BaseConfigField<object> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("SelectFieldPrefab"); } return fieldPrefab; } } protected Func<IDictionary<object, string>> OptionsAccessor { get; } public SelectConfigField(string displayName, Func<object> valueAccessor, Func<IDictionary<object, string>> optionsAccessor, Action<object> onValueChanged = null) : base(displayName, valueAccessor, onValueChanged) { OptionsAccessor = optionsAccessor; } public SelectConfigField(string displayName, string tooltip, Func<object> valueAccessor, Func<IDictionary<object, string>> optionsAccessor, Action<object> onValueChanged = null) : base(displayName, tooltip, valueAccessor, onValueChanged) { OptionsAccessor = optionsAccessor; } public SelectConfigField(string displayName, TooltipContent tooltip, Func<object> valueAccessor, Func<IDictionary<object, string>> optionsAccessor, Action<object> onValueChanged = null) : base(displayName, tooltip, valueAccessor, onValueChanged) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) OptionsAccessor = optionsAccessor; } public IDictionary<object, string> GetOptions() { return OptionsAccessor?.Invoke(); } } public class SelectConfigField<T> : SelectConfigField { protected new Func<IDictionary<T, string>> OptionsAccessor { get; } protected new Func<T> ValueAccessor { get; } public SelectConfigField(string displayName, Func<T> valueAccessor, Func<IDictionary<T, string>> optionsAccessor, Action<T> onValueChanged = null) : base(displayName, () => valueAccessor(), () => ((IEnumerable<KeyValuePair<T, string>>)optionsAccessor?.Invoke()).ToDictionary((Func<KeyValuePair<T, string>, object>)((KeyValuePair<T, string> row) => row.Key), (Func<KeyValuePair<T, string>, string>)((KeyValuePair<T, string> row) => row.Value)), delegate(object v) { onValueChanged?.Invoke((T)v); }) { OptionsAccessor = optionsAccessor; ValueAccessor = valueAccessor; } public SelectConfigField(string displayName, string tooltip, Func<T> valueAccessor, Func<IDictionary<T, string>> optionsAccessor, Action<T> onValueChanged = null) : base(displayName, tooltip, () => valueAccessor(), () => ((IEnumerable<KeyValuePair<T, string>>)optionsAccessor?.Invoke()).ToDictionary((Func<KeyValuePair<T, string>, object>)((KeyValuePair<T, string> row) => row.Key), (Func<KeyValuePair<T, string>, string>)((KeyValuePair<T, string> row) => row.Value)), delegate(object v) { onValueChanged?.Invoke((T)v); }) { OptionsAccessor = optionsAccessor; ValueAccessor = valueAccessor; } public SelectConfigField(string displayName, TooltipContent tooltip, Func<T> valueAccessor, Func<IDictionary<T, string>> optionsAccessor, Action<T> onValueChanged = null) : base(displayName, tooltip, () => valueAccessor(), () => ((IEnumerable<KeyValuePair<T, string>>)optionsAccessor?.Invoke()).ToDictionary((Func<KeyValuePair<T, string>, object>)((KeyValuePair<T, string> row) => row.Key), (Func<KeyValuePair<T, string>, string>)((KeyValuePair<T, string> row) => row.Value)), delegate(object v) { onValueChanged?.Invoke((T)v); }) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) OptionsAccessor = optionsAccessor; ValueAccessor = valueAccessor; } public new IDictionary<T, string> GetOptions() { return OptionsAccessor(); } public new T GetValue() { return ValueAccessor(); } } public class SelectListField : BaseConfigField<IEnumerable<object>> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("SelectListFieldPrefab"); } return fieldPrefab; } } protected Func<IDictionary<object, string>> OptionsAccessor { get; } protected Action<object, int> OnItemAddedCallback { get; } protected Action<int> OnItemRemovedCallback { get; } public SelectListField(string displayName, Func<IEnumerable<object>> valueAccessor, Action<object, int> onItemAdded, Action<int> onItemRemoved, Func<IDictionary<object, string>> optionsAccessor) : base(displayName, valueAccessor, (Action<IEnumerable<object>>)null) { OnItemAddedCallback = onItemAdded; OnItemRemovedCallback = onItemRemoved; OptionsAccessor = optionsAccessor; } public SelectListField(string displayName, string tooltip, Func<IEnumerable<object>> valueAccessor, Action<object, int> onItemAdded, Action<int> onItemRemoved, Func<IDictionary<object, string>> optionsAccessor) : base(displayName, tooltip, valueAccessor, (Action<IEnumerable<object>>)null) { OnItemAddedCallback = onItemAdded; OnItemRemovedCallback = onItemRemoved; OptionsAccessor = optionsAccessor; } public void OnItemAdded(object value, int index) { OnItemAddedCallback?.Invoke(value, index); } public void OnItemRemoved(int index) { OnItemRemovedCallback?.Invoke(index); } public IDictionary<object, string> GetOptions() { return OptionsAccessor?.Invoke(); } } public class SelectListField<T> : SelectListField { protected new Func<IDictionary<T, string>> OptionsAccessor { get; } protected new Action<T, int> OnItemAddedCallback { get; } protected new Action<int> OnItemRemovedCallback { get; } public SelectListField(string displayName, Func<ICollection<T>> valueAccessor, Action<T, int> onItemAdded, Action<int> onItemRemoved, Func<IDictionary<T, string>> optionsAccessor) : base(displayName, () => valueAccessor().Cast<object>(), delegate(object value, int index) { onItemAdded?.Invoke((T)value, index); }, onItemRemoved, () => ((IEnumerable<KeyValuePair<T, string>>)optionsAccessor?.Invoke()).ToDictionary((Func<KeyValuePair<T, string>, object>)((KeyValuePair<T, string> row) => row.Key), (Func<KeyValuePair<T, string>, string>)((KeyValuePair<T, string> row) => row.Value))) { OnItemAddedCallback = onItemAdded; OnItemRemovedCallback = onItemRemoved; OptionsAccessor = optionsAccessor; } public SelectListField(string displayName, string tooltip, Func<ICollection<T>> valueAccessor, Action<T, int> onItemAdded, Action<int> onItemRemoved, Func<IDictionary<T, string>> optionsAccessor) : base(displayName, tooltip, () => valueAccessor().Cast<object>(), delegate(object value, int index) { onItemAdded?.Invoke((T)value, index); }, onItemRemoved, () => ((IEnumerable<KeyValuePair<T, string>>)optionsAccessor?.Invoke()).ToDictionary((Func<KeyValuePair<T, string>, object>)((KeyValuePair<T, string> row) => row.Key), (Func<KeyValuePair<T, string>, string>)((KeyValuePair<T, string> row) => row.Value))) { OnItemAddedCallback = onItemAdded; OnItemRemovedCallback = onItemRemoved; OptionsAccessor = optionsAccessor; } public void OnItemAdded(T value, int index) { OnItemAddedCallback?.Invoke(value, index); } public new IDictionary<T, string> GetOptions() { return OptionsAccessor?.Invoke(); } } public class StringConfigField : BaseInputConfigField<string> { private static GameObject fieldPrefab; public override GameObject FieldPrefab { get { if (!Object.op_Implicit((Object)(object)fieldPrefab)) { return fieldPrefab = AssetBundleHelper.LoadPrefab("StringFieldPrefab"); } return fieldPrefab; } } public StringConfigField(string displayName, Func<string> valueAccessor, Action<string> onValueChanged = null, Action<string> onEndEdit = null) : base(displayName, valueAccessor, onValueChanged, onEndEdit) { } public StringConfigField(string displayName, string tooltip, Func<string> valueAccessor, Action<string> onValueChanged = null, Action<string> onEndEdit = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { } public StringConfigField(string displayName, TooltipContent tooltip, Func<string> valueAccessor, Action<string> onValueChanged, Action<string> onEndEdit = null) : base(displayName, tooltip, valueAccessor, onValueChanged, onEndEdit) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) } } namespace InLobbyConfig.FieldControllers { public class BooleanFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public Toggle toggle; private bool skipValueChange; private BooleanConfigField ConfigField { get; set; } public void Start() { //IL_0033: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as BooleanConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } bool value = ConfigField.GetValue(); if (value != toggle.isOn) { skipValueChange = true; toggle.isOn = value; } } } public void OnValueChanged(bool newValue) { if (ConfigField != null) { if (skipValueChange) { skipValueChange = false; } else { ConfigField.OnValueChanged(newValue); } } } } public class ColorFieldController : ConfigFieldController { public enum ColorPart { R, G, B, A } public TextMeshProUGUI fieldText; public Image preview; public TMP_InputField colorR; public TMP_InputField colorG; public TMP_InputField colorB; public TMP_InputField colorA; private Color32 currentColor; private ColorConfigField ConfigField { get; set; } public void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as ColorConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } if (!ConfigField.ShowAlpha) { ((Component)((Component)colorA).transform.parent).gameObject.SetActive(false); } ((MonoBehaviour)this).StartCoroutine(DelayedStartCoroutine()); } } private IEnumerator DelayedStartCoroutine() { yield return (object)new WaitForSeconds(0.01f); currentColor = Color32.op_Implicit(ConfigField.GetValue()); ProcessColor(currentColor.r, colorR); ProcessColor(currentColor.g, colorG); ProcessColor(currentColor.b, colorB); ProcessColor(currentColor.a, colorA); ((Graphic)preview).color = Color32.op_Implicit(currentColor); static void ProcessColor(byte color, TMP_InputField inputField) { string text = color.ToString(); if (text != inputField.text) { inputField.SetTextWithoutNotify(text); } } } public void OnValueChangedR(string newValue) { OnValueChanged(newValue, ColorPart.R); } public void OnValueChangedG(string newValue) { OnValueChanged(newValue, ColorPart.G); } public void OnValueChangedB(string newValue) { OnValueChanged(newValue, ColorPart.B); } public void OnValueChangedA(string newValue) { OnValueChanged(newValue, ColorPart.A); } private void OnValueChanged(string newValue, ColorPart colorPart) { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: 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) if (ConfigField == null || !int.TryParse(newValue, out var result)) { return; } switch (colorPart) { case ColorPart.R: if (ProcessColorPart(result, colorR)) { return; } currentColor.r = (byte)result; break; case ColorPart.G: if (ProcessColorPart(result, colorG)) { return; } currentColor.g = (byte)result; break; case ColorPart.B: if (ProcessColorPart(result, colorB)) { return; } currentColor.b = (byte)result; break; case ColorPart.A: if (ProcessColorPart(result, colorA)) { return; } currentColor.a = (byte)result; break; } ((Graphic)preview).color = Color32.op_Implicit(currentColor); ConfigField.OnValueChanged(new Color((float)(int)currentColor.r, (float)(int)currentColor.g, (float)(int)currentColor.b, (float)(int)currentColor.a)); } public void OnEndEditR(string newValue) { OnEndEdit(newValue, ColorPart.R); } public void OnEndEditG(string newValue) { OnEndEdit(newValue, ColorPart.G); } public void OnEndEditB(string newValue) { OnEndEdit(newValue, ColorPart.B); } public void OnEndEditA(string newValue) { OnEndEdit(newValue, ColorPart.A); } private void OnEndEdit(string newValue, ColorPart colorPart) { //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) if (ConfigField == null) { return; } if (!int.TryParse(newValue, out var _)) { bool flag = string.IsNullOrEmpty(newValue); switch (colorPart) { case ColorPart.R: colorR.text = (flag ? "0" : currentColor.r.ToString()); break; case ColorPart.G: colorG.text = (flag ? "0" : currentColor.g.ToString()); break; case ColorPart.B: colorB.text = (flag ? "0" : currentColor.b.ToString()); break; case ColorPart.A: colorA.text = (flag ? "0" : currentColor.a.ToString()); break; } } if (!(ConfigField.GetValue() == Color32.op_Implicit(currentColor))) { ConfigField.OnEndEdit(new Color((float)(int)currentColor.r, (float)(int)currentColor.g, (float)(int)currentColor.b, (float)(int)currentColor.a)); } } private bool ProcessColorPart(int newValue, TMP_InputField inputField) { if (newValue > 255) { inputField.text = "255"; return true; } if (newValue < 0) { inputField.text = "0"; return true; } return false; } } public abstract class ConfigFieldController : MonoBehaviour { public TooltipProvider tooltipProvider; [HideInInspector] public IConfigField configField; } public class FloatFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public TMP_InputField inputField; private FloatConfigField ConfigField { get; set; } public void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as FloatConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } ((MonoBehaviour)this).StartCoroutine(DelayedStartCoroutine()); } } private IEnumerator DelayedStartCoroutine() { yield return (object)new WaitForSeconds(0.01f); string text = ConfigField.GetValue().ToString(); if (!(text == inputField.text)) { inputField.SetTextWithoutNotify(text); } } public void OnValueChanged(string newValue) { if (ConfigField != null && float.TryParse(newValue, out var result)) { if (ConfigField.Minimum.HasValue && ConfigField.Minimum > result) { inputField.text = ConfigField.Minimum.Value.ToString(NumberFormatInfo.InvariantInfo); } else if (ConfigField.Maximum.HasValue && ConfigField.Maximum < result) { inputField.text = ConfigField.Maximum.Value.ToString(NumberFormatInfo.InvariantInfo); } else { ConfigField.OnValueChanged(result); } } } public void OnEndEdit(string newValue) { if (ConfigField != null) { float value = ConfigField.GetValue(); if (!float.TryParse(newValue, out var result)) { inputField.text = value.ToString(); } if (value != result) { ConfigField.OnEndEdit(result); } } } } public class IntFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public TMP_InputField inputField; private IntConfigField ConfigField { get; set; } public void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as IntConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } ((MonoBehaviour)this).StartCoroutine(DelayedStartCoroutine()); } } private IEnumerator DelayedStartCoroutine() { yield return (object)new WaitForSeconds(0.01f); string text = ConfigField.GetValue().ToString(NumberFormatInfo.InvariantInfo); if (!(text == inputField.text)) { inputField.SetTextWithoutNotify(text); } } public void OnValueChanged(string newValue) { if (ConfigField != null && int.TryParse(newValue, out var result)) { if (ConfigField.Minimum.HasValue && ConfigField.Minimum > result) { inputField.text = ConfigField.Minimum.Value.ToString(); } else if (ConfigField.Maximum.HasValue && ConfigField.Maximum < result) { inputField.text = ConfigField.Maximum.Value.ToString(); } else { ConfigField.OnValueChanged(result); } } } public void OnEndEdit(string newValue) { if (ConfigField != null) { int value = ConfigField.GetValue(); if (!int.TryParse(newValue, out var result)) { inputField.text = value.ToString(); } if (value != result) { ConfigField.OnEndEdit(result); } } } } public class SelectFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public SearchableDropdown dropdown; private Dictionary<object, string> options; private SelectConfigField ConfigField { get; set; } public void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as SelectConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } options = ConfigField.GetOptions().ToDictionary((KeyValuePair<object, string> el) => el.Key, (KeyValuePair<object, string> el) => el.Value); dropdown.Options = options.Select((KeyValuePair<object, string> el) => new SearchableDropdown.OptionData(el.Key, el.Value)).ToList(); ((UnityEvent<object>)(dropdown.OnItemSelected ?? (dropdown.OnItemSelected = new SearchableDropdown.DropdownEvent()))).AddListener((UnityAction<object>)AddNewItem); object value = ConfigField.GetValue(); options.TryGetValue(value, out var value2); dropdown.selectText.text = value2 ?? "{Missing option}"; } } public void AddNewItem(object value) { if (ConfigField != null) { ConfigField.OnValueChanged(value); options.TryGetValue(value, out var value2); dropdown.selectText.text = value2 ?? "{Missing option}"; } } } public class SelectListFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public SearchableDropdown dropdown; public GameObject itemPrefab; public Button contentToggleButton; public Transform contentContainer; private readonly List<SelectListItemController> items = new List<SelectListItemController>(); private Dictionary<object, string> options; private SelectListField ConfigField { get; set; } public void Start() { //IL_00f4: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as SelectListField; if (ConfigField == null) { return; } options = ConfigField.GetOptions().ToDictionary((KeyValuePair<object, string> el) => el.Key, (KeyValuePair<object, string> el) => el.Value); dropdown.Options = options.Select((KeyValuePair<object, string> el) => new SearchableDropdown.OptionData(el.Key, el.Value)).ToList(); ((UnityEvent<object>)(dropdown.OnItemSelected ?? (dropdown.OnItemSelected = new SearchableDropdown.DropdownEvent()))).AddListener((UnityAction<object>)AddNewItem); if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } foreach (object item in ConfigField.GetValue()) { AddNewItem(item, skipNotification: true); } } public void AddNewItem(object value) { AddNewItem(value, skipNotification: false); if (!((Component)contentContainer).gameObject.activeSelf) { ButtonClickedEvent onClick = contentToggleButton.onClick; if (onClick != null) { ((UnityEvent)onClick).Invoke(); } } } public void AddNewItem(object value, bool skipNotification = false) { if (ConfigField != null && !items.Any((SelectListItemController item) => item.value.Equals(value))) { GameObject val = Object.Instantiate<GameObject>(itemPrefab, contentContainer); SelectListItemController component = val.GetComponent<SelectListItemController>(); options.TryGetValue(value, out var value2); ((TMP_Text)component.textComponent).text = value2 ?? "{Missing option}"; component.value = value; val.SetActive(true); items.Add(component); if (!skipNotification) { ConfigField.OnItemAdded(value, val.transform.GetSiblingIndex()); } } } public void DeleteItem(int index) { if (ConfigField != null) { items.RemoveAt(index); ConfigField.OnItemRemoved(index); } } public void ToggleContent() { ((Component)contentContainer).gameObject.SetActive(!((Component)contentContainer).gameObject.activeSelf); } } public class SelectListItemController : MonoBehaviour { public TextMeshProUGUI textComponent; [HideInInspector] public object value; public SelectListFieldController fieldController; public void DeleteButtonClick() { fieldController?.DeleteItem(((Component)this).transform.GetSiblingIndex()); Object.Destroy((Object)(object)((Component)this).gameObject); } } public class StringFieldController : ConfigFieldController { public TextMeshProUGUI fieldText; public TMP_InputField inputField; private StringConfigField ConfigField { get; set; } public void Start() { //IL_0056: Unknown result type (might be due to invalid IL or missing references) ConfigField = configField as StringConfigField; if (ConfigField != null) { if (Object.op_Implicit((Object)(object)fieldText)) { ((TMP_Text)fieldText).text = ConfigField.DisplayName; } if (Object.op_Implicit((Object)(object)tooltipProvider)) { tooltipProvider.SetContent(ConfigField.Tooltip); } ((MonoBehaviour)this).StartCoroutine(DelayedStartCoroutine()); } } private IEnumerator DelayedStartCoroutine() { yield return (object)new WaitForSeconds(0.01f); string value = ConfigField.GetValue(); if (!(value == inputField.text)) { inputField.SetTextWithoutNotify(value); } } public void OnValueChanged(string newValue) { if (ConfigField != null) { ConfigField.OnValueChanged(newValue); } } public void OnEndEdit(string newValue) { if (ConfigField != null && !(ConfigField.GetValue() == newValue)) { ConfigField.OnEndEdit(newValue); } } } } namespace InLobbyConfig.Components { public class ConfigPanelController : MonoBehaviour { public GameObject configButton; public GameObject popoutPanel; private GameObject scrollContent; private bool initialized; public static GameObject CachedPrefab { get; private set; } private void Awake() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown ((UnityEvent)((Button)configButton.GetComponent<HGButton>()).onClick).AddListener(new UnityAction(TogglePopoutPanel)); } private void Start() { //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: 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) if (!Object.op_Implicit((Object)(object)popoutPanel)) { return; } HGPopoutPanel component = popoutPanel.GetComponent<HGPopoutPanel>(); component.popoutPanelTitleText.token = "IN_LOBBY_CONFIG_POPOUT_PANEL_NAME"; ((Component)((Component)component.popoutPanelDescriptionText).transform.parent).gameObject.SetActive(false); Transform obj = popoutPanel.GetComponent<ChildLocator>().FindChild("RandomButtonContainer"); if (obj != null) { GameObject gameObject = ((Component)obj).gameObject; if (gameObject != null) { gameObject.SetActive(false); } } RectTransform popoutPanelContentContainer = component.popoutPanelContentContainer; Object.DestroyImmediate((Object)(object)((Component)popoutPanelContentContainer).GetComponent<GridLayoutGroup>()); RectTransform component2 = ((Component)popoutPanelContentContainer).GetComponent<RectTransform>(); component2.sizeDelta = new Vector2(0f, 700f); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(0.5f, 1f); component2.offsetMin = default(Vector2); component2.offsetMax = default(Vector2); ((Component)popoutPanelContentContainer).gameObject.AddComponent<LayoutElement>().minHeight = 700f; if (InLobbyConfigPlugin.IsScrollableLobbyUILoaded) { ModifyIfSLUILoaded((Transform)(object)popoutPanelContentContainer); } ((Component)popoutPanelContentContainer).gameObject.AddComponent<RectMask2D>(); scrollContent = Object.Instantiate<GameObject>(AssetBundleHelper.LoadPrefab("ScrollContent"), ((Component)popoutPanelContentContainer).transform); GameObject val = Object.Instantiate<GameObject>(AssetBundleHelper.LoadPrefab("ScrollBar"), ((Component)popoutPanelContentContainer).transform); ScrollRect obj2 = ((Component)popoutPanelContentContainer).gameObject.AddComponent<ScrollRect>(); obj2.content = scrollContent.GetComponent<RectTransform>(); obj2.movementType = (MovementType)2; obj2.horizontal = false; obj2.vertical = true; obj2.viewport = popoutPanelContentContainer; obj2.scrollSensitivity = 30f; obj2.verticalScrollbar = val.GetComponent<Scrollbar>(); obj2.verticalScrollbarVisibility = (ScrollbarVisibility)1; if (popoutPanel.activeSelf) { InitContent(); } } [MethodImpl(MethodImplOptions.NoInlining)] private void ModifyIfSLUILoaded(Transform contentTransform) { ((Component)contentTransform.parent.parent).GetComponent<DynamicContentSizeFitter>().maxHeight = 700f; } private void TogglePopoutPanel() { if (Object.op_Implicit((Object)(object)popoutPanel)) { popoutPanel.SetActive(!popoutPanel.activeSelf); if (popoutPanel.activeSelf) { InitContent(); } } } private void InitContent() { if (initialized) { return; } foreach (ModConfigEntry @readonly in ModConfigCatalog.ReadonlyList) { if (@readonly == null) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)"Skipping over null ModConfigEntry"); continue; } if (@readonly.EnableField == null && (@readonly.SectionFields.Count == 0 || @readonly.SectionFields.All((KeyValuePair<string, IEnumerable<IConfigField>> row) => row.Value.Count() == 0))) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)("Skipping over `" + @readonly.DisplayName + "` because it has no fields assigned")); continue; } GameObject val = Object.Instantiate<GameObject>(AssetBundleHelper.LoadPrefab("ModConfigPrefab"), scrollContent.transform); if (!Object.op_Implicit((Object)(object)val)) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)"Failed to instantiate `ModConfigPrefab`"); } else { val.GetComponent<ModConfigController>().configEntry = @readonly; } } initialized = true; } internal static void CharacterSelectControllerAwake(Action<CharacterSelectController> orig, CharacterSelectController self) { orig(self); ((MonoBehaviour)self).StartCoroutine(InitConfigPanel(self)); } private static IEnumerator InitConfigPanel(CharacterSelectController self) { yield return (object)new WaitForFixedUpdate(); yield return (object)new WaitForFixedUpdate(); Transform val = ((Component)self).transform.Find("SafeArea/LeftHandPanel (Layer: Main)"); Transform val2 = ((Component)self).transform.Find("SafeArea/RightHandPanel"); if (!Object.op_Implicit((Object)(object)CachedPrefab)) { CachePrefabFromSurvivorGrid(val, "SurvivorChoiceGrid, Panel"); } GameObject val3 = Object.Instantiate<GameObject>(CachedPrefab, ((Component)self).transform.Find("SafeArea"), false); Transform val4 = val2.Find("PopoutPanelContainer"); GameObject val5 = Object.Instantiate<GameObject>(((Component)val4.Find("PopoutPanelPrefab")).gameObject, val4); val3.GetComponent<ConfigPanelController>().popoutPanel = val5; HGGamepadInputEvent val6 = ((Component)self).GetComponents<HGGamepadInputEvent>().First((HGGamepadInputEvent el) => el.actionName == "UIPageRight"); val6.requiredTopLayer = ((Component)val).GetComponent<UILayerKey>(); HGGamepadInputEvent obj = ((Component)self).gameObject.AddComponent<HGGamepadInputEvent>(); obj.actionName = val6.actionName; obj.actionEvent = val6.actionEvent; obj.requiredTopLayer = ((Component)val.Find("SurvivorInfoPanel, Active (Layer: Secondary)")).GetComponent<UILayerKey>(); obj.enabledObjectsIfActive = Array.Empty<GameObject>(); Transform ruleLayout = val2.Find("RuleLayoutActive (Layer: Tertiary)"); UILayerKey ruleLayoutLayer = ((Component)ruleLayout).GetComponent<UILayerKey>(); HGGamepadInputEvent val7 = ((Component)self).GetComponents<HGGamepadInputEvent>().First((HGGamepadInputEvent input) => input.actionName == "UIPageLeft" && (Object)(object)input.requiredTopLayer == (Object)(object)ruleLayoutLayer); HGGamepadInputEvent val8 = ((Component)ruleLayout).gameObject.AddComponent<HGGamepadInputEvent>(); val8.actionName = "UIPageRight"; val8.actionEvent = val3.GetComponent<EventHolder>().unityEvent; val8.requiredTopLayer = ruleLayoutLayer; val8.enabledObjectsIfActive = Array.Empty<GameObject>(); HGGamepadInputEvent obj2 = ((Component)ruleLayout).gameObject.AddComponent<HGGamepadInputEvent>(); obj2.actionName = val8.actionName; obj2.actionEvent = val7.actionEvent; obj2.requiredTopLayer = val8.requiredTopLayer; obj2.enabledObjectsIfActive = Array.Empty<GameObject>(); HGGamepadInputEvent component = val3.GetComponent<HGGamepadInputEvent>(); component.actionEvent.AddListener((UnityAction)delegate { ((Component)ruleLayout).gameObject.SetActive(true); }); HGGamepadInputEvent obj3 = val3.AddComponent<HGGamepadInputEvent>(); obj3.actionName = "UICancel"; obj3.actionEvent = component.actionEvent; obj3.requiredTopLayer = component.requiredTopLayer; obj3.enabledObjectsIfActive = component.enabledObjectsIfActive; } private static void CachePrefabFromSurvivorGrid(Transform panel, string survivorGridName) { //IL_0098: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)CachedPrefab)) { Transform obj = panel.Find(survivorGridName); CachedPrefab = AssetBundleHelper.LoadPrefab("ConfigPanel"); CachedPrefab.GetComponent<Image>().sprite = ((Component)panel.Find("BorderImage")).GetComponent<Image>().sprite; Sprite sprite = ((Component)obj.Find("SurvivorIconPrefab/BaseOutline")).GetComponent<Image>().sprite; Sprite sprite2 = ((Component)obj.Find("SurvivorIconPrefab/HoverOutline")).GetComponent<Image>().sprite; UISkinData val = Object.Instantiate<UISkinData>(((BaseSkinController)((Component)obj.Find("WIPClassButtonPrefab")).GetComponent<ButtonSkinController>()).skinData); ((ColorBlock)(ref val.buttonStyle.colors)).normalColor = Color.white; HGButton[] componentsInChildren = CachedPrefab.GetComponentsInChildren<HGButton>(); foreach (HGButton obj2 in componentsInChildren) { ((BaseSkinController)((Component)obj2).GetComponent<ButtonSkinController>()).skinData = val; ((Component)((Component)obj2).transform.Find("BaseOutline")).GetComponent<Image>().sprite = sprite; ((Component)((Component)obj2).transform.Find("HoverOutline")).GetComponent<Image>().sprite = sprite2; } } } } public class ConfigSectionController : MonoBehaviour { public BooleanFieldController enableButtonController; public Button contentToggleButton; public GameObject contentContainer; public string sectionName; public IEnumerable<IConfigField> fields; public BooleanConfigField enableField; public TextMeshProUGUI modNameText; private bool initialized; public void Start() { ((TMP_Text)modNameText).text = "[" + sectionName + "]"; if (enableField == null) { ((Component)enableButtonController).gameObject.SetActive(false); } else { enableButtonController.configField = enableField; } if (contentContainer.activeSelf) { InitContent(); } } public void ToggleContent() { if (Object.op_Implicit((Object)(object)contentContainer)) { contentContainer.SetActive(!contentContainer.activeSelf); if (contentContainer.activeSelf) { InitContent(); } } } private void InitContent() { if (initialized) { return; } foreach (IConfigField field in fields) { if (!Object.op_Implicit((Object)(object)field.FieldPrefab)) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)$"FieldPrefab for `{field.DisplayName}` of type `{field.GetType()}` doesn't exists"); continue; } GameObject val = Object.Instantiate<GameObject>(field.FieldPrefab, contentContainer.transform); if (!Object.op_Implicit((Object)(object)val)) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)("Failed to instantiate FieldPrefab for `" + field.DisplayName + "`")); continue; } ConfigFieldController component = val.GetComponent<ConfigFieldController>(); if (!Object.op_Implicit((Object)(object)component)) { InLobbyConfigPlugin.InstanceLogger.LogWarning((object)("FieldPrefab for `" + field.DisplayName + "` doesn't contain `ConfigFieldController`")); } else { component.configField = field; } } initialized = true; } } public class DelayedTooltipProvider : TooltipProvider, IPointerEnterHandler, IEventSystemHandler, IPointerExitHandler { public float delayInSeconds = 0.5f; void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData) { EventSystem current = EventSystem.current; MPEventSystem val = (MPEventSystem)(object)((current is MPEventSystem) ? current : null); if (Object.op_Implicit((Object)(object)val)) { ((MonoBehaviour)this).StartCoroutine(DelayTooltipOpen(val, eventData)); } } void IPointerExitHandler.OnPointerExit(PointerEventData eventData) { ((MonoBehaviour)this).StopAllCoroutines(); EventSystem current = EventSystem.current; MPEventSystem val = (MPEventSystem)(object)((current is MPEventSystem) ? current : null); if (Object.op_Implicit((Object)(object)val)) { TooltipController.RemoveTooltip(val, (TooltipProvider)(object)this); } } private IEnumerator DelayTooltipOpen(MPEventSystem eventSystem, PointerEventData eventData) { yield return (object)new WaitForSeconds(delayInSeconds); TooltipController.SetTooltip(eventSystem, (TooltipProvider)(object)this, eventData.position, (RectTransform)null); } } public class EventHolder : MonoBehaviour { public string customName; public UnityEvent unityEvent; } public class FlipVertical : MonoBehaviour { public void Flip() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) ((Component)this).transform.localScale = new Vector3(((Component)this).transform.localScale.x, ((Component)this).transform.localScale.y * -1f, ((Component)this).transform.localScale.z); } } public class ModConfigController : MonoBehaviour { public BooleanFieldController enableButtonController; public Button contentToggleButton; public GameObject contentContainer; public ModConfigEntry configEntry; public TextMeshProUGUI modNameText; public Button closeSearchButton; public Button searchButton; public TMP_InputField searchField; private readonly List<ConfigSectionController> sectionControllers = new List<ConfigSectionController>(); private bool initialized; public void Start() { //IL_008e: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) if (configEntry != null) { ((TMP_Text)modNameText).text = configEntry.DisplayName; if (configEntry.EnableField == null) { ((Component)enableButtonController).gameObject.SetActive(false); } else { enableButtonController.configField = configEntry.EnableField; } if (configEntry.SectionFields.Count < 2) { ((Component)searchButton).gameObject.SetActive(false); ((TMP_Text)modNameText).rectTransform.anchoredPosition = new Vector2(-46f, 0f); ((TMP_Text)modNameText).rectTransform.sizeDelta = new Vector2(-102f, 0f); } if (configEntry.SectionFields.Count == 0 && configEntry.SectionFields.All((KeyValuePair<string, IEnumerable<IConfigField>> row) => row.Value.Count() == 0)) { ((Component)contentToggleButton).gameObject.SetActive(false); } if (contentContainer.activeSelf) { InitContent(); } } } public void ToggleContent() { if (Object.op_Implicit((Object)(object)contentContainer)) { contentContainer.SetActive(!contentContainer.activeSelf); if (contentContainer.activeSelf) { InitContent(); } } } private void InitContent() { if (initialized) { return; } foreach (KeyValuePair<string, IEnumerable<IConfigField>> sectionField in configEntry.SectionFields) { ConfigSectionController component = Object.Instantiate<GameObject>(AssetBundleHelper.LoadPrefab("SectionPrefab"), contentContainer.transform).GetComponent<ConfigSectionController>(); component.sectionName = sectionField.Key; component.fields = sectionField.Value; configEntry.SectionEnableFields.TryGetValue(sectionField.Key, out component.enableField); sectionControllers.Add(component); } initialized = true; } public void UpdateFilter(string value) { if (Object.op_Implicit((Object)(object)contentContainer) && !contentContainer.activeSelf) { ((Component)((Component)contentToggleButton).transform).GetComponentInChildren<FlipVertical>()?.Flip(); contentContainer.SetActive(true); } foreach (ConfigSectionController sectionController in sectionControllers) { bool active = sectionController.sectionName.Contains(value, StringComparison.OrdinalIgnoreCase); ((Component)sectionController).gameObject.SetActive(active); } } public void OpenSearch() { InitContent(); if (Object.op_Implicit((Object)(object)contentContainer) && !contentContainer.activeSelf) { ((Component)((Component)contentToggleButton).transform).GetComponentInChildren<FlipVertical>()?.Flip(); contentContainer.SetActive(true); } ((Component)searchField).gameObject.SetActive(true); ((Component)searchButton).gameObject.SetActive(false); ((Component)closeSearchButton).gameObject.SetActive(true); ((Selectable)searchField).Select(); } public void CloseSearch() { searchField.text = null; ((Component)searchField).gameObject.SetActive(false); ((Component)closeSearchButton).gameObject.SetActive(false); ((Component)searchButton).gameObject.SetActive(true); foreach (ConfigSectionController sectionController in sectionControllers) { ((Component)sectionController).gameObject.SetActive(true); } } } public class RoRToggle : Toggle { private SelectionState previousState = (SelectionState)4; public Sprite onSprite; public Sprite offSprite; protected override void Start() { ((Toggle)this).Start(); ((UnityEvent<bool>)(object)base.onValueChanged).AddListener((UnityAction<bool>)ToggleImage); ToggleImage(((Toggle)this).isOn); } private void ToggleImage(bool newValue) { if (Object.op_Implicit((Object)(object)RoR2Application.instance)) { Util.PlaySound("Play_UI_menuClick", ((Component)RoR2Application.instance).gameObject); } ((Selectable)this).image.sprite = (newValue ? onSprite : offSprite); } protected override void DoStateTransition(SelectionState state, bool instant) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) ((Selectable)this).DoStateTransition(state, instant); if (previousState != state) { if ((int)state == 1 && Object.op_Implicit((Object)(object)RoR2Application.instance)) { Util.PlaySound("Play_UI_menuHover", ((Component)RoR2Application.instance).gameObject); } previousState = state; } } } [AddComponentMenu("UI/Searchable Dropdown", 35)] [RequireComponent(typeof(RectTransform))] public class SearchableDropdown : TMP_InputField, IEventSystemHandler, ICancelHandler { public class OptionData { public object Value { get; set; } public string Text { get; set; } public Sprite Image { get; set; } public OptionData() { } public OptionData(object value, string text) { Value = value; Text = text; } public OptionData(object value, Sprite image) { Value = value; Image = image; } public OptionData(object value, string text, Sprite image) { Value = value; Text = text; Image = image; } } [Serializable] public class DropdownEvent : UnityEvent<object> { } internal class FloatTweenRunner { protected MonoBehaviour m_CoroutineContainer; protected IEnumerator m_Tween; private static IEnumerator Start(FloatTween tweenInfo) { if (tweenInfo.ValidTarget()) { float elapsedTime = 0f; while ((double)elapsedTime < (double)tweenInfo.duration) { elapsedTime += (tweenInfo.ignoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime); tweenInfo.TweenValue(Mathf.Clamp01(elapsedTime / tweenInfo.duration)); yield return null; } tweenInfo.TweenValue(1f); } } public void Init(MonoBehaviour coroutineContainer) { m_CoroutineContainer = coroutineContainer; } public void StartTween(FloatTween info) { if ((Object)(object)m_CoroutineContainer == (Object)null) { Debug.LogWarning((object)"Coroutine container not configured... did you forget to call Init?"); return; } StopTween(); if (!((Component)m_CoroutineContainer).gameObject.activeInHierarchy) { info.TweenValue(1f); return; } m_Tween = Start(info); m_CoroutineContainer.StartCoroutine(m_Tween); } public void StopTween() { if (m_Tween != null) { m_CoroutineContainer.StopCoroutine(m_Tween); m_Tween = null; } } } internal struct FloatTween { public class FloatTweenCallback : UnityEvent<float> { } private FloatTweenCallback m_Target; private float m_StartValue; private float m_TargetValue; private float m_Duration; private bool m_IgnoreTimeScale; public float startValue { get { return m_StartValue; } set { m_StartValue = value; } } public float targetValue { get { return m_TargetValue; } set { m_TargetValue = value; } } public float duration { get { return m_Duration; } set { m_Duration = value; } } public bool ignoreTimeScale { get { return m_IgnoreTimeScale; } set { m_IgnoreTimeScale = value; } } public void TweenValue(float floatPercentage) { if (ValidTarget()) { ((UnityEvent<float>)m_Target).Invoke(Mathf.Lerp(m_StartValue, m_TargetValue, floatPercentage)); } } public void AddOnChangedCallback(UnityAction<float> callback) { if (m_Target == null) { m_Target = new FloatTweenCallback(); } ((UnityEvent<float>)m_Target).AddListener(callback); } public bool GetIgnoreTimescale() { return m_IgnoreTimeScale; } public float GetDuration() { return m_Duration; } public bool ValidTarget() { return m_Target != null; } } [SerializeField] private RectTransform m_Template; [Space] [SerializeField] private TMP_Text m_ItemText; [SerializeField] private Image m_ItemImage; [SerializeField] private TMP_Text m_SelectText; [Space] private GameObject m_Dropdown; private GameObject m_Blocker; private List<DropdownItem> m_Items = new List<DropdownItem>(); private FloatTweenRunner m_AlphaTweenRunner; private bool validTemplate; private Canvas rootCanvas; private Vector2 initialContentSizeDelta; private Vector2 initialDropdownSizeDelta; [SerializeField] private DropdownEvent m_OnItemSelected; public RectTransform template { get { return m_Template; } set { m_Template = value; } } public TMP_Text itemText { get { return m_ItemText; } set { m_ItemText = value; } } public Image itemImage { get { return m_ItemImage; } set { m_ItemImage = value; } } public TMP_Text selectText => m_SelectText; public List<OptionData> Options { get; set; } = new List<OptionData>(); public DropdownEvent OnItemSelected { get { return m_OnItemSelected; } set { m_OnItemSelected = value; } } public bool IsExpanded => (Object)(object)m_Dropdown != (Object)null; protected SearchableDropdown() { } protected override void Awake() { ((Selectable)this).Awake(); m_AlphaTweenRunner = new FloatTweenRunner(); m_AlphaTweenRunner.Init((MonoBehaviour)(object)this); if (Object.op_Implicit((Object)(object)m_Template)) { ((UnityEvent<string>)(object)((TMP_InputField)this).onValueChanged).AddListener((UnityAction<string>)ApplyOptionsFilter); } } protected override void OnEnable() { ((TMP_InputField)this).OnEnable(); ((Component)((TMP_InputField)this).textViewport).gameObject.SetActive(false); ((Component)m_SelectText).gameObject.SetActive(true); ((Component)m_Template).gameObject.SetActive(false); } protected override void Start() { ((UIBehaviour)this).Start(); } protected override void OnDisable() { ImmediateDestroyDropdownList(); if (!Object.op_Implicit((Object)(object)m_Blocker)) { DestroyBlocker(m_Blocker); } m_Blocker = null; } public void AddOptions(List<OptionData> options) { Options.AddRange(options); } public void AddOptions(Dictionary<object, string> options) { foreach (KeyValuePair<object, string> option in options) { Options.Add(new OptionData(option.Key, option.Value)); } } public void AddOptions(Dictionary<object, Sprite> options) { foreach (KeyValuePair<object, Sprite> option in options) { Options.Add(new OptionData(option.Key, option.Value)); } } public void ClearOptions() { Options.Clear(); } private void SetupTemplate() { validTemplate = false; if (!Object.op_Implicit((Object)(object)m_Template)) { Debug.LogError((object)"The dropdown template is not assigned. The template needs to be assigned and must have a child GameObject with a Toggle component serving as the item.", (Object)(object)this); return; } GameObject gameObject = ((Component)m_Template).gameObject; gameObject.SetActive(true); validTemplate = true; Button componentInChildren = gameObject.GetComponentInChildren<Button>(); if (!Object.op_Implicit((Object)(object)componentInChildren) || (Object)(object)((Component)componentInChildren).transform == (Object)(object)template) { validTemplate = false; Debug.LogError((object)"The dropdown template is not valid. The template must have a child GameObject with a Button component serving as the item.", (Object)(object)template); } else if (!(((Component)componentInChildren).transform.parent is RectTransform)) { validTemplate = false; Debug.LogError((object)"The dropdown template is not valid. The child GameObject with a Button component (the item) must have a RectTransform on its parent.", (Object)(object)template); } else if ((Object)(object)itemText != (Object)null && !itemText.transform.IsChildOf(((Component)componentInChildren).transform)) { validTemplate = false; Debug.LogError((object)"The dropdown template is not valid. The Item Text must be on the item GameObject or children of it.", (Object)(object)template); } else if ((Object)(object)itemImage != (Object)null && !((Component)itemImage).transform.IsChildOf(((Component)componentInChildren).transform)) { validTemplate = false; Debug.LogError((object)"The dropdown template is not valid. The Item Image must be on the item GameObject or children of it.", (Object)(object)template); } if (!validTemplate) { gameObject.SetActive(false); return; } Canvas orAddComponent = GetOrAddComponent<Canvas>(gameObject); orAddComponent.overrideSorting = true; orAddComponent.sortingOrder = 30000; GetOrAddComponent<GraphicRaycaster>(gameObject); GetOrAddComponent<CanvasGroup>(gameObject); gameObject.SetActive(false); validTemplate = true; } private static T GetOrAddComponent<T>(GameObject go) where T : Component { T val = go.GetComponent<T>(); if (!Object.op_Implicit((Object)(object)val)) { val = go.AddComponent<T>(); } return val; } public override void OnPointerClick(PointerEventData eventData) { Show(); ((Component)((TMP_InputField)this).textViewport).gameObject.SetActive(true); ((Component)m_SelectText).gameObject.SetActive(false); ((TMP_InputField)this).OnPointerClick(eventData); } public virtual void OnCancel(BaseEventData eventData) { Hide(); } public void Show() { //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Expected O, but got Unknown if (!((UIBehaviour)this).IsActive() || !((Selectable)this).IsInteractable() || Object.op_Implicit((Object)(object)m_Dropdown)) { return; } Canvas[] componentsInParent = ((Component)this).gameObject.GetComponentsInParent<Canvas>(false); if (componentsInParent.Length == 0) { return; } rootCanvas = componentsInParent[^1]; for (int i = 0; i < componentsInParent.Length; i++) { if (componentsInParent[i].isRootCanvas) { rootCanvas = componentsInParent[i]; break; } } componentsInParent = null; if (!validTemplate) { SetupTemplate(); if (!validTemplate) { return; } } ((Component)m_Template).gameObject.SetActive(true); ((Component)m_Template).GetComponent<Canvas>().sortingLayerID = rootCanvas.sortingLayerID; m_Dropdown = CreateDropdownList(((Component)m_Template).gameObject); ((Object)m_Dropdown).name = "Dropdown List"; m_Dropdown.SetActive(true); Transform transform = m_Dropdown.transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); ((Transform)val).SetParent(((Component)m_Template).transform.parent, false); DropdownItem componentInChildren = m_Dropdown.GetComponentInChildren<DropdownItem>(); Transform transform2 = ((Component)((Transform)componentInChildren.rectTransform).parent).gameObject.transform; RectTransform val2 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null); initialContentSizeDelta = val2.sizeDelta; initialDropdownSizeDelta = val.sizeDelta; ((Component)componentInChildren.rectTransform).gameObject.SetActive(true); m_Items.Clear(); for (int j = 0; j < Options.Count; j++) { DropdownItem item = AddItem(Options[j], componentInChildren, m_Items); if (Object.op_Implicit((Object)(object)item.button)) { ((UnityEvent)item.button.onClick).AddListener((UnityAction)delegate { OnSelectItem(item.Value); }); } } RecalculateDropdownBounds(); AlphaFadeList(0.15f, 0f, 1f); ((Component)m_Template).gameObject.SetActive(false); ((Component)componentInChildren).gameObject.SetActive(false); m_Blocker = CreateBlocker(rootCanvas); } private void RecalculateDropdownBounds() { //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_007d: 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_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: 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_00c9: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0174: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Unknown result type (might be due to invalid IL or missing references) //IL_02c1: Unknown result type (might be due to invalid IL or missing references) //IL_02cf: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0314: Unknown result type (might be due to invalid IL or missing references) //IL_031e: Unknown result type (might be due to invalid IL or missing references) //IL_032c: 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_0344: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_0227: 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_01fd: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_024a: Unknown result type (might be due to invalid IL or missing references) //IL_024f: Unknown result type (might be due to invalid IL or missing references) Transform transform = m_Dropdown.transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); DropdownItem componentInChildren = m_Dropdown.GetComponentInChildren<DropdownItem>(true); Transform transform2 = ((Component)((Transform)componentInChildren.rectTransform).parent).gameObject.transform; RectTransform val2 = (RectTransform)(object)((transform2 is RectTransform) ? transform2 : null); IEnumerable<DropdownItem> source = m_Items.Where((DropdownItem el) => ((Component)el).gameObject.activeSelf); val2.sizeDelta = initialContentSizeDelta; val.sizeDelta = initialDropdownSizeDelta; Rect rect = val2.rect; Rect rect2 = componentInChildren.rectTransform.rect; Vector2 val3 = ((Rect)(ref rect2)).min - ((Rect)(ref rect)).min + Vector2.op_Implicit(((Transform)componentInChildren.rectTransform).localPosition); Vector2 val4 = ((Rect)(ref rect2)).max - ((Rect)(ref rect)).max + Vector2.op_Implicit(((Transform)componentInChildren.rectTransform).localPosition); Vector2 size = ((Rect)(ref rect2)).size; Vector2 sizeDelta = val2.sizeDelta; sizeDelta.y = size.y * (float)source.Count() + val3.y - val4.y; val2.sizeDelta = sizeDelta; Rect rect3 = val.rect; double num = ((Rect)(ref rect3)).height; rect3 = val2.rect; double num2 = ((Rect)(ref rect3)).height; float num3 = (float)(num - num2); if ((double)num3 > 0.0) { val.sizeDelta = new Vector2(val.sizeDelta.x, val.sizeDelta.y - num3); } Vector3[] array = (Vector3[])(object)new Vector3[4]; val.GetWorldCorners(array); Transform transform3 = ((Component)rootCanvas).transform; RectTransform val5 = (RectTransform)(object)((transform3 is RectTransform) ? transform3 : null); Rect rect4 = val5.rect; for (int i = 0; i < 2; i++) { bool flag = false; for (int j = 0; j < 4; j++) { Vector3 val6 = ((Transform)val5).InverseTransformPoint(array[j]); double num4 = ((Vector3)(ref val6))[i]; Vector2 val7 = ((Rect)(ref rect4)).min; double num5 = ((Vector2)(ref val7))[i]; if (num4 < num5) { double num6 = ((Vector3)(ref val6))[i]; val7 = ((Rect)(ref rect4)).min; double num7 = ((Vector2)(ref val7))[i]; if (!Mathf.Approximately((float)num6, (float)num7)) { goto IL_0268; } } double num8 = ((Vector3)(ref val6))[i]; val7 = ((Rect)(ref rect4)).max; double num9 = ((Vector2)(ref val7))[i]; if (!(num8 > num9)) { continue; } double num10 = ((Vector3)(ref val6))[i]; val7 = ((Rect)(ref rect4)).max; double num11 = ((Vector2)(ref val7))[i]; if (Mathf.Approximately((float)num10, (float)num11)) { continue; } goto IL_0268; IL_0268: flag = true; break; } if (flag) { RectTransformUtility.FlipLayoutOnAxis(val, i, false, false); } } for (int k = 0; k < source.Count(); k++) { RectTransform rectTransform = source.ElementAt(k).rectTransform; rectTransform.anchorMin = new Vector2(rectTransform.anchorMin.x, 0f); rectTransform.anchorMax = new Vector2(rectTransform.anchorMax.x, 0f); rectTransform.anchoredPosition = new Vector2(rectTransform.anchoredPosition.x, (float)((double)val3.y + (double)size.y * (double)(source.Count() - 1 - k) + (double)size.y * (double)rectTransform.pivot.y)); rectTransform.sizeDelta = new Vector2(rectTransform.sizeDelta.x, size.y); } } protected virtual GameObject CreateBlocker(Canvas rootCanvas) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Expected O, but got Unknown //IL_00ad: Expected O, but got Unknown GameObject val = new GameObject("Blocker"); RectTransform obj = val.AddComponent<RectTransform>(); ((Transform)obj).SetParent(((Component)rootCanvas).transform, false); obj.anchorMin = Vector2.op_Implicit(Vector3.zero); obj.anchorMax = Vector2.op_Implicit(Vector3.one); obj.sizeDelta = Vector2.zero; Canvas obj2 = val.AddComponent<Canvas>(); obj2.overrideSorting = true; Canvas component = m_Dropdown.GetComponent<Canvas>(); obj2.sortingLayerID = component.sortingLayerID; obj2.sortingOrder = component.sortingOrder - 1; val.AddComponent<GraphicRaycaster>(); ((Graphic)val.AddComponent<Image>()).color = Color.clear; ((UnityEvent)val.AddComponent<Button>().onClick).AddListener(new UnityAction(Hide)); return val; } protected virtual void DestroyBlocker(GameObject blocker) { Object.Destroy((Object)(object)blocker); } protected virtual GameObject CreateDropdownList(GameObject template) { return Object.Instantiate<GameObject>(template); } protected virtual void DestroyDropdownList(GameObject dropdownList) { Object.Destroy((Object)(object)dropdownList); } protected virtual DropdownItem CreateItem(DropdownItem itemTemplate) { return Object.Instantiate<DropdownItem>(itemTemplate); } protected virtual void DestroyItem(DropdownItem item) { } private DropdownItem AddItem(OptionData data, DropdownItem itemTemplate, List<DropdownItem> items) { DropdownItem dropdownItem = CreateItem(itemTemplate); ((Transform)dropdownItem.rectTransform).SetParent(((Transform)itemTemplate.rectTransform).parent, false); ((Component)dropdownItem).gameObject.SetActive(true); ((Object)((Component)dropdownItem).gameObject).name = "Item " + items.Count + ((data.Text != null) ? (": " + data.Text) : ""); if (Object.op_Implicit((Object)(object)dropdownItem.text)) { dropdownItem.text.text = data.Text; } if (Object.op_Implicit((Object)(object)dropdownItem.image)) { dropdownItem.image.sprite = data.Image; ((Behaviour)dropdownItem.image).enabled = Object.op_Implicit((Object)(object)dropdownItem.image.sprite); } dropdownItem.Value = data.Value; items.Add(dropdownItem); return dropdownItem; } private void AlphaFadeList(float duration, float alpha) { CanvasGroup component = m_Dropdown.GetComponent<CanvasGroup>(); AlphaFadeList(duration, component.alpha, alpha); } private void AlphaFadeList(float duration, float start, float end) { if (!end.Equals(start)) { FloatTween floatTween = default(FloatTween); floatTween.duration = duration; floatTween.startValue = start; floatTween.targetValue = end; FloatTween info = floatTween; info.AddOnChangedCallback(SetAlpha); info.ignoreTimeScale = true; m_AlphaTweenRunner.StartTween(info); } } private void SetAlpha(float alpha) { if (Object.op_Implicit((Object)(object)m_Dropdown)) { m_Dropdown.GetComponent<CanvasGroup>().alpha = alpha; } } public void Hide() { if (Object.op_Implicit((Object)(object)m_Dropdown)) { AlphaFadeList(0.15f, 0f); if (((UIBehaviour)this).IsActive()) { ((MonoBehaviour)this).StartCoroutine(DelayedDestroyDropdownList(0.15f)); } } if (Object.op_Implicit((Object)(object)m_Blocker)) { DestroyBlocker(m_Blocker); } m_Blocker = null; ((Selectable)this).Select(); ((Component)((TMP_InputField)this).textViewport).gameObject.SetActive(false); ((Component)m_SelectText).gameObject.SetActive(true); ((TMP_InputField)this).SetTextWithoutNotify(string.Empty); } private IEnumerator DelayedDestroyDropdownList(float delay) { yield return (object)new WaitForSecondsRealtime(delay); ImmediateDestroyDropdownList(); } private void ImmediateDestroyDropdownList() { for (int i = 0; i < m_Items.Count; i++) { if (Object.op_Implicit((Object)(object)m_Items[i])) { DestroyItem(m_Items[i]); } } m_Items.Clear(); if (Object.op_Implicit((Object)(object)m_Dropdown)) { DestroyDropdownList(m_Dropdown); } m_Dropdown = null; } private void OnSelectItem(object value) { ((UnityEvent<object>)m_OnItemSelected)?.Invoke(value); Hide(); } private void ApplyOptionsFilter(string filter) { foreach (DropdownItem item in m_Items) { ((Component)item).gameObject.SetActive(ContainsInSequence(item.text.text, filter)); } RecalculateDropdownBounds(); } private bool ContainsInSequence(string target, string input) { string text = target.ToLowerInvariant(); string text2 = input.ToLowerInvariant(); if (input.Length == 0 || target.Length == 0) { return true; } int num = 0; for (int i = 0; i < text.Length; i++) { if (text[i] == text2[num]) { num++; } if (num == text2.Length) { return true; } } return false; } } } namespace InLobbyConfig.Components.TMP { public class DropdownItem : MonoBehaviour, IEventSystemHandler, ICancelHandler { public TMP_Text text; public Image image; public RectTransform rectTransform; public Button button; [HideInInspector] public object Value { get; set; } public virtual void OnCancel(BaseEventData eventData) { SearchableDropdown componentInParent = ((Component)this).GetComponentInParent<SearchableDropdown>(); if (Object.op_Implicit((Object)(object)componentInParent)) { componentInParent.Hide(); } } } }