mirror of
https://github.com/NotAKidoS/NAK_CVR_Mods.git
synced 2025-09-02 22:39:22 +00:00
[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:
parent
52d4ef3279
commit
337134d2b5
3 changed files with 34 additions and 7 deletions
|
@ -8,6 +8,7 @@ using HarmonyLib;
|
||||||
using NAK.DesktopVRSwitch.Patches;
|
using NAK.DesktopVRSwitch.Patches;
|
||||||
using NAK.DesktopVRSwitch.VRModeTrackers;
|
using NAK.DesktopVRSwitch.VRModeTrackers;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using Valve.VR;
|
||||||
|
|
||||||
namespace NAK.DesktopVRSwitch.HarmonyPatches;
|
namespace NAK.DesktopVRSwitch.HarmonyPatches;
|
||||||
|
|
||||||
|
@ -110,4 +111,21 @@ class CohtmlUISystemPatches
|
||||||
// dont
|
// dont
|
||||||
return false;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -32,7 +32,10 @@ public class DesktopVRSwitch : MelonMod
|
||||||
Category.CreateEntry("Use Transition on Switch", true, description: "Should the world transition play on VRMode switch?");
|
Category.CreateEntry("Use Transition on Switch", true, description: "Should the world transition play on VRMode switch?");
|
||||||
|
|
||||||
public static readonly MelonPreferences_Entry<bool> EntryRenderVRGameView =
|
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()
|
public override void OnInitializeMelon()
|
||||||
{
|
{
|
||||||
|
@ -52,6 +55,9 @@ public class DesktopVRSwitch : MelonMod
|
||||||
ApplyPatches(typeof(HarmonyPatches.CVRWorldPatches));
|
ApplyPatches(typeof(HarmonyPatches.CVRWorldPatches));
|
||||||
// cohtml gamepad handling nuke
|
// cohtml gamepad handling nuke
|
||||||
ApplyPatches(typeof(HarmonyPatches.CohtmlUISystemPatches));
|
ApplyPatches(typeof(HarmonyPatches.CohtmlUISystemPatches));
|
||||||
|
|
||||||
|
// prevent steamvr behaviour from closing game
|
||||||
|
ApplyPatches(typeof(HarmonyPatches.SteamVRBehaviourPatches));
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnUpdate()
|
public override void OnUpdate()
|
||||||
|
|
|
@ -5,25 +5,29 @@ namespace NAK.DesktopVRSwitch;
|
||||||
|
|
||||||
class VRModeSwitchDebugger : MonoBehaviour
|
class VRModeSwitchDebugger : MonoBehaviour
|
||||||
{
|
{
|
||||||
private Coroutine _switchCoroutine;
|
Coroutine _switchCoroutine;
|
||||||
private WaitForSeconds _sleep = new WaitForSeconds(2.5f);
|
WaitForSeconds _sleep;
|
||||||
|
|
||||||
private void OnEnable()
|
void OnEnable()
|
||||||
{
|
{
|
||||||
if (_switchCoroutine == null)
|
if (_switchCoroutine == null)
|
||||||
|
{
|
||||||
_switchCoroutine = StartCoroutine(SwitchLoop());
|
_switchCoroutine = StartCoroutine(SwitchLoop());
|
||||||
|
_sleep = new WaitForSeconds(2f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnDisable()
|
void OnDisable()
|
||||||
{
|
{
|
||||||
if (_switchCoroutine != null)
|
if (_switchCoroutine != null)
|
||||||
{
|
{
|
||||||
StopCoroutine(_switchCoroutine);
|
StopCoroutine(_switchCoroutine);
|
||||||
_switchCoroutine = null;
|
_switchCoroutine = null;
|
||||||
|
_sleep = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator SwitchLoop()
|
IEnumerator SwitchLoop()
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
@ -32,7 +36,6 @@ class VRModeSwitchDebugger : MonoBehaviour
|
||||||
VRModeSwitchManager.Instance.AttemptSwitch();
|
VRModeSwitchManager.Instance.AttemptSwitch();
|
||||||
yield return _sleep;
|
yield return _sleep;
|
||||||
}
|
}
|
||||||
|
|
||||||
yield return null;
|
yield return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue