[DesktopVRSwitch] Prevent SteamVR_Behaviour from closing game.

Was going to use my own event and switch before quit, but SteamVR_Behaviour was the one doing it the entire time. Very convenient for me.
This commit is contained in:
NotAKidoS 2023-06-20 15:15:42 -05:00
parent 52d4ef3279
commit 337134d2b5
3 changed files with 34 additions and 7 deletions

View file

@ -8,6 +8,7 @@ using HarmonyLib;
using NAK.DesktopVRSwitch.Patches;
using NAK.DesktopVRSwitch.VRModeTrackers;
using UnityEngine;
using Valve.VR;
namespace NAK.DesktopVRSwitch.HarmonyPatches;
@ -110,4 +111,21 @@ class CohtmlUISystemPatches
// dont
return false;
}
}
class SteamVRBehaviourPatches
{
[HarmonyPrefix]
[HarmonyPatch(typeof(SteamVR_Behaviour), nameof(SteamVR_Behaviour.OnQuit))]
static bool Prefix_SteamVR_Behaviour_OnQuit()
{
if (DesktopVRSwitch.EntrySwitchToDesktopOnExit.Value)
{
// If we don't switch fast enough, SteamVR will force close.
// World Transition might cause issues. Might need to override.
VRModeSwitchManager.Instance?.AttemptSwitch();
return false;
}
return true;
}
}

View file

@ -32,7 +32,10 @@ public class DesktopVRSwitch : MelonMod
Category.CreateEntry("Use Transition on Switch", true, description: "Should the world transition play on VRMode switch?");
public static readonly MelonPreferences_Entry<bool> EntryRenderVRGameView =
Category.CreateEntry("Render VR Game View", true, description: "Should the VR view be displayed in the game window?");
Category.CreateEntry("Render VR Game View", true, description: "Should the VR view be displayed in the game window after VRMode switch?");
public static readonly MelonPreferences_Entry<bool> EntrySwitchToDesktopOnExit =
Category.CreateEntry("Switch to Desktop on SteamVR Exit", true, description: "Should the game switch to Desktop when SteamVR quits?");
public override void OnInitializeMelon()
{
@ -52,6 +55,9 @@ public class DesktopVRSwitch : MelonMod
ApplyPatches(typeof(HarmonyPatches.CVRWorldPatches));
// cohtml gamepad handling nuke
ApplyPatches(typeof(HarmonyPatches.CohtmlUISystemPatches));
// prevent steamvr behaviour from closing game
ApplyPatches(typeof(HarmonyPatches.SteamVRBehaviourPatches));
}
public override void OnUpdate()

View file

@ -5,25 +5,29 @@ namespace NAK.DesktopVRSwitch;
class VRModeSwitchDebugger : MonoBehaviour
{
private Coroutine _switchCoroutine;
private WaitForSeconds _sleep = new WaitForSeconds(2.5f);
Coroutine _switchCoroutine;
WaitForSeconds _sleep;
private void OnEnable()
void OnEnable()
{
if (_switchCoroutine == null)
{
_switchCoroutine = StartCoroutine(SwitchLoop());
_sleep = new WaitForSeconds(2f);
}
}
private void OnDisable()
void OnDisable()
{
if (_switchCoroutine != null)
{
StopCoroutine(_switchCoroutine);
_switchCoroutine = null;
_sleep = null;
}
}
private IEnumerator SwitchLoop()
IEnumerator SwitchLoop()
{
while (true)
{
@ -32,7 +36,6 @@ class VRModeSwitchDebugger : MonoBehaviour
VRModeSwitchManager.Instance.AttemptSwitch();
yield return _sleep;
}
yield return null;
}
}