extends Node signal SitOnBenchTriggered(position: Vector2, sitting_direction: Enums.Directions) @export var player: CharacterBody2D var benches_in_range: Array[WoodenBench] = [] # Public Methods func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: var parent := area.get_parent() if parent == null or parent is not WoodenBench or benches_in_range.has(parent): return benches_in_range.append(parent) func OnPlayerInteractScannerAreaExited(area: Area2D) -> void: var parent = area.get_parent() if parent == null or parent is not WoodenBench or !benches_in_range.has(parent): return benches_in_range.erase(parent) func OnPlayerInteractionActionTriggered() -> void: if benches_in_range.is_empty(): return var bench := benches_in_range[0] var sitting_spots_container := bench.get_node("Sitting Spots") as Node2D var sitting_spot_markers := sitting_spots_container.get_children() var closest_marker: Marker2D var distance_to_player := 9999.0 for node in sitting_spot_markers: var marker := node as Marker2D var distance := marker.global_position.distance_to(player.global_position) if distance < distance_to_player: closest_marker = marker distance_to_player = distance if !closest_marker: return SitOnBenchTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN) # Private Methods func _ready() -> void: var all_players := get_tree().get_nodes_in_group("Player Group") if all_players == null or all_players.is_empty(): return for player_node in all_players: var player := player_node as PlayerCharacter player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered)