50 lines
1.6 KiB
GDScript
50 lines
1.6 KiB
GDScript
extends Node2D
|
|
|
|
@onready var player : Player = get_tree().get_first_node_in_group("player")
|
|
@onready var label: Label = $Label
|
|
|
|
var base_text: String
|
|
var active_areas := []
|
|
var can_interact := true
|
|
|
|
func _ready() -> void:
|
|
var interact_keys = InputMap.action_get_events("interact")
|
|
base_text = interact_keys[0].as_text() + " to "
|
|
#for interact_key in interact_keys:
|
|
#base_text = interact_key.as_text() + " to "
|
|
print(base_text)
|
|
|
|
func register_area(area: InteractionArea) -> void:
|
|
active_areas.push_back(area)
|
|
|
|
func unregister_area(area: InteractionArea) -> void:
|
|
var index = active_areas.find(area)
|
|
if index != -1:
|
|
active_areas.remove_at(index)
|
|
|
|
func _process(_delta: float) -> void:
|
|
if active_areas.size() > 0 and can_interact:
|
|
active_areas.sort_custom(_sort_by_distance_to_player)
|
|
var active_area = active_areas[0] as InteractionArea
|
|
label.text = base_text + active_area.action_name
|
|
#label.global_position = Vector2(active_area.global_position.x, active_area.global_position.y)
|
|
#label.global_position.y -= 36
|
|
#label.global_position.x -= label.size.x / 2
|
|
label.show()
|
|
else:
|
|
label.hide()
|
|
|
|
|
|
func _sort_by_distance_to_player(area1: Area3D, area2: Area3D) -> Area3D:
|
|
var area1_to_player = player.global_position.distance_to(area1.global_position)
|
|
var area2_to_player = player.global_position.distance_to(area2.global_position)
|
|
return area1_to_player < area2_to_player
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if event.is_action_pressed("interact") and can_interact:
|
|
if active_areas.size() > 0:
|
|
can_interact = false
|
|
label.hide()
|
|
await active_areas[0].interact.call()
|
|
can_interact = true
|