diff --git a/src/Explorer.csproj b/src/Explorer.csproj index cbee9a5..4272ad3 100644 --- a/src/Explorer.csproj +++ b/src/Explorer.csproj @@ -241,7 +241,10 @@ - + + + + diff --git a/src/ExplorerCore.cs b/src/ExplorerCore.cs index 9f2a95f..bba9e3a 100644 --- a/src/ExplorerCore.cs +++ b/src/ExplorerCore.cs @@ -5,7 +5,7 @@ namespace Explorer public class ExplorerCore { public const string NAME = "Explorer (" + PLATFORM + ", " + MODLOADER + ")"; - public const string VERSION = "1.8.22"; + public const string VERSION = "1.8.23"; public const string AUTHOR = "Sinai"; public const string GUID = "com.sinai.explorer"; @@ -33,7 +33,7 @@ namespace Explorer new MainMenu(); new WindowManager(); - InputHelper.Init(); + InputManager.Init(); CursorControl.Init(); Log($"{NAME} {VERSION} initialized."); @@ -54,7 +54,7 @@ namespace Explorer public static void Update() { - if (InputHelper.GetKeyDown(ModConfig.Instance.Main_Menu_Toggle)) + if (InputManager.GetKeyDown(ModConfig.Instance.Main_Menu_Toggle)) { ShowMenu = !ShowMenu; } diff --git a/src/Helpers/InputHelper.cs b/src/Helpers/InputHelper.cs deleted file mode 100644 index 675110c..0000000 --- a/src/Helpers/InputHelper.cs +++ /dev/null @@ -1,205 +0,0 @@ -using System; -using System.Reflection; -using UnityEngine; - -namespace Explorer -{ - /// - /// Version-agnostic Input module using Reflection. - /// - public static class InputHelper - { - // If no Input modules loaded at all - public static bool NO_INPUT; - - // If using new InputSystem module - public static bool USING_NEW_INPUT; - - // Cached Types - private static Type TInput => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.Input")); - private static Type _input; - - private static Type TKeyboard => _keyboard ?? (_keyboard = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard")); - private static Type _keyboard; - - private static Type TMouse => _mouse ?? (_mouse = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Mouse")); - private static Type _mouse; - - private static Type TKey => _key ?? (_key = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Key")); - private static Type _key; - - // Cached member infos (new system) - private static PropertyInfo _btnIsPressedProp; - private static PropertyInfo _btnWasPressedProp; - - private static object CurrentKeyboard => _currentKeyboard ?? (_currentKeyboard = _kbCurrentProp.GetValue(null, null)); - private static object _currentKeyboard; - private static PropertyInfo _kbCurrentProp; - private static PropertyInfo _kbIndexer; - - private static object CurrentMouse => _currentMouse ?? (_currentMouse = _mouseCurrentProp.GetValue(null, null)); - private static object _currentMouse; - private static PropertyInfo _mouseCurrentProp; - - private static object LeftMouseButton => _lmb ?? (_lmb = _leftButtonProp.GetValue(CurrentMouse, null)); - private static object _lmb; - private static PropertyInfo _leftButtonProp; - - private static object RightMouseButton => _rmb ?? (_rmb = _rightButtonProp.GetValue(CurrentMouse, null)); - private static object _rmb; - private static PropertyInfo _rightButtonProp; - - private static object MousePositionInfo => _pos ?? (_pos = _positionProp.GetValue(CurrentMouse, null)); - private static object _pos; - private static PropertyInfo _positionProp; - private static MethodInfo _readVector2InputMethod; - - // Cached member infos (legacy) - private static PropertyInfo _mousePositionProp; - private static MethodInfo _getKeyMethod; - private static MethodInfo _getKeyDownMethod; - private static MethodInfo _getMouseButtonMethod; - private static MethodInfo _getMouseButtonDownMethod; - - public static void Init() - { - if (TKeyboard != null || TryLoadModule("Unity.InputSystem", TKeyboard)) - { - InitNewInput(); - } - else if (TInput != null || TryLoadModule("UnityEngine.Input", TInput)) - { - InitLegacyInput(); - } - else - { - ExplorerCore.LogWarning("Could not find any Input module!"); - NO_INPUT = true; - } - } - - private static bool TryLoadModule(string dll, Type check) => ReflectionHelpers.LoadModule(dll) && check != null; - - private static void InitNewInput() - { - ExplorerCore.Log("Initializing new InputSystem support..."); - - USING_NEW_INPUT = true; - - _kbCurrentProp = TKeyboard.GetProperty("current"); - _kbIndexer = TKeyboard.GetProperty("Item", new Type[] { TKey }); - - var btnControl = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl"); - _btnIsPressedProp = btnControl.GetProperty("isPressed"); - _btnWasPressedProp = btnControl.GetProperty("wasPressedThisFrame"); - - _mouseCurrentProp = TMouse.GetProperty("current"); - _leftButtonProp = TMouse.GetProperty("leftButton"); - _rightButtonProp = TMouse.GetProperty("rightButton"); - - _positionProp = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Pointer") - .GetProperty("position"); - - _readVector2InputMethod = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.InputControl`1") - .MakeGenericType(typeof(Vector2)) - .GetMethod("ReadValue"); - } - - private static void InitLegacyInput() - { - ExplorerCore.Log("Initializing Legacy Input support..."); - - _mousePositionProp = TInput.GetProperty("mousePosition"); - _getKeyMethod = TInput.GetMethod("GetKey", new Type[] { typeof(KeyCode) }); - _getKeyDownMethod = TInput.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) }); - _getMouseButtonMethod = TInput.GetMethod("GetMouseButton", new Type[] { typeof(int) }); - _getMouseButtonDownMethod = TInput.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) }); - } - - public static Vector3 MousePosition - { - get - { - if (NO_INPUT) - return Vector3.zero; - - if (USING_NEW_INPUT) - return (Vector2)_readVector2InputMethod.Invoke(MousePositionInfo, new object[0]); - - return (Vector3)_mousePositionProp.GetValue(null, null); - } - } - - public static bool GetKeyDown(KeyCode key) - { - if (NO_INPUT) return false; - - if (USING_NEW_INPUT) - { - var parsedKey = Enum.Parse(TKey, key.ToString()); - var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsedKey }); - - return (bool)_btnWasPressedProp.GetValue(actualKey, null); - } - - return (bool)_getKeyDownMethod.Invoke(null, new object[] { key }); - } - - public static bool GetKey(KeyCode key) - { - if (NO_INPUT) return false; - - if (USING_NEW_INPUT) - { - var parsed = Enum.Parse(TKey, key.ToString()); - var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsed }); - - return (bool)_btnIsPressedProp.GetValue(actualKey, null); - } - - return (bool)_getKeyMethod.Invoke(null, new object[] { key }); - } - - /// 0 = left, 1 = right, 2 = middle. - public static bool GetMouseButtonDown(int btn) - { - if (NO_INPUT) return false; - - if (USING_NEW_INPUT) - { - object actualBtn; - switch (btn) - { - case 0: actualBtn = LeftMouseButton; break; - case 1: actualBtn = RightMouseButton; break; - default: throw new NotImplementedException(); - } - - return (bool)_btnWasPressedProp.GetValue(actualBtn, null); - } - - return (bool)_getMouseButtonDownMethod.Invoke(null, new object[] { btn }); - } - - /// 0 = left, 1 = right, 2 = middle. - public static bool GetMouseButton(int btn) - { - if (NO_INPUT) return false; - - if (USING_NEW_INPUT) - { - object actualBtn; - switch (btn) - { - case 0: actualBtn = LeftMouseButton; break; - case 1: actualBtn = RightMouseButton; break; - default: throw new NotImplementedException(); - } - - return (bool)_btnIsPressedProp.GetValue(actualBtn, null); - } - - return (bool)_getMouseButtonMethod.Invoke(null, new object[] { btn }); - } - } -} diff --git a/src/Input/AbstractInput.cs b/src/Input/AbstractInput.cs new file mode 100644 index 0000000..ef18f56 --- /dev/null +++ b/src/Input/AbstractInput.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace Explorer.Input +{ + public abstract class AbstractInput + { + public abstract void Init(); + + public abstract Vector2 MousePosition { get; } + + public abstract bool GetKeyDown(KeyCode key); + public abstract bool GetKey(KeyCode key); + + public abstract bool GetMouseButtonDown(int btn); + public abstract bool GetMouseButton(int btn); + } +} diff --git a/src/Input/InputManager.cs b/src/Input/InputManager.cs new file mode 100644 index 0000000..532b7ce --- /dev/null +++ b/src/Input/InputManager.cs @@ -0,0 +1,55 @@ +using System; +using System.Reflection; +using UnityEngine; +using Explorer.Input; + +namespace Explorer +{ + public static class InputManager + { + // If no Input modules loaded at all + public static bool NO_INPUT { get; private set; } + + // If using new InputSystem module + public static bool USING_NEW_INPUT { get; private set; } + + private static AbstractInput inputModule; + + public static void Init() + { + if (InputSystem.TKeyboard != null || TryLoadModule("Unity.InputSystem", InputSystem.TKeyboard)) + { + USING_NEW_INPUT = true; + inputModule = new InputSystem(); + } + else if (LegacyInput.TInput != null || TryLoadModule("UnityEngine.Input", LegacyInput.TInput)) + { + inputModule = new LegacyInput(); + } + + if (inputModule == null) + { + ExplorerCore.LogWarning("Could not find any Input module!"); + NO_INPUT = true; + } + else + { + inputModule.Init(); + } + + bool TryLoadModule(string dll, Type check) => ReflectionHelpers.LoadModule(dll) && check != null; + } + + public static Vector3 MousePosition => inputModule?.MousePosition ?? Vector3.zero; + + public static bool GetKeyDown(KeyCode key) => inputModule?.GetKeyDown(key) ?? false; + + public static bool GetKey(KeyCode key) => inputModule?.GetKey(key) ?? false; + + /// 0 = left, 1 = right, 2 = middle. + public static bool GetMouseButtonDown(int btn) => inputModule?.GetMouseButtonDown(btn) ?? false; + + /// 0 = left, 1 = right, 2 = middle. + public static bool GetMouseButton(int btn) => inputModule?.GetMouseButton(btn) ?? false; + } +} diff --git a/src/Input/InputSystem.cs b/src/Input/InputSystem.cs new file mode 100644 index 0000000..4f34b96 --- /dev/null +++ b/src/Input/InputSystem.cs @@ -0,0 +1,109 @@ +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace Explorer.Input +{ + public class InputSystem : AbstractInput + { + public static Type TKeyboard => _keyboard ?? (_keyboard = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard")); + private static Type _keyboard; + + public static Type TMouse => _mouse ?? (_mouse = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Mouse")); + private static Type _mouse; + + public static Type TKey => _key ?? (_key = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Key")); + private static Type _key; + + private static PropertyInfo _btnIsPressedProp; + private static PropertyInfo _btnWasPressedProp; + + private static object CurrentKeyboard => _currentKeyboard ?? (_currentKeyboard = _kbCurrentProp.GetValue(null, null)); + private static object _currentKeyboard; + private static PropertyInfo _kbCurrentProp; + private static PropertyInfo _kbIndexer; + + private static object CurrentMouse => _currentMouse ?? (_currentMouse = _mouseCurrentProp.GetValue(null, null)); + private static object _currentMouse; + private static PropertyInfo _mouseCurrentProp; + + private static object LeftMouseButton => _lmb ?? (_lmb = _leftButtonProp.GetValue(CurrentMouse, null)); + private static object _lmb; + private static PropertyInfo _leftButtonProp; + + private static object RightMouseButton => _rmb ?? (_rmb = _rightButtonProp.GetValue(CurrentMouse, null)); + private static object _rmb; + private static PropertyInfo _rightButtonProp; + + private static object MousePositionInfo => _pos ?? (_pos = _positionProp.GetValue(CurrentMouse, null)); + private static object _pos; + private static PropertyInfo _positionProp; + private static MethodInfo _readVector2InputMethod; + + public override Vector2 MousePosition => (Vector2)_readVector2InputMethod.Invoke(MousePositionInfo, new object[0]); + + public override bool GetKeyDown(KeyCode key) + { + var parsedKey = Enum.Parse(TKey, key.ToString()); + var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsedKey }); + + return (bool)_btnWasPressedProp.GetValue(actualKey, null); + } + + public override bool GetKey(KeyCode key) + { + var parsed = Enum.Parse(TKey, key.ToString()); + var actualKey = _kbIndexer.GetValue(CurrentKeyboard, new object[] { parsed }); + + return (bool)_btnIsPressedProp.GetValue(actualKey, null); + } + + public override bool GetMouseButtonDown(int btn) + { + switch (btn) + { + case 0: return (bool)_btnWasPressedProp.GetValue(LeftMouseButton, null); + case 1: return (bool)_btnWasPressedProp.GetValue(RightMouseButton, null); + // case 2: return (bool)_btnWasPressedProp.GetValue(MiddleMouseButton, null); + default: throw new NotImplementedException(); + } + } + + public override bool GetMouseButton(int btn) + { + switch (btn) + { + case 0: return (bool)_btnIsPressedProp.GetValue(LeftMouseButton, null); + case 1: return (bool)_btnIsPressedProp.GetValue(RightMouseButton, null); + // case 2: return (bool)_btnIsPressedProp.GetValue(MiddleMouseButton, null); + default: throw new NotImplementedException(); + } + } + + public override void Init() + { + ExplorerCore.Log("Initializing new InputSystem support..."); + + _kbCurrentProp = TKeyboard.GetProperty("current"); + _kbIndexer = TKeyboard.GetProperty("Item", new Type[] { TKey }); + + var btnControl = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl"); + _btnIsPressedProp = btnControl.GetProperty("isPressed"); + _btnWasPressedProp = btnControl.GetProperty("wasPressedThisFrame"); + + _mouseCurrentProp = TMouse.GetProperty("current"); + _leftButtonProp = TMouse.GetProperty("leftButton"); + _rightButtonProp = TMouse.GetProperty("rightButton"); + + _positionProp = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Pointer") + .GetProperty("position"); + + _readVector2InputMethod = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.InputControl`1") + .MakeGenericType(typeof(Vector2)) + .GetMethod("ReadValue"); + } + } +} diff --git a/src/Input/LegacyInput.cs b/src/Input/LegacyInput.cs new file mode 100644 index 0000000..808b900 --- /dev/null +++ b/src/Input/LegacyInput.cs @@ -0,0 +1,42 @@ +using System; +using System.Reflection; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace Explorer.Input +{ + public class LegacyInput : AbstractInput + { + public static Type TInput => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.Input")); + private static Type _input; + + private static PropertyInfo _mousePositionProp; + private static MethodInfo _getKeyMethod; + private static MethodInfo _getKeyDownMethod; + private static MethodInfo _getMouseButtonMethod; + private static MethodInfo _getMouseButtonDownMethod; + + public override Vector2 MousePosition => (Vector3)_mousePositionProp.GetValue(null, null); + + public override bool GetKey(KeyCode key) => (bool)_getKeyMethod.Invoke(null, new object[] { key }); + + public override bool GetKeyDown(KeyCode key) => (bool)_getKeyDownMethod.Invoke(null, new object[] { key }); + + public override bool GetMouseButton(int btn) => (bool)_getMouseButtonMethod.Invoke(null, new object[] { btn }); + + public override bool GetMouseButtonDown(int btn) => (bool)_getMouseButtonDownMethod.Invoke(null, new object[] { btn }); + + public override void Init() + { + ExplorerCore.Log("Initializing Legacy Input support..."); + + _mousePositionProp = TInput.GetProperty("mousePosition"); + _getKeyMethod = TInput.GetMethod("GetKey", new Type[] { typeof(KeyCode) }); + _getKeyDownMethod = TInput.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) }); + _getMouseButtonMethod = TInput.GetMethod("GetMouseButton", new Type[] { typeof(int) }); + _getMouseButtonDownMethod = TInput.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) }); + } + } +} diff --git a/src/Menu/CursorControl.cs b/src/Menu/CursorControl.cs index 21c4567..dc1bdff 100644 --- a/src/Menu/CursorControl.cs +++ b/src/Menu/CursorControl.cs @@ -108,7 +108,7 @@ namespace Explorer public static void Update() { // Check Force-Unlock input - if (InputHelper.GetKeyDown(KeyCode.LeftAlt)) + if (InputManager.GetKeyDown(KeyCode.LeftAlt)) { ForceUnlockMouse = !ForceUnlockMouse; } diff --git a/src/Menu/InspectUnderMouse.cs b/src/Menu/InspectUnderMouse.cs index c5b9b37..85d390e 100644 --- a/src/Menu/InspectUnderMouse.cs +++ b/src/Menu/InspectUnderMouse.cs @@ -12,7 +12,7 @@ namespace Explorer { if (ExplorerCore.ShowMenu) { - if (InputHelper.GetKey(KeyCode.LeftShift) && InputHelper.GetMouseButtonDown(1)) + if (InputManager.GetKey(KeyCode.LeftShift) && InputManager.GetMouseButtonDown(1)) { EnableInspect = !EnableInspect; } @@ -33,7 +33,7 @@ namespace Explorer if (!UnityHelpers.MainCamera) return; - var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputHelper.MousePosition); + var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputManager.MousePosition); if (Physics.Raycast(ray, out RaycastHit hit, 1000f)) { @@ -41,7 +41,7 @@ namespace Explorer m_objUnderMouseName = obj.transform.GetGameObjectPath(); - if (InputHelper.GetMouseButtonDown(0)) + if (InputManager.GetMouseButtonDown(0)) { EnableInspect = false; m_objUnderMouseName = ""; @@ -61,7 +61,7 @@ namespace Explorer { if (m_objUnderMouseName != "") { - var pos = InputHelper.MousePosition; + var pos = InputManager.MousePosition; var rect = new Rect( pos.x - (Screen.width / 2), // x Screen.height - pos.y - 50, // y diff --git a/src/Menu/ResizeDrag.cs b/src/Menu/ResizeDrag.cs index a3347db..25cac76 100644 --- a/src/Menu/ResizeDrag.cs +++ b/src/Menu/ResizeDrag.cs @@ -38,18 +38,18 @@ namespace Explorer //var r = GUILayoutUtility.GetLastRect(); var r = Internal_LayoutUtility.GetLastRect(); - var mousePos = InputHelper.MousePosition; + var mousePos = InputManager.MousePosition; try { var mouse = GUIUnstrip.ScreenToGUIPoint(new Vector2(mousePos.x, Screen.height - mousePos.y)); - if (r.Contains(mouse) && InputHelper.GetMouseButtonDown(0)) + if (r.Contains(mouse) && InputManager.GetMouseButtonDown(0)) { isResizing = true; m_currentWindow = ID; m_currentResize = new Rect(mouse.x, mouse.y, _rect.width, _rect.height); } - else if (!InputHelper.GetMouseButton(0)) + else if (!InputManager.GetMouseButton(0)) { isResizing = false; } @@ -125,16 +125,16 @@ namespace Explorer //var r = GUILayoutUtility.GetLastRect(); var r = GUILayoutUtility.GetLastRect(); - var mousePos = InputHelper.MousePosition; + var mousePos = InputManager.MousePosition; var mouse = GUIUnstrip.ScreenToGUIPoint(new Vector2(mousePos.x, Screen.height - mousePos.y)); - if (r.Contains(mouse) && InputHelper.GetMouseButtonDown(0)) + if (r.Contains(mouse) && InputManager.GetMouseButtonDown(0)) { isResizing = true; m_currentWindow = ID; m_currentResize = new Rect(mouse.x, mouse.y, _rect.width, _rect.height); } - else if (!InputHelper.GetMouseButton(0)) + else if (!InputManager.GetMouseButton(0)) { isResizing = false; } diff --git a/src/Menu/Windows/GameObjectWindow.cs b/src/Menu/Windows/GameObjectWindow.cs index e853702..e10d79e 100644 --- a/src/Menu/Windows/GameObjectWindow.cs +++ b/src/Menu/Windows/GameObjectWindow.cs @@ -109,7 +109,7 @@ namespace Explorer DestroyWindow(); return; } - else if (Target is UnityEngine.Object uObj) + if (Target is UnityEngine.Object uObj) { if (!uObj) { diff --git a/src/Menu/Windows/ReflectionWindow.cs b/src/Menu/Windows/ReflectionWindow.cs index b0a3909..4d47fbc 100644 --- a/src/Menu/Windows/ReflectionWindow.cs +++ b/src/Menu/Windows/ReflectionWindow.cs @@ -78,13 +78,15 @@ namespace Explorer { if (Target == null) { + ExplorerCore.Log("Target is null!"); DestroyWindow(); return; } - else if (Target is UnityEngine.Object uObj) + if (Target is UnityEngine.Object uObj) { if (!uObj) { + ExplorerCore.Log("Target was destroyed!"); DestroyWindow(); return; } diff --git a/src/Menu/Windows/WindowManager.cs b/src/Menu/Windows/WindowManager.cs index 5a8afa3..58194eb 100644 --- a/src/Menu/Windows/WindowManager.cs +++ b/src/Menu/Windows/WindowManager.cs @@ -81,7 +81,7 @@ namespace Explorer { createdNew = false; - if (InputHelper.GetKey(KeyCode.LeftShift)) + if (InputManager.GetKey(KeyCode.LeftShift)) { forceReflection = true; } @@ -189,7 +189,7 @@ namespace Explorer private static bool RectContainsMouse(Rect rect) { - var mousePos = InputHelper.MousePosition; + var mousePos = InputManager.MousePosition; return rect.Contains(new Vector2(mousePos.x, Screen.height - mousePos.y)); }