Datei-Menü: Hand-Haltung der Waffen startet das Hand-Haltungs-Tool aus dem Client-Ordner (importiert nach neuem Client-Stand im Hintergrund); Test

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
slyphax 2026-10-31 11:02:36 +01:00
parent 91c66a0b98
commit ff1c0e345e
5 changed files with 64 additions and 0 deletions

View file

@ -93,6 +93,18 @@ static func export_temp_map(doc: Dictionary) -> Dictionary:
return result return result
## Hand-Haltungs-Tool: liegt im Client-Projekt, weil es dessen Rig und Waffen
## direkt benutzt (kein VR, eigenes Fenster).
static func hand_pose_args(client_dir: String) -> PackedStringArray:
return PackedStringArray(["--xr-mode", "off", "--path", client_dir,
"res://tools/hand_pose_tool/hand_pose_tool.tscn"])
## Import-Lauf für den Client, nötig nach neuem Stand (neue Modelle/Skripte).
static func import_args(client_dir: String) -> PackedStringArray:
return PackedStringArray(["--headless", "--path", client_dir, "--import"])
## Argumentliste für den Client-Start (getestet: exakt diese Form). ## Argumentliste für den Client-Start (getestet: exakt diese Form).
static func launch_args(client_dir: String, map_path: String) -> PackedStringArray: static func launch_args(client_dir: String, map_path: String) -> PackedStringArray:
return PackedStringArray(["--path", client_dir, "--", "--testmap", map_path, "--mock-master"]) return PackedStringArray(["--path", client_dir, "--", "--testmap", map_path, "--mock-master"])

View file

@ -76,6 +76,7 @@ static func text() -> String:
["Strg+Y / Strg+Umschalt+Z", "Wiederherstellen"], ["Strg+Y / Strg+Umschalt+Z", "Wiederherstellen"],
["Strg+S / Strg+Umschalt+S", "Speichern / Speichern unter"], ["Strg+S / Strg+Umschalt+S", "Speichern / Speichern unter"],
["Strg+O / Strg+N", "Öffnen / Neue Map"], ["Strg+O / Strg+N", "Öffnen / Neue Map"],
["Datei → Hand-Haltung der Waffen", "öffnet das Tool für Hände und Finger pro Waffe (eigenes Fenster)"],
["Datei → Updates prüfen", "prüft auf eine neue Version; Banner „Jetzt updaten“ lädt und startet neu"], ["Datei → Updates prüfen", "prüft auf eine neue Version; Banner „Jetzt updaten“ lädt und startet neu"],
])) ]))
return out return out

View file

@ -166,6 +166,7 @@ var update_btn: Button # „Jetzt updaten“ im Banner
var check_thread: Thread # Update-Check im Hintergrund (Start/Menü) var check_thread: Thread # Update-Check im Hintergrund (Start/Menü)
var update_thread: Thread # Update-Ausführung (pull + Import-Lauf) var update_thread: Thread # Update-Ausführung (pull + Import-Lauf)
var _update_check_busy := false var _update_check_busy := false
var _hand_pose_thread: Thread = null
var _update_running := false var _update_running := false
var _update_result: Dictionary = {} # letzter Check (Status/Banner-Nachfrage) var _update_result: Dictionary = {} # letzter Check (Status/Banner-Nachfrage)
@ -794,6 +795,8 @@ func _on_menu_action(id: int) -> void:
_open_resize_dialog() _open_resize_dialog()
7: # Updates prüfen (Selbst-Update, t_d95f087a) 7: # Updates prüfen (Selbst-Update, t_d95f087a)
_on_update_check_menu() _on_update_check_menu()
8: # Hand-Haltung der Waffen (Tool im Client-Projekt)
_on_hand_pose_tool()
# --------------------------------------------- UI-Größe + Fenster (t_297221b5) -- # --------------------------------------------- UI-Größe + Fenster (t_297221b5) --
@ -1021,6 +1024,50 @@ func _startup_update_check() -> void:
_updater_check_async(false) _updater_check_async(false)
## Hand-Haltungs-Tool starten: eigenes Fenster aus dem Client-Projekt. Nach einem
## neuen Client-Stand erst importieren (im Hintergrund, kann dauern), sonst fehlen
## dem Tool neue Modelle.
func _on_hand_pose_tool() -> void:
if _hand_pose_thread != null:
_set_status("Hand-Haltungs-Tool wird schon vorbereitet…")
return
var cfg := TestRun.load_cfg()
var client := TestRun.find_client(ProjectSettings.globalize_path("res://"), cfg)
if client.is_empty():
_set_status("Client-Ordner nicht gefunden: er muss neben dem Editor liegen (scopedvr-client) oder in den Einstellungen stehen.", true)
return
var godot := TestRun.find_godot(cfg)
if godot.is_empty():
_set_status("Godot nicht gefunden: bitte in den Einstellungen eintragen.", true)
return
_set_status("Hand-Haltungs-Tool wird vorbereitet…")
_hand_pose_thread = Thread.new()
_hand_pose_thread.start(_hand_pose_prepare.bind(godot, client))
func _hand_pose_prepare(godot: String, client: String) -> void:
var head := EditorUpdater.git_run(EditorUpdater.git_exe(TestRun.load_cfg()), client, PackedStringArray(["rev-parse", "HEAD"]))
var stand := str(head.get("output", "")).strip_edges()
var cfg := TestRun.load_cfg()
if stand.is_empty() or str(cfg.get_value("test", "hand_pose_import", "")) != stand:
var out: Array = []
OS.execute(godot, TestRun.import_args(client), out, true)
_hand_pose_started.call_deferred(godot, client, stand)
func _hand_pose_started(godot: String, client: String, stand: String) -> void:
_hand_pose_thread.wait_to_finish()
_hand_pose_thread = null
var cfg := TestRun.load_cfg()
cfg.set_value("test", "hand_pose_import", stand)
cfg.save(TestRun.CFG_PATH)
var pid := OS.create_process(godot, TestRun.hand_pose_args(client))
if pid <= 0:
_set_status("Hand-Haltungs-Tool ließ sich nicht starten.", true)
return
_set_status("Hand-Haltungs-Tool läuft in einem eigenen Fenster.")
## Datei-Menü „🔄 Updates prüfen“ (ID 7): gleicher Check mit Ergebnis-Meldung. ## Datei-Menü „🔄 Updates prüfen“ (ID 7): gleicher Check mit Ergebnis-Meldung.
func _on_update_check_menu() -> void: func _on_update_check_menu() -> void:
if _update_check_busy: if _update_check_busy:

View file

@ -56,6 +56,7 @@ func build() -> void:
popup.add_separator() popup.add_separator()
popup.add_item("▶ Karte testen", 5) popup.add_item("▶ Karte testen", 5)
popup.add_separator() popup.add_separator()
popup.add_item("🖐 Hand-Haltung der Waffen…", 8)
popup.add_item("🔄 Updates prüfen", 7) popup.add_item("🔄 Updates prüfen", 7)
popup.add_item("Beenden", 4) popup.add_item("Beenden", 4)
# FIX 20.10. (Sly-Befund „Kartengröße ändern tut nichts“): id_pressed sendet # FIX 20.10. (Sly-Befund „Kartengröße ändern tut nichts“): id_pressed sendet

View file

@ -118,3 +118,6 @@ func _run_tests() -> void:
if str(args[i]) != want[i]: if str(args[i]) != want[i]:
ok = false ok = false
_check(ok, "launch_args exakt: --path … -- --testmap … --mock-master") _check(ok, "launch_args exakt: --path … -- --testmap … --mock-master")
var hp := TestRun.hand_pose_args("/pfad/client")
_check(Array(hp) == ["--xr-mode", "off", "--path", "/pfad/client", "res://tools/hand_pose_tool/hand_pose_tool.tscn"],
"hand_pose_args exakt: ohne VR, Szene aus dem Client")