extends Node3D class_name QuizBox @export var question: String @export var correct: int @export var answer_0: String @export var answer_1: String @export var answer_2: String @export var answer_3: String @onready var animation_player: AnimationPlayer = $AnimationPlayer @onready var quiz_light: CSGSphere3D = $quiz_box_sb/quiz_box/quiz_light @onready var answer_pad_0: Area3D = $answers/answer_pad_0/Area3D @onready var answer_pad_1: Area3D = $answers/answer_pad_1/Area3D @onready var answer_pad_2: Area3D = $answers/answer_pad_2/Area3D @onready var answer_pad_3: Area3D = $answers/answer_pad_3/Area3D @onready var answer_0_label: Label3D = $answers/answer_pad_0/answer_0_label @onready var answer_1_label: Label3D = $answers/answer_pad_1/answer_1_label @onready var answer_2_label: Label3D = $answers/answer_pad_2/answer_2_label @onready var answer_3_label: Label3D = $answers/answer_pad_3/answer_3_label @onready var question_label: Label3D = $StaticBody3D/Wall/question_label var answered_correctly := false func _ready() -> void: # Texte setzen question_label.text = question answer_0_label.text = answer_0 answer_1_label.text = answer_1 answer_2_label.text = answer_2 answer_3_label.text = answer_3 # Signale verbinden answer_pad_0.body_entered.connect(_on_answer_entered.bind(0)) answer_pad_1.body_entered.connect(_on_answer_entered.bind(1)) answer_pad_2.body_entered.connect(_on_answer_entered.bind(2)) answer_pad_3.body_entered.connect(_on_answer_entered.bind(3)) # WICHTIG: Material duplizieren, damit es nicht mit anderen Instanzen geteilt wird if quiz_light.material != null: # tiefe Kopie (alle Subressourcen mitduplizieren) quiz_light.material = quiz_light.material.duplicate(true) else: quiz_light.material = StandardMaterial3D.new() # Grundeinstellungen für diese Instanz quiz_light.material.emission_enabled = true quiz_light.material.emission_energy = 0.5 quiz_light.material.albedo_color = Color.WHITE quiz_light.material.emission = Color.WHITE func _on_answer_entered(body: Node3D, answer_index: int) -> void: if not body.is_in_group("player"): return # Nur Player soll triggern # Wenn schon korrekt beantwortet, nichts tun if answered_correctly: return # Prüfen und nur DIESE Instanzlampe setzen if answer_index == correct: _set_light_color(Color.GREEN) question_label.visible = false animation_player.play("open_door") answered_correctly = true else: _set_light_color(Color.RED) # optional: nach kurzer Zeit zurücksetzen, damit neu versucht werden kann await get_tree().create_timer(1.0).timeout _set_light_color(Color.WHITE) func _set_light_color(color: Color) -> void: # Setze nur das Material dieser Instanz if quiz_light.material == null: quiz_light.material = StandardMaterial3D.new() quiz_light.material.albedo_color = color quiz_light.material.emission = color # erhöhe kurz die Emission für Sichtbarkeit bei Farben außer weiß quiz_light.material.emission_energy = 1.5 if color != Color.WHITE else 0.5