Skip to content

Commit

Permalink
Fix two small bugs
Browse files Browse the repository at this point in the history
- You can now use keys on non-vanilla doors
- Death animations don't apply weird rotations anymore
  • Loading branch information
DaXcess committed Mar 19, 2024
1 parent fe31f1d commit 665910e
Show file tree
Hide file tree
Showing 4 changed files with 102 additions and 81 deletions.
6 changes: 4 additions & 2 deletions Source/Physics/Interactions/Door.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,8 @@ private static void OnRemovedFromDoor(LockPicker __instance)
[HarmonyPrefix]
private static bool OnUseItem()
{
return Plugin.Config.DisableDoorInteraction.Value;
// Use `IsHovering` to make sure modded doors without interaction support still allow lock picker placement
return Plugin.Config.DisableDoorInteraction.Value || VRSession.Instance.LocalPlayer.PrimaryController.IsHovering;
}
}

Expand All @@ -272,6 +273,7 @@ internal static class KeyPatches
[HarmonyPrefix]
private static bool OnUseItem()
{
return Plugin.Config.DisableDoorInteraction.Value;
// Use `IsHovering` to make sure modded doors without interaction support still allow key usage
return Plugin.Config.DisableDoorInteraction.Value || VRSession.Instance.LocalPlayer.PrimaryController.IsHovering;
}
}
145 changes: 79 additions & 66 deletions Source/Player/VRController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ namespace LCVR.Player;

public class VRController : MonoBehaviour
{
private const int interactableObjectsMask = (1 << 6) | (1 << 8) | (1 << 9);
private const int INTERACTABLE_OBJECTS_MASK = (1 << 6) | (1 << 8) | (1 << 9);

private static readonly int grabInvalidated = Animator.StringToHash("GrabInvalidated");
private static readonly int grabValidated = Animator.StringToHash("GrabValidated");
Expand All @@ -25,7 +25,6 @@ public class VRController : MonoBehaviour
private static PlayerControllerB PlayerController => VRSession.Instance.LocalPlayer.PlayerController;

private LineRenderer debugLineRenderer;
private bool hitInteractable;

private static string CursorTip
{
Expand All @@ -36,6 +35,7 @@ private static string CursorTip
}

public Transform InteractOrigin { get; private set; }
public bool IsHovering { get; private set; }

private void Awake()
{
Expand Down Expand Up @@ -191,51 +191,59 @@ private void LateUpdate()

debugLineRenderer.SetPositions(new[] { origin, end });

if (PlayerController.isGrabbingObjectAnimation)
return;

var ray = new Ray(InteractOrigin.position, InteractOrigin.forward);
var shouldReset = true;

if (ray.Raycast(out var hit, PlayerController.grabDistance, interactableObjectsMask) && hit.collider.gameObject.layer != 8)
try
{
// Place interaction hud on object
var position = hit.transform.position;
var offsetComponent = hit.transform.gameObject.GetComponent<InteractCanvasPositionOffset>();
if (offsetComponent != null)
{
position = hit.transform.TransformPoint(offsetComponent.offset);
}
if (PlayerController.isGrabbingObjectAnimation)
return;

var ray = new Ray(InteractOrigin.position, InteractOrigin.forward);

if (hit.collider.gameObject.CompareTag("InteractTrigger"))
if (ray.Raycast(out var hit, PlayerController.grabDistance, INTERACTABLE_OBJECTS_MASK) &&
hit.collider.gameObject.layer != 8)
{
var component = hit.transform.gameObject.GetComponent<InteractTrigger>();
if (component != PlayerController.previousHoveringOverTrigger && PlayerController.previousHoveringOverTrigger != null)
// Place interaction hud on object
var position = hit.transform.position;
var offsetComponent = hit.transform.gameObject.GetComponent<InteractCanvasPositionOffset>();
if (offsetComponent != null)
{
PlayerController.previousHoveringOverTrigger.isBeingHeldByPlayer = false;
position = hit.transform.TransformPoint(offsetComponent.offset);
}

// Ignore disabled triggers (like ship lever, charging station, etc)
if (disabledInteractTriggers.Contains(component.gameObject.name))
return;

if (VRSession.Instance.LocalPlayer.PlayerController.isPlayerDead)
if (hit.collider.gameObject.CompareTag("InteractTrigger"))
{
if (component == null)
var component = hit.transform.gameObject.GetComponent<InteractTrigger>();
if (component != PlayerController.previousHoveringOverTrigger &&
PlayerController.previousHoveringOverTrigger != null)
{
PlayerController.previousHoveringOverTrigger.isBeingHeldByPlayer = false;
}

// Ignore disabled triggers (like ship lever, charging station, etc)
if (disabledInteractTriggers.Contains(component.gameObject.name))
return;

// Only ladders and entrance trigger are allowed
if (!component.isLadder && hit.transform.gameObject.GetComponent<EntranceTeleport>() == null)
if (VRSession.Instance.LocalPlayer.PlayerController.isPlayerDead)
{
if (component == null)
return;

// Only ladders and entrance trigger are allowed
if (!component.isLadder && hit.transform.gameObject.GetComponent<EntranceTeleport>() == null)
return;
}

if (component == null)
return;
}

if (component != null)
{
VRSession.Instance.HUD.UpdateInteractCanvasPosition(position);

if (!hitInteractable)
if (!IsHovering)
VRSession.VibrateController(XRNode.RightHand, 0.1f, 0.2f);

hitInteractable = true;
shouldReset = false;
IsHovering = true;

PlayerController.hoveringOverTrigger = component;
if (!component.interactable)
Expand All @@ -261,61 +269,66 @@ private void LateUpdate()
CursorTip = component.hoverTip;
}
}
}
else if (hit.collider.gameObject.CompareTag("PhysicsProp"))
{
if (VRSession.Instance.LocalPlayer.PlayerController.isPlayerDead)
return;
else if (hit.collider.gameObject.CompareTag("PhysicsProp"))
{
if (VRSession.Instance.LocalPlayer.PlayerController.isPlayerDead)
return;

// Ignore disabled triggers (like ship lever, charging station, etc)
if (disabledInteractTriggers.Contains(hit.collider.gameObject.name))
return;
// Ignore disabled triggers (like ship lever, charging station, etc)
if (disabledInteractTriggers.Contains(hit.collider.gameObject.name))
return;

VRSession.Instance.HUD.UpdateInteractCanvasPosition(position);
VRSession.Instance.HUD.UpdateInteractCanvasPosition(position);

if (!hitInteractable)
VRSession.VibrateController(XRNode.RightHand, 0.1f, 0.2f);
if (!IsHovering)
VRSession.VibrateController(XRNode.RightHand, 0.1f, 0.2f);

hitInteractable = true;
shouldReset = false;
IsHovering = true;

if (PlayerController.FirstEmptyItemSlot() == -1)
{
CursorTip = "Inventory full!";
}
else
{
var component = hit.collider.gameObject.GetComponent<GrabbableObject>();

if (!GameNetworkManager.Instance.gameHasStarted && !component.itemProperties.canBeGrabbedBeforeGameStart)
if (PlayerController.FirstEmptyItemSlot() == -1)
{
CursorTip = "(Cannot hold until ship has landed)";
return;
CursorTip = "Inventory full!";
}

if (component != null && !string.IsNullOrEmpty(component.customGrabTooltip))
CursorTip = component.customGrabTooltip;
else
CursorTip = "Grab";
{
var component = hit.collider.gameObject.GetComponent<GrabbableObject>();

if (!GameNetworkManager.Instance.gameHasStarted &&
!component.itemProperties.canBeGrabbedBeforeGameStart)
{
CursorTip = "(Cannot hold until ship has landed)";
return;
}

if (component != null && !string.IsNullOrEmpty(component.customGrabTooltip))
CursorTip = component.customGrabTooltip;
else
CursorTip = "Grab";
}
}
}
}
else
finally
{
hitInteractable = false;
if (shouldReset)
{
IsHovering = false;

PlayerController.cursorIcon.enabled = false;
CursorTip = "";
if (PlayerController.hoveringOverTrigger != null)
PlayerController.previousHoveringOverTrigger = PlayerController.hoveringOverTrigger;
PlayerController.cursorIcon.enabled = false;
CursorTip = "";
if (PlayerController.hoveringOverTrigger != null)
PlayerController.previousHoveringOverTrigger = PlayerController.hoveringOverTrigger;

PlayerController.hoveringOverTrigger = null;
PlayerController.hoveringOverTrigger = null;
}
}
}

private void BeginGrabObject()
{
var ray = new Ray(InteractOrigin.position, InteractOrigin.forward);
if (ray.Raycast(out var hit, PlayerController.grabDistance, interactableObjectsMask) && hit.collider.gameObject.layer != 8 && hit.collider.CompareTag("PhysicsProp"))
if (ray.Raycast(out var hit, PlayerController.grabDistance, INTERACTABLE_OBJECTS_MASK) && hit.collider.gameObject.layer != 8 && hit.collider.CompareTag("PhysicsProp"))
{
if (PlayerController.twoHanded || PlayerController.sinkingValue > 0.73f) return;

Expand Down
16 changes: 8 additions & 8 deletions Source/Player/VRPlayer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,14 @@ private void Update()
isSprinting = false;
}

if (!wasInEnemyAnimation && playerController.inAnimationWithEnemy)
{
var direction = playerController.inAnimationWithEnemy.transform.position - transform.position;
var rotation = Quaternion.LookRotation(direction, Vector3.up);

turningProvider.SetOffset(rotation.eulerAngles.y - mainCamera.transform.localEulerAngles.y);
}

var rotationOffset = playerController.jetpackControls switch
{
true => Quaternion.Euler(playerController.jetpackTurnCompass.eulerAngles.x, turningProvider.GetRotationOffset(), playerController.jetpackTurnCompass.eulerAngles.z),
Expand All @@ -391,14 +399,6 @@ private void Update()
if (!wasInSpecialAnimation && playerController.inSpecialInteractAnimation)
specialAnimationPositionOffset = new Vector3(-cameraPosAccounted.x * SCALE_FACTOR, 0, -cameraPosAccounted.z * SCALE_FACTOR);

if (!wasInEnemyAnimation && playerController.inAnimationWithEnemy)
{
var direction = playerController.inAnimationWithEnemy.transform.position - transform.position;
var rotation = Quaternion.LookRotation(direction, Vector3.up);

turningProvider.SetOffset(rotation.eulerAngles.y - mainCamera.transform.localEulerAngles.y);
}

wasInSpecialAnimation = playerController.inSpecialInteractAnimation;
wasInEnemyAnimation = playerController.inAnimationWithEnemy is not null;

Expand Down
16 changes: 11 additions & 5 deletions Source/UI/VRHUD.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public class VRHUD : MonoBehaviour

private GameObject spectatorLight;

void Awake()
private void Awake()
{
// Create canvasses
worldInteractionCanvas = new GameObject("World Interaction Canvas").AddComponent<Canvas>();
Expand Down Expand Up @@ -142,6 +142,10 @@ void Awake()
}
else
{
// Self, SelfRed, RedGlowBodyParts = Pos (8, 112, 40) Rot (0 164 0)
// SprintMeter = Pos (4, 100, 40) Rot (0 164 0)
// WeightUI = Pos (-10 80 40) Rot (0 164 0)

selfRed.transform.SetParent(leftHandCanvas.transform, false);
self.transform.SetParent(leftHandCanvas.transform, false);
sprintMeter.transform.SetParent(leftHandCanvas.transform, false);
Expand Down Expand Up @@ -345,13 +349,15 @@ void Awake()
spectatorLight.SetActive(false);
}

void LateUpdate()
private void LateUpdate()
{
transform.position = VRSession.Instance.MainCamera.transform.position + VRSession.Instance.MainCamera.transform.forward * 0.5f;
transform.rotation = VRSession.Instance.MainCamera.transform.rotation;
var camTransform = VRSession.Instance.MainCamera.transform;

transform.position = camTransform.position + camTransform.forward * 0.5f;
transform.rotation = camTransform.rotation;

// Interaction canvas
worldInteractionCanvas.transform.rotation = Quaternion.LookRotation(worldInteractionCanvas.transform.position - VRSession.Instance.MainCamera.transform.position);
worldInteractionCanvas.transform.rotation = Quaternion.LookRotation(worldInteractionCanvas.transform.position - camTransform.position);
worldInteractionCanvas.transform.position += worldInteractionCanvas.transform.forward * -0.2f;

scanner.Update();
Expand Down

0 comments on commit 665910e

Please sign in to comment.