Decompiled source of CinematicUnityExplorer v1.0.0
CinematicUnityExplorer.BIE.Unity.IL2CPP.CoreCLR.dll
Decompiled 17 hours ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.CodeDom.Compiler; using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; using System.Diagnostics; using System.Diagnostics.SymbolStore; using System.Globalization; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Timers; using System.Xml; using System.Xml.Serialization; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using CinematicUnityExplorer.Cinematic; using HarmonyLib; using Il2CppInterop.Common; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.Attributes; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppSystem; using Il2CppSystem.Collections; using Il2CppSystem.Collections.Generic; using Microsoft.CodeAnalysis; using Mono.CSharp; using Mono.CSharp.IL2CPP; using Mono.CSharp.Linq; using Mono.CSharp.Nullable; using Mono.CSharp.yyParser; using Mono.CSharp.yydebug; using Mono.CompilerServices.SymbolWriter; using MonoMod.RuntimeDetour; using Tomlet; using Tomlet.Attributes; using Tomlet.Exceptions; using Tomlet.Models; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.Rendering; using UnityEngine.SceneManagement; using UnityEngine.UI; using UnityExplorer; using UnityExplorer.CSConsole; using UnityExplorer.CSConsole.Lexers; using UnityExplorer.CacheObject; using UnityExplorer.CacheObject.IValues; using UnityExplorer.CacheObject.Views; using UnityExplorer.CatmullRom; using UnityExplorer.Config; using UnityExplorer.Hooks; using UnityExplorer.Inspectors; using UnityExplorer.Inspectors.MouseInspectors; using UnityExplorer.Loader.BIE; using UnityExplorer.ObjectExplorer; using UnityExplorer.Runtime; using UnityExplorer.Serializers; using UnityExplorer.UI; using UnityExplorer.UI.Panels; using UnityExplorer.UI.Widgets; using UnityExplorer.UI.Widgets.AutoComplete; using UniverseLib; using UniverseLib.Config; using UniverseLib.Input; using UniverseLib.Runtime; using UniverseLib.UI; using UniverseLib.UI.Models; using UniverseLib.UI.ObjectPool; using UniverseLib.UI.Panels; using UniverseLib.UI.Widgets; using UniverseLib.UI.Widgets.ButtonList; using UniverseLib.UI.Widgets.ScrollView; using UniverseLib.Utility; [assembly: AssemblyTitle("CinematicUnityExplorer")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: AssemblyCompany("originalnicodr, Sinai, yukieiji")] [assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")] [assembly: AssemblyFileVersion("1.4.0")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: ComVisible(false)] [assembly: AssemblyProduct("CinematicUnityExplorer")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.4.0.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded] internal sealed class <300de733-bc39-4fd0-9379-95bf3e51a662>EmbeddedAttribute : System.Attribute { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] [<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded] [CompilerGenerated] internal sealed class <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <267d1362-9a20-4ec0-a85c-2e4ffe48c491>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] [<300de733-bc39-4fd0-9379-95bf3e51a662>Embedded] internal sealed class <320efdd9-03d8-4ad3-a3ae-8138e3594e43>NullableContextAttribute : Attribute { public readonly byte Flag; public <320efdd9-03d8-4ad3-a3ae-8138e3594e43>NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace CinematicUnityExplorer.Cinematic { internal static class NativeMethods { [DllImport("kernel32.dll")] public static extern IntPtr LoadLibrary(string dll); [DllImport("kernel32.dll")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procName); } public class UnityIGCSConnector { [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void MoveCameraCallback(float step_left, float step_up, float fov, int from_start); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void SessionCallback(); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate IntPtr U_IGCS_Initialize(MoveCameraCallback callback, SessionCallback start_cb, SessionCallback end_cb); private Mono.CSharp.Tuple<Vector3, Quaternion> position = null; private Mono.CSharp.Tuple<Vector3, Quaternion> endSessionPosition = null; private readonly bool isValid = false; private bool _isActive = false; private readonly List<System.Delegate> delegates = new List<System.Delegate>(); private readonly Queue<Mono.CSharp.Tuple<float, float>> commands = new Queue<Mono.CSharp.Tuple<float, float>>(); private IntPtr CameraStatus = IntPtr.Zero; public bool IsActive => isValid && _isActive; public void UpdateFreecamStatus(bool enabled) { if (!(CameraStatus == IntPtr.Zero)) { Marshal.WriteByte(CameraStatus, (byte)(enabled ? 1 : 0)); } } public void ExecuteCameraCommand(Camera cam) { //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) //IL_00b3: 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) Transform transform = ((Component)cam).transform; ShouldMoveToOriginalPosition(transform); if (!_isActive || position == null) { position = new Mono.CSharp.Tuple<Vector3, Quaternion>(transform.position, transform.rotation); } if (!_isActive || position == null) { return; } Mono.CSharp.Tuple<float, float> tuple = null; lock (commands) { if (commands.Count <= 0) { return; } tuple = commands.Dequeue(); } transform.position = position.Item1; transform.rotation = position.Item2; transform.Translate(tuple.Item1, tuple.Item2, 0f); } private void MoveCamera(float stepLeft, float stepUp, float fov, int fromStart) { lock (commands) { commands.Enqueue(new Mono.CSharp.Tuple<float, float>(stepLeft, stepUp)); } } private void StartSession() { _isActive = true; } public void ShouldMoveToOriginalPosition(Transform transform) { //IL_0026: 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) if (isValid && endSessionPosition != null) { transform.position = endSessionPosition.Item1; transform.rotation = endSessionPosition.Item2; endSessionPosition = null; } } private void EndSession() { endSessionPosition = position; position = null; _isActive = false; lock (commands) { commands.Clear(); } } public UnityIGCSConnector() { string text = ((IntPtr.Size == 8) ? "UnityIGCSConnector.dll" : "UnityIGCSConnector.32.dll"); IntPtr intPtr = NativeMethods.LoadLibrary(text); if (intPtr == IntPtr.Zero) { ExplorerCore.LogWarning(text + " was not found so IGCSDof will not be available"); return; } IntPtr procAddress = NativeMethods.GetProcAddress(intPtr, "U_IGCS_Initialize"); if (procAddress == IntPtr.Zero) { throw new EntryPointNotFoundException("Failed to find 'U_IGCS_Initialize' which means you can have a corrupt UnityIGCSConnector.dll."); } U_IGCS_Initialize u_IGCS_Initialize = (U_IGCS_Initialize)Marshal.GetDelegateForFunctionPointer(procAddress, typeof(U_IGCS_Initialize)); delegates.Add(new MoveCameraCallback(MoveCamera)); delegates.Add(new SessionCallback(StartSession)); delegates.Add(new SessionCallback(EndSession)); CameraStatus = u_IGCS_Initialize((MoveCameraCallback)delegates[0], (SessionCallback)delegates[1], (SessionCallback)delegates[2]); if (CameraStatus == IntPtr.Zero) { throw new Exception("IGCSDof returned an invalid pointer which means something went wrong"); } isValid = true; } } } namespace UniverseLib.Input { public static class IGamepadInputInterceptor { private static bool _isEnabled = false; private static int _targetGamepadIndex = 0; private static Type _gamepadType; private static Type _buttonControlType; private static Type _axisControlType; private static Type _vector2ControlType; private static Type _inputControlType; private static PropertyInfo _basePathProp; private static PropertyInfo _buttonIsPressedProp; private static PropertyInfo _buttonWasPressedProp; private static PropertyInfo _buttonWasReleasedProp; private static MethodInfo _axisReadValueMethod; private static MethodInfo _vector2ReadValueMethod; private static PropertyInfo _deviceProp; private static PropertyInfo _vector2XProp; private static PropertyInfo _vector2YProp; private static PropertyInfo _gamepadAllProp; private static PropertyInfo _gamepadCurrentProp; private static PropertyInfo _gamepadLeftStickProp; private static PropertyInfo _gamepadRightStickProp; private static readonly Dictionary<string, string> _vendorPrefixMap = new Dictionary<string, string> { { "/xinputcontrollerwindows", "/gamepad" }, { "/xinputcontroller", "/gamepad" }, { "/dualshockgamepad", "/gamepad" }, { "/dualsensegamepad", "/gamepad" }, { "/dualshock4gamepadhid", "/gamepad" }, { "/dualshock3gamepadhid", "/gamepad" }, { "/androidgamepad", "/gamepad" }, { "/switchprocontrollerhid", "/gamepad" } }; private static readonly Dictionary<string, object> _axisControls = new Dictionary<string, object>(); private static readonly Dictionary<string, object> _vector2Controls = new Dictionary<string, object>(); private static readonly Dictionary<string, float> _axisValues = new Dictionary<string, float>(); private static readonly Dictionary<string, Vector2> _vector2Values = new Dictionary<string, Vector2>(); public static void Init() { try { LoadReflectedTypes(); if (!(_gamepadType == null) && !(_axisControlType == null)) { PatchAnalogControls(); DiscoverGamepadControls(); _isEnabled = true; } } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Init failed: " + ex.Message + "\n" + ex.StackTrace); } } public static void Enable() { _isEnabled = true; } public static void Disable() { _isEnabled = false; } public static void SetTargetGamepad(int index) { _targetGamepadIndex = index; ClearControlCaches(); DiscoverGamepadControls(); } private static void LoadReflectedTypes() { _gamepadType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Gamepad, Unity.InputSystem"); _buttonControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem"); _axisControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.AxisControl, Unity.InputSystem"); _vector2ControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.Vector2Control, Unity.InputSystem"); _inputControlType = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputControl, Unity.InputSystem"); _basePathProp = _inputControlType?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public); _buttonIsPressedProp = _buttonControlType?.GetProperty("isPressed", BindingFlags.Instance | BindingFlags.Public); _buttonWasPressedProp = _buttonControlType?.GetProperty("wasPressedThisFrame", BindingFlags.Instance | BindingFlags.Public); _buttonWasReleasedProp = _buttonControlType?.GetProperty("wasReleasedThisFrame", BindingFlags.Instance | BindingFlags.Public); _axisReadValueMethod = _axisControlType?.GetMethod("ReadValue", Type.EmptyTypes); _vector2ReadValueMethod = _vector2ControlType?.GetMethod("ReadValue", Type.EmptyTypes); _deviceProp = _inputControlType?.GetProperty("device", BindingFlags.Instance | BindingFlags.Public); _vector2XProp = _vector2ControlType?.GetProperty("x", BindingFlags.Instance | BindingFlags.Public); _vector2YProp = _vector2ControlType?.GetProperty("y", BindingFlags.Instance | BindingFlags.Public); _gamepadAllProp = _gamepadType?.GetProperty("all", BindingFlags.Static | BindingFlags.Public); _gamepadCurrentProp = _gamepadType?.GetProperty("current", BindingFlags.Static | BindingFlags.Public); _gamepadLeftStickProp = _gamepadType?.GetProperty("leftStick", BindingFlags.Instance | BindingFlags.Public); _gamepadRightStickProp = _gamepadType?.GetProperty("rightStick", BindingFlags.Instance | BindingFlags.Public); } private static void LogLoadedType(string name, Type type) { if (type != null) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Loaded type: " + name); } else { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to load type: " + name); } } private static void PatchAnalogControls() { try { if (_vector2ControlType != null) { MethodInfo method = _vector2ControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); if (method == null) { Type baseType = _vector2ControlType.BaseType; if (baseType != null && baseType.IsGenericType) { method = baseType.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); } } if (method != null) { PatchMethod(method, null, "Postfix_Vector2ReadValue"); } } if (!(_axisControlType != null)) { return; } MethodInfo method2 = _axisControlType.GetMethod("ReadValue", BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); if (method2 == null) { Type baseType2 = _axisControlType.BaseType; if (baseType2 != null && baseType2.IsGenericType) { method2 = baseType2.GetMethod("ReadValue", BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null); } } if (method2 != null) { PatchMethod(method2, null, "Postfix_AxisReadValue"); } } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error during patching: " + ex.Message); } } private static void PatchMethod(MethodInfo method, string prefixName, string postfixName) { //IL_006c: 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) try { if (!(method == null) && !(Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null)) { MethodInfo methodInfo = ((prefixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), prefixName, (Type[])null, (Type[])null) : null); MethodInfo methodInfo2 = ((postfixName != null) ? AccessTools.Method(typeof(IGamepadInputInterceptor), postfixName, (Type[])null, (Type[])null) : null); ExplorerCore.Harmony.Patch((MethodBase)method, (!(methodInfo != null)) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo), (!(methodInfo2 != null)) ? ((HarmonyMethod)null) : new HarmonyMethod(methodInfo2), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to patch method: " + ex.Message); } } private static void DiscoverGamepadControls() { try { object gamepadInstance = GetGamepadInstance(_targetGamepadIndex); if (gamepadInstance == null) { return; } string[] array = new string[12] { "buttonSouth", "buttonNorth", "buttonWest", "buttonEast", "leftStickButton", "rightStickButton", "leftShoulder", "rightShoulder", "startButton", "selectButton", "leftTrigger", "rightTrigger" }; string[] array2 = new string[2] { "leftStick", "rightStick" }; string[] array3 = array; foreach (string text in array3) { try { PropertyInfo property = _gamepadType.GetProperty(text, BindingFlags.Instance | BindingFlags.Public); if (!(property != null)) { continue; } object value = property.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value != null) { string text2 = ExtractAndNormalizePath(value); if (!string.IsNullOrEmpty(text2)) { INewInputSystem.gamepadButtonControls[text2] = value; } } } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access button " + text + ": " + ex.Message); } } try { PropertyInfo property2 = _gamepadType.GetProperty("dpad", BindingFlags.Instance | BindingFlags.Public); if (property2 != null) { object value2 = property2.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value2 != null) { string[] array4 = new string[4] { "up", "down", "left", "right" }; string[] array5 = array4; foreach (string text3 in array5) { try { PropertyInfo property3 = value2.GetType().GetProperty(text3, BindingFlags.Instance | BindingFlags.Public); if (!(property3 != null)) { continue; } object value3 = property3.GetValue(value2, BindingFlags.Default, null, null, null); if (value3 != null) { string text4 = ExtractAndNormalizePath(value3); if (!string.IsNullOrEmpty(text4)) { INewInputSystem.gamepadButtonControls[text4] = value3; } } } catch (Exception ex2) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad." + text3 + ": " + ex2.Message); } } } } } catch (Exception ex3) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access dpad: " + ex3.Message); } string[] array6 = array2; foreach (string text5 in array6) { try { PropertyInfo property4 = _gamepadType.GetProperty(text5, BindingFlags.Instance | BindingFlags.Public); if (!(property4 != null)) { continue; } object value4 = property4.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value4 == null) { continue; } string text6 = ExtractAndNormalizePath(value4); if (!string.IsNullOrEmpty(text6)) { _vector2Controls[text6] = value4; } string[] array7 = new string[2] { "x", "y" }; string[] array8 = array7; foreach (string text7 in array8) { try { PropertyInfo property5 = value4.GetType().GetProperty(text7, BindingFlags.Instance | BindingFlags.Public); if (!(property5 != null)) { continue; } object value5 = property5.GetValue(value4, BindingFlags.Default, null, null, null); if (value5 != null) { string value6 = ExtractAndNormalizePath(value5); if (!string.IsNullOrEmpty(value6)) { string text8 = text5.ToLowerInvariant(); string key = "/gamepad/" + text8 + "/" + text7; _axisControls[key] = value5; } } } catch (Exception ex4) { ExplorerCore.LogWarning($"[IGamepadInputInterceptor] Failed to access {text5}.{text7}: {ex4.Message}"); } } } catch (Exception ex5) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access vector2 " + text5 + ": " + ex5.Message); } } string[] array9 = new string[2] { "leftTrigger", "rightTrigger" }; string[] array10 = array9; foreach (string text9 in array10) { try { PropertyInfo property6 = _gamepadType.GetProperty(text9, BindingFlags.Instance | BindingFlags.Public); if (!(property6 != null)) { continue; } object value7 = property6.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value7 != null) { string text10 = ExtractAndNormalizePath(value7); if (!string.IsNullOrEmpty(text10)) { _axisControls[text10] = value7; } } } catch (Exception ex6) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Failed to access " + text9 + ": " + ex6.Message); } } int num = INewInputSystem.gamepadButtonControls.Count + _axisControls.Count + _vector2Controls.Count; } catch (Exception ex7) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error discovering controls: " + ex7.Message + "\n" + ex7.StackTrace); } } private static object GetGamepadInstance(int index) { try { if (_gamepadAllProp != null) { object value = _gamepadAllProp.GetValue(null, BindingFlags.Default, null, null, null); if (value != null) { Type type = value.GetType(); PropertyInfo property = type.GetProperty("Count", BindingFlags.Instance | BindingFlags.Public); PropertyInfo property2 = type.GetProperty("Item", BindingFlags.Instance | BindingFlags.Public); if (property != null && property2 != null) { int num = (int)property.GetValue(value, BindingFlags.Default, null, null, null); if (index >= 0 && index < num) { return property2.GetValue(value, new object[1] { index }); } } } } if (_gamepadCurrentProp != null) { return _gamepadCurrentProp.GetValue(null, BindingFlags.Default, null, null, null); } return null; } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error getting gamepad instance: " + ex.Message); return null; } } private static string ExtractAndNormalizePath(object control) { if (control == null) { return null; } string text = null; try { string text2 = control.ToString(); if (!string.IsNullOrEmpty(text2)) { int num = text2.IndexOf('/'); if (num >= 0) { int num2 = text2.IndexOf('}', num); if (num2 >= 0) { text = text2.Substring(num, num2 - num); } } } } catch { } if (string.IsNullOrEmpty(text)) { try { if (_basePathProp != null) { object value = _basePathProp.GetValue(control, BindingFlags.Default, null, null, null); text = value as string; } } catch { } } if (string.IsNullOrEmpty(text)) { try { PropertyInfo property = control.GetType().GetProperty("name", BindingFlags.Instance | BindingFlags.Public); if (property != null) { string text3 = property.GetValue(control, BindingFlags.Default, null, null, null) as string; if (!string.IsNullOrEmpty(text3)) { text = "/gamepad/" + text3; } } } catch { } } if (string.IsNullOrEmpty(text)) { return null; } return NormalizeControlPath(text); } public static string NormalizeControlPath(string rawPath) { if (string.IsNullOrEmpty(rawPath)) { return rawPath; } string text = rawPath.ToLowerInvariant().Trim(); foreach (KeyValuePair<string, string> item in _vendorPrefixMap) { if (text.StartsWith(item.Key)) { text = item.Value + text.Substring(item.Key.Length); break; } } int length = "/gamepad".Length; if (text.StartsWith("/gamepad") && text.Length > length && char.IsDigit(text[length])) { text = "/gamepad" + text.Substring(length + 1); } switch (text) { default: if (!(text == "/gamepad/right")) { break; } goto case "/gamepad/up"; case "/gamepad/up": case "/gamepad/down": case "/gamepad/left": { string text2 = text.Substring("/gamepad/".Length); text = "/gamepad/dpad/" + text2; break; } } return text; } private static void ClearControlCaches() { INewInputSystem.gamepadButtonControls.Clear(); _axisControls.Clear(); _vector2Controls.Clear(); _axisValues.Clear(); _vector2Values.Clear(); } public static bool IsButtonPressed(string buttonPath) { if (!_isEnabled) { return false; } string key = buttonPath.ToLower(); if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonIsPressedProp != null) { _buttonIsPressedProp.GetValue(value, BindingFlags.Default, null, null, null); } bool value2; return INewInputSystem.buttonPressedStates.TryGetValue(key, out value2) && value2; } public static bool WasButtonPressedThisFrame(string buttonPath) { if (!_isEnabled) { return false; } string key = buttonPath.ToLower(); if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonWasPressedProp != null) { _buttonWasPressedProp.GetValue(value, BindingFlags.Default, null, null, null); } bool value2; return INewInputSystem.buttonWasPressedStates.TryGetValue(key, out value2) && value2; } public static bool WasButtonReleasedThisFrame(string buttonPath) { if (!_isEnabled) { return false; } string key = buttonPath.ToLower(); if (INewInputSystem.gamepadButtonControls.TryGetValue(key, out var value) && _buttonWasReleasedProp != null) { _buttonWasReleasedProp.GetValue(value, BindingFlags.Default, null, null, null); } bool value2; return INewInputSystem.buttonWasReleasedStates.TryGetValue(key, out value2) && value2; } public static float GetAxisValue(string axisPath) { if (!_isEnabled) { return 0f; } string key = NormalizeControlPath(axisPath ?? ""); if (_axisControls.TryGetValue(key, out var value) && _axisReadValueMethod != null) { _axisReadValueMethod.Invoke(value, null); } float value2; return _axisValues.TryGetValue(key, out value2) ? value2 : 0f; } public static Vector2 GetVector2Value(string vectorPath) { //IL_0017: 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_0087: 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_007b: 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) if (!_isEnabled) { return new Vector2(0f, 0f); } string key = NormalizeControlPath(vectorPath ?? ""); if (_vector2Controls.TryGetValue(key, out var value) && _vector2ReadValueMethod != null) { _vector2ReadValueMethod.Invoke(value, null); } Vector2 value2; return (Vector2)(_vector2Values.TryGetValue(key, out value2) ? value2 : new Vector2(0f, 0f)); } public static IEnumerable<string> GetRegisteredButtonPaths() { return INewInputSystem.gamepadButtonControls.Keys; } public static IEnumerable<string> GetRegisteredAxisPaths() { return _axisControls.Keys; } public static IEnumerable<string> GetRegisteredVector2Paths() { return _vector2Controls.Keys; } private static void Postfix_Vector2ReadValue(object __instance, ref object __result) { //IL_00c9: Unknown result type (might be due to invalid IL or missing references) if (__instance == null || __result == null) { return; } try { if (_deviceProp != null) { object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null); if (value == null) { return; } } } catch { return; } string text = ExtractAndNormalizePath(__instance); if (string.IsNullOrEmpty(text)) { return; } try { if (_vector2XProp != null && _vector2YProp != null) { float num = (float)_vector2XProp.GetValue(__result, BindingFlags.Default, null, null, null); float num2 = (float)_vector2YProp.GetValue(__result, BindingFlags.Default, null, null, null); _vector2Values[text] = new Vector2(num, num2); if (_isEnabled && FreeCamPanel.ShouldOverrideInput() && _vector2XProp.CanWrite && _vector2YProp.CanWrite) { _vector2XProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null); _vector2YProp.SetValue(__result, 0f, BindingFlags.Default, null, null, null); } } } catch { } } private static void Postfix_AxisReadValue(object __instance, ref float __result) { if (__instance == null) { return; } try { if (_deviceProp != null) { object value = _deviceProp.GetValue(__instance, BindingFlags.Default, null, null, null); if (value == null) { return; } } } catch { return; } string text = ExtractAndNormalizePath(__instance); if (string.IsNullOrEmpty(text)) { return; } string text2 = text; try { object gamepadInstance = GetGamepadInstance(_targetGamepadIndex); if (gamepadInstance != null) { if (_gamepadLeftStickProp != null) { object value2 = _gamepadLeftStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value2 != null) { PropertyInfo property = value2.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public); PropertyInfo property2 = value2.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public); object obj2 = property?.GetValue(value2, BindingFlags.Default, null, null, null); object obj3 = property2?.GetValue(value2, BindingFlags.Default, null, null, null); if (__instance == obj2 || __instance == obj3) { text2 = text.Replace("/gamepad/x", "/gamepad/leftstick/x").Replace("/gamepad/y", "/gamepad/leftstick/y"); } } } if (text2 == text && _gamepadRightStickProp != null) { object value3 = _gamepadRightStickProp.GetValue(gamepadInstance, BindingFlags.Default, null, null, null); if (value3 != null) { PropertyInfo property3 = value3.GetType().GetProperty("x", BindingFlags.Instance | BindingFlags.Public); PropertyInfo property4 = value3.GetType().GetProperty("y", BindingFlags.Instance | BindingFlags.Public); object obj4 = property3?.GetValue(value3, BindingFlags.Default, null, null, null); object obj5 = property4?.GetValue(value3, BindingFlags.Default, null, null, null); if (__instance == obj4 || __instance == obj5) { text2 = text.Replace("/gamepad/x", "/gamepad/rightstick/x").Replace("/gamepad/y", "/gamepad/rightstick/y"); } } } } } catch (Exception ex) { ExplorerCore.LogWarning("[IGamepadInputInterceptor] Error identifying stick axis: " + ex.Message); } _axisValues[text2] = __result; if (_isEnabled && FreeCamPanel.ShouldOverrideInput()) { __result = 0f; } } } public static class IInputManager { private static InputType currentInputType; public static Vector3 MousePosition => InputManager.MousePosition; public static void Setup() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: 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_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected I4, but got Unknown currentInputType = InputManager.CurrentType; InputType val = currentInputType; InputType val2 = val; switch ((int)val2) { case 1: ILegacyInput.Init(); break; case 0: INewInputSystem.Init(); break; case 2: break; } } public static bool GetKey(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected I4, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) InputType val = currentInputType; InputType val2 = val; return (int)val2 switch { 1 => ILegacyInput.GetKey(key), 0 => INewInputSystem.GetKey(key), _ => InputManager.GetKey(key), }; } public unsafe static bool GetKeyDown(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected I4, but got Unknown //IL_001d: 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) InputType val = currentInputType; InputType val2 = val; switch ((int)val2) { case 1: return ILegacyInput.GetKeyDown(key); case 0: { string buttonName = ("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower(); return INewInputSystem.GetButtonWasPressed(buttonName); } default: return InputManager.GetKeyDown(key); } } public unsafe static bool GetKeyUp(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected I4, but got Unknown //IL_001d: 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) InputType val = currentInputType; InputType val2 = val; switch ((int)val2) { case 1: return ILegacyInput.GetKeyUp(key); case 0: { string buttonName = ("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower(); return INewInputSystem.GetButtonWasReleased(buttonName); } default: return InputManager.GetKeyUp(key); } } public static bool GetMouseButton(int button) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected I4, but got Unknown InputType val = currentInputType; InputType val2 = val; return (int)val2 switch { 1 => ILegacyInput.GetMouseButton(button), 0 => INewInputSystem.GetMouseButton(button), _ => InputManager.GetMouseButton(button), }; } public static bool GetMouseButtonDown(int button) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected I4, but got Unknown InputType val = currentInputType; InputType val2 = val; return (int)val2 switch { 1 => ILegacyInput.GetMouseButtonDown(button), 0 => INewInputSystem.GetMouseButtonDown(button), _ => InputManager.GetMouseButtonDown(button), }; } } public static class ILegacyInput { public static Dictionary<KeyCode, bool> getKeyDict = new Dictionary<KeyCode, bool>(); public static Dictionary<KeyCode, bool> getKeyDownDict = new Dictionary<KeyCode, bool>(); public static Dictionary<KeyCode, bool> getKeyUpDict = new Dictionary<KeyCode, bool>(); public static Dictionary<int, bool> getMouseButton = new Dictionary<int, bool>(); public static Dictionary<int, bool> getMouseButtonDown = new Dictionary<int, bool>(); public static bool GetKey(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) if ((int)key == 0) { return false; } InputManager.GetKey(key); return getKeyDict[key]; } public static bool GetKeyDown(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) if ((int)key == 0) { return false; } InputManager.GetKeyDown(key); return getKeyDownDict[key]; } public static bool GetKeyUp(KeyCode key) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) if ((int)key == 0) { return false; } InputManager.GetKeyUp(key); return getKeyUpDict[key]; } public static bool GetMouseButton(int button) { InputManager.GetMouseButton(button); return getMouseButton[button]; } public static bool GetMouseButtonDown(int button) { InputManager.GetMouseButtonDown(button); return getMouseButtonDown[button]; } public static void Init() { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Expected O, but got Unknown //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Expected O, but got Unknown //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Expected O, but got Unknown //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Expected O, but got Unknown //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Expected O, but got Unknown //IL_02f6: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Expected O, but got Unknown //IL_0365: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Expected O, but got Unknown Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.Input"); try { MethodInfo method = typeByName.GetMethod("GetKey", new Type[1] { typeof(string) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method2 = typeByName.GetMethod("GetKey", new Type[1] { typeof(KeyCode) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method2) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method2, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method3 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(string) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method3) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method3, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method4 = typeByName.GetMethod("GetKeyDown", new Type[1] { typeof(KeyCode) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method4) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method4, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyDownKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method5 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(string) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method5) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method5, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpString", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method6 = typeByName.GetMethod("GetKeyUp", new Type[1] { typeof(KeyCode) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method6) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method6, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideKeyUpKeyCode", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method7 = typeByName.GetMethod("GetMouseButton", new Type[1] { typeof(int) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method7) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method7, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButton", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } try { MethodInfo method8 = typeByName.GetMethod("GetMouseButtonDown", new Type[1] { typeof(int) }); if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method8) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method8, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(ILegacyInput), "OverrideMouseButtonDown", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } catch { } } public static void OverrideKeyString(ref bool __result, ref string name) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name); getKeyDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } public static void OverrideKeyKeyCode(ref bool __result, ref KeyCode key) { if (key) { getKeyDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } } public static void OverrideKeyDownString(ref bool __result, ref string name) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name); getKeyDownDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } public static void OverrideKeyDownKeyCode(ref bool __result, ref KeyCode key) { if (key) { getKeyDownDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } } public static void OverrideKeyUpString(ref bool __result, ref string name) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) KeyCode key = (KeyCode)System.Enum.Parse(typeof(KeyCode), name); getKeyUpDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } public static void OverrideKeyUpKeyCode(ref bool __result, ref KeyCode key) { if (key) { getKeyUpDict[key] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } } public static void OverrideMouseButton(ref bool __result, ref int button) { getMouseButton[button] = __result; if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu)) { __result = false; } } public static void OverrideMouseButtonDown(ref bool __result, ref int button) { getMouseButtonDown[button] = __result; if (FreeCamPanel.ShouldOverrideInput() && (button != 0 || !UIManager.ShowMenu)) { __result = false; } } } public static class INewInputSystem { private static PropertyInfo isPressedProp; private static PropertyInfo wasPressedProp; private static PropertyInfo wasReleasedProp; private static MethodInfo isValueConsideredPressed; private static MethodInfo isPressedMethod; private static MethodInfo isInProgressMethod; private static MethodInfo wasPressedMethod; private static MethodInfo wasPerformedMethod; internal static readonly Dictionary<string, object> buttonControls = new Dictionary<string, object>(); internal static readonly Dictionary<string, object> gamepadButtonControls = new Dictionary<string, object>(); internal static readonly Dictionary<string, bool> buttonPressedStates = new Dictionary<string, bool>(); internal static readonly Dictionary<string, bool> buttonWasPressedStates = new Dictionary<string, bool>(); internal static readonly Dictionary<string, bool> buttonWasReleasedStates = new Dictionary<string, bool>(); private static readonly Dictionary<string, bool> buttonIsValueConsideredPressedStates = new Dictionary<string, bool>(); private static readonly Dictionary<string, bool> actionInProgressStates = new Dictionary<string, bool>(); private static readonly Dictionary<string, bool> actionWasPerformedStates = new Dictionary<string, bool>(); public static void Init() { Type typeByName = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem"); Type typeByName2 = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.InputAction, Unity.InputSystem"); if (typeByName == null || typeByName2 == null) { ExplorerCore.LogWarning("Unity.InputSystem types not found; InputSystem integration disabled."); return; } PatchButtonControl(typeByName); PatchInputAction(typeByName2); GetButtonControls(); IGamepadInputInterceptor.Init(); } private static void PatchButtonControl(Type buttonControlType) { isPressedProp = buttonControlType.GetProperty("isPressed"); wasPressedProp = buttonControlType.GetProperty("wasPressedThisFrame"); wasReleasedProp = buttonControlType.GetProperty("wasReleasedThisFrame"); isValueConsideredPressed = buttonControlType.GetMethod("IsValueConsideredPressed"); PatchPropertyGetter(isPressedProp, "Postfix_IsPressed"); PatchPropertyGetter(wasPressedProp, "Postfix_WasPressedThisFrame"); PatchPropertyGetter(wasReleasedProp, "Postfix_WasReleasedThisFrame"); PatchPropertyGetter(wasReleasedProp, "Postfix_IsValueConsideredPressed"); } private static void PatchInputAction(Type inputActionType) { isPressedMethod = inputActionType.GetMethod("IsPressed"); isInProgressMethod = inputActionType.GetMethod("IsInProgress"); wasPressedMethod = inputActionType.GetMethod("WasPressedThisFrame"); wasPerformedMethod = inputActionType.GetMethod("WasPerformedThisFrame"); PatchMethod(isPressedMethod, "Postfix_IsPressed"); PatchMethod(isInProgressMethod, "Postfix_IsInProgress"); PatchMethod(wasPressedMethod, "Postfix_WasPressedThisFrame"); PatchMethod(wasPerformedMethod, "Postfix_WasPerformedThisFrame"); } private static void PatchPropertyGetter(PropertyInfo prop, string postfixName) { //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown if (!(prop?.GetGetMethod() == null)) { if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)prop.GetGetMethod()) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)prop.GetGetMethod(), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } private static void PatchMethod(MethodInfo method, string postfixName) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown if (!(method == null)) { if (Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)method) == null) { throw new Exception(); } ExplorerCore.Harmony.Patch((MethodBase)method, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(INewInputSystem), postfixName, (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } public static void GetButtonControls() { PropertyInfo pathProp = ReflectionUtility.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl, Unity.InputSystem")?.GetProperty("path", BindingFlags.Instance | BindingFlags.Public); RegisterDeviceControls("UnityEngine.InputSystem.Keyboard", "UnityEngine.InputSystem.Controls.KeyControl", pathProp); RegisterDeviceControls("UnityEngine.InputSystem.Mouse", "UnityEngine.InputSystem.Controls.ButtonControl", pathProp); } internal static void RegisterDeviceControls(string deviceTypeName, string controlTypeName, PropertyInfo pathProp) { Type typeByName = ReflectionUtility.GetTypeByName(deviceTypeName + ", Unity.InputSystem"); if (typeByName == null) { return; } object obj = typeByName.GetProperty("current", BindingFlags.Static | BindingFlags.Public)?.GetValue(null, null); if (obj == null) { return; } PropertyInfo[] properties = typeByName.GetProperties(BindingFlags.Instance | BindingFlags.Public); foreach (PropertyInfo propertyInfo in properties) { if (propertyInfo.GetIndexParameters().Length != 0 || !(propertyInfo.PropertyType.FullName == controlTypeName)) { continue; } object value = propertyInfo.GetValue(obj, null); if (value != null) { string text = pathProp?.GetValue(value, null) as string; if (!string.IsNullOrEmpty(text)) { buttonControls[text.ToLower()] = value; } } } } public unsafe static bool GetKey(KeyCode key) { string buttonName = PropToKeycode(("/keyboard/" + ((object)(*(KeyCode*)(&key))/*cast due to .constrained prefix*/).ToString()).ToLower()); return GetButtonPressed(buttonName); } public static bool GetButtonPressed(string buttonName) { string key = buttonName.ToLower(); if (buttonControls.TryGetValue(key, out var value)) { isPressedProp?.GetValue(value, null); bool value2; return buttonPressedStates.TryGetValue(key, out value2) && value2; } return false; } public static bool GetButtonWasPressed(string buttonName) { string key = buttonName.ToLower(); if (buttonControls.TryGetValue(key, out var value)) { wasPressedProp?.GetValue(value, null); bool value2; return buttonWasPressedStates.TryGetValue(key, out value2) && value2; } return false; } public static bool GetButtonWasReleased(string buttonName) { string key = buttonName.ToLower(); if (buttonControls.TryGetValue(key, out var value)) { wasReleasedProp?.GetValue(value, null); bool value2; return buttonWasReleasedStates.TryGetValue(key, out value2) && value2; } return false; } public static bool GetMouseButton(int button) { return GetButtonPressed(button switch { 0 => "/mouse/leftbutton", 1 => "/mouse/rightbutton", 2 => "/mouse/middlebutton", 3 => "/mouse/forwardbutton", 4 => "/mouse/backbutton", _ => $"/mouse/button{button}", }); } public static bool GetMouseButtonDown(int button) { return GetButtonWasPressed(button switch { 0 => "/mouse/leftbutton", 1 => "/mouse/rightbutton", 2 => "/mouse/middlebutton", 3 => "/mouse/forwardbutton", 4 => "/mouse/backbutton", _ => $"/mouse/button{button}", }); } private static void Postfix_IsPressed(object __instance, ref bool __result) { StoreState(__instance, ref __result, buttonPressedStates); } private static void Postfix_WasPressedThisFrame(object __instance, ref bool __result) { StoreState(__instance, ref __result, buttonWasPressedStates); } private static void Postfix_WasReleasedThisFrame(object __instance, ref bool __result) { StoreState(__instance, ref __result, buttonWasReleasedStates); } private static void Postfix_IsValueConsideredPressed(object __instance, ref bool __result) { StoreState(__instance, ref __result, buttonIsValueConsideredPressedStates); } private static void Postfix_IsInProgress(object __instance, ref bool __result) { StoreState(__instance, ref __result, actionInProgressStates); } private static void Postfix_WasPerformedThisFrame(object __instance, ref bool __result) { StoreState(__instance, ref __result, actionWasPerformedStates); } private static void StoreState(object __instance, ref bool __result, Dictionary<string, bool> dict) { try { Type type = __instance.GetType(); string rawPath = ((type.GetProperty("path") ?? type.GetProperty("name"))?.GetValue(__instance, null)?.ToString() ?? string.Empty).ToLower(); rawPath = IGamepadInputInterceptor.NormalizeControlPath(rawPath); dict[rawPath] = __result; if (FreeCamPanel.ShouldOverrideInput()) { __result = false; } } catch (Exception ex) { ExplorerCore.LogWarning("Failed to store state: " + ex.Message); } } public static string PropToKeycode(string propName) { return propName switch { "/keyboard/leftcontrol" => "/keyboard/leftctrl", "/keyboard/rightcontrol" => "/keyboard/rightctrl", "/keyboard/keypad0" => "/keyboard/numpad0", "/keyboard/keypad1" => "/keyboard/numpad1", "/keyboard/keypad2" => "/keyboard/numpad2", "/keyboard/keypad3" => "/keyboard/numpad3", "/keyboard/keypad4" => "/keyboard/numpad4", "/keyboard/keypad5" => "/keyboard/numpad5", "/keyboard/keypad6" => "/keyboard/numpad6", "/keyboard/keypad7" => "/keyboard/numpad7", "/keyboard/keypad8" => "/keyboard/numpad8", "/keyboard/keypad9" => "/keyboard/numpad9", "/keyboard/keypaddivide" => "/keyboard/numpaddivide", "/keyboard/keypadmultiply" => "/keyboard/numpadmultiply", "/keyboard/keypadminus" => "/keyboard/numpadminus", "/keyboard/keypadplus" => "/keyboard/numpadplus", "/keyboard/keypadperiod" => "/keyboard/numpadperiod", "/keyboard/keypadequals" => "/keyboard/numpadequals", "/keyboard/keypadenter" => "/keyboard/numpadenter", "/keyboard/alpha0" => "/keyboard/0", "/keyboard/alpha1" => "/keyboard/1", "/keyboard/alpha2" => "/keyboard/2", "/keyboard/alpha3" => "/keyboard/3", "/keyboard/alpha4" => "/keyboard/4", "/keyboard/alpha5" => "/keyboard/5", "/keyboard/alpha6" => "/keyboard/6", "/keyboard/alpha7" => "/keyboard/7", "/keyboard/alpha8" => "/keyboard/8", "/keyboard/alpha9" => "/keyboard/9", "/keyboard/print" => "/keyboard/printscreen", _ => propName, }; } } } namespace UnityExplorer { public class ArrowGenerator { public static GameObject CreateArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color) { //IL_01bd: 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) //IL_01bf: 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_0072: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown //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_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0132: 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_0149: Expected O, but got Unknown //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: 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_01aa: Unknown result type (might be due to invalid IL or missing references) try { float value = ConfigManager.Arrow_Size.Value; Vector3 localScale = default(Vector3); ((Vector3)(ref localScale))..ctor(Math.Max(value, 0.1f), Math.Max(value, 0.1f), Math.Max(value, 0.1f)); GameObject val = GameObject.CreatePrimitive((PrimitiveType)2); val.GetComponent<Collider>().enabled = false; val.GetComponent<MeshFilter>().mesh = CreateCylinderMesh(0.01f, 20, 2); val.transform.rotation = Quaternion.LookRotation(Vector3.down, Vector3.up); Renderer component = val.GetComponent<Renderer>(); component.material = new Material(Shader.Find("Sprites/Default")); component.material.color = color; GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0); val2.GetComponent<Collider>().enabled = false; val2.GetComponent<MeshFilter>().mesh = CreateConeMesh(10, 0.05f, 0.1f); val2.transform.SetParent(val.transform, true); Renderer component2 = val2.GetComponent<Renderer>(); component2.material = new Material(Shader.Find("Sprites/Default")); component2.material.color = color; val.transform.rotation = Quaternion.LookRotation(Vector3.back, Vector3.up); GameObject val3 = new GameObject("CUE-Arrow"); val.transform.SetParent(val3.transform, true); val3.transform.localScale = localScale; val3.transform.position = arrowPosition; val3.transform.rotation = arrowRotation; Transform transform = val3.transform; transform.position += 0.5f * val3.transform.forward; return val3; } catch { return FallbackArrow(arrowPosition, arrowRotation, color); } } private static GameObject FallbackArrow(Vector3 arrowPosition, Quaternion arrowRotation, Color color) { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0088: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Expected O, but got Unknown //IL_00e9: 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_00fc: Expected O, but got Unknown //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Unknown result type (might be due to invalid IL or missing references) //IL_013e: 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_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0169: 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) GameObject val = GameObject.CreatePrimitive((PrimitiveType)2); val.GetComponent<Collider>().enabled = false; Renderer component = val.GetComponent<Renderer>(); component.material = new Material(Shader.Find("Sprites/Default")); component.material.color = color; val.transform.localScale = new Vector3(0.025f, 0.15f, 0.025f); GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)0); val2.GetComponent<Collider>().enabled = false; val2.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f); val2.transform.position = new Vector3(0f, 0.15f, 0f); val2.transform.SetParent(val.transform, true); Renderer component2 = val2.GetComponent<Renderer>(); component2.material = new Material(Shader.Find("Sprites/Default")); component2.material.color = color; GameObject val3 = new GameObject("CUE-Arrow"); val.transform.SetParent(val3.transform, true); val3.transform.position = arrowPosition; Vector3 eulerAngles = ((Quaternion)(ref arrowRotation)).eulerAngles; eulerAngles.x += 90f; val3.transform.rotation = Quaternion.Euler(eulerAngles); Transform transform = val3.transform; transform.position += 0.15f * val3.transform.up; return val3; } public static void PatchLights() { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Expected O, but got Unknown try { PropertyInfo property = typeof(Light).GetProperty("color"); MethodInfo setMethod = property.GetSetMethod(); if (!(Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)setMethod) == null)) { ExplorerCore.Harmony.Patch((MethodBase)setMethod, new HarmonyMethod(AccessTools.Method(typeof(ArrowGenerator), "ChangeArrowColor", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); } } catch { } } private static void ChangeArrowColor(Light __instance, Color __0) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (((Object)__instance).name.Contains("CUE - Light")) { Renderer[] array = Il2CppArrayBase<Renderer>.op_Implicit(((Component)__instance).GetComponentsInChildren<Renderer>()); Renderer[] array2 = array; foreach (Renderer val in array2) { val.material.color = __0; } } } private static Mesh CreateConeMesh(int subdivisions, float radius, float height) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: 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_0088: 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_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: 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) Mesh val = new Mesh(); Vector3[] array = (Vector3[])(object)new Vector3[subdivisions + 2]; Vector2[] array2 = (Vector2[])(object)new Vector2[array.Length]; int[] array3 = new int[subdivisions * 2 * 3]; array[0] = Vector3.zero; array2[0] = new Vector2(0.5f, 0f); int i = 0; int num = subdivisions - 1; for (; i < subdivisions; i++) { float num2 = (float)i / (float)num; float num3 = num2 * (MathF.PI * 2f); float num4 = Mathf.Cos(num3) * radius; float num5 = Mathf.Sin(num3) * radius; array[i + 1] = new Vector3(num4, 0f, num5); array2[i + 1] = new Vector2(num2, 0f); } array[subdivisions + 1] = new Vector3(0f, height, 0f); array2[subdivisions + 1] = new Vector2(0.5f, 1f); int j = 0; for (int num6 = subdivisions - 1; j < num6; j++) { int num7 = j * 3; array3[num7] = 0; array3[num7 + 1] = j + 1; array3[num7 + 2] = j + 2; } int num8 = subdivisions * 3; int k = 0; for (int num9 = subdivisions - 1; k < num9; k++) { int num10 = k * 3 + num8; array3[num10] = k + 1; array3[num10 + 1] = subdivisions + 1; array3[num10 + 2] = k + 2; } val.vertices = Il2CppStructArray<Vector3>.op_Implicit(array); val.uv = Il2CppStructArray<Vector2>.op_Implicit(array2); val.triangles = Il2CppStructArray<int>.op_Implicit(array3); val.RecalculateBounds(); val.RecalculateNormals(); return val; } private static Mesh CreateCylinderMesh(float radius = 1f, int iterations = 50, int lenggth = 10, float gap = 0.5f) { //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_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) int num = 0; float num2 = 0f; int i = 0; Vector3[] array = (Vector3[])(object)new Vector3[iterations * lenggth + 2]; int num3 = 0; array[^2] = Vector3.zero; for (; i < lenggth; i++) { int num4 = 0; while (num4 < iterations) { float num5 = (float)num4 * 1f / (float)iterations * MathF.PI * 2f; float num6 = Mathf.Sin(num5) * radius; float num7 = Mathf.Cos(num5) * radius; array[num3] = new Vector3(num6, num7, num2); num4++; num++; num3++; } num2 += gap; } array[^1] = new Vector3(0f, 0f, array[^3].z); Mesh val = new Mesh(); val.vertices = Il2CppStructArray<Vector3>.op_Implicit(array); int j = 0; Vector3[] array2 = (Vector3[])(object)new Vector3[num + 2]; for (; j < num; j++) { array2[j] = Vector3.forward; } val.normals = Il2CppStructArray<Vector3>.op_Implicit(array2); j = 0; int[] array3 = new int[3 * (lenggth - 1) * iterations * 2 + 3]; for (; j < (lenggth - 1) * iterations; j++) { array3[j * 3] = j; if ((j + 1) % iterations == 0) { array3[j * 3 + 1] = 1 + j - iterations; } else { array3[j * 3 + 1] = 1 + j; } array3[j * 3 + 2] = iterations + j; } int num8 = -1; for (int k = (array3.Length - 3) / 2; k < array3.Length - 6; k += 3) { if ((num8 + 2) % iterations == 0) { array3[k] = num8 + iterations * 2 + 1; } else { array3[k] = num8 + iterations + 1; } array3[k + 1] = num8 + 2; array3[k + 2] = num8 + iterations + 2; num8++; } array3[^3] = 0; array3[^2] = iterations * 2 - 1; array3[^1] = iterations; int[] array4 = new int[iterations * 3 * 2]; int num9 = 0; for (int l = 0; l < array4.Length / 2; l += 3) { array4[l] = num9; if (num9 + 1 != iterations) { array4[l + 1] = num9 + 1; } else { array4[l + 1] = 0; } array4[l + 2] = array.Length - 2; num9++; } num9 = iterations * (lenggth - 1); for (int m = array4.Length / 2; m < array4.Length; m += 3) { array4[m] = num9; if (num9 + 1 != iterations * (lenggth - 1)) { array4[m + 1] = num9 + 1; } else { array4[m + 1] = iterations * (lenggth - 1); } array4[m + 2] = array.Length - 1; num9++; } array4[^3] = iterations * (lenggth - 1); array4[^2] = array.Length - 3; array4[^1] = array.Length - 1; int[] array5 = new int[array3.Length + array4.Length]; int num10 = 0; int num11 = 0; num10 = 0; num11 = 0; for (; num10 < array3.Length; num10++) { array5[num11++] = array3[num10]; } for (num10 = 0; num10 < array4.Length; num10++) { array5[num11++] = array4[num10]; } val.triangles = Il2CppStructArray<int>.op_Implicit(array5); val.Optimize(); val.RecalculateNormals(); return val; } } public class ExplorerBehaviour : MonoBehaviour { internal bool quitting; internal static ExplorerBehaviour Instance { get; private set; } public ExplorerBehaviour(IntPtr ptr) : base(ptr) { } internal static void Setup() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ClassInjector.RegisterTypeInIl2Cpp<ExplorerBehaviour>(); GameObject val = new GameObject("ExplorerBehaviour"); Object.DontDestroyOnLoad((Object)(object)val); ((Object)val).hideFlags = (HideFlags)61; Instance = val.AddComponent<ExplorerBehaviour>(); } internal void Update() { ExplorerCore.Update(); } internal void OnDestroy() { OnApplicationQuit(); } internal void OnApplicationQuit() { if (!quitting) { quitting = true; if (Object.op_Implicit((Object)(object)UIManager.UIRoot)) { TryDestroy(((Component)UIManager.UIRoot.transform.root).gameObject); } object? value = typeof(Universe).Assembly.GetType("UniverseLib.UniversalBehaviour").GetProperty("Instance", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null, null); TryDestroy(((Component)((value is Component) ? value : null)).gameObject); TryDestroy(((Component)this).gameObject); } } internal void TryDestroy(GameObject obj) { try { if (Object.op_Implicit((Object)(object)obj)) { Object.Destroy((Object)(object)obj); } } catch { } } } public class KeypressListener : MonoBehaviour { private bool frameSkip; internal static KeypressListener Instance { get; private set; } public KeypressListener(IntPtr ptr) : base(ptr) { } internal static void Setup() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown ClassInjector.RegisterTypeInIl2Cpp<KeypressListener>(); GameObject val = new GameObject("KeypressListener"); Object.DontDestroyOnLoad((Object)(object)val); ((Object)val).hideFlags = (HideFlags)61; Instance = val.AddComponent<KeypressListener>(); } public void Update() { //IL_001b: 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_0076: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00be: 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_010a: 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) stopFrameSkip(); maybeForcePause(); maybeTakeScreenshot(); if (IInputManager.GetKeyDown(ConfigManager.Pause.Value)) { UIManager.GetTimeScaleWidget().PauseToggle(); } if (IInputManager.GetKeyDown(ConfigManager.Frameskip.Value) && UIManager.GetTimeScaleWidget().IsPaused()) { UIManager.GetTimeScaleWidget().PauseToggle(); frameSkip = true; } if (IInputManager.GetKeyDown(ConfigManager.Screenshot.Value)) { UIManager.GetPanel<Misc>(UIManager.Panels.Misc).screenshotStatus = Misc.ScreenshotState.TurnOffUI; } if (IInputManager.GetKeyDown(ConfigManager.HUD_Toggle.Value)) { UIManager.GetPanel<Misc>(UIManager.Panels.Misc).ToggleHUDElements(); } if (IInputManager.GetKeyDown(ConfigManager.Freecam_Toggle.Value)) { FreeCamPanel.ToggleFreecam(); } if (IInputManager.GetKeyDown(ConfigManager.Block_Freecam_Movement.Value)) { FreeCamPanel.blockFreecamMovementToggle.isOn = !FreeCamPanel.blockFreecamMovementToggle.isOn; } if (IInputManager.GetKeyDown(ConfigManager.Toggle_Animations.Value)) { UIManager.GetPanel<AnimatorPanel>(UIManager.Panels.AnimatorPanel).HotkeyToggleAnimators(); } if (FreeCamPanel.supportedInput && IInputManager.GetKeyDown(ConfigManager.Toggle_Block_Games_Input.Value)) { FreeCamPanel.blockGamesInputOnFreecamToggle.isOn = !FreeCamPanel.blockGamesInputOnFreecamToggle.isOn; } bool flag = IGamepadInputInterceptor.IsButtonPressed("/gamepad/buttonwest"); bool flag2 = IGamepadInputInterceptor.IsButtonPressed("/gamepad/leftstickpress"); bool flag3 = IGamepadInputInterceptor.IsButtonPressed("/gamepad/rightstickpress"); if (flag && flag2) { if (IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/buttonwest") || IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/leftstickpress")) { UIManager.GetTimeScaleWidget().ToggleOverride(); } } else if (flag && flag3 && (IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/buttonwest") || IGamepadInputInterceptor.WasButtonPressedThisFrame("/gamepad/rightstickpress"))) { FreeCamPanel.ToggleFreecam(); } } private void stopFrameSkip() { if (frameSkip && !UIManager.GetTimeScaleWidget().IsPaused()) { frameSkip = false; UIManager.GetTimeScaleWidget().PauseToggle(); } } private void maybeForcePause() { TimeScaleWidget timeScaleWidget = UIManager.GetTimeScaleWidget(); if (timeScaleWidget != null && timeScaleWidget.IsPaused() && Time.timeScale != 0f) { timeScaleWidget.SetTimeScale(0f); } } private void maybeTakeScreenshot() { UIManager.GetPanel<Misc>(UIManager.Panels.Misc)?.MaybeTakeScreenshot(); } } public static class ExplorerCore { public const string NAME = "CinematicUnityExplorer"; public const string VERSION = "1.4.0"; public const string AUTHOR = "originalnicodr, Sinai, yukieiji"; public const string GUID = "com.originalnicodr.cinematicunityexplorer"; public const string DEFAULT_EXPLORER_FOLDER_NAME = "CinematicUnityExplorer"; public static IExplorerLoader Loader { get; private set; } public static string ExplorerFolder => Path.Combine(Loader.ExplorerFolderDestination, Loader.ExplorerFolderName); public static Harmony Harmony { get; } = new Harmony("com.originalnicodr.cinematicunityexplorer"); public static void Init(IExplorerLoader loader) { //IL_006f: 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) if (Loader != null) { throw new Exception("CinematicUnityExplorer is already loaded."); } Loader = loader; Log("CinematicUnityExplorer 1.4.0 initializing..."); CheckLegacyExplorerFolder(); Directory.CreateDirectory(ExplorerFolder); ConfigManager.Init(Loader.ConfigHandler); Universe.Init(ConfigManager.Startup_Delay_Time.Value, (Action)LateInit, (Action<string, LogType>)Log, new UniverseLibConfig { Disable_EventSystem_Override = ConfigManager.Disable_EventSystem_Override.Value, Force_Unlock_Mouse = ConfigManager.Force_Unlock_Mouse.Value, Unhollowed_Modules_Folder = loader.UnhollowedModulesFolder }); UERuntimeHelper.Init(); ExplorerBehaviour.Setup(); UnityCrashPrevention.Init(); ArrowGenerator.PatchLights(); } private static void LateInit() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) SceneHandler.Init(); Log("Creating UI..."); UIManager.InitUI(); Log($"{"CinematicUnityExplorer"} {"1.4.0"} ({Universe.Context}) initialized."); IInputManager.Setup(); KeypressListener.Setup(); if (ConfigManager.Auto_Scale_UI.Value) { MakeUEUIScale(); } } internal static void Update() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (IInputManager.GetKeyDown(ConfigManager.Master_Toggle.Value)) { UIManager.ShowMenu = !UIManager.ShowMenu; } } public static void Log(object message) { Log(message, (LogType)3); } public static void LogWarning(object message) { Log(message, (LogType)2); } public static void LogError(object message) { Log(message, (LogType)0); } public static void LogUnity(object message, LogType logType) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (ConfigManager.Log_Unity_Debug.Value) { Log($"[Unity] {message}", logType); } } private static void Log(object message, LogType logType) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0021: 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_0023: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Expected I4, but got Unknown string text = message?.ToString() ?? ""; LogPanel.Log(text, logType); switch ((int)logType) { case 1: case 3: Loader.OnLogMessage(text); break; case 2: Loader.OnLogWarning(text); break; case 0: case 4: Loader.OnLogError(text); break; } } private static void CheckLegacyExplorerFolder() { string text = Path.Combine(Loader.ExplorerFolderDestination, "UnityExplorer"); if (!Directory.Exists(text)) { return; } LogWarning("Attempting to migrate old 'UnityExplorer/' folder to 'CinematicUnityExplorer/'..."); if (!Directory.Exists(ExplorerFolder)) { try { Directory.Move(text, ExplorerFolder); Log("Migrated successfully."); return; } catch (Exception value) { LogWarning($"Exception migrating folder: {value}"); return; } } try { CopyAll(new DirectoryInfo(text), new DirectoryInfo(ExplorerFolder)); Directory.Delete(text, recursive: true); Log("Migrated successfully."); } catch (Exception value2) { LogWarning($"Exception migrating folder: {value2}"); } } public static void CopyAll(DirectoryInfo source, DirectoryInfo target) { Directory.CreateDirectory(target.FullName); FileInfo[] files = source.GetFiles(); foreach (FileInfo fileInfo in files) { fileInfo.MoveTo(Path.Combine(target.ToString(), fileInfo.Name)); } DirectoryInfo[] directories = source.GetDirectories(); foreach (DirectoryInfo directoryInfo in directories) { DirectoryInfo target2 = target.CreateSubdirectory(directoryInfo.Name); CopyAll(directoryInfo, target2); } } private static void MakeUEUIScale() { List<CanvasScaler> list = (from obj in RuntimeHelper.FindObjectsOfTypeAll(typeof(CanvasScaler)) select ((Il2CppObjectBase)obj).TryCast<CanvasScaler>() into c where ((Object)c).name.Contains("unityexplorer") select c).ToList(); foreach (CanvasScaler item in list) { item.uiScaleMode = (ScaleMode)1; item.screenMatchMode = (ScreenMatchMode)0; item.matchWidthOrHeight = 0f; } } } public static class InspectorManager { public static readonly List<InspectorBase> Inspectors = new List<InspectorBase>(); private static InspectorBase lastActiveInspector; public static float PanelWidth; public static InspectorBase ActiveInspector { get; private set; } public static event Action OnInspectedTabsChanged; public static void Inspect(object obj, CacheObjectBase parent = null) { if (UnityHelpers.IsNullOrDestroyed(obj, true)) { return; } obj = ReflectionExtensions.TryCast(obj); if (!TryFocusActiveInspector(obj)) { if ((Object)(object)ReflectionExtensions.TryCast<GameObject>(obj) != (Object)null) { CreateInspector<GameObjectInspector>(obj); } else { CreateInspector<ReflectionInspector>(obj, staticReflection: false, parent); } } } public static void Inspect(Type type) { if (!TryFocusActiveInspector(type)) { CreateInspector<ReflectionInspector>(type, staticReflection: true); } } private static bool TryFocusActiveInspector(object target) { foreach (InspectorBase inspector in Inspectors) { bool flag = false; if (target is Type type) { if (inspector.TargetType.FullName == type.FullName) { flag = true; } } else if (ReflectionExtensions.ReferenceEqual(inspector.Target, target)) { flag = true; } if (flag) { UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true); SetInspectorActive(inspector); return true; } } return false; } public static void SetInspectorActive(InspectorBase inspector) { UnsetActiveInspector(); ActiveInspector = inspector; inspector.OnSetActive(); } public static void UnsetActiveInspector() { if (ActiveInspector != null) { lastActiveInspector = ActiveInspector; ActiveInspector.OnSetInactive(); ActiveInspector = null; } } public static void CloseAllTabs() { if (Inspectors.Any()) { for (int num = Inspectors.Count - 1; num >= 0; num--) { Inspectors[num].CloseInspector(); } Inspectors.Clear(); } UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false); } public static void InspectWithFilters(object target, string filterInputField, UnityExplorer.Inspectors.MemberFilter memberFilterFlags = UnityExplorer.Inspectors.MemberFilter.All, bool staticReflection = false, CacheObjectBase parent = null) { if (!TryFocusActiveInspector(target)) { ReflectionInspector reflectionInspector = CreateInspector<ReflectionInspector>(target, staticReflection, parent); reflectionInspector.filterInputField.Text = filterInputField; reflectionInspector.memberFilter = memberFilterFlags; reflectionInspector.Update(); } } private static T CreateInspector<T>(object target, bool staticReflection = false, CacheObjectBase parent = null) where T : InspectorBase { T val = Pool<T>.Borrow(); Inspectors.Add(val); val.Target = target; if (parent != null && parent.CanWrite && target.GetType().IsValueType && val is ReflectionInspector reflectionInspector) { reflectionInspector.ParentCacheObject = parent; } UIManager.SetPanelActive(UIManager.Panels.Inspector, active: true); val.UIRoot.transform.SetParent(InspectorPanel.Instance.ContentHolder.transform, false); if (val is ReflectionInspector reflectionInspector2) { reflectionInspector2.StaticOnly = staticReflection; } val.OnBorrowedFromPool(target); SetInspectorActive(val); InspectorManager.OnInspectedTabsChanged?.Invoke(); return val; } public static void ReleaseInspector<T>(T inspector) where T : InspectorBase { if (lastActiveInspector == inspector) { lastActiveInspector = null; } bool flag = ActiveInspector == inspector; int num = Inspectors.IndexOf(inspector); Inspectors.Remove(inspector); inspector.OnReturnToPool(); Pool<T>.Return(inspector); if (flag) { ActiveInspector = null; if (lastActiveInspector != null) { SetInspectorActive(lastActiveInspector); lastActiveInspector = null; } else if (Inspectors.Any()) { int index = Math.Min(Inspectors.Count - 1, Math.Max(0, num - 1)); SetInspectorActive(Inspectors[index]); } else { UIManager.SetPanelActive(UIManager.Panels.Inspector, active: false); } } InspectorManager.OnInspectedTabsChanged?.Invoke(); } internal static void Update() { for (int num = Inspectors.Count - 1; num >= 0; num--) { Inspectors[num].Update(); } } internal static void OnPanelResized(float width) { PanelWidth = width; foreach (InspectorBase inspector in Inspectors) { if (inspector is ReflectionInspector reflectionInspector) { reflectionInspector.SetLayouts(); } } } } [BepInPlugin("com.originalnicodr.cinematicunityexplorer", "UnityExplorer", "1.4.0")] public class ExplorerBepInPlugin : BasePlugin, IExplorerLoader { public static ExplorerBepInPlugin Instance; private const string IL2CPP_LIBS_FOLDER = "interop"; private BepInExConfigHandler _configHandler; private static readonly Harmony s_harmony = new Harmony("com.originalnicodr.cinematicunityexplorer"); public ManualLogSource LogSource => ((BasePlugin)this).Log; public string UnhollowedModulesFolder => Path.Combine(Paths.BepInExRootPath, "interop"); public ConfigHandler ConfigHandler => _configHandler; public Harmony HarmonyInstance => s_harmony; public string ExplorerFolderName => "CinematicUnityExplorer"; public string ExplorerFolderDestination => Paths.PluginPath; public Action<object> OnLogMessage => LogSource.LogMessage; public Action<object> OnLogWarning => LogSource.LogWarning; public Action<object> OnLogError => LogSource.LogError; private void Init() { Instance = this; _configHandler = new BepInExConfigHandler(); ExplorerCore.Init(this); } public override void Load() { Init(); } } public interface IExplorerLoader { string ExplorerFolderDestination { get; } string ExplorerFolderName { get; } string UnhollowedModulesFolder { get; } ConfigHandler ConfigHandler { get; } Action<object> OnLogMessage { get; } Action<object> OnLogWarning { get; } Action<object> OnLogError { get; } } } namespace UnityExplorer.CatmullRom { [Serializable] public struct CatmullRomPoint { public Vector3 position; public Quaternion rotation; public float fov; public CatmullRomPoint(Vector3 position, Quaternion rotation, float fov) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) this.position = position; this.rotation = rotation; this.fov = fov; } public CatmullRomPoint(Vector3 position, Vector4 rotation, float fov) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) this.position = position; this.rotation = Vector4ToQuaternion(rotation); this.fov = fov; } public static Vector4 QuaternionToVector4(Quaternion q) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) return new Vector4(q.x, q.y, q.z, q.w); } public static Quaternion Vector4ToQuaternion(Vector4 v) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) return new Quaternion(v.x, v.y, v.z, v.w); } public static CatmullRomPoint operator +(CatmullRomPoint a, CatmullRomPoint b) { //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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0022: 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_002d: 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_0033: Unknown result type (might be due to invalid IL or missing references) Vector4 val = QuaternionToVector4(a.rotation); Vector4 val2 = QuaternionToVector4(b.rotation); Vector4 v = val + val2; return new CatmullRomPoint(a.position + b.position, Vector4ToQuaternion(v), a.fov + b.fov); } public static CatmullRomPoint operator -(CatmullRomPoint a, CatmullRomPoint b) { //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_000d: 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_0017: 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_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: 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_002f: Unknown result type (might be due to invalid IL or missing references) Vector4 v = QuaternionToVector4(a.rotation) - QuaternionToVector4(b.rotation); return new CatmullRomPoint(a.position - b.position, Vector4ToQuaternion(v), a.fov - b.fov); } public static CatmullRomPoint operator /(CatmullRomPoint a, float b) { //IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references) return new CatmullRomPoint(a.position / b, a.rotation, a.fov); } public static CatmullRomPoint operator *(CatmullRomPoint a, float b) { //IL_0002: 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_000e: Unknown result type (might be due to invalid IL or missing references) return new CatmullRomPoint(a.position * b, a.rotation, a.fov); } public CatmullRomPoint Normalize() { ((Vector3)(ref position)).Normalize(); return this; } } public class CatmullRomMover : MonoBehaviour { public bool playingPath; private bool closedLoop; private CatmullRomPoint[] splinePoints; private List<CatmullRomPoint> lookaheadPoints = new List<CatmullRomPoint>(); private CatmullRomPoint lookahead; private float lookaheadDelta; private float time; private float speed; private float delta; private float tension = 0f; private float alpha = 0.5f; private CatmullRomPoint pauseCamCache; static CatmullRomMover() { ClassInjector.RegisterTypeInIl2Cpp<CatmullRomMover>(); } public CatmullRomMover(IntPtr ptr) : base(ptr) { } public CatmullRomMover() { splinePoints = new CatmullRomPoint[0]; lookaheadPoints = new List<CatmullRomPoint>(); } public void StartPath() { if (splinePoints == null || splinePoints.Length <= 2) { CatmullRomPoint[] array = splinePoints; int value = ((array != null) ? array.Length : 0); ExplorerCore.LogWarning($"Cannot start camera path: Need at least 3 nodes, but only {value} node(s) exist. Please add more nodes to create a path."); throw new ArgumentException("Catmull Rom Error: Too few spline points!"); } playingPath = true; delta = lookaheadDelta; MoveCameraToPoint(splinePoints[0]); lookahead = lookaheadPoints[1]; } public void TogglePause() { playingPath = !playingPath; if (!playingPath) { pauseCamCache = GetCurrentPoint(); } else { MoveCameraToPoint(pauseCamCache); } } public bool IsPaused() { return playingPath; } public void Stop() { playingPath = false; delta = lookaheadDelta; lookahead = GetPointFromPath(delta); MoveCameraToPoint(splinePoints[0]); pauseCamCache = GetCurrentPoint(); } public void setClosedLoop(bool newClosedLoop) { closedLoop = newClosedLoop; } [HideFromIl2Cpp] public void setSplinePoints(CatmullRomPoint[] newSplinePoints) { splinePoints = newSplinePoints; } public void setTime(float newTime) { time = newTime; } public void setCatmullRomVariables(float newAlpha, float newTension) { alpha = newAlpha; tension = newTension; } private void Update() { if (playingPath) { AdvanceMover(Time.fixedDeltaTime); } } private CatmullRomPoint GetCurrentPoint() { //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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) Vector3 cameraPosition = FreeCamPanel.GetCameraPosition(); Quaternion cameraRotation = FreeCamPanel.GetCameraRotation(); return new CatmullRomPoint(cameraPosition, cameraRotation, FreeCamPanel.GetFreecam().fieldOfView); } private void AdvanceMover(float dt) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) float num = 1f / 60f * speed; while ((double)num > 0.0) { CatmullRomPoint currentPoint = GetCurrentPoint(); float num2 = Vector3.Distance(lookahead.position, currentPoint.position); float num3 = Math.Min(num, num2); MoveCameraStep(currentPoint, num3, num2); num -= num3; currentPoint = GetCurrentPoint(); for (num2 = Vector3.Distance(lookahead.position, currentPoint.position); num2 <= 0.0002f; num2 = Vector3.Distance(lookahead.position, currentPoint.position)) { if (delta >= 1f) { PathFinished(); } delta = Math.Min(delta + lookaheadDelta, 1f); int index = (int)((float)(lookaheadPoints.Count - 1) * delta); lookahead = lookaheadPoints[index]; } } } public void MoveCameraStep(CatmullRomPoint currentPoint, float actual, float room) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or m
UniverseLib.BIE.IL2CPP.Interop.dll
Decompiled 17 hours 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.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using HarmonyLib; using Il2CppInterop.Common; using Il2CppInterop.Common.Attributes; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.Attributes; using Il2CppInterop.Runtime.Injection; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppInterop.Runtime.Runtime; using Il2CppSystem; using Il2CppSystem.Collections; using Il2CppSystem.Collections.Generic; using Il2CppSystem.Reflection; using Il2CppSystem.Threading; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; using UniverseLib.Config; using UniverseLib.Input; using UniverseLib.Reflection; using UniverseLib.Runtime; using UniverseLib.Runtime.Il2Cpp; 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.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("UniverseLib")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Sinai, yukieiji")] [assembly: AssemblyProduct("UniverseLib")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("b21dbde3-5d6f-4726-93ab-cc3cc68bae7d")] [assembly: AssemblyFileVersion("1.5.11")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.5.11.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [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] [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; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } 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); } } public static Type[] TryGetTypes(this Assembly asm) { try { return asm.GetTypes(); } catch (ReflectionTypeLoadException e) { return ReflectionUtility.TryExtractTypesFromException(e); } catch { try { return asm.GetExportedTypes(); } catch (ReflectionTypeLoadException e2) { return ReflectionUtility.TryExtractTypesFromException(e2); } catch { return ArgumentUtility.EmptyTypes; } } } 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; } } Object val3 = (Object)((objA is Object) ? objA : null); if (val3 != null) { Object val4 = (Object)((objB is Object) ? objB : null); if (val4 != null && ((Il2CppObjectBase)val3).Pointer == ((Il2CppObjectBase)val4).Pointer) { 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.InnerException is RuntimeWrappedException)) { e = e.InnerException; } return e; } } internal class Il2CppDictionary : IEnumerator<DictionaryEntry>, IEnumerator, IDisposable { private readonly Il2CppEnumerator keysEnumerator; private readonly Il2CppEnumerator valuesEnumerator; public object Current => new DictionaryEntry(keysEnumerator.Current, valuesEnumerator.Current); DictionaryEntry IEnumerator<DictionaryEntry>.Current => new DictionaryEntry(keysEnumerator.Current, valuesEnumerator.Current); public Il2CppDictionary(Il2CppEnumerator keysEnumerator, Il2CppEnumerator valuesEnumerator) { this.keysEnumerator = keysEnumerator; this.valuesEnumerator = valuesEnumerator; } public bool MoveNext() { if (keysEnumerator.MoveNext()) { return valuesEnumerator.MoveNext(); } return false; } public void Dispose() { throw new NotImplementedException(); } public void Reset() { throw new NotImplementedException(); } } internal class Il2CppEnumerator : IEnumerator { private readonly object enumerator; private readonly MethodInfo m_GetEnumerator; private readonly object instanceForMoveNext; private readonly MethodInfo m_MoveNext; private readonly object instanceForCurrent; private readonly MethodInfo p_Current; public object Current => p_Current.Invoke(instanceForCurrent, null); public bool MoveNext() { return (bool)m_MoveNext.Invoke(instanceForMoveNext, null); } public void Reset() { throw new NotImplementedException(); } public Il2CppEnumerator(object instance, Type type) { m_GetEnumerator = type.GetMethod("GetEnumerator") ?? type.GetMethod("System_Collections_IEnumerable_GetEnumerator", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); enumerator = m_GetEnumerator.Invoke(instance.TryCast(m_GetEnumerator.DeclaringType), ArgumentUtility.EmptyArgs); if (enumerator == null) { throw new Exception("GetEnumerator returned null"); } Type actualType = enumerator.GetActualType(); m_MoveNext = actualType.GetMethod("MoveNext") ?? actualType.GetMethod("System_Collections_IEnumerator_MoveNext", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); instanceForMoveNext = enumerator.TryCast(m_MoveNext.DeclaringType); p_Current = actualType.GetProperty("Current")?.GetGetMethod() ?? actualType.GetMethod("System_Collections_IEnumerator_get_Current", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); instanceForCurrent = enumerator.TryCast(p_Current.DeclaringType); } } public class Il2CppReflection : ReflectionUtility { internal Stopwatch initStopwatch = new Stopwatch(); internal static readonly Dictionary<string, MethodInfo> unboxMethods = new Dictionary<string, MethodInfo>(); internal static readonly IReadOnlyDictionary<string, Type> il2cppPrimitivesToMono = new Dictionary<string, Type> { { "Il2CppSystem.Boolean", typeof(bool) }, { "Il2CppSystem.Byte", typeof(byte) }, { "Il2CppSystem.SByte", typeof(sbyte) }, { "Il2CppSystem.Char", typeof(char) }, { "Il2CppSystem.Double", typeof(double) }, { "Il2CppSystem.Single", typeof(float) }, { "Il2CppSystem.Int32", typeof(int) }, { "Il2CppSystem.UInt32", typeof(uint) }, { "Il2CppSystem.Int64", typeof(long) }, { "Il2CppSystem.UInt64", typeof(ulong) }, { "Il2CppSystem.Int16", typeof(short) }, { "Il2CppSystem.UInt16", typeof(ushort) }, { "Il2CppSystem.IntPtr", typeof(IntPtr) }, { "Il2CppSystem.UIntPtr", typeof(UIntPtr) } }; private const string IL2CPP_STRING_FULLNAME = "Il2CppSystem.String"; private const string STRING_FULLNAME = "System.String"; private static readonly Dictionary<string, IntPtr> cppClassPointers = new Dictionary<string, IntPtr>(); private static readonly Dictionary<string, Type> obfuscatedToDeobfuscatedTypes = new Dictionary<string, Type>(); private static readonly Dictionary<string, string> deobfuscatedToObfuscatedNames = new Dictionary<string, string>(); internal static IntPtr cppIEnumerablePointer; internal static IntPtr cppIDictionaryPointer; protected override void Initialize() { base.Initialize(); ReflectionUtility.Initializing = true; ((MonoBehaviour)UniversalBehaviour.Instance).StartCoroutine(InitCoroutine().WrapToIl2Cpp()); } private IEnumerator InitCoroutine() { initStopwatch.Start(); Stopwatch sw = new Stopwatch(); sw.Start(); IEnumerator coro = TryLoadGameModules(); while (coro.MoveNext()) { yield return null; } Universe.Log($"Loaded Unhollowed modules in {(float)sw.ElapsedMilliseconds * 0.001f} seconds."); sw.Reset(); sw.Start(); BuildDeobfuscationCache(); Universe.Log($"Setup deobfuscation cache in {(float)sw.ElapsedMilliseconds * 0.001f} seconds."); ReflectionUtility.OnTypeLoaded += TryCacheDeobfuscatedType; ReflectionUtility.Initializing = false; } internal override Type Internal_GetTypeByName(string fullName) { if (obfuscatedToDeobfuscatedTypes.TryGetValue(fullName, out var value)) { return value; } return base.Internal_GetTypeByName(fullName); } internal override Type Internal_GetActualType(object obj) { if (obj == null) { return null; } Type type = obj.GetType(); try { if (il2cppPrimitivesToMono.TryGetValue(type.FullName, out var value)) { return value; } Il2CppObjectBase val = (Il2CppObjectBase)((obj is Il2CppObjectBase) ? obj : null); if (val != null) { if (type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(Il2CppArrayBase<>)) { return type; } IntPtr intPtr = IL2CPP.il2cpp_object_get_class(val.Pointer); Object val2 = (Object)((obj is Object) ? obj : null); Type cppType = ((val2 == null) ? Il2CppType.TypeFromPointer(intPtr, "<unknown type>") : val2.GetIl2CppType()); return GetUnhollowedType(cppType) ?? type; } } catch (Exception ex) { Universe.LogWarning("Exception in IL2CPP GetActualType: " + ex); } return type; } public static Type GetUnhollowedType(Type cppType) { if (cppType.IsArray) { return GetArrayBaseForArray(cppType); } if (ReflectionUtility.AllTypes.TryGetValue(cppType.FullName, out var value) && value.IsPrimitive) { return value; } if (IsString(cppType)) { return typeof(string); } string text = cppType.FullName; if (obfuscatedToDeobfuscatedTypes.TryGetValue(text, out var value2)) { return value2; } if (text.StartsWith("System.")) { text = "Il2Cpp" + text; } if (!ReflectionUtility.AllTypes.TryGetValue(text, out var value3)) { string text2; try { text2 = Il2CppTypeRedirector.GetAssemblyQualifiedName(cppType); } catch { text2 = cppType.AssemblyQualifiedName; } for (int i = 0; i < text2.Length; i++) { char c = text2[i]; if (c == '<' || c == '>') { text2 = text2.Remove(i, 1); text2 = text2.Insert(i, "_"); } } value3 = Type.GetType(text2); if (value3 == null) { Universe.LogWarning($"Failed to get Unhollowed type from '{text2}' (originally '{cppType.AssemblyQualifiedName}')!"); } } return value3; } internal static Type GetArrayBaseForArray(Type cppType) { Type unhollowedType = GetUnhollowedType(cppType.GetElementType()); if (unhollowedType == null) { throw new Exception("Could not get unhollowed Element type for Array: " + cppType.FullName); } if (unhollowedType.IsValueType) { return typeof(Il2CppStructArray<>).MakeGenericType(unhollowedType); } if (unhollowedType == typeof(string)) { return typeof(Il2CppStringArray); } return typeof(Il2CppReferenceArray<>).MakeGenericType(unhollowedType); } internal override object Internal_TryCast(object obj, Type toType) { if (obj == null) { return null; } Type type = obj.GetType(); if (type == toType) { return obj; } if (type.IsValueType) { if (IsIl2CppPrimitive(type) && toType.IsPrimitive) { return MakeMonoPrimitive(obj); } if (IsIl2CppPrimitive(toType)) { return MakeIl2CppPrimitive(toType, obj); } if (typeof(Object).IsAssignableFrom(toType)) { return BoxIl2CppObject(obj).TryCast(toType); } return obj; } if (obj is string && typeof(Object).IsAssignableFrom(toType)) { return BoxStringToType(obj, toType); } Il2CppObjectBase val = (Il2CppObjectBase)((obj is Il2CppObjectBase) ? obj : null); if (val == null) { return obj; } if (toType.IsValueType) { return UnboxCppObject(val, toType); } if (toType == typeof(string)) { return UnboxString(obj); } if (toType.IsSubclassOf(typeof(Il2CppObjectBase))) { if (!Il2CppTypeNotNull(toType, out var il2cppPtr)) { return obj; } IntPtr intPtr = IL2CPP.il2cpp_object_get_class(val.Pointer); if (!IL2CPP.il2cpp_class_is_assignable_from(il2cppPtr, intPtr)) { return obj; } if (RuntimeSpecificsStore.IsInjected(il2cppPtr)) { object monoObjectFromIl2CppPointer = ClassInjectorBase.GetMonoObjectFromIl2CppPointer(val.Pointer); if (monoObjectFromIl2CppPointer != null) { return monoObjectFromIl2CppPointer; } } try { return Activator.CreateInstance(toType, val.Pointer); } catch { return obj; } } return obj; } public static object UnboxCppObject(Il2CppObjectBase cppObj, Type toType) { if (!toType.IsValueType) { return null; } try { if (toType.IsEnum) { Type type = ((object)cppObj).GetType(); if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) { object obj = cppObj.TryCast(type); if ((bool)type.GetProperty("HasValue").GetValue(obj, null)) { PropertyInfo property = type.GetProperty("Value"); return Enum.Parse(toType, property.GetValue(obj, null).ToString()); } return cppObj; } return Enum.Parse(toType, ((Object)cppObj.TryCast<Enum>()).ToString()); } string assemblyQualifiedName = toType.AssemblyQualifiedName; if (!unboxMethods.ContainsKey(assemblyQualifiedName)) { unboxMethods.Add(assemblyQualifiedName, typeof(Il2CppObjectBase).GetMethod("Unbox").MakeGenericMethod(toType)); } return unboxMethods[assemblyQualifiedName].Invoke(cppObj, ArgumentUtility.EmptyArgs); } catch (Exception ex) { Universe.LogWarning("Exception Unboxing Il2Cpp object to struct: " + ex); return null; } } public static Object BoxIl2CppObject(object value) { if (value == null) { return null; } try { Type type = value.GetType(); if (!type.IsValueType) { return null; } if (type.IsEnum) { return Enum.Parse(Il2CppType.From(type), value.ToString()); } if (type.IsPrimitive && ReflectionUtility.AllTypes.TryGetValue("Il2Cpp" + type.FullName, out var value2)) { return BoxIl2CppObject(MakeIl2CppPrimitive(value2, value), value2); } return BoxIl2CppObject(value, type); } catch (Exception ex) { Universe.LogWarning("Exception in BoxIl2CppObject: " + ex); return null; } } private static Object BoxIl2CppObject(object cppStruct, Type structType) { object? obj = AccessTools.Method(structType, "BoxIl2CppObject", ArgumentUtility.EmptyTypes, (Type[])null).Invoke(cppStruct, ArgumentUtility.EmptyArgs); return (Object)((obj is Object) ? obj : null); } public static bool IsIl2CppPrimitive(object obj) { return IsIl2CppPrimitive(obj.GetType()); } public static bool IsIl2CppPrimitive(Type type) { return il2cppPrimitivesToMono.ContainsKey(type.FullName); } public static object MakeMonoPrimitive(object cppPrimitive) { return AccessTools.Field(cppPrimitive.GetType(), "m_value").GetValue(cppPrimitive); } public static object MakeIl2CppPrimitive(Type cppType, object monoValue) { object obj = Activator.CreateInstance(cppType); AccessTools.Field(cppType, "m_value").SetValue(obj, monoValue); return obj; } public static bool IsString(object obj) { if (obj is string || obj is String) { return true; } Object val = (Object)((obj is Object) ? obj : null); if (val != null) { Type il2CppType = val.GetIl2CppType(); if (!(il2CppType.FullName == "Il2CppSystem.String")) { return il2CppType.FullName == "System.String"; } return true; } return false; } public static bool IsString(Type type) { if (!(type == typeof(string))) { return type == typeof(String); } return true; } public static bool IsString(Type cppType) { if (!(cppType.FullName == "System.String")) { return cppType.FullName == "Il2CppSystem.String"; } return true; } public static object BoxStringToType(object value, Type castTo) { if (castTo == typeof(String)) { return String.op_Implicit(value as string); } return Object.op_Implicit(value as string); } public static string UnboxString(object value) { if (value == null) { throw new ArgumentNullException("value"); } if (value is string result) { return result; } Object val = (Object)((value is Object) ? value : null); if (val == null) { throw new NotSupportedException("Unable to unbox string from type " + value.GetActualType().FullName + "."); } string text = String.op_Implicit((String)(object)((val is String) ? val : null)); if (string.IsNullOrEmpty(text)) { text = val.ToString(); } return text; } public static bool Il2CppTypeNotNull(Type type) { IntPtr il2cppPtr; return Il2CppTypeNotNull(type, out il2cppPtr); } public static bool Il2CppTypeNotNull(Type type, out IntPtr il2cppPtr) { if (!cppClassPointers.TryGetValue(type.AssemblyQualifiedName, out il2cppPtr)) { il2cppPtr = (IntPtr)typeof(Il2CppClassPointerStore<>).MakeGenericType(type).GetField("NativeClassPtr", BindingFlags.Static | BindingFlags.Public).GetValue(null); cppClassPointers.Add(type.AssemblyQualifiedName, il2cppPtr); } return il2cppPtr != IntPtr.Zero; } private static void BuildDeobfuscationCache() { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { Type[] array = assemblies[i].TryGetTypes(); for (int j = 0; j < array.Length; j++) { TryCacheDeobfuscatedType(array[j]); } } } private static void TryCacheDeobfuscatedType(Type type) { try { if (!type.CustomAttributes.Any()) { return; } foreach (CustomAttributeData customAttribute in type.CustomAttributes) { if (customAttribute.AttributeType == typeof(ObfuscatedNameAttribute)) { string text = customAttribute.ConstructorArguments[0].Value.ToString(); obfuscatedToDeobfuscatedTypes.Add(text, type); deobfuscatedToObfuscatedNames.Add(type.FullName, text); break; } } } catch { } } internal override string Internal_ProcessTypeInString(string theString, Type type) { if (deobfuscatedToObfuscatedNames.TryGetValue(type.FullName, out var value)) { return theString.Replace(value, type.FullName); } return theString; } internal override void Internal_FindSingleton(string[] possibleNames, Type type, BindingFlags flags, List<object> instances) { foreach (string name in possibleNames) { PropertyInfo property = type.GetProperty(name, flags); if (property != null) { object value = property.GetValue(null, null); if (value != null) { instances.Add(value); return; } } } base.Internal_FindSingleton(possibleNames, type, flags, instances); } internal IEnumerator TryLoadGameModules() { string unhollowed_Modules_Folder = ConfigManager.Unhollowed_Modules_Folder; if (Directory.Exists(unhollowed_Modules_Folder)) { string[] files = Directory.GetFiles(unhollowed_Modules_Folder, "*.dll"); foreach (string filePath in files) { if (initStopwatch.ElapsedMilliseconds > 10) { yield return null; initStopwatch.Reset(); initStopwatch.Start(); } DoLoadModule(filePath); } } else { Universe.LogWarning("Expected Unhollowed folder path does not exist: '" + unhollowed_Modules_Folder + "'. If you are using the standalone release, you can specify the Unhollowed modules path when you call CreateInstance()."); } } internal bool DoLoadModule(string fullPath) { if (string.IsNullOrEmpty(fullPath) || !File.Exists(fullPath)) { return false; } try { Assembly.LoadFrom(fullPath); return true; } catch { return false; } } protected override bool Internal_IsEnumerable(Type type) { if (base.Internal_IsEnumerable(type)) { return true; } try { if (cppIEnumerablePointer == IntPtr.Zero) { Il2CppTypeNotNull(typeof(IEnumerable), out cppIEnumerablePointer); } if (cppIEnumerablePointer != IntPtr.Zero && Il2CppTypeNotNull(type, out var il2cppPtr) && IL2CPP.il2cpp_class_is_assignable_from(cppIEnumerablePointer, il2cppPtr)) { return true; } } catch (Exception value) { Universe.LogWarning($"IEnumerable of type [{type.FullName}] failed to check: {value}"); } return false; } protected override bool Internal_TryGetEntryType(Type enumerableType, out Type type) { if (base.Internal_TryGetEntryType(enumerableType, out type)) { return true; } if (type.IsGenericType) { type = type.GetGenericArguments()[0]; return true; } type = typeof(object); return false; } protected override bool Internal_TryGetEnumerator(object instance, out IEnumerator enumerator) { if (instance == null) { throw new ArgumentNullException("instance"); } if (instance is IEnumerable) { return base.Internal_TryGetEnumerator(instance, out enumerator); } enumerator = null; Type actualType = instance.GetActualType(); try { enumerator = new Il2CppEnumerator(instance, actualType); return true; } catch (Exception value) { Universe.LogWarning($"IEnumerable of type {actualType.FullName} failed to get enumerator: {value}"); return false; } } protected override bool Internal_IsDictionary(Type type) { if (base.Internal_IsDictionary(type)) { return true; } try { if (cppIDictionaryPointer == IntPtr.Zero && !Il2CppTypeNotNull(typeof(IDictionary), out cppIDictionaryPointer)) { return false; } if (Il2CppTypeNotNull(type, out var il2cppPtr) && IL2CPP.il2cpp_class_is_assignable_from(cppIDictionaryPointer, il2cppPtr)) { return true; } } catch (Exception value) { Universe.LogWarning($"IDictionary of type [{type.FullName}] failed to check : {value}"); } return false; } protected override bool Internal_TryGetEntryTypes(Type type, out Type keys, out Type values) { if (base.Internal_TryGetEntryTypes(type, out keys, out values)) { return true; } if (type.IsGenericType) { Type[] genericArguments = type.GetGenericArguments(); if (genericArguments.Length == 2) { keys = genericArguments[0]; values = genericArguments[1]; return true; } } keys = typeof(object); values = typeof(object); return false; } protected override bool Internal_TryGetDictEnumerator(object dictionary, out IEnumerator<DictionaryEntry> dictEnumerator) { if (dictionary is IDictionary) { return base.Internal_TryGetDictEnumerator(dictionary, out dictEnumerator); } try { Type actualType = dictionary.GetActualType(); if (typeof(Hashtable).IsAssignableFrom(actualType)) { dictEnumerator = EnumerateCppHashTable(dictionary.TryCast<Hashtable>()); return true; } PropertyInfo property = actualType.GetProperty("Keys"); object value = property.GetValue(dictionary.TryCast(property.DeclaringType), null); PropertyInfo property2 = actualType.GetProperty("Values"); object? value2 = property2.GetValue(dictionary.TryCast(property2.DeclaringType), null); Il2CppEnumerator keysEnumerator = new Il2CppEnumerator(value, value.GetActualType()); Il2CppEnumerator valuesEnumerator = new Il2CppEnumerator(value2, value2.GetActualType()); dictEnumerator = new Il2CppDictionary(keysEnumerator, valuesEnumerator); return true; } catch (Exception value3) { Universe.LogWarning($"IDictionary failed to enumerate: {value3}"); dictEnumerator = null; return false; } } private static IEnumerator<DictionaryEntry> EnumerateCppHashTable(Hashtable hashtable) { for (int i = 0; i < ((Il2CppArrayBase<bucket>)(object)hashtable.buckets).Count; i++) { bucket val = ((Il2CppArrayBase<bucket>)(object)hashtable.buckets)[i]; if (val != null && val.key != null) { yield return new DictionaryEntry(val.key, val.val); } } } } 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 IReadOnlyDictionary<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() { Instance = new Il2CppReflection(); 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 (!ConfigManager.Disable_Setup_Force_ReLoad_ManagedAssemblies && Universe.Context == RuntimeContext.Mono) { ForceLoadManagedAssemblies(); } Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); for (int i = 0; i < assemblies.Length; i++) { CacheTypes(assemblies[i]); } AppDomain.CurrentDomain.AssemblyLoad += AssemblyLoaded; } private static void AssemblyLoaded(object sender, AssemblyLoadEventArgs args) { if (!(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 assemblyFile in files) { try { Assembly.LoadFrom(assemblyFile).TryGetTypes(); } catch { } } } internal static void CacheTypes(Assembly asm) { Type[] array = asm.TryGetTypes(); foreach (Type type in array) { try { string text = type.Namespace; if (!string.IsNullOrEmpty(text) && uniqueNamespaces.Add(text)) { int num = 0; foreach (string allNamespace in AllNamespaces) { if (text.CompareTo(allNamespace) >= 0) { num++; continue; } break; } AllNamespaces.Insert(num, text); } } catch (Exception value) { Universe.LogWarning($"THIS WARNING IS NOT BUG!!!! DON'T REPORT THIS!!!!!\n Can't cache type named {type.Name} Error: {value}"); } 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); if (value2 == null) { return Type.GetType(fullName); } 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 (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) => it != null).ToArray(); } catch { return ArgumentUtility.EmptyTypes; } } public static Type[] GetAllBaseTypes(object obj) { return GetAllBaseTypes(obj?.GetActualType()); } public static Type[] GetAllBaseTypes(Type type) { if (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 (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 coro = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, DefaultTypesEnumerator()); while (coro.MoveNext()) { yield return null; } OnTypeLoaded -= ourListener; if (resolvedTypes.Count > 0) { coro = GetImplementationsAsync(baseType, set, allowAbstract, allowGeneric, allowEnum, resolvedTypes.GetEnumerator()); while (coro.MoveNext()) { yield return null; } } onResultsFetched(set); void ourListener(Type t) { resolvedTypes.Add(t); } } private static IEnumerator<Type> DefaultTypesEnumerator() { string[] names = GetTypeNameArray(); foreach (string key in names) { yield return AllTypes[key]; } } 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 != null && baseType.IsGenericParameter; 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") || type.FullName.Contains('<')) { continue; } if (!isGenericParam) { if (!(baseType != null) || baseType.IsAssignableFrom(type)) { goto IL_01ee; } } else if ((!type.IsClass || !baseType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint)) && (!type.IsValueType || !baseType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint)) && !baseType.GetGenericParameterConstraints().Any((Type it) => !it.IsAssignableFrom(type))) { goto IL_01ee; } goto end_IL_0092; IL_01ee: set.Add(type); end_IL_0092:; } 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 (genericTypeDefinition == typeof(IEnumerable<>) || genericTypeDefinition == typeof(IList<>) || 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 && 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 Il2CppProvider(); 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); } public class AssetBundle : Object { internal delegate IntPtr d_LoadFromFile(IntPtr path, uint crc, ulong offset); private delegate IntPtr d_LoadFromMemory(IntPtr binary, uint crc); public delegate IntPtr d_GetAllLoadedAssetBundles_Native(); internal delegate IntPtr d_LoadAssetWithSubAssets_Internal(IntPtr _this, IntPtr name, IntPtr type); internal delegate IntPtr d_LoadAsset_Internal(IntPtr _this, IntPtr name, IntPtr type); internal delegate void d_Unload(IntPtr _this, bool unloadAllLoadedObjects); public readonly IntPtr m_bundlePtr = IntPtr.Zero; static AssetBundle() { ClassInjector.RegisterTypeInIl2Cpp<AssetBundle>(); } [HideFromIl2Cpp] public static AssetBundle LoadFromFile(string path) { IntPtr intPtr = ICallManager.GetICallUnreliable<d_LoadFromFile>(new string[2] { "UnityEngine.AssetBundle::LoadFromFile_Internal", "UnityEngine.AssetBundle::LoadFromFile" })(IL2CPP.ManagedStringToIl2Cpp(path), 0u, 0uL); if (!(intPtr != IntPtr.Zero)) { return null; } return new AssetBundle(intPtr); } [HideFromIl2Cpp] public static AssetBundle LoadFromMemory(byte[] binary, uint crc = 0u) { IntPtr intPtr = ICallManager.GetICallUnreliable<d_LoadFromMemory>(new string[2] { "UnityEngine.AssetBundle::LoadFromMemory_Internal", "UnityEngine.AssetBundle::LoadFromMemory" })(((Il2CppObjectBase)Il2CppStructArray<byte>.op_Implicit(binary)).Pointer, crc); if (!(intPtr != IntPtr.Zero)) { return null; } return new AssetBundle(intPtr); } [HideFromIl2Cpp] public static AssetBundle[] GetAllLoadedAssetBundles() { IntPtr intPtr = ICallManager.GetICall<d_GetAllLoadedAssetBundles_Native>("UnityEngine.AssetBundle::GetAllLoadedAssetBundles_Native")(); if (!(intPtr != IntPtr.Zero)) { return null; } return Il2CppArrayBase<AssetBundle>.op_Implicit((Il2CppArrayBase<AssetBundle>)(object)new Il2CppReferenceArray<AssetBundle>(intPtr)); } public AssetBundle(IntPtr ptr) : base(ptr) { m_bundlePtr = ptr; } [HideFromIl2Cpp] public Object[] LoadAllAssets() { IntPtr intPtr = ICallManager.GetICall<d_LoadAssetWithSubAssets_Internal>("UnityEngine.AssetBundle::LoadAssetWithSubAssets_Internal")(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(""), ((Il2CppObjectBase)Il2CppType.Of<Object>()).Pointer); if (!(intPtr != IntPtr.Zero)) { return (Object[])(object)new Object[0]; } return Il2CppArrayBase<Object>.op_Implicit((Il2CppArrayBase<Object>)(object)new Il2CppReferenceArray<Object>(intPtr)); } [HideFromIl2Cpp] public T LoadAsset<T>(string name) where T : Object { //IL_003e: Unknown result type (might be due to invalid IL or missing references) IntPtr intPtr = ICallManager.GetICall<d_LoadAsset_Internal>("UnityEngine.AssetBundle::LoadAsset_Internal")(m_bundlePtr, IL2CPP.ManagedStringToIl2Cpp(name), ((Il2CppObjectBase)Il2CppType.Of<T>()).Pointer); if (!(intPtr != IntPtr.Zero)) { return default(T); } return ((Il2CppObjectBase)new Object(intPtr)).TryCast<T>(); } [HideFromIl2Cpp] public void Unload(bool unloadAllLoadedObjects) { ICallManager.GetICall<d_Unload>("UnityEngine.AssetBundle::Unload")(m_bundlePtr, unloadAllLoadedObjects); } } public static class Il2CppExtensions { public static void AddListener(this UnityEvent action, Action listener) { action.AddListener(UnityAction.op_Implicit(listener)); } public static void AddListener<T>(this UnityEvent<T> action, Action<T> listener) { action.AddListener(UnityAction<T>.op_Implicit(listener)); } public static void RemoveListener(this UnityEvent action, Action listener) { action.RemoveListener(UnityAction.op_Implicit(listener)); } public static void RemoveListener<T>(this UnityEvent<T> action, Action<T> listener) { action.RemoveListener(UnityAction<T>.op_Implicit(listener)); } public static void SetChildControlHeight(this HorizontalOrVerticalLayoutGroup group, bool value) { group.childControlHeight = value; } public static void SetChildControlWidth(this HorizontalOrVerticalLayoutGroup group, bool value) { group.childControlWidth = value; } } internal class UniversalBehaviour : MonoBehaviour { private static Delegate queuedDelegate; internal static UniversalBehaviour Instance { get; private set; } internal static void Setup() { //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_0015: Expected O, but got Unknown //IL_0015: 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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) ClassInjector.RegisterTypeInIl2Cpp<UniversalBehaviour>(); GameObject val = new GameObject("UniverseLibBehaviour"); Object.DontDestroyOnLoad((Object)val); ((Object)val).hideFlags = (HideFlags)(((Object)val).hideFlags | 0x3D); Instance = val.AddComponent<UniversalBehaviour>(); } internal void Update() { Universe.Update(); } public UniversalBehaviour(IntPtr ptr) : base(ptr) { } internal static void InvokeDelegate(Delegate method) { queuedDelegate = method; ((MonoBehaviour)Instance).Invoke("InvokeQueuedAction", 0f); } private void InvokeQueuedAction() { try { Delegate obj = queuedDelegate; queuedDelegate = null; obj?.DynamicInvoke(); } catch (Exception value) { Universe.LogWarning($"Exception invoking action from IL2CPP thread: {value}"); } } } public static class Universe { public enum GlobalState { WaitingToSetup, SettingUp, SetupCompleted } public const string NAME = "UniverseLib"; public const string VERSION = "1.5.11"; public const string AUTHOR = "Sinai, yukieiji"; public const string GUID = "com.sinai.universelib"; private static float startupDelay; private static Action<string, LogType> logHandler; public static RuntimeContext Context { get; } = RuntimeContext.IL2CPP; 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.5.11 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.5.11 initialized."); CurrentGlobalState = GlobalState.SetupCompleted; InvokeOnInitialized(Universe.OnInitialized); } private static void InvokeOnInitialized(Action onInitialized) { if (onInitialized == null) { return; } Delegate[] invocationList = onInitialized.GetInvocationList(); foreach (Delegate obj in invocationList) { try { obj.DynamicInvoke(); } catch (Exception value) { LogWarning($"Exception invoking onInitialized callback! {value}"); } } } 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_002c: Unknown result type (might be due to invalid IL or missing references) if (logHandler != null) { 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_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Expected O, but got Unknown //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: 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 (methodInfo == null) { return false; } if (Il2CppType.From(type, false) != (Type)null && Il2CppInteropUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod((MethodBase)methodInfo) == null) { Log("\t IL2CPP method has no corresponding pointer, aborting patch of " + type.FullName + "." + methodName); return false; } PatchProcessor val = Harmony.CreateProcessor((MethodBase)methodInfo); if (prefix != null) { val.AddPrefix(new HarmonyMethod(prefix)); } if (postfix != null) { val.AddPostfix(new HarmonyMethod(postfix)); } if (finalizer != null) { val.AddFinalizer(new HarmonyMethod(finalizer)); } val.Patch(); return true; } catch (Exception value) { LogWarning($"\t Exception patching {type.FullName}.{methodName}: {value}"); 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_000c: 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_0019: 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_000c: 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) { if (!string.IsNullOrEmpty(type?.FullName)) { if (!type.IsPrimitive && !type.IsEnum && !nonPrimitiveTypes.Contains(type)) { return customTypes.ContainsKey(type.FullName); } return true; } return false; } 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; return result; } obj = default(T); return result; } public static bool TryParse(string input, Type type, out object obj, out Exception parseException) { obj = null; parseException = null; if (type == null) { return false; } if (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 (type == null || obj == null) { return null; } if (type == typeof(string)) { return obj as string; } if (type.IsEnum) { if (!Enum.IsDefined(type, obj)) { return obj.ToString(); } return Enum.GetName(type, obj); } 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 value) { Universe.LogWarning($"Exception formatting object for input: {value}"); 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_0002: 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) Vector2 val = default(Vector2); string[] array = input.Split(' '); 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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) if (!(obj is Vector2 val)) { return null; } return FormatDecimalSequence(val.x, val.y); } internal static object TryParseVector3(string input) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); string[] array = input.Split(' '); 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0037: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Vector3 val)) { return null; } return FormatDecimalSequence(val.x, val.y, val.z); } internal static object TryParseVector4(string input) { //IL_0002: 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) Vector4 val = default(Vector4); string[] array = input.Split(' '); 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Vector4 val)) { return null; } return FormatDecimalSequence(val.x, val.y, val.z, val.w); } internal static object TryParseQuaternion(string input) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) Vector3 val = default(Vector3); string[] array = input.Split(' '); if (array.Length == 4) { return (object)new Quaternion { x = float.Parse(array[0].Trim(), CultureInfo.CurrentCulture), y = float.Parse(array[1].Trim(), CultureInfo.CurrentCulture), z = float.Parse(array[2].Trim(), CultureInfo.CurrentCulture), w = float.Parse(array[3].Trim(), CultureInfo.CurrentCulture) }; } 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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_003f: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Quaternion val)) { return null; } Vector3 eulerAngles = ((Quaternion)(ref val)).eulerAngles; return FormatDecimalSequence(eulerAngles.x, eulerAngles.y, eulerAngles.z); } internal static object TryParseRect(string input) { //IL_0002: 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) Rect val = default(Rect); string[] array = input.Split(' '); ((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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Rect val)) { 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_0002: 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) Color val = default(Color); string[] array = input.Split(' '); 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: 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_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) if (!(obj is Color val)) { return null; } return FormatDecimalSequence(val.r, val.g, val.b, val.a); } internal static object TryParseColor32(string input) { //IL_0002: 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) Color32 val = default(Color32); string[] array = input.Split(' '); 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_0050: 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) if (!(obj is Color32 val)) { return null; } return $"{val.r} {val.g} {val.b} {val.a}"; } internal static object TryParseLayerMask(string input) { //IL_0006: 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_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) if (!(obj is LayerMask val)) { 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 (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 (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 (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 stringBuilder2 = stringBuilder; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(1, 2, stringBuilder2); handler.AppendFormatted("<color="); handler.AppendFormatted(GetClassColor(type)); handler.AppendLiteral(">"); stringBuilder2.Append(ref handler).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 value = ((!method.IsStatic) ? "#ff8000" : "#b55b02"); StringBuilder stringBuilder2 = stringBuilder; StringBuilder stringBuilder3 = stringBuilder2; StringBuilder.AppendInterpolatedStringHandler handler = new StringBuilder.AppendInterpolatedStringHandler(16, 2, stringBuilder2); handler.AppendLiteral("<color="); handler.AppendFormatted(value); handler.AppendLiteral(">"); handler.AppendFormatted(method.Name); handler.AppendLiteral("</color>"); stringBuilder3.Append(ref handler); if (method.IsGenericMethod) { stringBuilder.Append("<"); Type[] genericArguments = method.GetGenericArguments(); for (int i = 0; i < genericArguments.Length; i++) { Type type = genericArguments[i]; if (type.IsGenericParameter) { stringBuilder2 = stringBuilder; StringBuilder stringBuilder4 = stringBuilder2; handler = new StringBuilder.AppendInterpolatedStringHandler(16, 2, stringBuilder2); handler.AppendLiteral("<color="); handler.AppendFormatted("#92c470"); handler.AppendLiteral(">"); handler.AppendFormatted(genericArguments[i].Name); handler.AppendLiteral("</color>"); stringBuilder4.Append(ref handler); } 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 text = stringBuilder.ToString(); highlightedMethods.Add(key, text); return text; } [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() && 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(); } theString = ReflectionUtility.ProcessTypeInString(actualType, theString); Type val = (Type)((value is Type) ? value : null); if (val != null) { Type unhollowedType = Il2CppReflection.GetUnhollowedType(val); if (unhollowedType != null) { theString = ReflectionUtility.ProcessTypeInString(unhollowedType, theString); } } return 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_0000: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) byte value = (byte)Mathf.Clamp(Mathf.RoundToInt(color.r * 255f), 0, 255); byte value2 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.g * 255f), 0, 255); byte value3 = (byte)Mathf.Clamp(Mathf.RoundToInt(color.b * 255f), 0, 255); return $"{value:X2}{value2:X2}{value3:X2}"; } public static Color ToColor(this string _string) { //IL_005c: 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_001b: 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); return new Color { r = (float)((decimal)b / 255m), g = (float)((decimal)b2 / 255m), b = (float)((decimal)b3 / 255m), a = 1f }; } public static UnityEvent<string> GetOnEndEdit(this InputField _this) { if (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 { if (Object.op_Implicit((Object)(object)RootObject)) { return RootObject.activeSelf; } return false; } set { UniversalUI.SetUIActive(ID, value); } } public UIBase(string id, Action updateMethod) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: 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_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0131: 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 obj = RootObject.AddComponent<CanvasScaler>(); obj.referenceResolution = new Vector2(1920f, 1080f); obj.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 value) { Universe.LogWarning($"Exception invoking update method for {ID}: {value}"); } } } 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_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Expected O, but got Unknown //IL_0036: 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); } val.AddComponent<RectTransform>().sizeDelta = sizeDelta; return val; } internal static void SetDefaultTextValues(Text text) { //IL_0001: 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_002a: 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_005c: Unknown result type (might be due to invalid IL or missing references) Navigation navigation = selectable.navigation; 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_0119: 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_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_0074: 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_008e: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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)