extends Node ## Autoload: Modell-Status + Probe (Karte t_12cf94fe). ## ## Zwei Aufgaben: ## 1. Banner/Klartext: Wenn beim App-Start KEINE Modell-Quelle irgendeine ## GLB enthält, sagt die App deutlich, wie sie die Modelle bekommt ## (GlbMeshStore.fehl_text()). Kein stiller Kisten-Platzhalter. ## 2. Probe-Modus für den Eigenständigkeits-Beweis: startet die exportierte ## App mit --probe-map=/pfad/test.svmap (NUR user-args, also nach --), ## öffnet die Map über die Editor-Methode, sammelt die OID-Belege ## (Quellpfad je Objekt, fehlende_glbs) und beendet sich mit Exit 0/1. ## ## Aufruf (exportierte App, headless): ## ./MapEditor.x86_64 --headless -- --probe-map=/pfad/test.svmap ## ## main.gd wird NICHT anfasst (Kollisionsschutz U1) — alle Aufrufe gehen ## über call() auf die laufende Szene. const PROBE_ARG := "--probe-map=" const PROBE_WARTEFRAMES_START := 2 const PROBE_WARTEFRAMES_MAP := 20 func _ready() -> void: var args := OS.get_cmdline_user_args() for a in args: if a.begins_with(PROBE_ARG): _probe(str(a.substr(PROBE_ARG.length()))) return _bannern() ## 1. Klartext-Banner, wenn nirgends Modelle liegen (GUI + Log). func _bannern() -> void: await get_tree().process_frame await get_tree().process_frame if GlbMeshStore.lager_ist_leer(): var text := GlbMeshStore.fehl_text() print("⚠ MODELL-FEHLT-BANNER:") for zeile in text.split("\n"): print(" " + zeile) var szene := get_tree().current_scene if szene != null and szene.has_method("_set_status"): szene.call("_set_status", "⚠ Modelle fehlen — Terrain/Bauteile funktionieren. Details im Log.") if DisplayServer.get_name() != "headless": var dialog := AcceptDialog.new() dialog.title = "Modelle fehlen" dialog.dialog_text = text dialog.ok_button_text = "Verstanden" get_tree().root.add_child(dialog) dialog.popup_centered() ## 2. Probe: Map öffnen, Belege sammeln, Exit 0/1. func _probe(map_pfad: String) -> void: for i in PROBE_WARTEFRAMES_START: await get_tree().process_frame var szene := get_tree().current_scene if szene == null or not szene.has_method("_on_open_selected"): print("PROBE FEHLGESCHLAGEN: keine Szene mit _on_open_selected") get_tree().quit(1) return var result: Variant = szene.call("_on_open_selected", map_pfad) for i in PROBE_WARTEFRAMES_MAP: await get_tree().process_frame # --- Belege sammeln ------------------------------------------------------- var fehlend: Array = [] var view_builder: Variant = szene.get("view_builder") if view_builder != null: fehlend = view_builder.get("fehlende_glbs") var oids: Array = [] var doc: Variant = szene.get("doc") if doc is Dictionary: for obj in (doc as Dictionary).get("objects", []): if obj is Dictionary: var oid := str((obj as Dictionary).get("id", "")) if oid != "" and not oids.has(oid): oids.append(oid) var modelle_da := DirAccess.dir_exists_absolute(GlbMeshStore.models_pfad()) var geladen: bool = doc is Dictionary and SvmapDocument.object_count(doc) > 0 print("PROBE map=%s" % map_pfad) print("PROBE map_geladen=%s objekte=%d" % [str(geladen), oids.size()]) print("PROBE modelle_ordinar=%s pfad=%s" % [str(modelle_da), GlbMeshStore.models_pfad()]) print("PROBE quellen=%s" % ", ".join(PackedStringArray(GlbMeshStore.quellen()))) var quellen_pro_oid := 0 for oid in oids: var pfad := GlbMeshStore.probe_source_fuer(oid) if pfad.contains("/models/"): quellen_pro_oid += 1 var muster: Array = [] for oid in oids.slice(0, 5): muster.append("%s -> %s" % [oid, GlbMeshStore.probe_source_fuer(oid)]) if not muster.is_empty(): print("PROBE oid-quellen (erste %d):" % muster.size()) for m in muster: print(" " + m) print("PROBE aus-models=%d/%d fehlende_glbs=%d" % [quellen_pro_oid, oids.size(), fehlend.size()]) var ok := geladen and fehlend.is_empty() print("PROBE ERGEBNIS: %s" % ("OK" if ok else "FEHLGESCHLAGEN")) get_tree().quit(0 if ok else 1)