mirror of
https://github.com/GrahamKracker/UnityExplorer.git
synced 2025-01-09 18:48:46 +08:00
1.6.9
* Fix for games where patching Cursor methods fails. * Added backup attempt for loading Cursor module if not present. * HashSet collections are now supported by CacheList * try/catch for loading Mod Config
This commit is contained in:
parent
835a81765e
commit
8d648fec43
@ -13,7 +13,7 @@ namespace Explorer
|
|||||||
public class CppExplorer : MelonMod
|
public class CppExplorer : MelonMod
|
||||||
{
|
{
|
||||||
public const string NAME = "CppExplorer";
|
public const string NAME = "CppExplorer";
|
||||||
public const string VERSION = "1.6.8";
|
public const string VERSION = "1.6.9";
|
||||||
public const string AUTHOR = "Sinai";
|
public const string AUTHOR = "Sinai";
|
||||||
public const string GUID = "com.sinai.cppexplorer";
|
public const string GUID = "com.sinai.cppexplorer";
|
||||||
|
|
||||||
@ -24,51 +24,30 @@ namespace Explorer
|
|||||||
get => m_showMenu;
|
get => m_showMenu;
|
||||||
set => SetShowMenu(value);
|
set => SetShowMenu(value);
|
||||||
}
|
}
|
||||||
private static bool m_showMenu;
|
public static bool m_showMenu;
|
||||||
|
|
||||||
public static bool ForceUnlockMouse
|
|
||||||
{
|
|
||||||
get => m_forceUnlock;
|
|
||||||
set => SetForceUnlock(value);
|
|
||||||
}
|
|
||||||
private static bool m_forceUnlock;
|
|
||||||
private static CursorLockMode m_lastLockMode;
|
|
||||||
private static bool m_lastVisibleState;
|
|
||||||
private static bool m_currentlySettingCursor = false;
|
|
||||||
|
|
||||||
public static bool ShouldForceMouse => ShowMenu && ForceUnlockMouse;
|
|
||||||
|
|
||||||
private static void SetShowMenu(bool show)
|
private static void SetShowMenu(bool show)
|
||||||
{
|
{
|
||||||
m_showMenu = show;
|
m_showMenu = show;
|
||||||
UpdateCursorControl();
|
CursorControl.UpdateCursorControl();
|
||||||
}
|
|
||||||
|
|
||||||
private static void SetForceUnlock(bool unlock)
|
|
||||||
{
|
|
||||||
m_forceUnlock = unlock;
|
|
||||||
UpdateCursorControl();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnApplicationStart()
|
public override void OnApplicationStart()
|
||||||
{
|
{
|
||||||
Instance = this;
|
Instance = this;
|
||||||
|
|
||||||
|
// First, load config
|
||||||
ModConfig.OnLoad();
|
ModConfig.OnLoad();
|
||||||
|
|
||||||
|
// Setup InputHelper class (UnityEngine.Input)
|
||||||
InputHelper.Init();
|
InputHelper.Init();
|
||||||
|
|
||||||
|
// Create CppExplorer modules
|
||||||
new MainMenu();
|
new MainMenu();
|
||||||
new WindowManager();
|
new WindowManager();
|
||||||
|
|
||||||
// Get current cursor state and enable cursor
|
// Init cursor control
|
||||||
m_lastLockMode = Cursor.lockState;
|
CursorControl.Init();
|
||||||
m_lastVisibleState = Cursor.visible;
|
|
||||||
|
|
||||||
// Enable ShowMenu and ForceUnlockMouse
|
|
||||||
// (set m_showMenu directly to not call UpdateCursorState twice)
|
|
||||||
m_showMenu = true;
|
|
||||||
ForceUnlockMouse = true;
|
|
||||||
|
|
||||||
MelonLogger.Log($"CppExplorer {VERSION} initialized.");
|
MelonLogger.Log($"CppExplorer {VERSION} initialized.");
|
||||||
}
|
}
|
||||||
@ -89,15 +68,11 @@ namespace Explorer
|
|||||||
|
|
||||||
if (ShowMenu)
|
if (ShowMenu)
|
||||||
{
|
{
|
||||||
// Check Force-Unlock input
|
CursorControl.Update();
|
||||||
if (InputHelper.GetKeyDown(KeyCode.LeftAlt))
|
InspectUnderMouse.Update();
|
||||||
{
|
|
||||||
ForceUnlockMouse = !ForceUnlockMouse;
|
|
||||||
}
|
|
||||||
|
|
||||||
MainMenu.Instance.Update();
|
MainMenu.Instance.Update();
|
||||||
WindowManager.Instance.Update();
|
WindowManager.Instance.Update();
|
||||||
InspectUnderMouse.Update();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,93 +80,14 @@ namespace Explorer
|
|||||||
{
|
{
|
||||||
if (!ShowMenu) return;
|
if (!ShowMenu) return;
|
||||||
|
|
||||||
|
var origSkin = GUI.skin;
|
||||||
|
GUI.skin = UIStyles.WindowSkin;
|
||||||
|
|
||||||
MainMenu.Instance.OnGUI();
|
MainMenu.Instance.OnGUI();
|
||||||
WindowManager.Instance.OnGUI();
|
WindowManager.Instance.OnGUI();
|
||||||
InspectUnderMouse.OnGUI();
|
InspectUnderMouse.OnGUI();
|
||||||
}
|
|
||||||
|
|
||||||
private static void UpdateCursorControl()
|
GUI.skin = origSkin;
|
||||||
{
|
|
||||||
m_currentlySettingCursor = true;
|
|
||||||
if (ShouldForceMouse)
|
|
||||||
{
|
|
||||||
Cursor.lockState = CursorLockMode.None;
|
|
||||||
Cursor.visible = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Cursor.lockState = m_lastLockMode;
|
|
||||||
Cursor.visible = m_lastVisibleState;
|
|
||||||
}
|
|
||||||
m_currentlySettingCursor = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Force mouse to stay unlocked and visible while UnlockMouse and ShowMenu are true.
|
|
||||||
// Also keep track of when anything else tries to set Cursor state, this will be the
|
|
||||||
// value that we set back to when we close the menu or disable force-unlock.
|
|
||||||
|
|
||||||
[HarmonyPatch(typeof(Cursor), nameof(Cursor.lockState), MethodType.Setter)]
|
|
||||||
public class Cursor_set_lockState
|
|
||||||
{
|
|
||||||
[HarmonyPrefix]
|
|
||||||
public static void Prefix(ref CursorLockMode value)
|
|
||||||
{
|
|
||||||
if (!m_currentlySettingCursor)
|
|
||||||
{
|
|
||||||
m_lastLockMode = value;
|
|
||||||
|
|
||||||
if (ShouldForceMouse)
|
|
||||||
{
|
|
||||||
value = CursorLockMode.None;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HarmonyPatch(typeof(Cursor), nameof(Cursor.visible), MethodType.Setter)]
|
|
||||||
public class Cursor_set_visible
|
|
||||||
{
|
|
||||||
[HarmonyPrefix]
|
|
||||||
public static void Prefix(ref bool value)
|
|
||||||
{
|
|
||||||
if (!m_currentlySettingCursor)
|
|
||||||
{
|
|
||||||
m_lastVisibleState = value;
|
|
||||||
|
|
||||||
if (ShouldForceMouse)
|
|
||||||
{
|
|
||||||
value = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make it appear as though UnlockMouse is disabled to the rest of the application.
|
|
||||||
|
|
||||||
[HarmonyPatch(typeof(Cursor), nameof(Cursor.lockState), MethodType.Getter)]
|
|
||||||
public class Cursor_get_lockState
|
|
||||||
{
|
|
||||||
[HarmonyPostfix]
|
|
||||||
public static void Postfix(ref CursorLockMode __result)
|
|
||||||
{
|
|
||||||
if (ShouldForceMouse)
|
|
||||||
{
|
|
||||||
__result = m_lastLockMode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[HarmonyPatch(typeof(Cursor), nameof(Cursor.visible), MethodType.Getter)]
|
|
||||||
public class Cursor_get_visible
|
|
||||||
{
|
|
||||||
[HarmonyPostfix]
|
|
||||||
public static void Postfix(ref bool __result)
|
|
||||||
{
|
|
||||||
if (ShouldForceMouse)
|
|
||||||
{
|
|
||||||
__result = m_lastVisibleState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -93,6 +93,7 @@
|
|||||||
<Compile Include="CppExplorer.cs" />
|
<Compile Include="CppExplorer.cs" />
|
||||||
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
<Compile Include="Extensions\ReflectionExtensions.cs" />
|
||||||
<Compile Include="Helpers\InputHelper.cs" />
|
<Compile Include="Helpers\InputHelper.cs" />
|
||||||
|
<Compile Include="Menu\CursorControl.cs" />
|
||||||
<Compile Include="Tests\TestClass.cs" />
|
<Compile Include="Tests\TestClass.cs" />
|
||||||
<Compile Include="UnstripFixes\GUIUnstrip.cs" />
|
<Compile Include="UnstripFixes\GUIUnstrip.cs" />
|
||||||
<Compile Include="UnstripFixes\ScrollViewStateUnstrip.cs" />
|
<Compile Include="UnstripFixes\ScrollViewStateUnstrip.cs" />
|
||||||
@ -101,24 +102,24 @@
|
|||||||
<Compile Include="Helpers\ReflectionHelpers.cs" />
|
<Compile Include="Helpers\ReflectionHelpers.cs" />
|
||||||
<Compile Include="Helpers\UIHelpers.cs" />
|
<Compile Include="Helpers\UIHelpers.cs" />
|
||||||
<Compile Include="Helpers\UnityHelpers.cs" />
|
<Compile Include="Helpers\UnityHelpers.cs" />
|
||||||
<Compile Include="MainMenu\InspectUnderMouse.cs" />
|
<Compile Include="Menu\MainMenu\InspectUnderMouse.cs" />
|
||||||
<Compile Include="CachedObjects\CacheObjectBase.cs" />
|
<Compile Include="CachedObjects\CacheObjectBase.cs" />
|
||||||
<Compile Include="UnstripFixes\SliderHandlerUnstrip.cs" />
|
<Compile Include="UnstripFixes\SliderHandlerUnstrip.cs" />
|
||||||
<Compile Include="UnstripFixes\UnstripExtensions.cs" />
|
<Compile Include="UnstripFixes\UnstripExtensions.cs" />
|
||||||
<Compile Include="Windows\ResizeDrag.cs" />
|
<Compile Include="Menu\Windows\ResizeDrag.cs" />
|
||||||
<Compile Include="Windows\TabViewWindow.cs" />
|
<Compile Include="Menu\Windows\TabViewWindow.cs" />
|
||||||
<Compile Include="Windows\UIWindow.cs" />
|
<Compile Include="Menu\Windows\UIWindow.cs" />
|
||||||
<Compile Include="MainMenu\Pages\ConsolePage.cs" />
|
<Compile Include="Menu\MainMenu\Pages\ConsolePage.cs" />
|
||||||
<Compile Include="MainMenu\Pages\Console\REPL.cs" />
|
<Compile Include="Menu\MainMenu\Pages\Console\REPL.cs" />
|
||||||
<Compile Include="MainMenu\Pages\Console\REPLHelper.cs" />
|
<Compile Include="Menu\MainMenu\Pages\Console\REPLHelper.cs" />
|
||||||
<Compile Include="MainMenu\Pages\WindowPage.cs" />
|
<Compile Include="Menu\MainMenu\Pages\WindowPage.cs" />
|
||||||
<Compile Include="Windows\WindowManager.cs" />
|
<Compile Include="Menu\Windows\WindowManager.cs" />
|
||||||
<Compile Include="MainMenu\MainMenu.cs" />
|
<Compile Include="Menu\MainMenu\MainMenu.cs" />
|
||||||
<Compile Include="Windows\GameObjectWindow.cs" />
|
<Compile Include="Menu\Windows\GameObjectWindow.cs" />
|
||||||
<Compile Include="Windows\ReflectionWindow.cs" />
|
<Compile Include="Menu\Windows\ReflectionWindow.cs" />
|
||||||
<Compile Include="MainMenu\Pages\ScenePage.cs" />
|
<Compile Include="Menu\MainMenu\Pages\ScenePage.cs" />
|
||||||
<Compile Include="MainMenu\Pages\SearchPage.cs" />
|
<Compile Include="Menu\MainMenu\Pages\SearchPage.cs" />
|
||||||
<Compile Include="Helpers\UIStyles.cs" />
|
<Compile Include="Menu\UIStyles.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -88,7 +88,8 @@ namespace Explorer
|
|||||||
{
|
{
|
||||||
MelonLogger.Log("UnityEngine.Input is null, trying to load manually....");
|
MelonLogger.Log("UnityEngine.Input is null, trying to load manually....");
|
||||||
|
|
||||||
if ((TryLoad("UnityEngine.InputLegacyModule.dll") || TryLoad("UnityEngine.CoreModule.dll")) && Input != null)
|
if ((ReflectionHelpers.LoadModule("UnityEngine.InputLegacyModule.dll") || ReflectionHelpers.LoadModule("UnityEngine.CoreModule.dll"))
|
||||||
|
&& Input != null)
|
||||||
{
|
{
|
||||||
MelonLogger.Log("Ok!");
|
MelonLogger.Log("Ok!");
|
||||||
return true;
|
return true;
|
||||||
@ -98,23 +99,6 @@ namespace Explorer
|
|||||||
MelonLogger.Log("Could not load Input module!");
|
MelonLogger.Log("Could not load Input module!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TryLoad(string module)
|
|
||||||
{
|
|
||||||
var path = $@"MelonLoader\Managed\{module}";
|
|
||||||
if (!File.Exists(path)) return false;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Assembly.Load(File.ReadAllBytes(path));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
MelonLogger.Log(e.GetType() + ", " + e.Message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,8 @@ using System.Collections;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using System.IO;
|
||||||
|
using MelonLoader;
|
||||||
using UnhollowerBaseLib;
|
using UnhollowerBaseLib;
|
||||||
using UnhollowerRuntimeLib;
|
using UnhollowerRuntimeLib;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -122,6 +124,23 @@ namespace Explorer
|
|||||||
return list.ToArray();
|
return list.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static bool LoadModule(string module)
|
||||||
|
{
|
||||||
|
var path = $@"MelonLoader\Managed\{module}";
|
||||||
|
if (!File.Exists(path)) return false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Assembly.Load(File.ReadAllBytes(path));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
MelonLogger.Log(e.GetType() + ", " + e.Message);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string ExceptionToString(Exception e)
|
public static string ExceptionToString(Exception e)
|
||||||
{
|
{
|
||||||
if (IsFailedGeneric(e))
|
if (IsFailedGeneric(e))
|
||||||
|
238
src/Menu/CursorControl.cs
Normal file
238
src/Menu/CursorControl.cs
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
using Harmony;
|
||||||
|
using MelonLoader;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace Explorer
|
||||||
|
{
|
||||||
|
public class CursorControl
|
||||||
|
{
|
||||||
|
public static bool ForceUnlockMouse
|
||||||
|
{
|
||||||
|
get => m_forceUnlock;
|
||||||
|
set => SetForceUnlock(value);
|
||||||
|
}
|
||||||
|
private static bool m_forceUnlock;
|
||||||
|
private static CursorLockMode m_lastLockMode;
|
||||||
|
private static bool m_lastVisibleState;
|
||||||
|
private static bool m_currentlySettingCursor = false;
|
||||||
|
|
||||||
|
public static bool ShouldForceMouse => CppExplorer.ShowMenu && ForceUnlockMouse;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// Check if Cursor class is loaded
|
||||||
|
if (ReflectionHelpers.GetTypeByName("UnityEngine.Cursor") == null)
|
||||||
|
{
|
||||||
|
MelonLogger.Log("Trying to manually load Cursor module...");
|
||||||
|
|
||||||
|
if (ReflectionHelpers.LoadModule("UnityEngine.CoreModule"))
|
||||||
|
{
|
||||||
|
MelonLogger.Log("Ok!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
throw new Exception("Could not load UnityEngine.Cursor module!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current cursor state and enable cursor
|
||||||
|
m_lastLockMode = Cursor.lockState;
|
||||||
|
m_lastVisibleState = Cursor.visible;
|
||||||
|
|
||||||
|
TryPatch("lockState", new HarmonyMethod(typeof(CursorControl).GetMethod(nameof(Prefix_set_lockState))), false, false);
|
||||||
|
TryPatch("visible", new HarmonyMethod(typeof(CursorControl).GetMethod(nameof(Prefix_set_visible))), false, false);
|
||||||
|
|
||||||
|
TryPatch("lockState", new HarmonyMethod(typeof(CursorControl).GetMethod(nameof(Postfix_get_lockState))), true, true);
|
||||||
|
TryPatch("visible", new HarmonyMethod(typeof(CursorControl).GetMethod(nameof(Postfix_get_visible))), true, true);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
MelonLogger.Log($"Exception on CursorControl.Init! {e.GetType()}, {e.Message}");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable ShowMenu and ForceUnlockMouse
|
||||||
|
// (set m_showMenu directly to not call UpdateCursorState twice)
|
||||||
|
CppExplorer.m_showMenu = true;
|
||||||
|
ForceUnlockMouse = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void TryPatch(string property, HarmonyMethod patch, bool getter = true, bool postfix = false)
|
||||||
|
{
|
||||||
|
// Setup Harmony Patches
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var harmony = CppExplorer.Instance.harmonyInstance;
|
||||||
|
|
||||||
|
var prop = typeof(Cursor).GetProperty(property);
|
||||||
|
|
||||||
|
harmony.Patch(getter ? prop.GetGetMethod() : prop.GetSetMethod(),
|
||||||
|
postfix ? null : patch,
|
||||||
|
postfix ? patch : null);
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
MelonLogger.Log($"[NON-FATAL] Couldn't patch a method: {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SetForceUnlock(bool unlock)
|
||||||
|
{
|
||||||
|
m_forceUnlock = unlock;
|
||||||
|
UpdateCursorControl();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Update()
|
||||||
|
{
|
||||||
|
// Check Force-Unlock input
|
||||||
|
if (InputHelper.GetKeyDown(KeyCode.LeftAlt))
|
||||||
|
{
|
||||||
|
ForceUnlockMouse = !ForceUnlockMouse;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void UpdateCursorControl()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
m_currentlySettingCursor = true;
|
||||||
|
if (ShouldForceMouse)
|
||||||
|
{
|
||||||
|
Cursor.lockState = CursorLockMode.None;
|
||||||
|
Cursor.visible = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cursor.lockState = m_lastLockMode;
|
||||||
|
Cursor.visible = m_lastVisibleState;
|
||||||
|
}
|
||||||
|
m_currentlySettingCursor = false;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
MelonLogger.Log($"Exception setting Cursor state: {e.GetType()}, {e.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force mouse to stay unlocked and visible while UnlockMouse and ShowMenu are true.
|
||||||
|
// Also keep track of when anything else tries to set Cursor state, this will be the
|
||||||
|
// value that we set back to when we close the menu or disable force-unlock.
|
||||||
|
|
||||||
|
[HarmonyPrefix]
|
||||||
|
public static void Prefix_set_lockState(ref CursorLockMode value)
|
||||||
|
{
|
||||||
|
if (!m_currentlySettingCursor)
|
||||||
|
{
|
||||||
|
m_lastLockMode = value;
|
||||||
|
|
||||||
|
if (ShouldForceMouse)
|
||||||
|
{
|
||||||
|
value = CursorLockMode.None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPrefix]
|
||||||
|
public static void Prefix_set_visible(ref bool value)
|
||||||
|
{
|
||||||
|
if (!m_currentlySettingCursor)
|
||||||
|
{
|
||||||
|
m_lastVisibleState = value;
|
||||||
|
|
||||||
|
if (ShouldForceMouse)
|
||||||
|
{
|
||||||
|
value = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPrefix]
|
||||||
|
public static void Postfix_get_lockState(ref CursorLockMode __result)
|
||||||
|
{
|
||||||
|
if (ShouldForceMouse)
|
||||||
|
{
|
||||||
|
__result = m_lastLockMode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[HarmonyPrefix]
|
||||||
|
public static void Postfix_get_visible(ref bool __result)
|
||||||
|
{
|
||||||
|
if (ShouldForceMouse)
|
||||||
|
{
|
||||||
|
__result = m_lastVisibleState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//[HarmonyPatch(typeof(Cursor), nameof(Cursor.lockState), MethodType.Setter)]
|
||||||
|
//public class Cursor_set_lockState
|
||||||
|
//{
|
||||||
|
// [HarmonyPrefix]
|
||||||
|
// public static void Prefix(ref CursorLockMode value)
|
||||||
|
// {
|
||||||
|
// if (!m_currentlySettingCursor)
|
||||||
|
// {
|
||||||
|
// m_lastLockMode = value;
|
||||||
|
|
||||||
|
// if (ShouldForceMouse)
|
||||||
|
// {
|
||||||
|
// value = CursorLockMode.None;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//[HarmonyPatch(typeof(Cursor), nameof(Cursor.visible), MethodType.Setter)]
|
||||||
|
//public class Cursor_set_visible
|
||||||
|
//{
|
||||||
|
// [HarmonyPrefix]
|
||||||
|
// public static void Prefix(ref bool value)
|
||||||
|
// {
|
||||||
|
// if (!m_currentlySettingCursor)
|
||||||
|
// {
|
||||||
|
// m_lastVisibleState = value;
|
||||||
|
|
||||||
|
// if (ShouldForceMouse)
|
||||||
|
// {
|
||||||
|
// value = true;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//// Make it appear as though UnlockMouse is disabled to the rest of the application.
|
||||||
|
|
||||||
|
//[HarmonyPatch(typeof(Cursor), nameof(Cursor.lockState), MethodType.Getter)]
|
||||||
|
//public class Cursor_get_lockState
|
||||||
|
//{
|
||||||
|
// [HarmonyPostfix]
|
||||||
|
// public static void Postfix(ref CursorLockMode __result)
|
||||||
|
// {
|
||||||
|
// if (ShouldForceMouse)
|
||||||
|
// {
|
||||||
|
// __result = m_lastLockMode;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
//[HarmonyPatch(typeof(Cursor), nameof(Cursor.visible), MethodType.Getter)]
|
||||||
|
//public class Cursor_get_visible
|
||||||
|
//{
|
||||||
|
// [HarmonyPostfix]
|
||||||
|
// public static void Postfix(ref bool __result)
|
||||||
|
// {
|
||||||
|
// if (ShouldForceMouse)
|
||||||
|
// {
|
||||||
|
// __result = m_lastVisibleState;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
@ -52,12 +52,7 @@ namespace Explorer
|
|||||||
|
|
||||||
public void OnGUI()
|
public void OnGUI()
|
||||||
{
|
{
|
||||||
var origSkin = GUI.skin;
|
|
||||||
GUI.skin = UIStyles.WindowSkin;
|
|
||||||
|
|
||||||
MainRect = GUI.Window(MainWindowID, MainRect, (GUI.WindowFunction)MainWindow, CppExplorer.NAME);
|
MainRect = GUI.Window(MainWindowID, MainRect, (GUI.WindowFunction)MainWindow, CppExplorer.NAME);
|
||||||
|
|
||||||
GUI.skin = origSkin;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MainWindow(int id)
|
private void MainWindow(int id)
|
||||||
@ -108,9 +103,9 @@ namespace Explorer
|
|||||||
GUI.color = Color.white;
|
GUI.color = Color.white;
|
||||||
InspectUnderMouse.EnableInspect = GUILayout.Toggle(InspectUnderMouse.EnableInspect, "Inspect Under Mouse (Shift + RMB)", null);
|
InspectUnderMouse.EnableInspect = GUILayout.Toggle(InspectUnderMouse.EnableInspect, "Inspect Under Mouse (Shift + RMB)", null);
|
||||||
|
|
||||||
bool mouseState = CppExplorer.ForceUnlockMouse;
|
bool mouseState = CursorControl.ForceUnlockMouse;
|
||||||
bool setMouse = GUILayout.Toggle(mouseState, "Force Unlock Mouse (Left Alt)", null);
|
bool setMouse = GUILayout.Toggle(mouseState, "Force Unlock Mouse (Left Alt)", null);
|
||||||
if (setMouse != mouseState) CppExplorer.ForceUnlockMouse = setMouse;
|
if (setMouse != mouseState) CursorControl.ForceUnlockMouse = setMouse;
|
||||||
|
|
||||||
WindowManager.TabView = GUILayout.Toggle(WindowManager.TabView, "Tab View", null);
|
WindowManager.TabView = GUILayout.Toggle(WindowManager.TabView, "Tab View", null);
|
||||||
GUILayout.EndHorizontal();
|
GUILayout.EndHorizontal();
|
@ -49,15 +49,7 @@ namespace Explorer
|
|||||||
|
|
||||||
public void OnGUI()
|
public void OnGUI()
|
||||||
{
|
{
|
||||||
if (CppExplorer.ShowMenu)
|
m_rect = GUI.Window(windowID, m_rect, (GUI.WindowFunction)WindowFunction, Title);
|
||||||
{
|
|
||||||
var origSkin = GUI.skin;
|
|
||||||
|
|
||||||
GUI.skin = UIStyles.WindowSkin;
|
|
||||||
m_rect = GUI.Window(windowID, m_rect, (GUI.WindowFunction)WindowFunction, Title);
|
|
||||||
|
|
||||||
GUI.skin = origSkin;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Header()
|
public void Header()
|
Loading…
x
Reference in New Issue
Block a user