extends CharacterBody3D class_name Player @export_group("Movement") @export var walk_speed := 10.0 @export var dash_length := 10.0 @export var acceleration := 20.0 @export var rotation_speed := 10.0 @export var idle_timeout := 5.0 var idle_time := 0.00 var last_movement_direction := rotation var floor_normal := Vector3.ZERO var ground_slope_input := 0.0 var state := "" @onready var input: InputHandler = $Input @onready var model: PlayerModel = $Model @onready var skin: SkeletonSkin3D = $Visual @onready var cameraHandler: PlayerCameraHandler = $CameraHandler @onready var camera: Camera3D = $CameraHandler/SpringArm3D/Camera3D func _ready() -> void: skin.assign_skeleton(model.skeleton) func _physics_process(delta: float) -> void: var input_pkt := input.get_player_input() cameraHandler.update(input_pkt, delta) input_pkt.player_movement_direction = get_movement_relative_to_camera( input_pkt.player_movement_direction ) model.update(input_pkt, delta) # TODO: this is bad!! model.skeleton.global_transform = skin.global_transform # Get the XZ input direction based on player's input relative to the camera func get_movement_relative_to_camera(movement_direction: Vector2) -> Vector2: if camera: var forward := camera.global_basis.z var right := camera.global_basis.x var dir := ( forward * movement_direction.y + right * movement_direction.x ).normalized() return Vector2(dir.x, dir.z).normalized() else: return Vector2.ZERO