Skip to content
This repository has been archived by the owner on May 9, 2023. It is now read-only.

Commit

Permalink
1.8.2
Browse files Browse the repository at this point in the history
* Added support for games which use the new InputSystem module and have disabled LegacyInputModule
  • Loading branch information
sinai-dev committed Oct 1, 2020
1 parent 5afaf85 commit b4b5f1e
Show file tree
Hide file tree
Showing 10 changed files with 200 additions and 85 deletions.
8 changes: 4 additions & 4 deletions src/Config/ModConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ public static void OnLoad()
}

// returns true if settings successfully loaded
public static bool LoadSettings(bool checkExist = true)
public static bool LoadSettings()
{
if (checkExist && !File.Exists(SETTINGS_PATH))
if (!File.Exists(SETTINGS_PATH))
return false;

try
Expand All @@ -50,9 +50,9 @@ public static bool LoadSettings(bool checkExist = true)
return Instance != null;
}

public static void SaveSettings(bool checkExist = true)
public static void SaveSettings()
{
if (checkExist && File.Exists(SETTINGS_PATH))
if (File.Exists(SETTINGS_PATH))
File.Delete(SETTINGS_PATH);

using (var file = File.Create(SETTINGS_PATH))
Expand Down
1 change: 1 addition & 0 deletions src/Explorer.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<BIECppGameFolder>D:\Steam\steamapps\common\Outward - Il2Cpp</BIECppGameFolder>
<!-- Set this to the BepInEx Mono Game folder, without the ending '\' character. -->
<BIEMonoGameFolder>D:\Steam\steamapps\common\Outward</BIEMonoGameFolder>
<!-- <BIEMonoGameFolder>D:\source\Unity Projects\! My Unity Games\NewInputSystemTest\_BUILD</BIEMonoGameFolder> -->
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release_ML_Cpp|AnyCPU' ">
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
Expand Down
2 changes: 1 addition & 1 deletion src/ExplorerBepInPlugin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ internal void Awake()

new ExplorerCore();

HarmonyInstance.PatchAll();
//HarmonyInstance.PatchAll();
}

void LoadMCS()
Expand Down
19 changes: 9 additions & 10 deletions src/ExplorerCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,23 @@ namespace Explorer
{
public class ExplorerCore
{
public const string NAME = "Explorer (" + PLATFORM + ", " + MODLOADER + ")";
public const string VERSION = "1.8.1";
public const string NAME = "Explorer (" + PLATFORM + ", " + MODLOADER + ")";
public const string VERSION = "1.8.2";
public const string AUTHOR = "Sinai";
public const string GUID = "com.sinai.explorer";

public const string MODLOADER =
#if ML
"MelonLoader";
#else
"BepInEx";
#endif
public const string PLATFORM =
#if CPP
"Il2Cpp";
#else
"Mono";
#endif
public const string MODLOADER =
#if ML
"MelonLoader";
#else
"BepInEx";
#endif

public static ExplorerCore Instance { get; private set; }

Expand All @@ -30,11 +30,10 @@ public ExplorerCore()

ModConfig.OnLoad();

InputHelper.Init();

new MainMenu();
new WindowManager();

InputHelper.Init();
CursorControl.Init();

Log($"{NAME} {VERSION} initialized.");
Expand Down
186 changes: 155 additions & 31 deletions src/Helpers/InputHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,41 @@
namespace Explorer
{
/// <summary>
/// Version-agnostic UnityEngine Input module using Reflection.
/// Version-agnostic Input module using Reflection.
/// </summary>
public static class InputHelper
{
// If Input module failed to load at all
public static bool NO_INPUT;

// Base UnityEngine.Input class
private static Type Input => _input ?? (_input = ReflectionHelpers.GetTypeByName("UnityEngine.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;

// Cached member infos
private static Type TKeyboard => _keyboardSys ?? (_keyboardSys = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Keyboard"));
private static Type _keyboardSys;

private static Type TMouse => _mouseSys ?? (_mouseSys = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Mouse"));
private static Type _mouseSys;

private static Type TKey => _key ?? (_key = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Key"));
private static Type _key;

// Cached member infos (new system)
private static PropertyInfo _keyboardCurrent;
private static PropertyInfo _kbItemProp;
private static PropertyInfo _isPressed;
private static PropertyInfo _wasPressedThisFrame;
private static PropertyInfo _mouseCurrent;
private static PropertyInfo _leftButton;
private static PropertyInfo _rightButton;
private static PropertyInfo _position;
private static MethodInfo _readValueMethod;

// Cached member infos (legacy)
private static PropertyInfo _mousePosition;
private static MethodInfo _getKey;
private static MethodInfo _getKeyDown;
Expand All @@ -25,74 +48,175 @@ public static class InputHelper

public static void Init()
{
if (Input == null && !TryManuallyLoadInput())
if (TKeyboard != null || TryManuallyLoadNewInput())
{
NO_INPUT = true;
InitNewInput();
return;
}

// Cache reflection now that we know Input is loaded
if (TInput != null || TryManuallyLoadLegacyInput())
{
InitLegacyInput();
return;
}

ExplorerCore.LogWarning("Could not find any Input module!");
NO_INPUT = true;
}

private static void InitNewInput()
{
ExplorerCore.Log("Initializing new InputSystem support...");

USING_NEW_INPUT = true;

_keyboardCurrent = TKeyboard.GetProperty("current");
_kbItemProp = TKeyboard.GetProperty("Item", new Type[] { TKey });

var btnControl = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Controls.ButtonControl");
_isPressed = btnControl.GetProperty("isPressed");
_wasPressedThisFrame = btnControl.GetProperty("wasPressedThisFrame");

_mouseCurrent = TMouse.GetProperty("current");
_leftButton = TMouse.GetProperty("leftButton");
_rightButton = TMouse.GetProperty("rightButton");

_position = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.Pointer")
.GetProperty("position");

_readValueMethod = ReflectionHelpers.GetTypeByName("UnityEngine.InputSystem.InputControl`1")
.MakeGenericType(typeof(Vector2))
.GetMethod("ReadValue");
}

private static void InitLegacyInput()
{
ExplorerCore.Log("Initializing Legacy Input support...");

_mousePosition = Input.GetProperty("mousePosition");
_mousePosition = TInput.GetProperty("mousePosition");
_getKey = TInput.GetMethod("GetKey", new Type[] { typeof(KeyCode) });
_getKeyDown = TInput.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) });
_getMouseButton = TInput.GetMethod("GetMouseButton", new Type[] { typeof(int) });
_getMouseButtonDown = TInput.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) });
}

_getKey = Input.GetMethod("GetKey", new Type[] { typeof(KeyCode) });
_getKeyDown = Input.GetMethod("GetKeyDown", new Type[] { typeof(KeyCode) });
_getMouseButton = Input.GetMethod("GetMouseButton", new Type[] { typeof(int) });
_getMouseButtonDown = Input.GetMethod("GetMouseButtonDown", new Type[] { typeof(int) });
private static bool TryManuallyLoadNewInput()
{
if (ReflectionHelpers.LoadModule("Unity.InputSystem") && TKeyboard != null)
{
ExplorerCore.Log("Loaded new InputSystem module!");
return true;
}
else
{
return false;
}
}

#pragma warning disable IDE1006 // Camel-case property (Unity style)
public static Vector3 mousePosition
private static bool TryManuallyLoadLegacyInput()
{
if ((ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule") || ReflectionHelpers.LoadModule("UnityEngine.CoreModule"))
&& TInput != null)
{
ExplorerCore.Log("Loaded legacy InputModule!");
return true;
}
else
{
return false;
}
}

public static Vector3 MousePosition
{
get
{
if (NO_INPUT) return Vector3.zero;

if (USING_NEW_INPUT)
{
var mouse = _mouseCurrent.GetValue(null, null);
var pos = _position.GetValue(mouse, null);

return (Vector2)_readValueMethod.Invoke(pos, new object[0]);
}

return (Vector3)_mousePosition.GetValue(null, null);
}
}
#pragma warning restore IDE1006

public static bool GetKeyDown(KeyCode key)
{
if (NO_INPUT) return false;

if (USING_NEW_INPUT)
{
var parsed = Enum.Parse(TKey, key.ToString());
var currentKB = _keyboardCurrent.GetValue(null, null);
var actualKey = _kbItemProp.GetValue(currentKB, new object[] { parsed });

return (bool)_wasPressedThisFrame.GetValue(actualKey, null);
}

return (bool)_getKeyDown.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 currentKB = _keyboardCurrent.GetValue(null, null);
var actualKey = _kbItemProp.GetValue(currentKB, new object[] { parsed });

return (bool)_isPressed.GetValue(actualKey, null);
}

return (bool)_getKey.Invoke(null, new object[] { key });
}

/// <param name="btn">1 = left, 2 = middle, 3 = right, etc</param>
/// <param name="btn">0/1 = left, 2 = middle, 3 = right, etc</param>
public static bool GetMouseButtonDown(int btn)
{
if (NO_INPUT) return false;

if (USING_NEW_INPUT)
{
var mouse = _mouseCurrent.GetValue(null, null);

PropertyInfo btnProp;
if (btn < 2) btnProp = _leftButton;
else btnProp = _rightButton;

var actualBtn = btnProp.GetValue(mouse, null);

return (bool)_wasPressedThisFrame.GetValue(actualBtn, null);
}

return (bool)_getMouseButtonDown.Invoke(null, new object[] { btn });
}

/// <param name="btn">1 = left, 2 = middle, 3 = right, etc</param>
public static bool GetMouseButton(int btn)
{
if (NO_INPUT) return false;
return (bool)_getMouseButton.Invoke(null, new object[] { btn });
}

private static bool TryManuallyLoadInput()
{
ExplorerCore.Log("UnityEngine.Input is null, trying to load manually....");

if ((ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule") || ReflectionHelpers.LoadModule("UnityEngine.CoreModule"))
&& Input != null)
{
ExplorerCore.Log("Ok!");
return true;
}
else
if (USING_NEW_INPUT)
{
ExplorerCore.Log("Could not load Input module!");
return false;
var mouse = _mouseCurrent.GetValue(null, null);

PropertyInfo btnProp;
if (btn < 2) btnProp = _leftButton;
else btnProp = _rightButton;

var actualBtn = btnProp.GetValue(mouse, null);

return (bool)_isPressed.GetValue(actualBtn, null);
}

return (bool)_getMouseButton.Invoke(null, new object[] { btn });
}
}
}
4 changes: 2 additions & 2 deletions src/Menu/InspectUnderMouse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public static void InspectRaycast()
if (!UnityHelpers.MainCamera)
return;

var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputHelper.mousePosition);
var ray = UnityHelpers.MainCamera.ScreenPointToRay(InputHelper.MousePosition);

if (Physics.Raycast(ray, out RaycastHit hit, 1000f))
{
Expand Down Expand Up @@ -61,7 +61,7 @@ public static void OnGUI()
{
if (m_objUnderMouseName != "")
{
var pos = InputHelper.mousePosition;
var pos = InputHelper.MousePosition;
var rect = new Rect(
pos.x - (Screen.width / 2), // x
Screen.height - pos.y - 50, // y
Expand Down
4 changes: 2 additions & 2 deletions src/Menu/ResizeDrag.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public static Rect ResizeWindow(Rect _rect, int ID)
//var r = GUILayoutUtility.GetLastRect();
var r = Internal_LayoutUtility.GetLastRect();

var mousePos = InputHelper.mousePosition;
var mousePos = InputHelper.MousePosition;

try
{
Expand Down Expand Up @@ -125,7 +125,7 @@ public static Rect ResizeWindow(Rect _rect, int ID)
//var r = GUILayoutUtility.GetLastRect();
var r = GUILayoutUtility.GetLastRect();

var mousePos = InputHelper.mousePosition;
var mousePos = InputHelper.MousePosition;

var mouse = GUIUnstrip.ScreenToGUIPoint(new Vector2(mousePos.x, Screen.height - mousePos.y));
if (r.Contains(mouse) && InputHelper.GetMouseButtonDown(0))
Expand Down
2 changes: 1 addition & 1 deletion src/Menu/Windows/WindowManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ public static bool IsMouseInWindow

private static bool RectContainsMouse(Rect rect)
{
var mousePos = InputHelper.mousePosition;
var mousePos = InputHelper.MousePosition;
return rect.Contains(new Vector2(mousePos.x, Screen.height - mousePos.y));
}

Expand Down
Loading

0 comments on commit b4b5f1e

Please sign in to comment.