immersive-home/app/addons/godot-xr-tools/functions/movement_crouch.gd

93 lines
2.3 KiB
GDScript3
Raw Permalink Normal View History

2023-10-16 20:10:20 +03:00
@tool
class_name XRToolsMovementCrouch
extends XRToolsMovementProvider
## XR Tools Movement Provider for Crouching
##
## This script works with the [XRToolsPlayerBody] attached to the players
## [XROrigin3D].
##
## While the player presses the crounch button, the height is overridden to
## the specified crouch height.
## Enumeration of crouching modes
enum CrouchType {
HOLD_TO_CROUCH, ## Hold button to crouch
TOGGLE_CROUCH, ## Toggle crouching on button press
}
## Movement provider order
@export var order : int = 10
## Crouch height
@export var crouch_height : float = 1.0
## Crouch button
@export var crouch_button_action : String = "primary_click"
## Type of crouching
@export var crouch_type : CrouchType = CrouchType.HOLD_TO_CROUCH
## Crouching flag
var _crouching : bool = false
## Crouch button down state
var _crouch_button_down : bool = false
# Controller node
@onready var _controller := XRHelpers.get_xr_controller(self)
# Add support for is_xr_class on XRTools classes
func is_xr_class(name : String) -> bool:
return name == "XRToolsMovementCrouch" or super(name)
# Perform jump movement
func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool):
# Skip if the controller isn't active
if !_controller.get_is_active():
return
# Detect crouch button down and pressed states
var crouch_button_down := _controller.is_button_pressed(crouch_button_action)
var crouch_button_pressed := crouch_button_down and !_crouch_button_down
_crouch_button_down = crouch_button_down
# Calculate new crouching state
var crouching := _crouching
match crouch_type:
CrouchType.HOLD_TO_CROUCH:
# Crouch when button down
crouching = crouch_button_down
CrouchType.TOGGLE_CROUCH:
# Toggle when button pressed
if crouch_button_pressed:
crouching = !crouching
# Update crouching state
if crouching != _crouching:
_crouching = crouching
if crouching:
player_body.override_player_height(self, crouch_height)
else:
player_body.override_player_height(self)
# This method verifies the movement provider has a valid configuration.
func _get_configuration_warnings() -> PackedStringArray:
var warnings := super()
# Check the controller node
if !XRHelpers.get_xr_controller(self):
warnings.append("This node must be within a branch of an XRController3D node")
# Return warnings
return warnings