init
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
@tool
|
||||
class_name XRToolsDesktopMovementCrouch
|
||||
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 = "action_crouch"
|
||||
|
||||
## 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 xr_start_node = XRTools.find_xr_child(
|
||||
XRTools.find_xr_ancestor(self,
|
||||
"*Staging",
|
||||
"XRToolsStaging"),"StartXR","Node")
|
||||
|
||||
|
||||
# Add support for is_xr_class on XRTools classes
|
||||
func is_xr_class(xr_name: String) -> bool:
|
||||
return xr_name == "XRToolsMovementCrouch" or super(xr_name)
|
||||
|
||||
|
||||
# Perform jump movement
|
||||
func physics_movement(_delta: float, player_body: XRToolsPlayerBody, _disabled: bool):
|
||||
# Skip if the controller isn't active
|
||||
if !player_body.enabled or xr_start_node.is_xr_active():
|
||||
return
|
||||
|
||||
# Detect crouch button down and pressed states
|
||||
var crouch_button_down := Input.is_action_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)
|
||||
Reference in New Issue
Block a user