extends State @export var dash_length: float @export var dash_time: float var new_position: Vector3 func should_enter(input: InputPacket) -> String: if state_finished: input.player_actions.sort_custom(states_priority_sort) return input.player_actions[0] return name func update(input: InputPacket, delta: float): if new_position: # if new position has been set, move towards it! player.global_position = lerp( player.global_position, new_position, (dash_length / dash_time) * delta ) state_finished = get_progress() >= dash_time else: # else pick new position var dir: Vector2 if input.player_movement_direction == Vector2.ZERO: dir = Vector2(player.last_movement_vector.x, player.last_movement_vector.z) else: dir = input.player_movement_direction new_position = player.global_position + Vector3(dir.x, 0, dir.y).normalized() * dash_length rotate_skin(new_position) func on_enter_state(): player.model.shield.visible = true new_position = Vector3.ZERO state_finished = false func on_exit_state(): player.model.shield.visible = false func rotate_skin(towards: Vector3): var skin_target_angle := Vector3.BACK.signed_angle_to( towards - player.global_position, Vector3.UP ) player.model.global_rotation.y = skin_target_angle