class_name PlayerCursor extends CanvasLayer @export var _side_change_speed: float = 15 @export var _screen_inset: float = 100 @export_group("References") @export var _base: Control @export var _bat: Control @export var _arrow: Control var _side: float = 0 func handle_cursor(player: Player, delta: float) -> void: var cursor_pos_world := player.attack.global_position + player.aimer.aim_offset var cursor_pos_screen := MainCamera.instance.unproject_position(cursor_pos_world) var clamp_corner_min := Vector2.ZERO var clamp_corner_max := get_viewport().get_visible_rect().size if player.input_mode_is(Inputer.Mode.CONTROLLER): clamp_corner_min += Vector2(_screen_inset, _screen_inset) clamp_corner_max -= Vector2(_screen_inset, _screen_inset) _base.position = ( cursor_pos_screen.clamp(clamp_corner_min, clamp_corner_max) - _base.size / 2 ) _side = lerpf( _side as float, (PI / 2.0) * (1.0 if player.attack.side == PlayerAttacker.Side.LEFT else -1.0), _side_change_speed * delta ) var aim_offset_normalized := player.aimer.aim_offset.normalized() var bat_rotation_point_screen := MainCamera.instance.unproject_position( cursor_pos_world + aim_offset_normalized.rotated(Vector3.UP, _side as float) ) var arrow_rotation_point_screen := MainCamera.instance.unproject_position( cursor_pos_world + aim_offset_normalized ) _bat.rotation = cursor_pos_screen.angle_to_point(bat_rotation_point_screen) _arrow.rotation = ( cursor_pos_screen.angle_to_point(arrow_rotation_point_screen) + PI / 2 ) _base.modulate = player.cursor_color if player.input_mode_is(Inputer.Mode.KB_MOUSE): _base.position = (get_viewport().get_mouse_position() - _base.size / 2)