class_name XRFirearmBolt extends MeshInstance3D @export var _handle : XRToolsInteractableHandle @export var _slide : XRFirearmSlide @export var value : Vector3 # Current controller holding this object var _current_controller : XRController3D # Add support for is_xr_class on XRTools classes func is_xr_class(name : String) -> bool: return name == "XRFirearmBolt" func _ready() -> void: # Listen for when this object is picked up or dropped _handle.grabbed.connect(_on_grabbed) _handle.released.connect(_on_released) # Called when this object is grabbed func _on_grabbed(_pickable, _by) -> void: _update_controller_signals() # Called when this object is released func _on_released(_pickable, _by) -> void: _update_controller_signals() # Update the controller signals func _update_controller_signals() -> void: # Find the primary controller holding the firearm var controller := _handle.get_picked_up_by_controller() #var grab_point := _handle.get_active_grab_point() as XRToolsGrabPointHand #if not grab_point or grab_point.handle != "Grip": # controller = null # If the bound controller is no-longer correct then unbind if _current_controller and _current_controller != controller: if !_slide.slider_position: reset_rotation() _current_controller = null # If we need to bind to a new controller then bind if controller and not _current_controller: _current_controller = controller if !_slide.default_position: reset_rotation() rotation_degrees += value func _on_controller_trigger_pressed(trigger_button : String): # Skip if not pose-toggle button if trigger_button != "trigger_click": return rotation_degrees += value func _on_controller_trigger_released(trigger_button : String): # Skip if not pose-toggle button if trigger_button != "trigger_click": return reset_rotation() func reset_rotation(): rotation_degrees = Vector3(0,0,0)