class_name Player extends CharacterBody3D const SPEED = 4.0 const JUMP_VELOCITY = 2.5 @onready var geometry:Node3D = %Geometry @onready var actionable_detector = %ActionableDetector @onready var animation_tree:AnimationTree = $Geometry/Rogue/AnimationTree # Get the gravity from the project settings to be synced with RigidBody nodes. var gravity = ProjectSettings.get_setting("physics/3d/default_gravity") var inventory:Inventory = Inventory.new() var look_direction:Vector3 = Vector3.BACK var look_direction_damper:SpringDamper = SpringDamper.new(Vector3.ZERO) signal trigger_message(message:String) var interaction_state:bool = false func _process(_delta): animation_tree.set("parameters/conditions/attack", interaction_state) if interaction_state: interaction_state = false func _physics_process(delta): # Add the gravity. if not is_on_floor(): velocity.y -= gravity * delta # Get the input direction and handle the movement/deceleration. # As good practice, you should replace UI actions with custom gameplay actions. var input_dir = Input.get_vector("walk_left", "walk_right", "walk_forward", "walk_back") var direction = (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x = direction.x * SPEED velocity.z = direction.z * SPEED else: velocity.x = move_toward(velocity.x, 0, SPEED) velocity.z = move_toward(velocity.z, 0, SPEED) move_and_slide() var ground_velocity:Vector2 = Vector2(velocity.x, velocity.z) var is_moving:bool = ground_velocity.length_squared() > 0.1 * 0.1 if is_moving: look_direction = Vector3(ground_velocity.x, 0, ground_velocity.y).normalized() elif direction.length_squared() > 0.1 * 0.1: look_direction = direction var damped_look_direction = look_direction_damper.calc(geometry.global_basis.z, look_direction, delta) animation_tree.set("parameters/conditions/running", is_moving) animation_tree.set("parameters/conditions/idle", not is_moving) geometry.look_at(position - damped_look_direction, Vector3.UP) func on_item_picked_up(item:Item): emit_signal("trigger_message", "Picked up a " + item.name) inventory.add_item(item) func _unhandled_input(_event: InputEvent) -> void: if Input.is_action_just_pressed("ui_accept"): var actionables = actionable_detector.get_overlapping_areas() if actionables.size() > 0: look_direction = (actionables[0].global_position - position).normalized() actionables[0].action() get_viewport().set_input_as_handled() return if Input.is_action_just_pressed("interaction"): interaction_state = true get_viewport().set_input_as_handled() return