Decompiled source of Mods Communicator Menu v0.0.1
OutwardModsCommunicatorMenu.dll
Decompiled 2 days 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.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using OutwardModsCommunicator.EventBus; using OutwardModsCommunicator.Managers; using OutwardModsCommunicatorMenu.Events.Publishers; using OutwardModsCommunicatorMenu.Managers; using OutwardModsCommunicatorMenu.Patches; using OutwardModsCommunicatorMenu.UI; using OutwardModsCommunicatorMenu.UI.Builders; using OutwardModsCommunicatorMenu.UI.Components; using OutwardModsCommunicatorMenu.Utility; using OutwardModsCommunicatorMenu.Utility.Enums; using OutwardModsCommunicatorMenu.Utility.Helpers; using SideLoader; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; using UniverseLib; using UniverseLib.Config; using UniverseLib.UI; using UniverseLib.UI.Models; using UniverseLib.UI.Panels; using UniverseLib.UI.Widgets; using UniverseLib.Utility; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("OutwardModsCommunicatorMenu")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("OutwardModsCommunicatorMenu")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c5450fe0-edcf-483f-b9ea-4b1ef9d36da7")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace OutwardModsCommunicatorMenu { [BepInPlugin("gymmed.mods_communicator_menu", "Mods Communicator Menu", "0.0.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class OMCM : BaseUnityPlugin { public const string GUID = "gymmed.mods_communicator_menu"; public const string NAME = "Mods Communicator Menu"; public const string VERSION = "0.0.1"; public static string prefix = "[Mods-Communicator-Menu]"; public const string EVENTS_LISTENER_GUID = "gymmed.mods_communicator_menu_*"; internal static ManualLogSource Log; internal void Awake() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) try { Log = ((BaseUnityPlugin)this).Logger; LogMessage("Hello world from Mods Communicator Menu 0.0.1!"); Universe.Init(1f, (Action)delegate { LogMessage("UniverseLib initialized"); }, (Action<string, LogType>)delegate(string msg, LogType type) { LogMessage("[UniverseLib] " + msg); }, new UniverseLibConfig { Force_Unlock_Mouse = true }); new Harmony("gymmed.mods_communicator_menu").PatchAll(); UIManager.Instance.Initialize(Log); LogMessage("Awake completed successfully"); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)("[OMCM] Error in Awake: " + ex.GetType().Name + ": " + ex.Message + "\n" + ex.StackTrace)); } } internal void Update() { UIManager.Instance.OnUpdate(); } public static void LogMessage(string message) { Log.LogMessage((object)(prefix + " " + message)); } public static void LogStatusMessage(string message, ChatLogStatus status = ChatLogStatus.Info) { LogMessage($"[{status}] {message}"); } public static void LogSL(string message) { SL.Log(prefix + " " + message); } public static string GetProjectLocation() { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } } } namespace OutwardModsCommunicatorMenu.Utility { public static class CollectionValueParser { public static (object result, string error) TryParse(Type collectionType, string valueString) { if (collectionType == null || string.IsNullOrWhiteSpace(valueString)) { return (null, "Type or value is null/empty"); } if (!IsCollectionType(collectionType)) { return (null, "Type '" + collectionType.Name + "' is not a collection type"); } Type elementType = GetElementType(collectionType); if (elementType == null) { return (null, "Cannot determine element type for '" + collectionType.Name + "'"); } string[] array = valueString.Split(new char[1] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (array.Length == 0) { return (null, "No values provided"); } if (collectionType.IsArray) { return TryParseArray(elementType, array); } return TryParseCollection(collectionType, elementType, array); } private static (object result, string error) TryParseArray(Type elementType, string[] values) { List<object> list = new List<object>(); for (int i = 0; i < values.Length; i++) { var (item, text) = ParseValue(elementType, values[i]); if (text != null) { return (null, $"Invalid value at position {i + 1}: {text}"); } list.Add(item); } try { Array array = Array.CreateInstance(elementType, list.Count); for (int j = 0; j < list.Count; j++) { array.SetValue(list[j], j); } return (array, null); } catch (Exception ex) { return (null, "Failed to create array: " + ex.Message); } } private static (object result, string error) TryParseCollection(Type collectionType, Type elementType, string[] values) { List<object> list = new List<object>(); for (int i = 0; i < values.Length; i++) { var (item, text) = ParseValue(elementType, values[i]); if (text != null) { return (null, $"Invalid value at position {i + 1}: {text}"); } list.Add(item); } try { bool num = IsSetType(collectionType); bool flag = IsListType(collectionType); bool flag2 = typeof(ICollection).IsAssignableFrom(collectionType); bool flag3 = typeof(IEnumerable).IsAssignableFrom(collectionType); object obj; if (num || (flag3 && !flag && collectionType.GetConstructor(Type.EmptyTypes) != null)) { Type type = typeof(HashSet<>).MakeGenericType(elementType); obj = Activator.CreateInstance(type); MethodInfo method = type.GetMethod("Add"); foreach (object item2 in list) { method.Invoke(obj, new object[1] { item2 }); } } else if (flag || (flag2 && collectionType.GetConstructor(Type.EmptyTypes) != null)) { Type type2 = typeof(List<>).MakeGenericType(elementType); obj = Activator.CreateInstance(type2); MethodInfo method2 = type2.GetMethod("Add"); foreach (object item3 in list) { method2.Invoke(obj, new object[1] { item3 }); } } else { if (!collectionType.IsAssignableFrom(typeof(List<>).MakeGenericType(elementType))) { return (null, "Cannot instantiate collection type '" + collectionType.Name + "'"); } Type type3 = typeof(List<>).MakeGenericType(elementType); obj = Activator.CreateInstance(type3); MethodInfo method3 = type3.GetMethod("Add"); foreach (object item4 in list) { method3.Invoke(obj, new object[1] { item4 }); } } return (obj, null); } catch (Exception ex) { return (null, "Failed to create collection: " + ex.Message); } } private static (object result, string error) ParseValue(Type targetType, string valueString) { if (string.IsNullOrWhiteSpace(valueString)) { return (null, "Empty value"); } valueString = valueString.Trim(); if (targetType.IsEnum) { try { return (Enum.Parse(targetType, valueString, ignoreCase: true), null); } catch { string text = string.Join(", ", Enum.GetNames(targetType)); return (null, "Invalid enum value. Expected one of: " + text); } } object item = default(object); Exception ex = default(Exception); if (ParseUtility.TryParse(valueString, targetType, ref item, ref ex)) { return (item, null); } return (null, "Cannot convert '" + valueString + "' to " + targetType.Name); } public static bool IsCollectionType(Type type) { if (type == null) { return false; } if (type.IsArray) { return true; } if (typeof(IEnumerable).IsAssignableFrom(type)) { if (type.IsGenericType) { Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(HashSet<>) || genericTypeDefinition == typeof(List<>) || genericTypeDefinition == typeof(IList<>) || genericTypeDefinition == typeof(ICollection<>) || genericTypeDefinition == typeof(IEnumerable<>)) { return true; } } if (typeof(ICollection).IsAssignableFrom(type) && type.GetConstructor(Type.EmptyTypes) != null) { return true; } } return false; } public static Type GetElementType(Type collectionType) { if (collectionType == null) { return null; } if (collectionType.IsArray) { return collectionType.GetElementType(); } if (collectionType.IsGenericType) { Type[] genericArguments = collectionType.GetGenericArguments(); if (genericArguments.Length != 0) { return genericArguments[0]; } } Type[] interfaces = collectionType.GetInterfaces(); foreach (Type type in interfaces) { if (!type.IsGenericType) { continue; } Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (genericTypeDefinition == typeof(IEnumerable<>) || genericTypeDefinition == typeof(ICollection<>) || genericTypeDefinition == typeof(IList<>)) { Type[] genericArguments2 = type.GetGenericArguments(); if (genericArguments2.Length != 0) { return genericArguments2[0]; } } } return null; } private static bool IsSetType(Type type) { if (type == null) { return false; } if (type.IsGenericType) { Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (!(genericTypeDefinition == typeof(HashSet<>))) { return genericTypeDefinition == typeof(ISet<>); } return true; } return false; } private static bool IsListType(Type type) { if (type == null) { return false; } if (type.IsGenericType) { Type genericTypeDefinition = type.GetGenericTypeDefinition(); if (!(genericTypeDefinition == typeof(List<>)) && !(genericTypeDefinition == typeof(IList<>))) { return genericTypeDefinition == typeof(IList<>); } return true; } return typeof(IList).IsAssignableFrom(type); } } public class EventPayloadBuilder { private readonly struct ParseResult { public bool Success { get; } public object Value { get; } public string ErrorMessage { get; } private ParseResult(bool success, object value, string errorMessage) { Success = success; Value = value; ErrorMessage = errorMessage; } public static ParseResult CreateSuccess(object value) { return new ParseResult(success: true, value, null); } public static ParseResult CreateFailure(string errorMessage) { return new ParseResult(success: false, null, errorMessage); } } private class PayloadParameter { public string Name { get; } public Type Type { get; } public string Value { get; } public PayloadParameter(string name, Type type, string value) { Name = name; Type = type; Value = value; } } private readonly List<PayloadParameter> _parameters = new List<PayloadParameter>(); public void AddParameter(string name, Type type, string value) { _parameters.Add(new PayloadParameter(name, type, value)); } public (EventPayload payload, string errors) Build() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown EventPayload val = new EventPayload(); StringBuilder stringBuilder = new StringBuilder(); foreach (PayloadParameter parameter in _parameters) { if (!string.IsNullOrEmpty(parameter.Name) && !(parameter.Type == null)) { string text = TypeNameFormatter.Format(parameter.Type); ParseResult parseResult = TryParseParameterValue(parameter.Type, parameter.Value); if (parseResult.Success) { ((Dictionary<string, object>)(object)val)[parameter.Name] = parseResult.Value; continue; } stringBuilder.AppendLine("Failed to parse '" + parameter.Value + "' as " + text + ": " + parseResult.ErrorMessage); } } return (val, stringBuilder.ToString()); } private static ParseResult TryParseParameterValue(Type type, string value) { if (string.IsNullOrEmpty(value)) { return ParseResult.CreateFailure("Empty value"); } if (CollectionValueParser.IsCollectionType(type)) { var (value2, text) = CollectionValueParser.TryParse(type, value); if (text != null) { return ParseResult.CreateFailure(text); } return ParseResult.CreateSuccess(value2); } Type enumType = GetEnumType(type); if (enumType != null) { if (TryParseEnumValue(enumType, value, out var result)) { return ParseResult.CreateSuccess(result); } string text2 = string.Join(", ", Enum.GetNames(enumType)); return ParseResult.CreateFailure("Expected one of: " + text2); } object value3 = default(object); Exception ex = default(Exception); if (ParseUtility.TryParse(value, type, ref value3, ref ex)) { return ParseResult.CreateSuccess(value3); } return ParseResult.CreateFailure("Unable to parse value"); } private static Type GetEnumType(Type type) { if (type.IsEnum) { return type; } Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null && underlyingType.IsEnum) { return underlyingType; } return null; } private static bool TryParseEnumValue(Type enumType, string valueString, out object result) { result = null; if (string.IsNullOrWhiteSpace(valueString) || enumType == null || !enumType.IsEnum) { return false; } try { result = Enum.Parse(enumType, valueString, ignoreCase: true); return true; } catch { return false; } } public void Clear() { _parameters.Clear(); } } public static class GenericTypeParser { private static readonly Dictionary<string, Type> SimpleTypeMap = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase) { { "string", typeof(string) }, { "int", typeof(int) }, { "bool", typeof(bool) }, { "float", typeof(float) }, { "double", typeof(double) }, { "decimal", typeof(decimal) }, { "long", typeof(long) }, { "short", typeof(short) }, { "byte", typeof(byte) }, { "char", typeof(char) }, { "object", typeof(object) }, { "void", typeof(void) }, { "hashset", typeof(HashSet<>) }, { "list", typeof(List<>) }, { "dictionary", typeof(Dictionary<, >) }, { "queue", typeof(Queue<>) }, { "stack", typeof(Stack<>) }, { "set", typeof(HashSet<>) } }; public static Type Parse(string typeString) { if (string.IsNullOrWhiteSpace(typeString)) { return null; } typeString = typeString.Trim(); int num = typeString.IndexOf('['); int num2 = typeString.IndexOf('<'); if (num >= 0 && (num2 < 0 || num < num2)) { return ParseArrayType(typeString); } if (num2 >= 0) { return ParseGenericType(typeString); } return ParseSimpleType(typeString); } private static Type ParseArrayType(string typeString) { int num = typeString.IndexOf('['); if (num < 0) { return null; } string typeString2 = typeString.Substring(0, num); string text = typeString.Substring(num); Type type = Parse(typeString2); if (type == null) { return null; } if (text == "[]") { return type.MakeArrayType(); } int num2 = 1; for (int i = 1; i < text.Length; i++) { if (text[i] == ',') { num2++; } } return type.MakeArrayType(num2); } private static Type ParseGenericType(string typeString) { int num = typeString.IndexOf('<'); int num2 = typeString.LastIndexOf('>'); if (num < 0 || num2 < 0 || num2 <= num) { return null; } string typeName = typeString.Substring(0, num); List<Type> list = ParseGenericArguments(typeString.Substring(num + 1, num2 - num - 1)); if (list == null || list.Count == 0) { return null; } Type type = ParseSimpleType(typeName); if (type == null) { return null; } try { return type.MakeGenericType(list.ToArray()); } catch (Exception) { return null; } } private static List<Type> ParseGenericArguments(string argsString) { List<Type> list = new List<Type>(); int num = 0; int num2 = 0; for (int i = 0; i <= argsString.Length; i++) { switch ((i < argsString.Length) ? argsString[i] : ',') { case '<': case '[': num++; break; case '>': case ']': num--; break; case ',': { if (num != 0) { break; } string text = argsString.Substring(num2, i - num2).Trim(); if (!string.IsNullOrEmpty(text)) { Type type = Parse(text); if (type == null) { return null; } list.Add(type); } num2 = i + 1; break; } } } if (num2 < argsString.Length) { string text2 = argsString.Substring(num2).Trim(); if (!string.IsNullOrEmpty(text2)) { Type type2 = Parse(text2); if (type2 == null) { return null; } list.Add(type2); } } return list; } private static Type ParseSimpleType(string typeName) { if (string.IsNullOrWhiteSpace(typeName)) { return null; } typeName = typeName.Trim(); if (SimpleTypeMap.TryGetValue(typeName, out var value)) { return value; } if (typeName.EndsWith("?")) { Type type = ParseSimpleType(typeName.Substring(0, typeName.Length - 1)); if (type != null) { return typeof(Nullable<>).MakeGenericType(type); } return null; } return FindTypeInAssemblies(typeName); } private static Type FindTypeInAssemblies(string typeName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); if (Enumerable.Contains(typeName, '.') || Enumerable.Contains(typeName, '+')) { Type type = TryResolveNestedClass(typeName); if (type != null) { return type; } } Assembly[] array = assemblies; foreach (Assembly assembly in array) { try { Type type2 = assembly.GetType(typeName, throwOnError: false, ignoreCase: true); if (type2 != null) { return type2; } } catch (Exception) { } } array = assemblies; foreach (Assembly assembly2 in array) { try { string name = typeName; int num = typeName.LastIndexOf('.'); if (num >= 0) { name = typeName.Substring(num + 1); } Type type3 = assembly2.GetType(name, throwOnError: false, ignoreCase: true); if (type3 != null) { return type3; } } catch (Exception) { } } array = assemblies; foreach (Assembly assembly3 in array) { try { Type[] types = assembly3.GetTypes(); foreach (Type type4 in types) { if (string.Equals(type4.Name, typeName, StringComparison.OrdinalIgnoreCase) || string.Equals(type4.FullName, typeName, StringComparison.OrdinalIgnoreCase)) { return type4; } } } catch (Exception) { } } return null; } private static Type TryResolveNestedClass(string typeName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); List<string> list = new List<string>(); list.Add(typeName); if (Enumerable.Contains(typeName, '.')) { string[] array = typeName.Split(new char[1] { '.' }); for (int i = 1; i < array.Length; i++) { string item = string.Join(".", array, 0, array.Length - i) + "+" + string.Join("+", array, array.Length - i, i); if (!list.Contains(item)) { list.Add(item); } } list.Add(typeName.Replace(".", "+")); } if (Enumerable.Contains(typeName, '+')) { string item2 = typeName.Replace("+", "."); if (!list.Contains(item2)) { list.Add(item2); } string[] array2 = typeName.Split(new char[1] { '+' }); for (int j = 1; j < array2.Length; j++) { string item3 = string.Join("+", array2, 0, array2.Length - j) + "." + string.Join(".", array2, array2.Length - j, j); if (!list.Contains(item3)) { list.Add(item3); } } } Assembly[] array3 = assemblies; foreach (Assembly assembly in array3) { try { foreach (string item4 in list) { try { Type type = assembly.GetType(item4, throwOnError: false, ignoreCase: true); if (type != null) { return type; } } catch (Exception) { } } } catch (Exception) { } } array3 = assemblies; foreach (Assembly assembly2 in array3) { try { Type[] types = assembly2.GetTypes(); foreach (Type type2 in types) { string fullName = type2.FullName; if (fullName != null) { string a = (Enumerable.Contains(fullName, '+') ? fullName.Substring(fullName.LastIndexOf('+') + 1) : (Enumerable.Contains(fullName, '.') ? fullName.Substring(fullName.LastIndexOf('.') + 1) : fullName)); string b = (Enumerable.Contains(typeName, '+') ? typeName.Substring(typeName.LastIndexOf('+') + 1) : (Enumerable.Contains(typeName, '.') ? typeName.Substring(typeName.LastIndexOf('.') + 1) : typeName)); if (string.Equals(a, b, StringComparison.OrdinalIgnoreCase)) { return type2; } } } } catch (Exception) { } } return null; } public static bool IsGenericType(string typeString) { if (!string.IsNullOrWhiteSpace(typeString) && Enumerable.Contains(typeString, '<')) { return Enumerable.Contains(typeString, '>'); } return false; } public static bool IsArrayType(string typeString) { if (!string.IsNullOrWhiteSpace(typeString) && Enumerable.Contains(typeString, '[')) { return Enumerable.Contains(typeString, ']'); } return false; } } public static class KeybindingHelper { private const string CATEGORY = "Mods Communicator Menu"; public static void Register(string actionName, string displayName) { CustomKeybindings.AddAction(actionName, (KeybindingsCategory)0, (ControlType)2, (InputType)1); } public static bool IsKeyDown(string actionName) { return CustomKeybindings.GetKeyDown(actionName); } public static bool IsKeyHeld(string actionName) { return CustomKeybindings.GetKey(actionName); } } public static class TypeNameFormatter { public static string Format(Type type) { if (type == null) { return "null"; } if (type.IsArray) { return Format(type.GetElementType()) + "[]"; } Type underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { return Format(underlyingType) + "?"; } if (type.IsGenericType) { Type genericTypeDefinition = type.GetGenericTypeDefinition(); Type[] genericArguments = type.GetGenericArguments(); string genericTypeBaseName = GetGenericTypeBaseName(genericTypeDefinition.Name); string text = string.Join(", ", genericArguments.Select(Format)); return genericTypeBaseName + "<" + text + ">"; } if (type == typeof(string)) { return "string"; } if (type == typeof(int)) { return "int"; } if (type == typeof(bool)) { return "bool"; } if (type == typeof(float)) { return "float"; } if (type == typeof(double)) { return "double"; } return GetDisplayName(type); } private static string GetGenericTypeBaseName(string genericTypeDefinitionName) { int num = genericTypeDefinitionName.IndexOf('`'); if (num > 0) { return genericTypeDefinitionName.Substring(0, num); } return genericTypeDefinitionName; } private static string GetDisplayName(Type type) { List<string> nestedClassPath = GetNestedClassPath(type); bool num = HasNameCollision(nestedClassPath); string fullQualifiedName = GetFullQualifiedName(type); if (num) { return fullQualifiedName; } return string.Join(".", nestedClassPath); } private static List<string> GetNestedClassPath(Type type) { List<string> list = new List<string>(); Type type2 = type; while (type2 != null) { string text = type2.Name; int num = text.IndexOf('`'); if (num > 0) { text = text.Substring(0, num); } list.Insert(0, text); type2 = type2.DeclaringType; } return list; } private static string GetFullQualifiedName(Type type) { string @namespace = type.Namespace; List<string> nestedClassPath = GetNestedClassPath(type); if (string.IsNullOrEmpty(@namespace)) { return string.Join(".", nestedClassPath); } return @namespace + "." + string.Join(".", nestedClassPath); } private static bool HasNameCollision(List<string> nestedPath) { if (nestedPath.Count == 0) { return false; } string.Join(".", nestedPath); List<string> list = new List<string>(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { try { Type[] types = assembly.GetTypes(); foreach (Type type in types) { if (type.FullName == null) { continue; } List<string> nestedClassPath = GetNestedClassPath(type); if (nestedClassPath.Count != nestedPath.Count) { continue; } bool flag = true; for (int k = 0; k < nestedClassPath.Count; k++) { if (!string.Equals(nestedClassPath[k], nestedPath[k], StringComparison.OrdinalIgnoreCase)) { flag = false; break; } } if (flag) { list.Add(type.Namespace ?? ""); } } } catch { } } return list.Distinct().ToList().Count > 1; } } public static class TypeResolver { public static Type Resolve(string typeName) { if (string.IsNullOrEmpty(typeName)) { return null; } if (typeName.EndsWith("?")) { return ResolveNullableType(typeName); } return ResolveNonNullableType(typeName); } private static Type ResolveNullableType(string typeName) { Type type = ResolveNonNullableType(typeName.Substring(0, typeName.Length - 1)); if (type != null && type.IsValueType && type != typeof(void)) { return typeof(Nullable<>).MakeGenericType(type); } return type; } private static Type ResolveNonNullableType(string typeName) { if (TryGetSimpleType(typeName, out var result)) { return result; } return GenericTypeParser.Parse(typeName); } private static bool TryGetSimpleType(string typeName, out Type result) { result = typeName.ToLower() switch { "string" => typeof(string), "int" => typeof(int), "bool" => typeof(bool), "float" => typeof(float), "double" => typeof(double), "vector2" => typeof(Vector2), "vector3" => typeof(Vector3), "vector4" => typeof(Vector4), "quaternion" => typeof(Quaternion), "color" => typeof(Color), _ => null, }; return result != null; } public static string GetExampleInput(Type type) { return ParseUtility.GetExampleInput(type); } public static bool CanParse(Type type) { return ParseUtility.CanParse(type); } } } namespace OutwardModsCommunicatorMenu.Utility.Helpers { public static class CharacterHelpers { public static Character TryToFindOtherCharacterInLobby(Character mainCharacter, string otherCharName) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) Character val = null; foreach (PlayerSystem item in Global.Lobby.PlayersInLobby) { val = item.ControlledCharacter; if ((Object)(object)val != (Object)null && val.UID != mainCharacter.UID && string.Equals(otherCharName, val.Name)) { return val; } } return null; } public static Character TryToFindOtherCharacterInLobby(Character mainCharacter) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) Character val = null; foreach (PlayerSystem item in Global.Lobby.PlayersInLobby) { val = item.ControlledCharacter; if ((Object)(object)val != (Object)null && val.UID != mainCharacter.UID) { return val; } } return val; } public static bool IsCharacterInDistance(Character firstCharacter, Character secondCharacter, float minimumDistance) { //IL_0006: 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_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Component)firstCharacter).transform.position - ((Component)secondCharacter).transform.position; float sqrMagnitude = ((Vector3)(ref val)).sqrMagnitude; float num = minimumDistance * minimumDistance; if (sqrMagnitude > num) { return false; } return true; } public static bool HasManualMovement(Character character) { CharacterControl characterControl = character.CharacterControl; LocalCharacterControl val = (LocalCharacterControl)(object)((characterControl is LocalCharacterControl) ? characterControl : null); if (val == null) { return false; } if (((Vector2)(ref ((CharacterControl)val).m_moveInput)).sqrMagnitude > 0.01f) { return true; } return false; } } public static class ChatHelpers { public static void SendChatLog(ChatPanel panel, string message, ChatLogStatus status = ChatLogStatus.Info) { panel.ChatMessageReceived("System", ChatLogStatusHelper.GetChatLogText(message, status)); } public static void SendChatLog(Character character, string message, ChatLogStatus status = ChatLogStatus.Info) { CharacterUI characterUI = character.CharacterUI; if ((Object)(object)((characterUI != null) ? characterUI.ChatPanel : null) == (Object)null) { OMCM.LogMessage("ChatHelpers@SendChatLog provided character with missing chatPanel!"); } else { SendChatLog(character.CharacterUI.ChatPanel, message, status); } } public static void SendChatOrLog(Character character, string message, ChatLogStatus status = ChatLogStatus.Info) { CharacterUI characterUI = character.CharacterUI; if ((Object)(object)((characterUI != null) ? characterUI.ChatPanel : null) == (Object)null) { OMCM.LogStatusMessage(message, status); } else { SendChatLog(character.CharacterUI.ChatPanel, message, status); } } } } namespace OutwardModsCommunicatorMenu.Utility.Enums { public enum ChatCommandsManagerParams { CommandName, CommandParameters, CommandAction, IsCheatCommand, CommandDescription, CommandRequiresDebugMode } public static class ChatCommandsManagerParamsHelper { private static readonly Dictionary<ChatCommandsManagerParams, (string key, Type type)> _registry = new Dictionary<ChatCommandsManagerParams, (string, Type)> { [ChatCommandsManagerParams.CommandName] = ("command", typeof(string)), [ChatCommandsManagerParams.CommandParameters] = ("parameters", typeof(Dictionary<string, (string, string)>)), [ChatCommandsManagerParams.CommandAction] = ("function", typeof(Action<Character, Dictionary<string, string>>)), [ChatCommandsManagerParams.IsCheatCommand] = ("isCheatCommand", typeof(bool)), [ChatCommandsManagerParams.CommandDescription] = ("description", typeof(string)), [ChatCommandsManagerParams.CommandRequiresDebugMode] = ("debugMode", typeof(bool)) }; public static (string key, Type type) Get(ChatCommandsManagerParams param) { return _registry[param]; } } public enum ChatLogStatus { Info, Success, Warning, Error } public static class ChatLogStatusHelper { public static string GetChatLogText(string message, ChatLogStatus status = ChatLogStatus.Info) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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) return status switch { ChatLogStatus.Success => Global.SetTextColor(message, Global.LIGHT_GREEN), ChatLogStatus.Warning => Global.SetTextColor(message, Global.LIGHT_ORANGE), ChatLogStatus.Error => "<color=#" + UnityEngineExtensions.ToHex(Global.LIGHT_RED) + ">" + message + "</color>", _ => message, }; } } } namespace OutwardModsCommunicatorMenu.UI { public static class EventPublishingPanelBuilder { private static GameObject _contentParent; private static TabNavigationBuilder _tabNavigationBuilder; private static GameObject _publishViewContainer; private static SubscribersViewBuilder _subscribersViewBuilder; private static PublishersViewBuilder _publishersViewBuilder; private static InputSectionBuilder _inputSectionBuilder; private static RegisteredParamsBuilder _registeredParamsBuilder; private static DynamicParamsBuilder _dynamicParamsBuilder; private static ActionButtonsBuilder _actionButtonsBuilder; public static void Build(GameObject content) { //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) _contentParent = content; _tabNavigationBuilder = new TabNavigationBuilder(); _tabNavigationBuilder.Build(content); _tabNavigationBuilder.OnTabChanged += OnTabChanged; _publishViewContainer = UIFactory.CreateVerticalGroup(content, "PublishViewContainer", false, false, true, true, 5, new Vector4(5f, 5f, 5f, 5f), default(Color), (TextAnchor?)null); GameObject publishViewContainer = _publishViewContainer; int? num = 9999; int? num2 = 9999; int? num3 = 400; UIFactory.SetLayoutElement(publishViewContainer, (int?)null, num3, num, num2, (int?)null, (int?)null, (bool?)null); BuildPublishView(_publishViewContainer); _subscribersViewBuilder = new SubscribersViewBuilder(); _subscribersViewBuilder.Build(content); _publishersViewBuilder = new PublishersViewBuilder(); _publishersViewBuilder.Build(content); ShowTab(EventMenuTab.Publish); } private static void BuildPublishView(GameObject parent) { CreateTitleLabel(parent); _inputSectionBuilder = new InputSectionBuilder(); _inputSectionBuilder.Build(parent); _inputSectionBuilder.OnEventNameChanged += OnInputChanged; _inputSectionBuilder.OnModGuidChanged += OnInputChanged; _registeredParamsBuilder = new RegisteredParamsBuilder(); _registeredParamsBuilder.Build(parent); _registeredParamsBuilder.OnRegisteredParamClicked += OnRegisteredParamClicked; _actionButtonsBuilder = new ActionButtonsBuilder(); _actionButtonsBuilder.Build(parent); _actionButtonsBuilder.OnPublishClicked += PublishEvent; _actionButtonsBuilder.OnClearClicked += ClearAll; _dynamicParamsBuilder = new DynamicParamsBuilder(); _dynamicParamsBuilder.Build(parent); CreateInfoLabel(parent); RefreshRegisteredParams(); } private static void OnTabChanged(EventMenuTab tab) { ShowTab(tab); } private static void ShowTab(EventMenuTab tab) { bool active = tab == EventMenuTab.Publish; bool flag = tab == EventMenuTab.Subscribers; bool flag2 = tab == EventMenuTab.Publishers; if ((Object)(object)_publishViewContainer != (Object)null) { _publishViewContainer.SetActive(active); } if (_subscribersViewBuilder != null) { _subscribersViewBuilder.SetVisible(flag); if (flag) { _subscribersViewBuilder.Refresh(); } } if (_publishersViewBuilder != null) { _publishersViewBuilder.SetVisible(flag2); if (flag2) { _publishersViewBuilder.Refresh(); } } ManualLogSource log = UIManager.Instance.Log; if (log != null) { log.LogMessage((object)$"[EventPublishingPanel] Switched to tab: {tab}"); } } private static void OnRegisteredParamClicked(string name, string type) { _dynamicParamsBuilder.AddDynamicParameter(name, type); } private static void OnInputChanged() { _actionButtonsBuilder?.ClearValidationMessage(); RefreshRegisteredParams(); } private static void RefreshRegisteredParams() { string modGuid = _inputSectionBuilder?.ModGuidInput?.Text ?? string.Empty; string text = _inputSectionBuilder?.EventNameInput?.Text ?? string.Empty; _registeredParamsBuilder?.Refresh(modGuid, text, text); } private static void CreateTitleLabel(GameObject content) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(content, "Title", "Publish Event to Mods", (TextAnchor)3, Color.white, true, 16)).gameObject, (int?)300, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); } private static void CreateInfoLabel(GameObject content) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(content, "InfoLabel", "Type mod GUID and event name. Click registered params to add. Dynamic params: click to edit.", (TextAnchor)3, Color.yellow, true, 14)).gameObject, (int?)420, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); } private static void ClearAll() { _dynamicParamsBuilder?.Clear(); _inputSectionBuilder?.ModGuidInput?.Clear(); _inputSectionBuilder?.EventNameInput?.Clear(); RefreshRegisteredParams(); _actionButtonsBuilder?.ClearValidationMessage(); ManualLogSource log = UIManager.Instance.Log; if (log != null) { log.LogMessage((object)"[EventPublishingPanel] Cleared all"); } } private static void PublishEvent() { string text = _inputSectionBuilder?.ModGuidInput?.Text?.Trim() ?? string.Empty; string text2 = _inputSectionBuilder?.EventNameInput?.Text?.Trim() ?? string.Empty; if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(text2)) { _actionButtonsBuilder?.SetValidationMessage("Error: Mod GUID and Event Name are required!", isError: true); ManualLogSource log = UIManager.Instance.Log; if (log != null) { log.LogMessage((object)"[EventPublishingPanel] Error: Mod GUID and Event Name are required!"); } return; } EventPayloadBuilder eventPayloadBuilder = new EventPayloadBuilder(); string text3 = string.Empty; IReadOnlyDictionary<string, Dictionary<string, EventDefinition>> registeredEvents = EventBus.GetRegisteredEvents(); bool flag = false; Dictionary<string, EventPayload> value2; if (registeredEvents.TryGetValue(text, out var value) && value.ContainsKey(text2)) { flag = true; } else if (EventBus.GetModPublishedPayloads().TryGetValue(text, out value2) && value2.ContainsKey(text2)) { flag = true; } if (!flag) { text3 = text3 + "Warning: Event '" + text2 + "' for mod '" + text + "' is not registered.\n"; } IReadOnlyList<(string, string, string)> readOnlyList = _dynamicParamsBuilder?.DynamicParams; if (readOnlyList != null) { foreach (var (text4, text5, text6) in readOnlyList) { if (string.IsNullOrEmpty(text4) || string.IsNullOrEmpty(text5)) { continue; } Type type = TypeResolver.Resolve(text5); if (type == null) { text3 = text3 + "Warning: Unknown type '" + text5 + "' for parameter '" + text4 + "'.\n"; continue; } if (CollectionValueParser.IsCollectionType(type) && !string.IsNullOrWhiteSpace(text6)) { string item = CollectionValueParser.TryParse(type, text6).error; if (item != null) { Type elementType = CollectionValueParser.GetElementType(type); text3 = ((!(elementType != null) || !elementType.IsEnum) ? (text3 + "Warning: Failed to parse collection '" + text4 + "' (" + text5 + "): " + item + "\n") : (text3 + "Warning: Failed to parse enum collection '" + text4 + "' (" + text5 + "): " + item + ". For enum values, use only member names separated by spaces (e.g., 'Abrassar Enmerkar').\n")); continue; } } eventPayloadBuilder.AddParameter(text4, type, text6); } } var (val, text7) = eventPayloadBuilder.Build(); if (!string.IsNullOrEmpty(text7)) { text3 += text7; } if (!string.IsNullOrEmpty(text3)) { _actionButtonsBuilder?.SetValidationMessage(text3.TrimEnd(new char[1] { '\n' }), isError: true); ManualLogSource log2 = UIManager.Instance.Log; if (log2 != null) { log2.LogMessage((object)("[EventPublishingPanel] Warning publishing event:\n" + text3)); } } else { _actionButtonsBuilder?.SetValidationMessage("Event published successfully!", isError: false); } EventBus.Publish(text, text2, val); ManualLogSource log3 = UIManager.Instance.Log; if (log3 != null) { log3.LogMessage((object)$"[EventPublishingPanel] Published event '{text2}' to mod '{text}' with {readOnlyList?.Count ?? 0} dynamic params"); } } public static void Update() { _inputSectionBuilder?.Update(); _dynamicParamsBuilder?.Update(); _subscribersViewBuilder?.Update(); _publishersViewBuilder?.Update(); } } public static class MenuFactory { public static void CreateEventPublishingPanel(GameObject contentRoot) { EventPublishingPanelBuilder.Build(contentRoot); } } } namespace OutwardModsCommunicatorMenu.UI.Components { public class AutocompleteInput { private readonly InputFieldRef _inputField; private readonly GameObject _suggestionsScrollView; private readonly GameObject _suggestionsContainer; private readonly List<ButtonRef> _suggestionButtons = new List<ButtonRef>(); private readonly List<string> _currentSuggestions = new List<string>(); private readonly Func<string, List<string>> _getSuggestions; private readonly Func<string> _externalFilterProvider; private readonly float _width; private int _selectedIndex = -1; private bool _isInitialized; private float _debounceTimer = -1f; private string _pendingFilter = string.Empty; private const float DEBOUNCE_DELAY = 0.3f; public string Text => _inputField.Text; public InputFieldRef InputField => _inputField; public event Action<string> OnSelect; public event Action<string> OnTextChanged; public AutocompleteInput(GameObject parent, string name, string placeholder, Vector2 size, Func<string, List<string>> getSuggestions, Func<string> externalFilterProvider = null) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) _getSuggestions = getSuggestions; _externalFilterProvider = externalFilterProvider; _width = size.x; _inputField = UIFactory.CreateInputField(parent, name, placeholder); GameObject gameObject = ((Component)_inputField.Component).gameObject; int? num = (int)size.x; int? num2 = 9999; UIFactory.SetLayoutElement(gameObject, num, (int?)(int)size.y, num2, (int?)null, (int?)null, (int?)null, (bool?)null); (_suggestionsScrollView, _suggestionsContainer) = ScrollViewHelper.CreateScrollView(parent, name + "_Suggestions", new Vector2(size.x, 80f), (Color?)new Color(0.15f, 0.15f, 0.2f, 0.98f)); _suggestionsScrollView.SetActive(false); ((UnityEvent<string>)(object)_inputField.Component.onValueChanged).AddListener((UnityAction<string>)OnValueChanged); _isInitialized = true; UpdateSuggestions(string.Empty); } public void Update() { if (_debounceTimer > 0f) { _debounceTimer -= Time.unscaledDeltaTime; if (_debounceTimer <= 0f) { _debounceTimer = -1f; UpdateSuggestions(_pendingFilter); } } } private void OnValueChanged(string value) { _selectedIndex = -1; _pendingFilter = value; if (string.IsNullOrEmpty(value)) { _debounceTimer = -1f; UpdateSuggestions(value); } else { _debounceTimer = 0.3f; } this.OnTextChanged?.Invoke(value); } private void UpdateSuggestions(string filter) { if (!_isInitialized) { return; } _currentSuggestions.Clear(); foreach (ButtonRef suggestionButton in _suggestionButtons) { Object.Destroy((Object)(object)suggestionButton.GameObject); } _suggestionButtons.Clear(); _ = filter; List<string> list = _getSuggestions?.Invoke(filter) ?? new List<string>(); if (!string.IsNullOrEmpty(filter)) { list = list.Where((string s) => UnityEngineExtensions.Contains(s, filter, StringComparison.OrdinalIgnoreCase)).ToList(); } _currentSuggestions.AddRange(list); if (_currentSuggestions.Count == 0) { _suggestionsScrollView.SetActive(false); return; } _suggestionsScrollView.SetActive(true); for (int i = 0; i < _currentSuggestions.Count; i++) { string text = _currentSuggestions[i]; CreateSuggestionButton(text, i); } UpdateSelectionVisual(); } private void CreateSuggestionButton(string text, int index) { //IL_0033: Unknown result type (might be due to invalid IL or missing references) ButtonRef val = UIFactory.CreateButton(_suggestionsContainer, $"Suggestion_{index}", text, (Color?)new Color(0.2f, 0.2f, 0.2f)); GameObject gameObject = ((Component)val.Component).gameObject; int? num = (int)_width; int? num2 = 9999; UIFactory.SetLayoutElement(gameObject, num, (int?)25, num2, (int?)null, (int?)null, (int?)null, (bool?)null); int capturedIndex = index; val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate { SelectItem(capturedIndex); }); _suggestionButtons.Add(val); } private void UpdateSelectionVisual() { //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) for (int i = 0; i < _suggestionButtons.Count; i++) { ButtonRef val = _suggestionButtons[i]; ColorBlock colors; if (i == _selectedIndex) { Button component = val.Component; colors = default(ColorBlock); ((ColorBlock)(ref colors)).normalColor = new Color(0.3f, 0.5f, 0.7f, 1f); ((ColorBlock)(ref colors)).highlightedColor = new Color(0.4f, 0.6f, 0.8f, 1f); ((ColorBlock)(ref colors)).pressedColor = new Color(0.2f, 0.4f, 0.6f, 1f); ((ColorBlock)(ref colors)).colorMultiplier = 1f; ((ColorBlock)(ref colors)).fadeDuration = 0.1f; ((Selectable)component).colors = colors; } else { Button component2 = val.Component; colors = default(ColorBlock); ((ColorBlock)(ref colors)).normalColor = new Color(0.2f, 0.2f, 0.2f, 0.9f); ((ColorBlock)(ref colors)).highlightedColor = new Color(0.3f, 0.4f, 0.5f, 1f); ((ColorBlock)(ref colors)).pressedColor = new Color(0.2f, 0.3f, 0.4f, 1f); ((ColorBlock)(ref colors)).colorMultiplier = 1f; ((ColorBlock)(ref colors)).fadeDuration = 0.1f; ((Selectable)component2).colors = colors; } } } public void HandleKeyDown(KeyCode key) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Invalid comparison between Unknown and I4 //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Invalid comparison between Unknown and I4 //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Invalid comparison between Unknown and I4 //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Invalid comparison between Unknown and I4 //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Invalid comparison between Unknown and I4 if (!_suggestionsScrollView.activeSelf || _currentSuggestions.Count == 0) { return; } if ((int)key == 274) { _selectedIndex = Mathf.Min(_selectedIndex + 1, _currentSuggestions.Count - 1); UpdateSelectionVisual(); } else if ((int)key == 273) { _selectedIndex = Mathf.Max(_selectedIndex - 1, 0); UpdateSelectionVisual(); } else if ((int)key == 13 || (int)key == 271) { if (_selectedIndex >= 0 && _selectedIndex < _currentSuggestions.Count) { SelectItem(_selectedIndex); } } else if ((int)key == 27) { _suggestionsScrollView.SetActive(false); _selectedIndex = -1; } } private void SelectItem(int index) { if (index >= 0 && index < _currentSuggestions.Count) { string text = _currentSuggestions[index]; _inputField.Text = text; _suggestionsScrollView.SetActive(false); _selectedIndex = -1; _debounceTimer = -1f; this.OnSelect?.Invoke(text); } } public void SetText(string text) { _inputField.Text = text; } public void Clear() { _inputField.Text = string.Empty; _suggestionsScrollView.SetActive(false); _selectedIndex = -1; _debounceTimer = -1f; } public void HideSuggestions() { _suggestionsScrollView.SetActive(false); _selectedIndex = -1; } public void RefreshSuggestions() { _pendingFilter = _inputField.Text; _debounceTimer = -1f; UpdateSuggestions(_pendingFilter); } } public static class ScrollViewHelper { public static (GameObject root, GameObject content) CreateScrollView(GameObject parent, string name, Vector2 size, Color? bgColor = null) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) GameObject item = default(GameObject); AutoSliderScrollbar val = default(AutoSliderScrollbar); GameObject obj = UIFactory.CreateScrollView(parent, name, ref item, ref val, (Color)(((??)bgColor) ?? new Color(0.2f, 0.2f, 0.25f, 0.95f))); int? num = (int)size.x; int? num2 = 9999; UIFactory.SetLayoutElement(obj, num, (int?)(int)size.y, num2, (int?)9999, (int?)null, (int?)null, (bool?)null); return (obj, item); } public static (GameObject root, GameObject content) CreateScrollView(GameObject parent, string name, int minWidth, int minHeight, Color? bgColor = null) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return CreateScrollView(parent, name, new Vector2((float)minWidth, (float)minHeight), bgColor); } } } namespace OutwardModsCommunicatorMenu.UI.Builders { public class ActionButtonsBuilder { private Text _validationLabel; public event Action OnPublishClicked; public event Action OnClearClicked; public void Build(GameObject parent) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0137: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) GameObject obj = UIFactory.CreateHorizontalGroup(parent, "ActionButtonsRow", false, false, true, true, 10, new Vector4(3f, 3f, 3f, 3f), default(Color), (TextAnchor?)null); int? num = 35; UIFactory.SetLayoutElement(obj, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); ButtonRef obj2 = UIFactory.CreateButton(obj, "PublishBtn", "PUBLISH EVENT", (Color?)new Color(0.2f, 0.3f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj2.Component).gameObject, (int?)130, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate { this.OnPublishClicked?.Invoke(); }); ButtonRef obj3 = UIFactory.CreateButton(obj, "ClearBtn", "Clear", (Color?)new Color(0.3f, 0.2f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj3.Component).gameObject, (int?)100, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj3.OnClick = (Action)Delegate.Combine(obj3.OnClick, (Action)delegate { this.OnClearClicked?.Invoke(); }); _validationLabel = UIFactory.CreateLabel(parent, "ValidationLabel", "", (TextAnchor)3, Color.yellow, false, 12); GameObject gameObject = ((Component)_validationLabel).gameObject; num = 9999; int? num2 = 20; UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); } public void SetValidationMessage(string message, bool isError) { //IL_002a: 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) if ((Object)(object)_validationLabel != (Object)null) { _validationLabel.text = message; ((Graphic)_validationLabel).color = (isError ? Color.red : Color.green); } } public void ClearValidationMessage() { if ((Object)(object)_validationLabel != (Object)null) { _validationLabel.text = ""; } } } public class ComplexValueFormatter : IValueFormatter { public class MemberInfo { public string Name { get; set; } public object Value { get; set; } public string MemberType { get; set; } } private const int MaxDepth = 3; public bool CanFormat(object value) { if (value != null) { return !IsSimpleType(value); } return false; } public void CreateDisplay(GameObject parent, string name, object value, Type displayType) { string text = "unknown"; try { text = ((displayType != null) ? TypeNameFormatter.Format(displayType) : (value?.GetType().Name ?? "null")); } catch { text = value?.GetType().Name ?? "null"; } ExpandableValueBuilder.Create(parent, name, text, value, displayType); } private static bool IsSimpleType(object value) { if (value != null) { if (!(value is string)) { if (!(value is bool)) { if (!(value is char)) { if (!(value is int)) { if (!(value is long)) { if (!(value is float)) { if (!(value is double)) { if (!(value is decimal)) { if (!(value is DateTime)) { if (!(value is DateTimeOffset)) { if (!(value is TimeSpan)) { if (value is Guid) { return true; } return value?.GetType().IsPrimitive ?? false; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } public static string FormatAsString(object value, int depth) { if (!(value is Array array)) { if (!(value is IDictionary dict)) { if (!(value is ICollection collection)) { if (value is IEnumerable enumerable) { return FormatEnumerable(enumerable); } return null; } return FormatCollection(collection); } return FormatDictionary(dict); } return FormatArray(array); } private static string FormatCollection(ICollection collection) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); int num = 0; foreach (object item in collection) { if (num > 0) { stringBuilder.Append(", "); } if (num >= 10) { stringBuilder.Append("..."); break; } stringBuilder.Append(FormatCollectionItem(item)); num++; } stringBuilder.Append(']'); return stringBuilder.ToString(); } private static string FormatArray(Array array) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); for (int i = 0; i < array.Length && i < 10; i++) { if (i > 0) { stringBuilder.Append(", "); } stringBuilder.Append(FormatCollectionItem(array.GetValue(i))); } if (array.Length > 10) { stringBuilder.Append("..."); } stringBuilder.Append(']'); return stringBuilder.ToString(); } private static string FormatDictionary(IDictionary dict) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('{'); int num = 0; foreach (DictionaryEntry item in dict) { if (num > 0) { stringBuilder.Append(", "); } if (num >= 5) { stringBuilder.Append("..."); break; } stringBuilder.Append(FormatCollectionItem(item.Key) + ": " + FormatCollectionItem(item.Value)); num++; } stringBuilder.Append('}'); return stringBuilder.ToString(); } private static string FormatEnumerable(IEnumerable enumerable) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('['); int num = 0; foreach (object item in enumerable) { if (num > 0) { stringBuilder.Append(", "); } if (num >= 10) { stringBuilder.Append("..."); break; } stringBuilder.Append(FormatCollectionItem(item)); num++; } stringBuilder.Append(']'); return stringBuilder.ToString(); } private static string FormatCollectionItem(object item) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0165: 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_0182: Unknown result type (might be due to invalid IL or missing references) //IL_018e: Unknown result type (might be due to invalid IL or missing references) //IL_019a: 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_00c6: 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_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) //IL_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) if (item != null) { if (!(item is string text)) { if (!(item is bool)) { if (!(item is int num)) { if (!(item is float num2)) { if (!(item is double num3)) { if (!(item is Vector2 val)) { if (!(item is Vector3 val2)) { if (!(item is Vector4 val3)) { if (!(item is Quaternion val4)) { if (item is Color val5) { return $"({val5.r:F2},{val5.g:F2},{val5.b:F2},{val5.a:F2})"; } if (item != null && item.GetType().IsPrimitive) { return item.ToString(); } if (item is ICollection || item is Array || item is IDictionary || item is IEnumerable) { return "<" + item.GetType().Name + ">"; } return item?.ToString() ?? "null"; } return $"({val4.x:F2},{val4.y:F2},{val4.z:F2},{val4.w:F2})"; } return $"({val3.x:F2},{val3.y:F2},{val3.z:F2},{val3.w:F2})"; } return $"({val2.x:F2},{val2.y:F2},{val2.z:F2})"; } return $"({val.x:F2},{val.y:F2})"; } return num3.ToString("F2"); } return num2.ToString("F2"); } return num.ToString(); } return ((bool)item) ? "true" : "false"; } return "\"" + text + "\""; } return "null"; } public static string GetValuePreview(object value) { if (value != null) { if (!(value is Array array)) { if (!(value is IDictionary dictionary)) { if (!(value is ICollection collection)) { if (value is IEnumerable enumerable) { return $">= {GetEnumerableCount(enumerable)}"; } return string.Empty; } return $"Count={collection.Count}"; } return $"Count={dictionary.Count}"; } return $"Length={array.Length}"; } return "(null)"; } private static int GetEnumerableCount(IEnumerable enumerable) { int num = 0; foreach (object item in enumerable) { _ = item; num++; if (num > 5) { break; } } return num; } public static List<MemberInfo> GetMembers(object value, int depth) { List<MemberInfo> list = new List<MemberInfo>(); if (value == null) { return list; } Type type = value.GetType(); try { PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.GetIndexParameters().Length == 0) { try { object value2 = propertyInfo.GetValue(value); list.Add(new MemberInfo { Name = propertyInfo.Name, Value = value2, MemberType = "Property" }); } catch { list.Add(new MemberInfo { Name = propertyInfo.Name, Value = null, MemberType = "Property" }); } } } } catch { } try { FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { try { object value3 = fieldInfo.GetValue(value); list.Add(new MemberInfo { Name = fieldInfo.Name, Value = value3, MemberType = "Field" }); } catch { list.Add(new MemberInfo { Name = fieldInfo.Name, Value = null, MemberType = "Field" }); } } } catch { } return list; } } public class DynamicParamsBuilder { private readonly List<(string name, string type, string value, GameObject button)> _dynamicParams = new List<(string, string, string, GameObject)>(); private GameObject _dynamicParamsContainer; private GameObject _currentRow; private GameObject _paramEditorGroup; private InputFieldRef _paramNameInput; private AutocompleteInput _paramTypeInput; private InputFieldRef _paramValueInput; private int _editingParamIndex = -1; private const int MAX_ROW_WIDTH = 700; private const int BUTTON_MIN_WIDTH = 120; private const int BUTTON_SPACING = 3; private const int ROW_PADDING = 6; private int _currentRowWidth; public IReadOnlyList<(string name, string type, string value)> DynamicParams => _dynamicParams.ConvertAll(((string name, string type, string value, GameObject button) p) => (p.name, p.type, p.value)); public event Action OnDynamicParamsChanged; public void Update() { if ((Object)(object)_paramEditorGroup != (Object)null && _paramEditorGroup.activeSelf) { _paramTypeInput?.Update(); } } public void Build(GameObject parent) { CreateDynamicParamsSection(parent); CreateParamEditor(parent); } private void CreateDynamicParamsSection(GameObject parent) { //IL_000c: 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_0089: 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_011e: Unknown result type (might be due to invalid IL or missing references) UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(parent, "DynamicParamsLabel", "Dynamic Parameters:", (TextAnchor)3, Color.white, true, 14)).gameObject, (int?)200, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _dynamicParamsContainer = UIFactory.CreateVerticalGroup(parent, "DynamicParamsContainer", false, false, true, true, 3, new Vector4(3f, 3f, 3f, 3f), default(Color), (TextAnchor?)null); GameObject dynamicParamsContainer = _dynamicParamsContainer; int? num = 9999; int? num2 = 30; UIFactory.SetLayoutElement(dynamicParamsContainer, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); _currentRow = CreateNewRow(); ButtonRef obj = UIFactory.CreateButton(parent, "AddParamBtn", "+ Add", (Color?)new Color(0.2f, 0.3f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj.Component).gameObject, (int?)80, (int?)30, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj.OnClick = (Action)Delegate.Combine(obj.OnClick, (Action)delegate { AddDynamicParameter(); }); } private GameObject CreateNewRow() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) GameObject obj = UIFactory.CreateHorizontalGroup(_dynamicParamsContainer, $"Row_{_dynamicParamsContainer.transform.childCount}", false, false, true, true, 3, new Vector4(6f, 2f, 6f, 2f), default(Color), (TextAnchor?)null); int? num = 9999; int? num2 = 30; UIFactory.SetLayoutElement(obj, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); _currentRowWidth = 12; return obj; } private void CreateParamEditor(GameObject parent) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_0336: 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_0340: Unknown result type (might be due to invalid IL or missing references) //IL_03b1: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Unknown result type (might be due to invalid IL or missing references) //IL_04dc: Unknown result type (might be due to invalid IL or missing references) _paramEditorGroup = UIFactory.CreateVerticalGroup(parent, "ParamEditor", false, false, true, true, 3, new Vector4(5f, 5f, 5f, 5f), new Color(0.15f, 0.15f, 0.2f, 0.95f), (TextAnchor?)null); UIFactory.SetLayoutElement(_paramEditorGroup, (int?)300, (int?)120, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _paramEditorGroup.SetActive(false); GameObject gameObject = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditNameLabel", "Name:", (TextAnchor)3, Color.white, true, 14)).gameObject; int? num = 25; UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _paramNameInput = UIFactory.CreateInputField(_paramEditorGroup, "EditNameInput", ""); GameObject gameObject2 = ((Component)_paramNameInput.Component).gameObject; num = 9999; int? num2 = 25; UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); GameObject gameObject3 = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditTypeLabel", "Type:", (TextAnchor)3, Color.white, true, 14)).gameObject; num2 = 25; UIFactory.SetLayoutElement(gameObject3, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _paramTypeInput = new AutocompleteInput(_paramEditorGroup, "EditTypeInput", "type", new Vector2(150f, 25f), (string filter) => EventDataManager.Instance.GetSupportedTypes(filter)); GameObject gameObject4 = ((Component)UIFactory.CreateLabel(_paramEditorGroup, "EditValueLabel", "Value:", (TextAnchor)3, Color.white, true, 14)).gameObject; num2 = 25; UIFactory.SetLayoutElement(gameObject4, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _paramValueInput = UIFactory.CreateInputField(_paramEditorGroup, "EditValueInput", ""); GameObject gameObject5 = ((Component)_paramValueInput.Component).gameObject; num2 = 9999; num = 25; UIFactory.SetLayoutElement(gameObject5, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null); GameObject obj = UIFactory.CreateHorizontalGroup(_paramEditorGroup, "ButtonRow", false, false, true, true, 5, default(Vector4), default(Color), (TextAnchor?)null); num = 30; UIFactory.SetLayoutElement(obj, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); ButtonRef obj2 = UIFactory.CreateButton(obj, "SaveBtn", "Save", (Color?)new Color(0.2f, 0.4f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj2.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate { SaveParamEdit(); }); ButtonRef obj3 = UIFactory.CreateButton(obj, "DeleteBtn", "Delete", (Color?)new Color(0.4f, 0.2f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj3.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj3.OnClick = (Action)Delegate.Combine(obj3.OnClick, (Action)delegate { DeleteCurrentParam(); }); ButtonRef obj4 = UIFactory.CreateButton(obj, "CancelBtn", "Cancel", (Color?)new Color(0.3f, 0.2f, 0.2f)); UIFactory.SetLayoutElement(((Component)obj4.Component).gameObject, (int?)60, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); obj4.OnClick = (Action)Delegate.Combine(obj4.OnClick, (Action)delegate { HideParamEditor(); }); } public void AddDynamicParameter(string name = null, string type = null) { //IL_00c5: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)_dynamicParamsContainer == (Object)null)) { int count = _dynamicParams.Count; string text = name ?? $"param{count}"; string text2 = type ?? "string"; string item = ""; int num = Mathf.Max(120, text.Length * 8 + 60); if (_currentRowWidth + num > 700 && _dynamicParams.Count > 0) { _currentRow = CreateNewRow(); } ButtonRef val = UIFactory.CreateButton(_currentRow, $"Param_{count}", $"[{count}] {text}: {text2}", (Color?)new Color(0.2f, 0.25f, 0.3f)); UIFactory.SetLayoutElement(((Component)val.Component).gameObject, (int?)num, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _currentRowWidth += num + 3; int capturedIndex = count; val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate { EditDynamicParameter(capturedIndex); }); _dynamicParams.Add((text, text2, item, ((Component)val.Component).gameObject)); UpdateParamButtonLabels(); this.OnDynamicParamsChanged?.Invoke(); ManualLogSource log = UIManager.Instance.Log; if (log != null) { log.LogMessage((object)$"[DynamicParams] Added parameter {count}: {text} ({text2})"); } } } private void UpdateParamButtonLabels() { for (int i = 0; i < _dynamicParams.Count; i++) { (string name, string type, string value, GameObject button) tuple = _dynamicParams[i]; string item = tuple.name; string item2 = tuple.type; Text componentInChildren = tuple.button.GetComponentInChildren<Text>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.text = $"[{i}] {item}: {item2}"; } } } private void EditDynamicParameter(int index) { if (index >= 0 && index < _dynamicParams.Count) { _editingParamIndex = index; var (text, text2, text3, _) = _dynamicParams[index]; _paramNameInput.Text = text; _paramTypeInput.SetText(text2); _paramValueInput.Text = text3; _paramEditorGroup.SetActive(true); } } private void SaveParamEdit() { if (_editingParamIndex >= 0 && _editingParamIndex < _dynamicParams.Count) { _dynamicParams[_editingParamIndex] = (_paramNameInput.Text, _paramTypeInput.Text, _paramValueInput.Text, _dynamicParams[_editingParamIndex].button); UpdateParamButtonLabels(); this.OnDynamicParamsChanged?.Invoke(); } HideParamEditor(); } private void DeleteCurrentParam() { if (_editingParamIndex >= 0 && _editingParamIndex < _dynamicParams.Count) { GameObject item = _dynamicParams[_editingParamIndex].button; if ((Object)(object)item != (Object)null) { Object.Destroy((Object)(object)item); } _dynamicParams.RemoveAt(_editingParamIndex); RebuildRows(); this.OnDynamicParamsChanged?.Invoke(); } HideParamEditor(); } private void RebuildRows() { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) List<(string, string, string, GameObject)> list = new List<(string, string, string, GameObject)>(); foreach (Transform item4 in _dynamicParamsContainer.transform) { Object.Destroy((Object)(object)((Component)item4).gameObject); } _currentRow = CreateNewRow(); _currentRowWidth = 12; for (int i = 0; i < _dynamicParams.Count; i++) { (string name, string type, string value, GameObject button) tuple = _dynamicParams[i]; string item = tuple.name; string item2 = tuple.type; string item3 = tuple.value; int num = Mathf.Max(120, item.Length * 8 + 60); if (_currentRowWidth + num > 700 && _dynamicParams.Count > 0) { _currentRow = CreateNewRow(); } ButtonRef val = UIFactory.CreateButton(_currentRow, $"Param_{i}", $"[{i}] {item}: {item2}", (Color?)new Color(0.2f, 0.25f, 0.3f)); UIFactory.SetLayoutElement(((Component)val.Component).gameObject, (int?)num, (int?)25, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); int capturedIndex = i; val.OnClick = (Action)Delegate.Combine(val.OnClick, (Action)delegate { EditDynamicParameter(capturedIndex); }); _currentRowWidth += num + 3; list.Add((item, item2, item3, ((Component)val.Component).gameObject)); } _dynamicParams.Clear(); _dynamicParams.AddRange(list); UpdateParamButtonLabels(); } private void HideParamEditor() { _paramEditorGroup.SetActive(false); _editingParamIndex = -1; } public void Clear() { //IL_005c: Unknown result type (might be due to invalid IL or missing references) foreach (var dynamicParam in _dynamicParams) { Object.Destroy((Object)(object)dynamicParam.button); } _dynamicParams.Clear(); foreach (Transform item in _dynamicParamsContainer.transform) { Object.Destroy((Object)(object)((Component)item).gameObject); } _currentRow = CreateNewRow(); this.OnDynamicParamsChanged?.Invoke(); } } public class ExpandableItemBuilder { private readonly ButtonRef _toggleButton; private readonly GameObject _detailContent; private bool _isExpanded; private string _collapsedText; private string _expandedText; public bool IsExpanded => _isExpanded; public GameObject DetailContent => _detailContent; public ExpandableItemBuilder(GameObject parent, string name, string title, Color? buttonColor = null, string collapsedSuffix = " [+]", string expandedSuffix = " [-]") { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: 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) _collapsedText = title + collapsedSuffix; _expandedText = title + expandedSuffix; _toggleButton = UIFactory.CreateButton(parent, name + "_ToggleBtn", _collapsedText, (Color?)(Color)(((??)buttonColor) ?? new Color(0.2f, 0.25f, 0.3f))); GameObject gameObject = ((Component)_toggleButton.Component).gameObject; int? num = 9999; int? num2 = 28; UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); _detailContent = UIFactory.CreateVerticalGroup(parent, name + "_DetailContent", false, false, true, true, 2, new Vector4(8f, 5f, 5f, 5f), new Color(0.08f, 0.1f, 0.12f, 0.95f), (TextAnchor?)null); GameObject detailContent = _detailContent; num2 = 9999; UIFactory.SetLayoutElement(detailContent, (int?)null, (int?)null, num2, (int?)null, (int?)null, (int?)null, (bool?)null); _detailContent.SetActive(false); ButtonRef toggleButton = _toggleButton; toggleButton.OnClick = (Action)Delegate.Combine(toggleButton.OnClick, new Action(Toggle)); } private void Toggle() { SetExpanded(!_isExpanded); } public void SetExpanded(bool expanded) { _isExpanded = expanded; _detailContent.SetActive(_isExpanded); Text componentInChildren = ((Component)_toggleButton.Component).GetComponentInChildren<Text>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.text = (_isExpanded ? _expandedText : _collapsedText); } UpdateButtonColor(); } private void UpdateButtonColor() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: 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_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: 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) Button component = _toggleButton.Component; ColorBlock colors = default(ColorBlock); ((ColorBlock)(ref colors)).normalColor = (_isExpanded ? new Color(0.25f, 0.35f, 0.45f, 1f) : new Color(0.2f, 0.25f, 0.3f, 0.9f)); ((ColorBlock)(ref colors)).highlightedColor = (_isExpanded ? new Color(0.35f, 0.45f, 0.55f, 1f) : new Color(0.3f, 0.35f, 0.4f, 1f)); ((ColorBlock)(ref colors)).pressedColor = (_isExpanded ? new Color(0.2f, 0.3f, 0.4f, 1f) : new Color(0.2f, 0.25f, 0.3f, 1f)); ((ColorBlock)(ref colors)).colorMultiplier = 1f; ((ColorBlock)(ref colors)).fadeDuration = 0.1f; ((Selectable)component).colors = colors; } public void Collapse() { SetExpanded(expanded: false); } public void Expand() { SetExpanded(expanded: true); } public void SetTitle(string title, string collapsedSuffix = " [+]", string expandedSuffix = " [-]") { _collapsedText = title + collapsedSuffix; _expandedText = title + expandedSuffix; UpdateButtonColor(); } } public class ExpandableValueBuilder { private const int MaxReflectionDepth = 3; private const int PageSize = 30; private readonly GameObject _rootObject; private readonly GameObject _summaryLine; private readonly GameObject _detailContent; private readonly ButtonRef _toggleButton; private readonly bool _isExpanded; private readonly string _name; private readonly object _storedValue; private readonly Type _storedType; public GameObject DetailContent => _detailContent; private ExpandableValueBuilder(GameObject parent, string name, string typeName, object value, Type displayType, bool isExpanded) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_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_017e: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0364: Unknown result type (might be due to invalid IL or missing references) //IL_036b: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_02db: Unknown result type (might be due to invalid IL or missing references) _name = name; _isExpanded = isExpanded; _storedValue = value; _storedType = displayType; GameObject val = UIFactory.CreateVerticalGroup(parent, name + "_Container", false, false, true, true, 2, new Vector4(2f, 2f, 2f, 2f), default(Color), (TextAnchor?)null); int? num = 9999; int? num2 = 20; UIFactory.SetLayoutElement(val, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); _rootObject = val; _summaryLine = UIFactory.CreateHorizontalGroup(val, name + "_Summary", false, false, true, true, 3, default(Vector4), default(Color), (TextAnchor?)null); GameObject summaryLine = _summaryLine; num2 = 20; UIFactory.SetLayoutElement(summaryLine, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); _toggleButton = UIFactory.CreateButton(_summaryLine, name + "_Toggle", isExpanded ? "[-]" : "[+]", (Color?)new Color(0.25f, 0.28f, 0.35f)); ButtonRef toggleButton = _toggleButton; toggleButton.OnClick = (Action)Delegate.Combine(toggleButton.OnClick, new Action(OnToggleClicked)); UIFactory.SetLayoutElement(((Component)_toggleButton.Component).gameObject, (int?)30, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(_summaryLine, name + "_Type", typeName ?? "", (TextAnchor)3, new Color(0.6f, 0.7f, 0.9f, 1f), false, 11)).gameObject, (int?)80, (int?)18, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); if (value != null) { string valuePreview = GetValuePreview(value); if (!string.IsNullOrEmpty(valuePreview)) { GameObject gameObject = ((Component)UIFactory.CreateLabel(_summaryLine, name + "_Preview", valuePreview, (TextAnchor)3, new Color(0.7f, 0.7f, 0.75f, 1f), false, 10)).gameObject; num2 = 9999; num = 18; UIFactory.SetLayoutElement(gameObject, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null); } } _detailContent = UIFactory.CreateVerticalGroup(val, name + "_Detail", false, false, true, true, 2, new Vector4(10f, 2f, 2f, 2f), default(Color), (TextAnchor?)null); GameObject detailContent = _detailContent; num = 9999; UIFactory.SetLayoutElement(detailContent, (int?)null, (int?)null, num, (int?)null, (int?)null, (int?)null, (bool?)null); _detailContent.SetActive(isExpanded); if (isExpanded) { BuildDetailContent(_detailContent, value, displayType, 0); } } public static ExpandableValueBuilder Create(GameObject parent, string name, string typeName, object value, Type displayType) { return new ExpandableValueBuilder(parent, name, typeName, value, displayType, isExpanded: false); } private void OnToggleClicked() { _detailContent.SetActive(!_detailContent.activeSelf); Text componentInChildren = ((Component)_toggleButton.Component).GetComponentInChildren<Text>(); if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.text = (_detailContent.activeSelf ? "[-]" : "[+]"); } if (_detailContent.activeSelf && _detailContent.transform.childCount == 0) { BuildDetailContent(_detailContent, _storedValue, _storedType, 0); } } private void BuildDetailContent(GameObject content, object value, Type displayType, int depth) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) if (value == null) { GameObject gameObject = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_Null", " (null)", (TextAnchor)3, new Color(0.5f, 0.5f, 0.5f, 1f), false, 10)).gameObject; int? num = 16; UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); return; } if (value is IEnumerable && !(value is string)) { BuildCollectionContent(content, value, displayType, depth); return; } string text = ComplexValueFormatter.FormatAsString(value, depth); if (!string.IsNullOrEmpty(text)) { GameObject gameObject2 = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_AsString", " " + text, (TextAnchor)3, new Color(0.6f, 0.85f, 0.6f, 1f), false, 10)).gameObject; int? num = 9999; int? num2 = 16; UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); CreateSeparator(content, ((Object)content).name + "_Sep1"); } BuildReflectionContent(content, value, depth); } private void BuildCollectionContent(GameObject content, object value, Type displayType, int depth) { if (!(value is IEnumerable enumerable)) { return; } List<object> list = new List<object>(); foreach (object item in enumerable) { list.Add(item); } int count = list.Count; int startIndex = 0; int num = Math.Min(30, count); bool num2 = count > 30; CreateCollectionItems(content, list, startIndex, num, count, depth, ((Object)content).name + "_page0"); if (num2) { CreatePaginationControls(content, list, num, count, depth, ((Object)content).name + "_pagination"); } } private void CreateCollectionItems(GameObject parent, List<object> items, int startIndex, int displayCount, int totalCount, int depth, string namePrefix) { //IL_0094: 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_00a1: 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_0121: 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_012b: 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_025d: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: 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_03ae: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_0475: Unknown result type (might be due to invalid IL or missing references) for (int i = startIndex; i < startIndex + displayCount && i < items.Count; i++) { object item = items[i]; string text = $"{namePrefix}_{i}"; _ = item?.GetType().Name; string itemPreview = GetItemPreview(item); GameObject val = UIFactory.CreateVerticalGroup(parent, text + "_container", false, false, true, true, 2, new Vector4(2f, 2f, 2f, 2f), default(Color), (TextAnchor?)null); int? num = 9999; int? num2 = 18; UIFactory.SetLayoutElement(val, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); GameObject val2 = UIFactory.CreateHorizontalGroup(val, text + "_header", false, false, true, true, 3, default(Vector4), default(Color), (TextAnchor?)null); num2 = 18; UIFactory.SetLayoutElement(val2, (int?)null, num2, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val2, text + "_index", $"#{i}:", (TextAnchor)3, new Color(0.6f, 0.7f, 0.8f, 1f), false, 13)).gameObject, (int?)35, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); string text2 = item?.GetType().Name ?? "null"; UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val2, text + "_type", text2, (TextAnchor)3, new Color(0.6f, 0.7f, 0.9f, 1f), false, 13)).gameObject, (int?)80, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); if (!string.IsNullOrEmpty(itemPreview)) { if (IsSimpleType(item)) { CreateLockedInputField(val2, text + "_preview", itemPreview); } else { GameObject gameObject = ((Component)UIFactory.CreateLabel(val2, text + "_preview", " = " + itemPreview, (TextAnchor)3, new Color(0.7f, 0.7f, 0.75f, 1f), false, 13)).gameObject; num2 = 9999; num = 20; UIFactory.SetLayoutElement(gameObject, (int?)null, num, num2, (int?)null, (int?)null, (int?)null, (bool?)null); } } GameObject detailContent = UIFactory.CreateVerticalGroup(val, text + "_detail", false, false, true, true, 2, new Vector4(10f, 2f, 2f, 2f), default(Color), (TextAnchor?)null); GameObject obj = detailContent; num = 9999; UIFactory.SetLayoutElement(obj, (int?)null, (int?)null, num, (int?)null, (int?)null, (int?)null, (bool?)null); detailContent.SetActive(false); if (item == null || IsSimpleType(item) || depth >= 3) { continue; } ButtonRef expandBtn = UIFactory.CreateButton(val2, text + "_expand", "[+]", (Color?)new Color(0.2f, 0.25f, 0.3f)); ButtonRef obj2 = expandBtn; obj2.OnClick = (Action)Delegate.Combine(obj2.OnClick, (Action)delegate { bool flag = !detailContent.activeSelf; detailContent.SetActive(flag); expandBtn.ButtonText.text = (flag ? "[-]" : "[+]"); if (flag && detailContent.transform.childCount == 0) { BuildReflectionContent(detailContent, item, depth + 1); } }); UIFactory.SetLayoutElement(((Component)expandBtn.Component).gameObject, (int?)30, (int?)16, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); } } private void CreatePaginationControls(GameObject parent, List<object> items, int currentEnd, int totalCount, int depth, string namePrefix) { //IL_0070: Unknown result type (might be due to invalid IL or missing references) ButtonRef loadMoreBtn = UIFactory.CreateButton(parent, namePrefix + "_loadMore", $"Load More ({totalCount - currentEnd} remaining)", (Color?)new Color(0.2f, 0.3f, 0.4f)); GameObject gameObject = ((Component)loadMoreBtn.Component).gameObject; int? num = 9999; int? num2 = 25; UIFactory.SetLayoutElement(gameObject, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); int capturedStart = currentEnd; ButtonRef obj = loadMoreBtn; obj.OnClick = (Action)Delegate.Combine(obj.OnClick, (Action)delegate { Object.Destroy((Object)(object)((Component)loadMoreBtn.Component).gameObject); int num3 = Math.Min(capturedStart + 30, totalCount); CreateCollectionItems(parent, items, capturedStart, num3 - capturedStart, totalCount, depth, $"{namePrefix}_page{capturedStart / 30}"); if (num3 < totalCount) { CreatePaginationControls(parent, items, num3, totalCount, depth, $"{namePrefix}_page{num3 / 30}"); } }); } private bool IsSimpleType(object value) { if (value != null) { if (!(value is string)) { if (!(value is bool)) { if (!(value is char)) { if (!(value is int)) { if (!(value is long)) { if (!(value is float)) { if (!(value is double)) { if (!(value is decimal)) { if (value is DateTime) { return true; } return value?.GetType().IsPrimitive ?? false; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } return true; } private string GetItemPreview(object item) { if (item == null) { return "null"; } if (item is string text) { return "\"" + text + "\""; } if (item is bool) { if (!(bool)item) { return "false"; } return "true"; } if (item is int num) { return num.ToString(); } if (item is float num2) { return num2.ToString("F2"); } if (item is double num3) { return num3.ToString("F2"); } return string.Empty; } private void BuildReflectionContent(GameObject content, object value, int depth) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) int? num; if (depth >= 3) { GameObject gameObject = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_MaxDepth", " (max depth reached)", (TextAnchor)3, new Color(0.5f, 0.5f, 0.5f, 1f), false, 13)).gameObject; num = 20; UIFactory.SetLayoutElement(gameObject, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); return; } List<ComplexValueFormatter.MemberInfo> list = null; try { list = ComplexValueFormatter.GetMembers(value, depth); } catch (Exception ex) { OMCM.LogMessage("[ExpandableValueBuilder] GetMembers failed: " + ex.Message); } if (list == null || list.Count <= 0) { return; } GameObject gameObject2 = ((Component)UIFactory.CreateLabel(content, ((Object)content).name + "_ReflectionHeader", $" --- Members ({list.Count}) ---", (TextAnchor)3, new Color(0.5f, 0.6f, 0.8f, 1f), true, 13)).gameObject; num = 9999; int? num2 = 20; UIFactory.SetLayoutElement(gameObject2, (int?)null, num2, num, (int?)null, (int?)null, (int?)null, (bool?)null); foreach (ComplexValueFormatter.MemberInfo item in list) { try { CreateMemberLabel(content, item.Name, item.Value, item.MemberType, depth + 1); } catch (Exception ex2) { OMCM.LogMessage("[ExpandableValueBuilder] CreateMemberLabel failed for " + item.Name + ": " + ex2.Message); } } } private void CreateMemberLabel(GameObject parent, string name, object memberValue, string memberType, int depth) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) string text = ((memberType == "Property") ? "P:" : "F:"); GameObject val = UIFactory.CreateHorizontalGroup(parent, "Member_" + name, false, false, true, true, 5, default(Vector4), default(Color), (TextAnchor?)null); int? num = 20; UIFactory.SetLayoutElement(val, (int?)null, num, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); UIFactory.SetLayoutElement(((Component)UIFactory.CreateLabel(val, "MemberName_" + name, " " + text + " " + name + ":", (TextAnchor)3, new Color(0.6f, 0.7f, 0.85f, 1f), false, 13)).gameObject, (int?)80, (int?)20, (int?)null, (int?)null, (int?)null, (int?)null, (bool?)null); if (memberValue == null || IsSimpleType(memberValue)) { string text2 = ((memberValue == null) ? "null" : memberValue.ToString()); if (text2.Length > 60) { text2 = text2.Substring(0, 60) + "..."; } CreateLockedInputField(val, "MemberValue_" + name, text2); return; } string text3; if (memberValue is ICollection collection) { text3 = $"<{collection.GetType().Name} Count={collection.Count}>"; } else if (memberValue is Array array) { text3 = $"<{array.GetType().Name} Length={array.Length}>"; } else { text3 = memberValue.ToString(); if (text3.Length > 60) {
UniverseLib.Mono.dll
Decompiled 2 days 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.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using HarmonyLib; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; using UniverseLib.Config; using UniverseLib.Input; using UniverseLib.Runtime; using UniverseLib.Runtime.Mono; using UniverseLib.UI; using UniverseLib.UI.Models; using UniverseLib.UI.ObjectPool; using UniverseLib.UI.Panels; using UniverseLib.UI.Widgets; using UniverseLib.UI.Widgets.ScrollView; using UniverseLib.Utility; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("UniverseLib")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Sinai")] [assembly: AssemblyProduct("UniverseLib")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")] [assembly: AssemblyFileVersion("1.4.3")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.3.0")] [module: UnverifiableCode] public static class MonoExtensions { private static PropertyInfo p_childControlHeight = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlHeight"); private static PropertyInfo p_childControlWidth = AccessTools.Property(typeof(HorizontalOrVerticalLayoutGroup), "childControlWidth"); public static void AddListener(this UnityEvent _event, Action listener) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown _event.AddListener(new UnityAction(listener.Invoke)); } public static void AddListener<T>(this UnityEvent<T> _event, Action<T> listener) { _event.AddListener((UnityAction<T>)listener.Invoke); } public static void RemoveListener(this UnityEvent _event, Action listener) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown _event.RemoveListener(new UnityAction(listener.Invoke)); } public static void RemoveListener<T>(this UnityEvent<T> _event, Action<T> listener) { _event.RemoveListener((UnityAction<T>)listener.Invoke); } public static void Clear(this StringBuilder sb) { sb.Remove(0, sb.Length); } public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value) { p_childControlHeight?.SetValue(group, value, null); } public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value) { p_childControlWidth?.SetValue(group, value, null); } } namespace UniverseLib { public static class ReflectionExtensions { public static Type GetActualType(this object obj) { return ReflectionUtility.Instance.Internal_GetActualType(obj); } public static object TryCast(this object obj) { return ReflectionUtility.Instance.Internal_TryCast(obj, ReflectionUtility.Instance.Internal_GetActualType(obj)); } public static object TryCast(this object obj, Type castTo) { return ReflectionUtility.Instance.Internal_TryCast(obj, castTo); } public static T TryCast<T>(this object obj) { try { return (T)ReflectionUtility.Instance.Internal_TryCast(obj, typeof(T)); } catch { return default(T); } } [Obsolete("This method is no longer necessary, just use Assembly.GetTypes().", false)] public static IEnumerable<Type> TryGetTypes(this Assembly asm) { return asm.GetTypes(); } public static bool ReferenceEqual(this object objA, object objB) { if (objA == objB) { return true; } Object val = (Object)((objA is Object) ? objA : null); if (val != null) { Object val2 = (Object)((objB is Object) ? objB : null); if (val2 != null && Object.op_Implicit(val) && Object.op_Implicit(val2) && val.m_CachedPtr == val2.m_CachedPtr) { return true; } } return false; } public static string ReflectionExToString(this Exception e, bool innerMost = true) { if (e == null) { return "The exception was null."; } if (innerMost) { e = e.GetInnerMostException(); } return $"{e.GetType()}: {e.Message}"; } public static Exception GetInnerMostException(this Exception e) { while (e != null && e.InnerException != null) { e = e.InnerException; } return e; } } internal static class ReflectionPatches { internal static void Init() { Universe.Patch(typeof(Assembly), "GetTypes", (MethodType)0, new Type[0], null, null, AccessTools.Method(typeof(ReflectionPatches), "Finalizer_Assembly_GetTypes", (Type[])null, (Type[])null)); } public static Exception Finalizer_Assembly_GetTypes(Assembly __instance, Exception __exception, ref Type[] __result) { if (__exception != null) { if (__exception is ReflectionTypeLoadException e) { __result = ReflectionUtility.TryExtractTypesFromException(e); } else { try { __result = __instance.GetExportedTypes(); } catch (ReflectionTypeLoadException e2) { __result = ReflectionUtility.TryExtractTypesFromException(e2); } catch { __result = ArgumentUtility.EmptyTypes; } } } return null; } } public class ReflectionUtility { public static bool Initializing; public const BindingFlags FLAGS = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; public static readonly SortedDictionary<string, Type> AllTypes = new SortedDictionary<string, Type>(StringComparer.OrdinalIgnoreCase); public static readonly List<string> AllNamespaces = new List<string>(); private static readonly HashSet<string> uniqueNamespaces = new HashSet<string>(); private static string[] allTypeNamesArray; private static readonly Dictionary<string, Type> shorthandToType = new Dictionary<string, Type> { { "object", typeof(object) }, { "string", typeof(string) }, { "bool", typeof(bool) }, { "byte", typeof(byte) }, { "sbyte", typeof(sbyte) }, { "char", typeof(char) }, { "decimal", typeof(decimal) }, { "double", typeof(double) }, { "float", typeof(float) }, { "int", typeof(int) }, { "uint", typeof(uint) }, { "long", typeof(long) }, { "ulong", typeof(ulong) }, { "short", typeof(short) }, { "ushort", typeof(ushort) }, { "void", typeof(void) } }; internal static readonly Dictionary<string, Type[]> baseTypes = new Dictionary<string, Type[]>(); internal static ReflectionUtility Instance { get; private set; } public static event Action<Type> OnTypeLoaded; internal static void Init() { ReflectionPatches.Init(); Instance = new ReflectionUtility(); Instance.Initialize(); } protected virtual void Initialize() { SetupTypeCache(); Initializing = false; } public static string[] GetTypeNameArray() { if (allTypeNamesArray == null || allTypeNamesArray.Length != AllTypes.Count) { allTypeNamesArray = new string[AllTypes.Count]; int num = 0; foreach (string key in AllTypes.Keys) { allTypeNamesArray[num] = key; num++; } } return allTypeNamesArray; } private static void SetupTypeCache() { if (Universe.Context == RuntimeContext.Mono) { ForceLoadManagedAssemblies(); } Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly asm in assemblies) { CacheTypes(asm); } AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded; } private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args) { if ((object)args.LoadedAssembly != null && !(args.LoadedAssembly.GetName().Name == "completions")) { CacheTypes(args.LoadedAssembly); } } private static void ForceLoadManagedAssemblies() { string path = Path.Combine(Application.dataPath, "Managed"); if (!Directory.Exists(path)) { return; } string[] files = Directory.GetFiles(path, "*.dll"); foreach (string path2 in files) { try { Assembly assembly = Assembly.LoadFile(path2); assembly.GetTypes(); } catch { } } } private static void CacheTypes(Assembly asm) { Type[] types = asm.GetTypes(); foreach (Type type in types) { if (!string.IsNullOrEmpty(type.Namespace) && !uniqueNamespaces.Contains(type.Namespace)) { uniqueNamespaces.Add(type.Namespace); int j; for (j = 0; j < AllNamespaces.Count && type.Namespace.CompareTo(AllNamespaces[j]) >= 0; j++) { } AllNamespaces.Insert(j, type.Namespace); } AllTypes[type.FullName] = type; ReflectionUtility.OnTypeLoaded?.Invoke(type); } } public static Type GetTypeByName(string fullName) { return Instance.Internal_GetTypeByName(fullName); } internal virtual Type Internal_GetTypeByName(string fullName) { if (shorthandToType.TryGetValue(fullName, out var value)) { return value; } AllTypes.TryGetValue(fullName, out var value2); return value2; } internal virtual Type Internal_GetActualType(object obj) { return obj?.GetType(); } internal virtual object Internal_TryCast(object obj, Type castTo) { return obj; } public static string ProcessTypeInString(Type type, string theString) { return Instance.Internal_ProcessTypeInString(theString, type); } internal virtual string Internal_ProcessTypeInString(string theString, Type type) { return theString; } public static void FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances) { Instance.Internal_FindSingleton(possibleNames, type, flags, instances); } internal virtual void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances) { foreach (string name in possibleNames) { FieldInfo field = type.GetField(name, flags); if ((object)field != null) { object value = field.GetValue(null); if (value != null) { instances.Add(value); break; } } } } public static Type[] TryExtractTypesFromException(ReflectionTypeLoadException e) { try { return e.Types.Where((Type it) => (object)it != null).ToArray(); } catch { return ArgumentUtility.EmptyTypes; } } public static Type[] GetAllBaseTypes(object obj) { return GetAllBaseTypes(obj?.GetActualType()); } public static Type[] GetAllBaseTypes(Type type) { if ((object)type == null) { throw new ArgumentNullException("type"); } string assemblyQualifiedName = type.AssemblyQualifiedName; if (baseTypes.TryGetValue(assemblyQualifiedName, out var value)) { return value; } List<Type> list = new List<Type>(); while ((object)type != null) { list.Add(type); type = type.BaseType; } value = list.ToArray(); baseTypes.Add(assemblyQualifiedName, value); return value; } public static void GetImplementationsOf(Type baseType, Action<HashSet<Type>> onResultsFetched, bool allowAbstract, bool allowGeneric, bool allowEnum) { RuntimeHelper.StartCoroutine(DoGetImplementations(onResultsFetched, baseType, allowAbstract, allowGeneric, allowEnum)); } private static IEnumerator DoGetImplementations(Action<HashSet<Type>> onResultsFetched, Type baseType, bool allowAbstract, bool allowGeneric, bool allowEnum) { List<Type> resolvedTypes = new List<Type>(); OnTypeLoaded += ourListener; HashSet<Type> set = new HashSet<Type>(); IEnumerator coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator()); while (coro2.MoveNext()) { yield return null; } OnTypeLoaded -= ourListener; if (resolvedTypes.Count > 0) { coro2 = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator()); while (coro2.MoveNext()) { yield return null; } } onResultsFetched(set); void ourListener(Type t) { resolvedTypes.Add(t); } } private static IEnumerator<Type> DefaultTypesEnumerator() { string[] names = GetTypeNameArray(); foreach (string name in names) { yield return AllTypes[name]; } } private static IEnumerator GetImplementationsAsync(Type baseType, HashSet<Type> set, bool allowAbstract, bool allowGeneric, bool allowEnum, IEnumerator<Type> enumerator) { Stopwatch sw = new Stopwatch(); sw.Start(); bool isGenericParam = baseType?.IsGenericParameter ?? false; while (enumerator.MoveNext()) { if (sw.ElapsedMilliseconds > 10) { yield return null; sw.Reset(); sw.Start(); } try { Type type = enumerator.Current; if (set.Contains(type) || (!allowAbstract && type.IsAbstract) || (!allowGeneric && type.IsGenericType) || (!allowEnum && type.IsEnum) || type.FullName.Contains("PrivateImplementationDetails") || type.FullName.Contains("DisplayClass") || Enumerable.Contains(type.FullName, '<')) { continue; } if (!isGenericParam) { if ((object)baseType == null || baseType.IsAssignableFrom(type)) { goto IL_0269; } } else if ((!type.IsClass || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !MiscUtility.HasFlag(baseType.GenericParameterAttributes, GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type))) { goto IL_0269; } goto end_IL_009f; IL_0269: set.Add(type); end_IL_009f:; } catch { } } } public static bool IsEnumerable(Type type) { return Instance.Internal_IsEnumerable(type); } protected virtual bool Internal_IsEnumerable(Type type) { return typeof(IEnumerable).IsAssignableFrom(type); } public static bool TryGetEnumerator(object ienumerable, out IEnumerator enumerator) { return Instance.Internal_TryGetEnumerator(ienumerable, out enumerator); } protected virtual bool Internal_TryGetEnumerator(object list, out IEnumerator enumerator) { enumerator = (list as IEnumerable).GetEnumerator(); return true; } public static bool TryGetEntryType(Type enumerableType, out Type type) { return Instance.Internal_TryGetEntryType(enumerableType, out type); } protected virtual bool Internal_TryGetEntryType(Type enumerableType, out Type type) { if (enumerableType.IsArray) { type = enumerableType.GetElementType(); return true; } Type[] interfaces = enumerableType.GetInterfaces(); foreach (Type type2 in interfaces) { if (type2.IsGenericType) { Type genericTypeDefinition = type2.GetGenericTypeDefinition(); if ((object)genericTypeDefinition == typeof(IEnumerable<>) || (object)genericTypeDefinition == typeof(IList<>) || (object)genericTypeDefinition == typeof(ICollection<>)) { type = type2.GetGenericArguments()[0]; return true; } } } type = typeof(object); return false; } public static bool IsDictionary(Type type) { return Instance.Internal_IsDictionary(type); } protected virtual bool Internal_IsDictionary(Type type) { return typeof(IDictionary).IsAssignableFrom(type); } public static bool TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator) { return Instance.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator); } protected virtual bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator) { dictEnumerator = EnumerateDictionary((IDictionary)dictionary); return true; } private IEnumerator<DictionaryEntry> EnumerateDictionary(IDictionary dict) { IDictionaryEnumerator enumerator = dict.GetEnumerator(); while (enumerator.MoveNext()) { yield return new DictionaryEntry(enumerator.Key, enumerator.Value); } } public static bool TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values) { return Instance.Internal_TryGetEntryTypes(dictionaryType, out keys, out values); } protected virtual bool Internal_TryGetEntryTypes(Type dictionaryType, out Type keys, out Type values) { Type[] interfaces = dictionaryType.GetInterfaces(); foreach (Type type in interfaces) { if (type.IsGenericType && (object)type.GetGenericTypeDefinition() == typeof(IDictionary<, >)) { Type[] genericArguments = type.GetGenericArguments(); keys = genericArguments[0]; values = genericArguments[1]; return true; } } keys = typeof(object); values = typeof(object); return false; } } public abstract class RuntimeHelper { internal static RuntimeHelper Instance { get; private set; } internal static void Init() { Instance = new MonoProvider(); Instance.OnInitialize(); } protected internal abstract void OnInitialize(); public static Coroutine StartCoroutine(IEnumerator routine) { return Instance.Internal_StartCoroutine(routine); } protected internal abstract Coroutine Internal_StartCoroutine(IEnumerator routine); public static void StopCoroutine(Coroutine coroutine) { Instance.Internal_StopCoroutine(coroutine); } protected internal abstract void Internal_StopCoroutine(Coroutine coroutine); public static T AddComponent<T>(GameObject obj, Type type) where T : Component { return Instance.Internal_AddComponent<T>(obj, type); } protected internal abstract T Internal_AddComponent<T>(GameObject obj, Type type) where T : Component; public static ScriptableObject CreateScriptable(Type type) { return Instance.Internal_CreateScriptable(type); } protected internal abstract ScriptableObject Internal_CreateScriptable(Type type); public static string LayerToName(int layer) { return Instance.Internal_LayerToName(layer); } protected internal abstract string Internal_LayerToName(int layer); public static T[] FindObjectsOfTypeAll<T>() where T : Object { return Instance.Internal_FindObjectsOfTypeAll<T>(); } public static Object[] FindObjectsOfTypeAll(Type type) { return Instance.Internal_FindObjectsOfTypeAll(type); } protected internal abstract T[] Internal_FindObjectsOfTypeAll<T>() where T : Object; protected internal abstract Object[] Internal_FindObjectsOfTypeAll(Type type); public static void GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list) { Instance.Internal_GraphicRaycast(raycaster, data, list); } protected internal abstract void Internal_GraphicRaycast(GraphicRaycaster raycaster, PointerEventData data, List<RaycastResult> list); public static GameObject[] GetRootGameObjects(Scene scene) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return Instance.Internal_GetRootGameObjects(scene); } protected internal abstract GameObject[] Internal_GetRootGameObjects(Scene scene); public static int GetRootCount(Scene scene) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return Instance.Internal_GetRootCount(scene); } protected internal abstract int Internal_GetRootCount(Scene scene); public static void SetColorBlockAuto(Selectable selectable, Color baseColor) { //IL_0006: 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_0012: 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_0022: Unknown result type (might be due to invalid IL or missing references) Instance.Internal_SetColorBlock(selectable, baseColor, baseColor * 1.2f, baseColor * 0.8f); } public static void SetColorBlock(Selectable selectable, ColorBlock colors) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) Instance.Internal_SetColorBlock(selectable, colors); } protected internal abstract void Internal_SetColorBlock(Selectable selectable, ColorBlock colors); public static void SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null) { Instance.Internal_SetColorBlock(selectable, normal, highlighted, pressed, disabled); } protected internal abstract void Internal_SetColorBlock(Selectable selectable, Color? normal = null, Color? highlighted = null, Color? pressed = null, Color? disabled = null); } internal class UniversalBehaviour : MonoBehaviour { internal static UniversalBehaviour Instance { get; private set; } internal static void Setup() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Expected O, but got Unknown //IL_0015: 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) GameObject val = new GameObject("UniverseLibBehaviour"); Object.DontDestroyOnLoad((Object)(object)val); ((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D); Instance = val.AddComponent<UniversalBehaviour>(); } internal void Update() { Universe.Update(); } } public class Universe { public enum GlobalState { WaitingToSetup, SettingUp, SetupCompleted } public const string NAME = "UniverseLib"; public const string VERSION = "1.4.3"; public const string AUTHOR = "Sinai"; public const string GUID = "com.sinai.universelib"; private static float startupDelay; private static Action<string, LogType> logHandler; public static RuntimeContext Context { get; } = RuntimeContext.Mono; public static GlobalState CurrentGlobalState { get; private set; } internal static Harmony Harmony { get; } = new Harmony("com.sinai.universelib"); private static event Action OnInitialized; public static void Init(Action onInitialized = null, Action<string, LogType> logHandler = null) { Init(1f, onInitialized, logHandler, default(UniverseLibConfig)); } public static void Init(float startupDelay, Action onInitialized, Action<string, LogType> logHandler, UniverseLibConfig config) { if (CurrentGlobalState == GlobalState.SetupCompleted) { InvokeOnInitialized(onInitialized); return; } if (startupDelay > Universe.startupDelay) { Universe.startupDelay = startupDelay; } ConfigManager.LoadConfig(config); OnInitialized += onInitialized; if (logHandler != null && Universe.logHandler == null) { Universe.logHandler = logHandler; } if (CurrentGlobalState == GlobalState.WaitingToSetup) { CurrentGlobalState = GlobalState.SettingUp; Log("UniverseLib 1.4.3 initializing..."); UniversalBehaviour.Setup(); ReflectionUtility.Init(); RuntimeHelper.Init(); RuntimeHelper.Instance.Internal_StartCoroutine(SetupCoroutine()); Log("Finished UniverseLib initial setup."); } } internal static void Update() { UniversalUI.Update(); } private static IEnumerator SetupCoroutine() { yield return null; Stopwatch sw = new Stopwatch(); sw.Start(); while (ReflectionUtility.Initializing || (float)sw.ElapsedMilliseconds * 0.001f < startupDelay) { yield return null; } InputManager.Init(); UniversalUI.Init(); Log("UniverseLib 1.4.3 initialized."); CurrentGlobalState = GlobalState.SetupCompleted; InvokeOnInitialized(Universe.OnInitialized); } private static void InvokeOnInitialized(Action onInitialized) { if (onInitialized == null) { return; } Delegate[] invocationList = onInitialized.GetInvocationList(); foreach (Delegate @delegate in invocationList) { try { @delegate.DynamicInvoke(); } catch (Exception arg) { LogWarning($"Exception invoking onInitialized callback! {arg}"); } } } internal static void Log(object message) { Log(message, (LogType)3); } internal static void LogWarning(object message) { Log(message, (LogType)2); } internal static void LogError(object message) { Log(message, (LogType)0); } private static void Log(object message, LogType logType) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) logHandler("[UniverseLib] " + (message?.ToString() ?? string.Empty), logType); } internal static bool Patch(Type type, string methodName, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Invalid comparison between Unknown and I4 //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Expected O, but got Unknown try { string text = (((int)methodType == 1) ? "get_" : (((int)methodType != 2) ? string.Empty : "set_")); string text2 = text; MethodInfo methodInfo = ((arguments == null) ? type.GetMethod(text2 + methodName, AccessTools.all) : type.GetMethod(text2 + methodName, AccessTools.all, null, arguments, null)); if ((object)methodInfo == null) { return false; } PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo); if ((object)prefix != null) { val.AddPrefix(new HarmonyMethod(prefix)); } if ((object)postfix != null) { val.AddPostfix(new HarmonyMethod(postfix)); } if ((object)finalizer != null) { val.AddFinalizer(new HarmonyMethod(finalizer)); } val.Patch(); return true; } catch (Exception arg) { LogWarning($"\t Exception patching {type.FullName}.{methodName}: {arg}"); return false; } } internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[] arguments = null, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) foreach (string methodName in possibleNames) { if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer)) { return true; } } return false; } internal static bool Patch(Type type, string[] possibleNames, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) foreach (string methodName in possibleNames) { foreach (Type[] arguments in possibleArguments) { if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer)) { return true; } } } return false; } internal static bool Patch(Type type, string methodName, MethodType methodType, Type[][] possibleArguments, MethodInfo prefix = null, MethodInfo postfix = null, MethodInfo finalizer = null) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) foreach (Type[] arguments in possibleArguments) { if (Patch(type, methodName, methodType, arguments, prefix, postfix, finalizer)) { return true; } } return false; } } } namespace UniverseLib.Utility { public static class ArgumentUtility { public static readonly Type[] EmptyTypes = new Type[0]; public static readonly object[] EmptyArgs = new object[0]; public static readonly Type[] ParseArgs = new Type[1] { typeof(string) }; } public static class IOUtility { private static readonly char[] invalidDirectoryCharacters = Path.GetInvalidPathChars(); private static readonly char[] invalidFilenameCharacters = Path.GetInvalidFileNameChars(); public static string EnsureValidFilePath(string fullPathWithFile) { fullPathWithFile = string.Concat(fullPathWithFile.Split(invalidDirectoryCharacters)); Directory.CreateDirectory(Path.GetDirectoryName(fullPathWithFile)); return fullPathWithFile; } public static string EnsureValidFilename(string filename) { return string.Concat(filename.Split(invalidFilenameCharacters)); } } public static class MiscUtility { public static bool ContainsIgnoreCase(this string _this, string s) { return CultureInfo.CurrentCulture.CompareInfo.IndexOf(_this, s, CompareOptions.IgnoreCase) >= 0; } public static bool HasFlag(this Enum flags, Enum value) { try { ulong num = Convert.ToUInt64(value); return (Convert.ToUInt64(flags) & num) == num; } catch { long num2 = Convert.ToInt64(value); return (Convert.ToInt64(flags) & num2) == num2; } } public static bool EndsWith(this StringBuilder sb, string _string) { int length = _string.Length; if (sb.Length < length) { return false; } int num = 0; int num2 = sb.Length - length; while (num2 < sb.Length) { if (sb[num2] != _string[num]) { return false; } num2++; num++; } return true; } } public static class ParseUtility { internal delegate object ParseMethod(string input); internal delegate string ToStringMethod(object obj); public static readonly string NumberFormatString = "0.####"; private static readonly Dictionary<int, string> numSequenceStrings = new Dictionary<int, string>(); private static readonly HashSet<Type> nonPrimitiveTypes = new HashSet<Type> { typeof(string), typeof(decimal), typeof(DateTime) }; private static readonly HashSet<Type> formattedTypes = new HashSet<Type> { typeof(float), typeof(double), typeof(decimal) }; private static readonly Dictionary<string, string> typeInputExamples = new Dictionary<string, string>(); private static readonly Dictionary<string, ParseMethod> customTypes = new Dictionary<string, ParseMethod> { { typeof(Vector2).FullName, TryParseVector2 }, { typeof(Vector3).FullName, TryParseVector3 }, { typeof(Vector4).FullName, TryParseVector4 }, { typeof(Quaternion).FullName, TryParseQuaternion }, { typeof(Rect).FullName, TryParseRect }, { typeof(Color).FullName, TryParseColor }, { typeof(Color32).FullName, TryParseColor32 }, { typeof(LayerMask).FullName, TryParseLayerMask } }; private static readonly Dictionary<string, ToStringMethod> customTypesToString = new Dictionary<string, ToStringMethod> { { typeof(Vector2).FullName, Vector2ToString }, { typeof(Vector3).FullName, Vector3ToString }, { typeof(Vector4).FullName, Vector4ToString }, { typeof(Quaternion).FullName, QuaternionToString }, { typeof(Rect).FullName, RectToString }, { typeof(Color).FullName, ColorToString }, { typeof(Color32).FullName, Color32ToString }, { typeof(LayerMask).FullName, LayerMaskToString } }; public static string FormatDecimalSequence(params object[] numbers) { if (numbers.Length == 0) { return null; } return string.Format(CultureInfo.CurrentCulture, GetSequenceFormatString(numbers.Length), numbers); } internal static string GetSequenceFormatString(int count) { if (count <= 0) { return null; } if (numSequenceStrings.ContainsKey(count)) { return numSequenceStrings[count]; } string[] array = new string[count]; for (int i = 0; i < count; i++) { array[i] = $"{{{i}:{NumberFormatString}}}"; } string text = string.Join(" ", array); numSequenceStrings.Add(count, text); return text; } public static bool CanParse(Type type) { return !string.IsNullOrEmpty(type?.FullName) && (type.IsPrimitive || type.IsEnum || nonPrimitiveTypes.Contains(type) || customTypes.ContainsKey(type.FullName)); } public static bool CanParse<T>() { return CanParse(typeof(T)); } public static bool TryParse<T>(string input, out T obj, out Exception parseException) { object obj2; bool result = TryParse(input, typeof(T), out obj2, out parseException); if (obj2 != null) { obj = (T)obj2; } else { obj = default(T); } return result; } public static bool TryParse(string input, Type type, out object obj, out Exception parseException) { obj = null; parseException = null; if ((object)type == null) { return false; } if ((object)type == typeof(string)) { obj = input; return true; } if (type.IsEnum) { try { obj = Enum.Parse(type, input); return true; } catch (Exception e) { parseException = e.GetInnerMostException(); return false; } } try { if (customTypes.ContainsKey(type.FullName)) { obj = customTypes[type.FullName](input); } else { obj = AccessTools.Method(type, "Parse", ArgumentUtility.ParseArgs, (Type[])null).Invoke(null, new object[1] { input }); } return true; } catch (Exception e2) { Exception innerMostException = e2.GetInnerMostException(); parseException = innerMostException; } return false; } public static string ToStringForInput<T>(object obj) { return ToStringForInput(obj, typeof(T)); } public static string ToStringForInput(object obj, Type type) { if ((object)type == null || obj == null) { return null; } if ((object)type == typeof(string)) { return obj as string; } if (type.IsEnum) { return Enum.IsDefined(type, obj) ? Enum.GetName(type, obj) : obj.ToString(); } try { if (customTypes.ContainsKey(type.FullName)) { return customTypesToString[type.FullName](obj); } if (formattedTypes.Contains(type)) { return AccessTools.Method(type, "ToString", new Type[2] { typeof(string), typeof(IFormatProvider) }, (Type[])null).Invoke(obj, new object[2] { NumberFormatString, CultureInfo.CurrentCulture }) as string; } return obj.ToString(); } catch (Exception arg) { Universe.LogWarning($"Exception formatting object for input: {arg}"); return null; } } public static string GetExampleInput<T>() { return GetExampleInput(typeof(T)); } public static string GetExampleInput(Type type) { if (!typeInputExamples.ContainsKey(type.AssemblyQualifiedName)) { try { if (type.IsEnum) { typeInputExamples.Add(type.AssemblyQualifiedName, Enum.GetNames(type).First()); } else { object obj = Activator.CreateInstance(type); typeInputExamples.Add(type.AssemblyQualifiedName, ToStringForInput(obj, type)); } } catch (Exception message) { Universe.LogWarning("Exception generating default instance for example input for '" + type.FullName + "'"); Universe.Log(message); return ""; } } return typeInputExamples[type.AssemblyQualifiedName]; } internal static object TryParseVector2(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) Vector2 val = default(Vector2); string[] array = input.Split(new char[1] { ' ' }); val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); return val; } internal static string Vector2ToString(object obj) { //IL_000a: 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_0027: 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) if (!(obj is Vector2 val) || 1 == 0) { return null; } return FormatDecimalSequence(val.x, val.y); } internal static object TryParseVector3(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); string[] array = input.Split(new char[1] { ' ' }); val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); return val; } internal static string Vector3ToString(object obj) { //IL_000a: 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_0027: 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_0043: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Vector3 val) || 1 == 0) { return null; } return FormatDecimalSequence(val.x, val.y, val.z); } internal static object TryParseVector4(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) Vector4 val = default(Vector4); string[] array = input.Split(new char[1] { ' ' }); val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); val.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture); return val; } internal static string Vector4ToString(object obj) { //IL_000a: 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_0027: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Vector4 val) || 1 == 0) { return null; } return FormatDecimalSequence(val.x, val.y, val.z, val.w); } internal static object TryParseQuaternion(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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) Vector3 val = default(Vector3); string[] array = input.Split(new char[1] { ' ' }); if (array.Length == 4) { Quaternion val2 = default(Quaternion); val2.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val2.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val2.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); val2.w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture); return val2; } val.x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val.z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); return Quaternion.Euler(val); } internal static string QuaternionToString(object obj) { //IL_000a: 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_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002f: 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_004b: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Quaternion val) || 1 == 0) { return null; } Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles; return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z); } internal static object TryParseRect(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) Rect val = default(Rect); string[] array = input.Split(new char[1] { ' ' }); ((Rect)(ref val)).x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); ((Rect)(ref val)).y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); ((Rect)(ref val)).width = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); ((Rect)(ref val)).height = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture); return val; } internal static string RectToString(object obj) { //IL_000a: 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) if (!(obj is Rect val) || 1 == 0) { return null; } return FormatDecimalSequence(((Rect)(ref val)).x, ((Rect)(ref val)).y, ((Rect)(ref val)).width, ((Rect)(ref val)).height); } internal static object TryParseColor(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) Color val = default(Color); string[] array = input.Split(new char[1] { ' ' }); val.r = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.g = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val.b = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture); if (array.Length > 3) { val.a = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture); } else { val.a = 1f; } return val; } internal static string ColorToString(object obj) { //IL_000a: 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_0027: 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_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Color val) || 1 == 0) { return null; } return FormatDecimalSequence(val.r, val.g, val.b, val.a); } internal static object TryParseColor32(string input) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) Color32 val = default(Color32); string[] array = input.Split(new char[1] { ' ' }); val.r = byte.Parse(array[0].Trim(), CultureInfo.CurrentCulture); val.g = byte.Parse(array[1].Trim(), CultureInfo.CurrentCulture); val.b = byte.Parse(array[2].Trim(), CultureInfo.CurrentCulture); if (array.Length > 3) { val.a = byte.Parse(array[3].Trim(), CultureInfo.CurrentCulture); } else { val.a = byte.MaxValue; } return val; } internal static string Color32ToString(object obj) { //IL_000a: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Color32 val) || 1 == 0) { return null; } return $"{val.r} {val.g} {val.b} {val.a}"; } internal static object TryParseLayerMask(string input) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) return LayerMask.op_Implicit(int.Parse(input)); } internal static string LayerMaskToString(object obj) { //IL_000a: 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) if (!(obj is LayerMask val) || 1 == 0) { return null; } return ((LayerMask)(ref val)).value.ToString(); } } public static class SignatureHighlighter { public const string NAMESPACE = "#a8a8a8"; public const string CONST = "#92c470"; public const string CLASS_STATIC = "#3a8d71"; public const string CLASS_INSTANCE = "#2df7b2"; public const string STRUCT = "#0fba3a"; public const string INTERFACE = "#9b9b82"; public const string FIELD_STATIC = "#8d8dc6"; public const string FIELD_INSTANCE = "#c266ff"; public const string METHOD_STATIC = "#b55b02"; public const string METHOD_INSTANCE = "#ff8000"; public const string PROP_STATIC = "#588075"; public const string PROP_INSTANCE = "#55a38e"; public const string LOCAL_ARG = "#a6e9e9"; public const string OPEN_COLOR = "<color="; public const string CLOSE_COLOR = "</color>"; public const string OPEN_ITALIC = "<i>"; public const string CLOSE_ITALIC = "</i>"; public static readonly Regex ArrayTokenRegex = new Regex("\\[,*?\\]"); private static readonly Regex colorTagRegex = new Regex("<color=#?[\\d|\\w]*>"); public static readonly Color StringOrange = new Color(0.83f, 0.61f, 0.52f); public static readonly Color EnumGreen = new Color(0.57f, 0.76f, 0.43f); public static readonly Color KeywordBlue = new Color(0.3f, 0.61f, 0.83f); public static readonly string keywordBlueHex = KeywordBlue.ToHex(); public static readonly Color NumberGreen = new Color(0.71f, 0.8f, 0.65f); private static readonly Dictionary<string, string> typeToRichType = new Dictionary<string, string>(); private static readonly Dictionary<string, string> highlightedMethods = new Dictionary<string, string>(); private static readonly Dictionary<Type, string> builtInTypesToShorthand = new Dictionary<Type, string> { { typeof(object), "object" }, { typeof(string), "string" }, { typeof(bool), "bool" }, { typeof(byte), "byte" }, { typeof(sbyte), "sbyte" }, { typeof(char), "char" }, { typeof(decimal), "decimal" }, { typeof(double), "double" }, { typeof(float), "float" }, { typeof(int), "int" }, { typeof(uint), "uint" }, { typeof(long), "long" }, { typeof(ulong), "ulong" }, { typeof(short), "short" }, { typeof(ushort), "ushort" }, { typeof(void), "void" } }; public static string Parse(Type type, bool includeNamespace, MemberInfo memberInfo = null) { if ((object)type == null) { throw new ArgumentNullException("type"); } if (memberInfo is MethodInfo method) { return ParseMethod(method); } if (memberInfo is ConstructorInfo ctor) { return ParseConstructor(ctor); } StringBuilder stringBuilder = new StringBuilder(); if (type.IsByRef) { AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append("ref ").Append("</color>"); } Type type2 = type; while (type2.HasElementType) { type2 = type2.GetElementType(); } includeNamespace &= !builtInTypesToShorthand.ContainsKey(type2); if (!type.IsGenericParameter && (!type.HasElementType || !type.GetElementType().IsGenericParameter) && includeNamespace && TryGetNamespace(type, out var ns)) { AppendOpenColor(stringBuilder, "#a8a8a8").Append(ns).Append("</color>").Append('.'); } stringBuilder.Append(ProcessType(type)); if ((object)memberInfo != null) { stringBuilder.Append('.'); int index = stringBuilder.Length - 1; AppendOpenColor(stringBuilder, GetMemberInfoColor(memberInfo, out var isStatic)).Append(memberInfo.Name).Append("</color>"); if (isStatic) { stringBuilder.Insert(index, "<i>"); stringBuilder.Append("</i>"); } } return stringBuilder.ToString(); } private static string ProcessType(Type type) { string key = type.ToString(); if (typeToRichType.ContainsKey(key)) { return typeToRichType[key]; } StringBuilder stringBuilder = new StringBuilder(); if (!type.IsGenericParameter) { int length = stringBuilder.Length; Type declaringType = type.DeclaringType; while ((object)declaringType != null) { stringBuilder.Insert(length, HighlightType(declaringType) + "."); declaringType = declaringType.DeclaringType; } stringBuilder.Append(HighlightType(type)); if (type.IsGenericType) { ProcessGenericArguments(type, stringBuilder); } } else { stringBuilder.Append("<color=").Append("#92c470").Append('>') .Append(type.Name) .Append("</color>"); } string text = stringBuilder.ToString(); typeToRichType.Add(key, text); return text; } internal static string GetClassColor(Type type) { if (type.IsAbstract && type.IsSealed) { return "#3a8d71"; } if (type.IsEnum || type.IsGenericParameter) { return "#92c470"; } if (type.IsValueType) { return "#0fba3a"; } if (type.IsInterface) { return "#9b9b82"; } return "#2df7b2"; } private static bool TryGetNamespace(Type type, out string ns) { return !string.IsNullOrEmpty(ns = type.Namespace?.Trim()); } private static StringBuilder AppendOpenColor(StringBuilder sb, string color) { return sb.Append("<color=").Append(color).Append('>'); } private static string HighlightType(Type type) { StringBuilder stringBuilder = new StringBuilder(); if (type.IsByRef) { type = type.GetElementType(); } int num = 0; Match match = ArrayTokenRegex.Match(type.Name); if (match != null && match.Success) { num = 1 + match.Value.Count((char c) => c == ','); type = type.GetElementType(); } if (builtInTypesToShorthand.TryGetValue(type, out var value)) { AppendOpenColor(stringBuilder, "#" + keywordBlueHex).Append(value).Append("</color>"); } else { stringBuilder.Append("<color=" + GetClassColor(type) + ">").Append(type.Name).Append("</color>"); } if (num > 0) { stringBuilder.Append('[').Append(new string(',', num - 1)).Append(']'); } return stringBuilder.ToString(); } private static void ProcessGenericArguments(Type type, StringBuilder sb) { List<Type> list = type.GetGenericArguments().ToList(); for (int i = 0; i < sb.Length; i++) { if (!list.Any()) { break; } if (sb[i] != '`') { continue; } int num = i; i++; StringBuilder stringBuilder = new StringBuilder(); for (; char.IsDigit(sb[i]); i++) { stringBuilder.Append(sb[i]); } string text = stringBuilder.ToString(); int num2 = int.Parse(text); sb.Remove(num, text.Length + 1); int num3 = 1; num++; while (num3 < "</color>".Length && sb[num] == "</color>"[num3]) { num3++; num++; } sb.Insert(num, '<'); num++; int length = sb.Length; while (num2 > 0 && list.Any()) { num2--; Type type2 = list.First(); list.RemoveAt(0); sb.Insert(num, ProcessType(type2)); if (num2 > 0) { num += sb.Length - length; sb.Insert(num, ", "); num += 2; length = sb.Length; } } sb.Insert(num + sb.Length - length, '>'); } } public static string RemoveHighlighting(string _string) { if (_string == null) { throw new ArgumentNullException("_string"); } _string = _string.Replace("<i>", string.Empty); _string = _string.Replace("</i>", string.Empty); _string = colorTagRegex.Replace(_string, string.Empty); _string = _string.Replace("</color>", string.Empty); return _string; } [Obsolete("Use 'ParseMethod(MethodInfo)' instead (rename).")] public static string HighlightMethod(MethodInfo method) { return ParseMethod(method); } public static string ParseMethod(MethodInfo method) { string key = GeneralExtensions.FullDescription((MethodBase)method); if (highlightedMethods.ContainsKey(key)) { return highlightedMethods[key]; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(Parse(method.DeclaringType, includeNamespace: false)); stringBuilder.Append('.'); string text = ((!method.IsStatic) ? "#ff8000" : "#b55b02"); stringBuilder.Append("<color=" + text + ">" + method.Name + "</color>"); if (method.IsGenericMethod) { stringBuilder.Append("<"); Type[] genericArguments = method.GetGenericArguments(); for (int i = 0; i < genericArguments.Length; i++) { Type type = genericArguments[i]; if (type.IsGenericParameter) { stringBuilder.Append("<color=#92c470>" + genericArguments[i].Name + "</color>"); } else { stringBuilder.Append(Parse(type, includeNamespace: false)); } if (i < genericArguments.Length - 1) { stringBuilder.Append(", "); } } stringBuilder.Append(">"); } stringBuilder.Append('('); ParameterInfo[] parameters = method.GetParameters(); for (int j = 0; j < parameters.Length; j++) { ParameterInfo parameterInfo = parameters[j]; stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false)); if (j < parameters.Length - 1) { stringBuilder.Append(", "); } } stringBuilder.Append(')'); string text2 = stringBuilder.ToString(); highlightedMethods.Add(key, text2); return text2; } [Obsolete("Use 'ParseConstructor(ConstructorInfo)' instead (rename).")] public static string HighlightConstructor(ConstructorInfo ctor) { return ParseConstructor(ctor); } public static string ParseConstructor(ConstructorInfo ctor) { string key = GeneralExtensions.FullDescription((MethodBase)ctor); if (highlightedMethods.ContainsKey(key)) { return highlightedMethods[key]; } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(Parse(ctor.DeclaringType, includeNamespace: false)); string value = stringBuilder.ToString(); stringBuilder.Append('.'); stringBuilder.Append(value); stringBuilder.Append('('); ParameterInfo[] parameters = ctor.GetParameters(); for (int i = 0; i < parameters.Length; i++) { ParameterInfo parameterInfo = parameters[i]; stringBuilder.Append(Parse(parameterInfo.ParameterType, includeNamespace: false)); if (i < parameters.Length - 1) { stringBuilder.Append(", "); } } stringBuilder.Append(')'); string text = stringBuilder.ToString(); highlightedMethods.Add(key, text); return text; } public static string GetMemberInfoColor(MemberInfo memberInfo, out bool isStatic) { isStatic = false; if (memberInfo is FieldInfo fieldInfo) { if (fieldInfo.IsStatic) { isStatic = true; return "#8d8dc6"; } return "#c266ff"; } if (memberInfo is MethodInfo methodInfo) { if (methodInfo.IsStatic) { isStatic = true; return "#b55b02"; } return "#ff8000"; } if (memberInfo is PropertyInfo propertyInfo) { if (propertyInfo.GetAccessors(nonPublic: true)[0].IsStatic) { isStatic = true; return "#588075"; } return "#55a38e"; } if (memberInfo is ConstructorInfo) { isStatic = true; return "#2df7b2"; } throw new NotImplementedException(memberInfo.GetType().Name + " is not supported"); } } public static class ToStringUtility { internal static Dictionary<string, MethodInfo> toStringMethods = new Dictionary<string, MethodInfo>(); private const string nullString = "<color=grey>null</color>"; private const string nullUnknown = "<color=grey>null</color> (?)"; private const string destroyedString = "<color=red>Destroyed</color>"; private const string untitledString = "<i><color=grey>untitled</color></i>"; private const string eventSystemNamespace = "UnityEngine.EventSystem"; public static string PruneString(string s, int chars = 200, int lines = 5) { if (string.IsNullOrEmpty(s)) { return s; } StringBuilder stringBuilder = new StringBuilder(Math.Max(chars, s.Length)); int num = 0; for (int i = 0; i < s.Length; i++) { if (num >= lines || i >= chars) { stringBuilder.Append("..."); break; } char c = s[i]; if (c == '\r' || c == '\n') { num++; } stringBuilder.Append(c); } return stringBuilder.ToString(); } public static string ToStringWithType(object value, Type fallbackType, bool includeNamespace = true) { if (value.IsNullOrDestroyed() && (object)fallbackType == null) { return "<color=grey>null</color> (?)"; } Type type = value?.GetActualType() ?? fallbackType; string text = SignatureHighlighter.Parse(type, includeNamespace); StringBuilder stringBuilder = new StringBuilder(); if (value.IsNullOrDestroyed()) { if (value == null) { stringBuilder.Append("<color=grey>null</color>"); AppendRichType(stringBuilder, text); return stringBuilder.ToString(); } stringBuilder.Append("<color=red>Destroyed</color>"); AppendRichType(stringBuilder, text); return stringBuilder.ToString(); } Object val = (Object)((value is Object) ? value : null); if (val != null) { if (string.IsNullOrEmpty(val.name)) { stringBuilder.Append("<i><color=grey>untitled</color></i>"); } else { stringBuilder.Append('"'); stringBuilder.Append(PruneString(val.name, 50, 1)); stringBuilder.Append('"'); } AppendRichType(stringBuilder, text); } else if (type.FullName.StartsWith("UnityEngine.EventSystem")) { stringBuilder.Append(text); } else { string text2 = ToString(value); if (type.IsGenericType || text2 == type.FullName || text2 == type.FullName + " " + type.FullName || text2 == "Il2Cpp" + type.FullName || type.FullName == "Il2Cpp" + text2) { stringBuilder.Append(text); } else { stringBuilder.Append(PruneString(text2)); AppendRichType(stringBuilder, text); } } return stringBuilder.ToString(); } private static void AppendRichType(StringBuilder sb, string richType) { sb.Append(' '); sb.Append('('); sb.Append(richType); sb.Append(')'); } private static string ToString(object value) { if (value.IsNullOrDestroyed()) { if (value == null) { return "<color=grey>null</color>"; } return "<color=red>Destroyed</color>"; } Type actualType = value.GetActualType(); if (!toStringMethods.ContainsKey(actualType.AssemblyQualifiedName)) { MethodInfo method = actualType.GetMethod("ToString", ArgumentUtility.EmptyTypes); toStringMethods.Add(actualType.AssemblyQualifiedName, method); } value = value.TryCast(actualType); string theString; try { theString = (string)toStringMethods[actualType.AssemblyQualifiedName].Invoke(value, ArgumentUtility.EmptyArgs); } catch (Exception e) { theString = e.ReflectionExToString(); } return ReflectionUtility.ProcessTypeInString(actualType, theString); } } public static class UnityHelpers { private static PropertyInfo onEndEdit; public static bool OccuredEarlierThanDefault(this float time) { return Time.realtimeSinceStartup - 0.01f >= time; } public static bool OccuredEarlierThan(this float time, float secondsAgo) { return Time.realtimeSinceStartup - secondsAgo >= time; } public static bool IsNullOrDestroyed(this object obj, bool suppressWarning = true) { try { if (obj == null) { if (!suppressWarning) { Universe.LogWarning("The target instance is null!"); } return true; } Object val = (Object)((obj is Object) ? obj : null); if (val != null && !Object.op_Implicit(val)) { if (!suppressWarning) { Universe.LogWarning("The target UnityEngine.Object was destroyed!"); } return true; } return false; } catch { return true; } } public static string GetTransformPath(this Transform transform, bool includeSelf = false) { StringBuilder stringBuilder = new StringBuilder(); if (includeSelf) { stringBuilder.Append(((Object)transform).name); } while (Object.op_Implicit((Object)(object)transform.parent)) { transform = transform.parent; stringBuilder.Insert(0, '/'); stringBuilder.Insert(0, ((Object)transform).name); } return stringBuilder.ToString(); } public static string ToHex(this Color color) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) byte b = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255); byte b2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255); byte b3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255); return $"{b:X2}{b2:X2}{b3:X2}"; } public static Color ToColor(this string _string) { //IL_006c: 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_00e6: 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_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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) _string = _string.Replace("#", ""); if (_string.Length != 6) { return Color.magenta; } byte b = byte.Parse(_string.Substring(0, 2), NumberStyles.HexNumber); byte b2 = byte.Parse(_string.Substring(2, 2), NumberStyles.HexNumber); byte b3 = byte.Parse(_string.Substring(4, 2), NumberStyles.HexNumber); Color result = default(Color); result.r = (float)((decimal)b / 255m); result.g = (float)((decimal)b2 / 255m); result.b = (float)((decimal)b3 / 255m); result.a = 1f; return result; } public static UnityEvent<string> GetOnEndEdit(this InputField _this) { if ((object)onEndEdit == null) { onEndEdit = AccessTools.Property(typeof(InputField), "onEndEdit") ?? throw new Exception("Could not get InputField.onEndEdit property!"); } return onEndEdit.GetValue(_this, null).TryCast<UnityEvent<string>>(); } } } namespace UniverseLib.UI { public class UIBase { internal static readonly int TOP_SORTORDER = 30000; public string ID { get; } public GameObject RootObject { get; } public RectTransform RootRect { get; } public Canvas Canvas { get; } public Action UpdateMethod { get; } public PanelManager Panels { get; } public bool Enabled { get { return Object.op_Implicit((Object)(object)RootObject) && RootObject.activeSelf; } set { UniversalUI.SetUIActive(ID, value); } } public UIBase(string id, Action updateMethod) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012f: 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) if (string.IsNullOrEmpty(id)) { throw new ArgumentException("Cannot register a UI with a null or empty id!"); } if (UniversalUI.registeredUIs.ContainsKey(id)) { throw new ArgumentException("A UI with the id '" + id + "' is already registered!"); } ID = id; UpdateMethod = updateMethod; RootObject = UIFactory.CreateUIObject(id + "_Root", UniversalUI.CanvasRoot); RootObject.SetActive(false); RootRect = RootObject.GetComponent<RectTransform>(); Canvas = RootObject.AddComponent<Canvas>(); Canvas.renderMode = (RenderMode)1; Canvas.referencePixelsPerUnit = 100f; Canvas.sortingOrder = TOP_SORTORDER; Canvas.overrideSorting = true; CanvasScaler val = RootObject.AddComponent<CanvasScaler>(); val.referenceResolution = new Vector2(1920f, 1080f); val.screenMatchMode = (ScreenMatchMode)1; RootObject.AddComponent<GraphicRaycaster>(); RectTransform component = RootObject.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.pivot = new Vector2(0.5f, 0.5f); Panels = CreatePanelManager(); RootObject.SetActive(true); UniversalUI.registeredUIs.Add(id, this); UniversalUI.uiBases.Add(this); } protected virtual PanelManager CreatePanelManager() { return new PanelManager(this); } public void SetOnTop() { RootObject.transform.SetAsLastSibling(); foreach (UIBase uiBasis in UniversalUI.uiBases) { int num = UniversalUI.CanvasRoot.transform.childCount - ((Transform)uiBasis.RootRect).GetSiblingIndex(); uiBasis.Canvas.sortingOrder = TOP_SORTORDER - num; } UniversalUI.uiBases.Sort((UIBase a, UIBase b) => b.RootObject.transform.GetSiblingIndex().CompareTo(a.RootObject.transform.GetSiblingIndex())); } internal void Update() { try { Panels.Update(); UpdateMethod?.Invoke(); } catch (Exception arg) { Universe.LogWarning($"Exception invoking update method for {ID}: {arg}"); } } } public static class UIFactory { internal static Vector2 largeElementSize = new Vector2(100f, 30f); internal static Vector2 smallElementSize = new Vector2(25f, 25f); internal static Color defaultTextColor = Color.white; public static GameObject CreateUIObject(string name, GameObject parent, Vector2 sizeDelta = default(Vector2)) { //IL_0002: 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) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject(name) { layer = 5, hideFlags = (HideFlags)61 }; if (Object.op_Implicit((Object)(object)parent)) { val.transform.SetParent(parent.transform, false); } RectTransform val2 = val.AddComponent<RectTransform>(); val2.sizeDelta = sizeDelta; return val; } internal static void SetDefaultTextValues(Text text) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) ((Graphic)text).color = defaultTextColor; text.font = UniversalUI.DefaultFont; text.fontSize = 14; } internal static void SetDefaultSelectableValues(Selectable selectable) { //IL_0002: 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) //IL_0012: 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_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) Navigation navigation = selectable.navigation; ((Navigation)(ref navigation)).mode = (Mode)4; selectable.navigation = navigation; RuntimeHelper.Instance.Internal_SetColorBlock(selectable, (Color?)new Color(0.2f, 0.2f, 0.2f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)new Color(0.15f, 0.15f, 0.15f), (Color?)null); } public static LayoutElement SetLayoutElement(GameObject gameObject, int? minWidth = null, int? minHeight = null, int? flexibleWidth = null, int? flexibleHeight = null, int? preferredWidth = null, int? preferredHeight = null, bool? ignoreLayout = null) { LayoutElement val = gameObject.GetComponent<LayoutElement>(); if (!Object.op_Implicit((Object)(object)val)) { val = gameObject.AddComponent<LayoutElement>(); } if (minWidth.HasValue) { val.minWidth = minWidth.Value; } if (minHeight.HasValue) { val.minHeight = minHeight.Value; } if (flexibleWidth.HasValue) { val.flexibleWidth = flexibleWidth.Value; } if (flexibleHeight.HasValue) { val.flexibleHeight = flexibleHeight.Value; } if (preferredWidth.HasValue) { val.preferredWidth = preferredWidth.Value; } if (preferredHeight.HasValue) { val.preferredHeight = preferredHeight.Value; } if (ignoreLayout.HasValue) { val.ignoreLayout = ignoreLayout.Value; } return val; } public static T SetLayoutGroup<T>(GameObject gameObject, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup { T val = gameObject.GetComponent<T>(); if (!Object.op_Implicit((Object)(object)val)) { val = gameObject.AddComponent<T>(); } return SetLayoutGroup(val, forceWidth, forceHeight, childControlWidth, childControlHeight, spacing, padTop, padBottom, padLeft, padRight, childAlignment); } public static T SetLayoutGroup<T>(T group, bool? forceWidth = null, bool? forceHeight = null, bool? childControlWidth = null, bool? childControlHeight = null, int? spacing = null, int? padTop = null, int? padBottom = null, int? padLeft = null, int? padRight = null, TextAnchor? childAlignment = null) where T : HorizontalOrVerticalLayoutGroup { //IL_0143: Unknown result type (might be due to invalid IL or missing references) if (forceWidth.HasValue) { ((HorizontalOrVerticalLayoutGroup)group).childForceExpandWidth = forceWidth.Value; } if (forceHeight.HasValue) { ((HorizontalOrVerticalLayoutGroup)group).childForceExpandHeight = forceHeight.Value; } if (childControlWidth.HasValue) { ((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlWidth(childControlWidth.Value); } if (childControlHeight.HasValue) { ((HorizontalOrVerticalLayoutGroup)(object)group).SetChildControlHeight(childControlHeight.Value); } if (spacing.HasValue) { ((HorizontalOrVerticalLayoutGroup)group).spacing = spacing.Value; } if (padTop.HasValue) { ((LayoutGroup)(object)group).padding.top = padTop.Value; } if (padBottom.HasValue) { ((LayoutGroup)(object)group).padding.bottom = padBottom.Value; } if (padLeft.HasValue) { ((LayoutGroup)(object)group).padding.left = padLeft.Value; } if (padRight.HasValue) { ((LayoutGroup)(object)group).padding.right = padRight.Value; } if (childAlignment.HasValue) { ((LayoutGroup)(object)group).childAlignment = childAlignment.Value; } return group; } public static GameObject CreatePanel(string name, GameObject parent, out GameObject contentHolder, Color? bgColor = null) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_0096: 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_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent); UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)1, (int?)1, (int?)1, (int?)1, (TextAnchor?)null); RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.anchoredPosition = Vector2.zero; component.sizeDelta = Vector2.zero; ((Graphic)val.AddComponent<Image>()).color = Color.black; val.AddComponent<RectMask2D>(); contentHolder = CreateUIObject("Content", val); Image val2 = contentHolder.AddComponent<Image>(); val2.type = (Type)3; ((Graphic)val2).color = (Color)((!bgColor.HasValue) ? new Color(0.07f, 0.07f, 0.07f) : bgColor.Value); UIFactory.SetLayoutGroup<VerticalLayoutGroup>(contentHolder, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)3, (int?)3, (int?)3, (int?)3, (int?)3, (TextAnchor?)null); return val; } public static GameObject CreateVerticalGroup(GameObject parent, string name, bool forceWidth, bool forceHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_009d: 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) GameObject val = CreateUIObject(name, parent); UIFactory.SetLayoutGroup<VerticalLayoutGroup>(val, (bool?)forceWidth, (bool?)forceHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor); return val; } public static GameObject CreateHorizontalGroup(GameObject parent, string name, bool forceExpandWidth, bool forceExpandHeight, bool childControlWidth, bool childControlHeight, int spacing = 0, Vector4 padding = default(Vector4), Color bgColor = default(Color), TextAnchor? childAlignment = null) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007c: 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_009d: 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) GameObject val = CreateUIObject(name, parent); UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)forceExpandWidth, (bool?)forceExpandHeight, (bool?)childControlWidth, (bool?)childControlHeight, (int?)spacing, (int?)(int)padding.x, (int?)(int)padding.y, (int?)(int)padding.z, (int?)(int)padding.w, childAlignment); Image val2 = val.AddComponent<Image>(); ((Graphic)val2).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor); return val; } public static GameObject CreateGridGroup(GameObject parent, string name, Vector2 cellSize, Vector2 spacing, Color bgColor = default(Color)) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0043: 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_004c: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent); GridLayoutGroup val2 = val.AddComponent<GridLayoutGroup>(); ((LayoutGroup)val2).childAlignment = (TextAnchor)0; val2.cellSize = cellSize; val2.spacing = spacing; Image val3 = val.AddComponent<Image>(); ((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.17f, 0.17f, 0.17f) : bgColor); return val; } public static Text CreateLabel(GameObject parent, string name, string defaultText, TextAnchor alignment = 3, Color color = default(Color), bool supportRichText = true, int fontSize = 14) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent); Text val2 = val.AddComponent<Text>(); SetDefaultTextValues(val2); val2.text = defaultText; ((Graphic)val2).color = ((color == default(Color)) ? defaultTextColor : color); val2.supportRichText = supportRichText; val2.alignment = alignment; val2.fontSize = fontSize; return val2; } public static ButtonRef CreateButton(GameObject parent, string name, string text, Color? normalColor = null) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_003d: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) Color valueOrDefault = normalColor.GetValueOrDefault(); if (!normalColor.HasValue) { ((Color)(ref valueOrDefault))..ctor(0.25f, 0.25f, 0.25f); normalColor = valueOrDefault; } ButtonRef buttonRef = CreateButton(parent, name, text, default(ColorBlock)); RuntimeHelper instance = RuntimeHelper.Instance; Button component = buttonRef.Component; Color? normal = normalColor; Color? val = normalColor; float num = 1.2f; Color? highlighted = (val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null); val = normalColor; num = 0.7f; instance.Internal_SetColorBlock((Selectable)(object)component, normal, highlighted, val.HasValue ? new Color?(val.GetValueOrDefault() * num) : null); return buttonRef; } public static ButtonRef CreateButton(GameObject parent, string name, string text, ColorBlock colors) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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) //IL_0074: 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_00b4: 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) GameObject val = CreateUIObject(name, parent, smallElementSize); GameObject val2 = CreateUIObject("Text", val); Image val3 = val.AddComponent<Image>(); val3.type = (Type)1; ((Graphic)val3).color = new Color(1f, 1f, 1f, 1f); Button val4 = val.AddComponent<Button>(); SetDefaultSelectableValues((Selectable)(object)val4); ((ColorBlock)(ref colors)).colorMultiplier = 1f; RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val4, colors); Text val5 = val2.AddComponent<Text>(); val5.text = text; SetDefaultTextValues(val5); val5.alignment = (TextAnchor)4; RectTransform component = val2.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; SetButtonDeselectListener(val4); return new ButtonRef(val4); } internal static void SetButtonDeselectListener(Button button) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown ((UnityEvent)button.onClick).AddListener((UnityAction)delegate { ((Selectable)button).OnDeselect((BaseEventData)null); }); } public static GameObject CreateSlider(GameObject parent, string name, out Slider slider) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0070: 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_00a6: 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_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0129: 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_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0189: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_021c: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_0291: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent, smallElementSize); GameObject val2 = CreateUIObject("Background", val); GameObject val3 = CreateUIObject("Fill Area", val); GameObject val4 = CreateUIObject("Fill", val3); GameObject val5 = CreateUIObject("Handle Slide Area", val); GameObject val6 = CreateUIObject("Handle", val5); Image val7 = val2.AddComponent<Image>(); val7.type = (Type)1; ((Graphic)val7).color = new Color(0.15f, 0.15f, 0.15f, 1f); RectTransform component = val2.GetComponent<RectTransform>(); component.anchorMin = new Vector2(0f, 0.25f); component.anchorMax = new Vector2(1f, 0.75f); component.sizeDelta = new Vector2(0f, 0f); RectTransform component2 = val3.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 0.25f); component2.anchorMax = new Vector2(1f, 0.75f); component2.anchoredPosition = new Vector2(-5f, 0f); component2.sizeDelta = new Vector2(-20f, 0f); Image val8 = val4.AddComponent<Image>(); val8.type = (Type)1; ((Graphic)val8).color = new Color(0.3f, 0.3f, 0.3f, 1f); val4.GetComponent<RectTransform>().sizeDelta = new Vector2(10f, 0f); RectTransform component3 = val5.GetComponent<RectTransform>(); component3.sizeDelta = new Vector2(-20f, 0f); component3.anchorMin = new Vector2(0f, 0f); component3.anchorMax = new Vector2(1f, 1f); Image val9 = val6.AddComponent<Image>(); ((Graphic)val9).color = new Color(0.5f, 0.5f, 0.5f, 1f); val6.GetComponent<RectTransform>().sizeDelta = new Vector2(20f, 0f); slider = val.AddComponent<Slider>(); slider.fillRect = val4.GetComponent<RectTransform>(); slider.handleRect = val6.GetComponent<RectTransform>(); ((Selectable)slider).targetGraphic = (Graphic)(object)val9; slider.direction = (Direction)0; RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)slider, (Color?)new Color(0.4f, 0.4f, 0.4f), (Color?)new Color(0.55f, 0.55f, 0.55f), (Color?)new Color(0.3f, 0.3f, 0.3f), (Color?)null); return val; } public static GameObject CreateScrollbar(GameObject parent, string name, out Scrollbar scrollbar) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: 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_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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) GameObject val = CreateUIObject(name, parent, smallElementSize); GameObject val2 = CreateUIObject("Sliding Area", val); GameObject val3 = CreateUIObject("Handle", val2); Image val4 = val.AddComponent<Image>(); val4.type = (Type)1; ((Graphic)val4).color = new Color(0.1f, 0.1f, 0.1f); Image val5 = val3.AddComponent<Image>(); val5.type = (Type)1; ((Graphic)val5).color = new Color(0.4f, 0.4f, 0.4f); RectTransform component = val2.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(-20f, -20f); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; RectTransform component2 = val3.GetComponent<RectTransform>(); component2.sizeDelta = new Vector2(20f, 20f); scrollbar = val.AddComponent<Scrollbar>(); scrollbar.handleRect = component2; ((Selectable)scrollbar).targetGraphic = (Graphic)(object)val5; SetDefaultSelectableValues((Selectable)(object)scrollbar); return val; } public static GameObject CreateToggle(GameObject parent, string name, out Toggle toggle, out Text text, Color bgColor = default(Color), int checkWidth = 20, int checkHeight = 20) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0099: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: 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_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_0177: 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_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent, smallElementSize); UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val, (bool?)false, (bool?)false, (bool?)true, (bool?)true, (int?)5, (int?)0, (int?)0, (int?)0, (int?)0, (TextAnchor?)(TextAnchor)3); toggle = val.AddComponent<Toggle>(); toggle.isOn = true; SetDefaultSelectableValues((Selectable)(object)toggle); Toggle t2 = toggle; ((UnityEvent<bool>)(object)toggle.onValueChanged).AddListener((UnityAction<bool>)delegate { ((Selectable)t2).OnDeselect((BaseEventData)null); }); GameObject val2 = CreateUIObject("Background", val); Image val3 = val2.AddComponent<Image>(); ((Graphic)val3).color = (Color)((bgColor == default(Color)) ? new Color(0.04f, 0.04f, 0.04f, 0.75f) : bgColor); UIFactory.SetLayoutGroup<HorizontalLayoutGroup>(val2, (bool?)true, (bool?)true, (bool?)true, (bool?)true, (int?)0, (int?)2, (int?)2, (int?)2, (int?)2, (TextAnchor?)null); SetLayoutElement(val2, checkWidth, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0); GameObject val4 = CreateUIObject("Checkmark", val2); Image val5 = val4.AddComponent<Image>(); ((Graphic)val5).color = new Color(0.8f, 1f, 0.8f, 0.3f); GameObject val6 = CreateUIObject("Label", val); text = val6.AddComponent<Text>(); text.text = ""; text.alignment = (TextAnchor)3; SetDefaultTextValues(text); SetLayoutElement(val6, 0, flexibleWidth: 0, minHeight: checkHeight, flexibleHeight: 0); toggle.graphic = (Graphic)(object)val5; ((Selectable)toggle).targetGraphic = (Graphic)(object)val3; return val; } public static InputFieldRef CreateInputField(GameObject parent, string name, string placeHolderText) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_004f: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: 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_0128: 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_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0156: 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_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01ea: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0289: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Unknown result type (might be due to invalid IL or missing references) //IL_02a3: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result type (might be due to invalid IL or missing references) GameObject val = CreateUIObject(name, parent); Image val2 = val.AddComponent<Image>(); val2.type = (Type)1; ((Graphic)val2).color = new Color(0f, 0f, 0f, 0.5f); InputField val3 = val.AddComponent<InputField>(); Navigation navigation = ((Selectable)val3).navigation; ((Navigation)(ref navigation)).mode = (Mode)0; ((Selectable)val3).navigation = navigation; val3.lineType = (LineType)0; ((Selectable)val3).interactable = true; ((Selectable)val3).transition = (Transition)1; ((Selectable)val3).targetGraphic = (Graphic)(object)val2; RuntimeHelper.Instance.Internal_SetColorBlock((Selectable)(object)val3, (Color?)new Color(1f, 1f, 1f, 1f), (Color?)new Color(0.95f, 0.95f, 0.95f, 1f), (Color?)new Color(0.78f, 0.78f, 0.78f, 1f), (Color?)null); GameObject val4 = CreateUIObject("TextArea", val); val4.AddComponent<RectMask2D>(); RectTransform component = val4.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; GameObject val5 = CreateUIObject("Placeholder", val4); Text val6 = val5.AddComponent<Text>(); SetDefaultTextValues(val6); val6.text = placeHolderText ?? "..."; ((Graphic)val6).color = new Color(0.5f, 0.5f, 0.5f, 1f); val6.horizontalOverflow = (HorizontalWrapMode)0; val6.alignment = (TextAnchor)3; val6.fontSize = 14; RectTransform component2 = val5.GetComponent<RectTransform>(); component2.anchorMin = Vector2.zero; component2.anchorMax = Vector2.one; component2.offsetMin = Vector2.zero; component2.offsetMax = Vector2.zero; val3.placeholder = (Graphic)(object)val6; GameObject val7 = CreateUIObject("Text", val4); Text val8 = val7.AddComponent<Text>(); SetDefaultTextValues(val8); val8.text = ""; ((Graphic)val8).color = new Color(1f, 1f, 1f, 1f); val8.horizontalOverflow = (HorizontalWrapMode)0; val8.alignment = (TextAnchor)3; val8.fontSize = 14; RectTransform component3 = val7.GetComponent<RectTransform>(); component3.anchorMin = Vector2.zero; component3.anchorMax = Vector2.one; component3.offsetMin = Vector2.zero; component3.offsetMax = Vector2.zero; val3.textComponent = val8; val3.characterLimit = 16000; return new InputFieldRef(val3); } public static GameObject CreateDropdown(GameObject parent, string name, out Dropdown dropdown, string defaultItemText, int itemFontSize, Action<int> onValueChanged, string[] defaultOptions = null) { //IL_0009: 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_0022: 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_0038: 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) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_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_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_020f: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_023d: Unknown result type (might be due to invalid IL or m