59 lines
1.8 KiB
GDScript
59 lines
1.8 KiB
GDScript
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)
|