@export_group("Movement")
-@export var walk_speed := 8.0
+@export var walk_speed := 10.0
@export var dash_length := 10.0
@export var acceleration := 20.0
@export var rotation_speed := 10.0
var idle_time := 0.00
-var last_movement_direction := Vector3.ZERO
-var state := ""
+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
-@onready var input: InputHandler = %Input
-@onready var model: PlayerModel = %Model
-@onready var skin: AnimatedSkin = %skin
+
+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