extends CanvasLayer @export var side_change_speed: float = 15 var _side: float @onready var _base: Control = $CursorBase # @onready var _circle: Control = $CursorBase/CursorCircle @onready var _bat: Control = $CursorBase/CursorBat @onready var _arrow: Control = $CursorBase/CursorArrow func _ready() -> void: Input.mouse_mode = Input.MOUSE_MODE_HIDDEN func _process(delta: float) -> void: if not Referencer.player or not Referencer.main_camera: var mouse_pos := get_viewport().get_mouse_position() _base.position = mouse_pos - _base.size / 2 _bat.visible = false return _bat.visible = true var player := Referencer.player var cursor_pos_world := player.attack.global_position + player.aiming.aim_offset var cursor_pos_screen := Referencer.main_camera.unproject_position(cursor_pos_world) _base.position = ( cursor_pos_screen.clamp(Vector2.ZERO, get_viewport().get_visible_rect().size) - _base.size / 2 ) _side = lerpf( _side, (PI / 2.0) * (1.0 if player.attack.side == PlayerAttack.Side.LEFT else -1.0), side_change_speed * delta ) var aim_offset_normalized := player.aiming.aim_offset.normalized() var bat_rotation_point_screen := Referencer.main_camera.unproject_position( cursor_pos_world + aim_offset_normalized.rotated(Vector3.UP, _side) ) var arrow_rotation_point_screen := Referencer.main_camera.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)