extends Area3D @export var poi_name: String = "Tor zur Mitte" @export var marker_color: Color = Color(1.0, 0.9, 0.4) @export var required_group: String = "region1_pois" @export var target_position: Vector3 = Vector3.ZERO @onready var sprite: AnimatedSprite3D = $AnimatedSprite3D @onready var name_label: Label3D = $Billboard/NameLabel @onready var prompt: Label3D = $Billboard/InteractionPrompt var player_nearby: bool = false func _ready() -> void: prompt.visible = false prompt.text = "[F] Interact" name_label.text = poi_name _update_visuals() body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) func _all_required_visited() -> bool: var pois := get_tree().get_nodes_in_group(required_group) if pois.is_empty(): return false for poi in pois: if not poi.visited: return false return true func _update_visuals() -> void: if _all_required_visited(): sprite.modulate = marker_color else: sprite.modulate = marker_color * Color(0.4, 0.4, 0.4, 1.0) func _on_body_entered(body: Node3D) -> void: if body.is_in_group("player"): player_nearby = true prompt.visible = true _update_visuals() func _on_body_exited(body: Node3D) -> void: if body.is_in_group("player"): player_nearby = false prompt.visible = false func _input(event: InputEvent) -> void: if player_nearby and Input.is_action_just_pressed("interact"): _try_transition() func _try_transition() -> void: if _all_required_visited(): InteractionManager.open_message(self, poi_name, "Du betrittst die Mitte der Insel.") var player := get_tree().get_first_node_in_group("player") if player: player.global_position = target_position else: InteractionManager.open_message(self, poi_name, "Hier geht es noch nicht weiter.\nErst müssen alle sechs Orte dieser Region erkundet sein.")