extends Area3D @export var poi_name: String = "Kampfarena" @export var marker_color: Color = Color.WHITE @onready var sprite: AnimatedSprite3D = $AnimatedSprite3D @onready var name_label: Label3D = $Billboard/NameLabel @onready var prompt: Label3D = $Billboard/InteractionPrompt var player_nearby: bool = false var visited: bool = false func _ready() -> void: prompt.visible = false prompt.text = "[F] Interact" _update_visuals() body_entered.connect(_on_body_entered) body_exited.connect(_on_body_exited) # Terrain-Kollision braucht mind. einen Physik-Tick um registriert zu sein await get_tree().physics_frame _snap_to_terrain() func _snap_to_terrain() -> void: var space_state := get_world_3d().direct_space_state var from := global_position + Vector3(0, 20, 0) var to := global_position + Vector3(0, -20, 0) var query := PhysicsRayQueryParameters3D.create(from, to) query.exclude = [get_rid(), $StaticBody3D.get_rid()] var result := space_state.intersect_ray(query) if result: global_position.y = result.position.y + 0.5 func _update_visuals() -> void: if visited: name_label.text = poi_name sprite.modulate = marker_color else: name_label.text = "???" sprite.modulate = marker_color * Color(0.4, 0.4, 0.4, 1.0) func mark_visited() -> void: visited = true _update_visuals() func _on_body_entered(body: Node3D) -> void: if body.is_in_group("player"): player_nearby = true prompt.visible = true 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"): if not visited: ArenaManager.start_arena(self) else: InteractionManager.open_message(self, poi_name, "Bereits bezwungen.")