grunk/src/props/physics/holdable.gd
2025-07-08 17:36:21 -06:00

37 lines
1.0 KiB
GDScript

class_name Holdable extends Node
## Component for holdable elements
@export var hold_distance := 1.0
@export var controller: RigidBody3D
func _ready() -> void:
if not controller:
controller = _default_controller()
assert(controller, "Holdable %s has no valid controller!" % str(self))
controller.add_user_signal(Interactive.SELECT_SIGNAL)
controller.connect(Interactive.SELECT_SIGNAL, select)
controller.add_user_signal(Interactive.DESELECT_SIGNAL)
controller.connect(Interactive.DESELECT_SIGNAL, deselect)
controller.add_user_signal(Interactive.ACTIVATE_SIGNAL)
controller.connect(Interactive.ACTIVATE_SIGNAL, activate)
func _default_controller() -> RigidBody3D:
return get_parent() as RigidBody3D
func select() -> void:
Tutorial.manager.activate("game/tutorial/progress/pick_up")
Player.instance.hud.hold_hud.select_prop()
func deselect() -> void:
Player.instance.hud.hold_hud.deselect()
func activate() -> void:
if not Player.instance.hold_component.holding_object():
Player.instance.hold_component.attach(controller, hold_distance)