- BauKatalog: 12 Teile (Fundament, Boden, Wände mit Tür/Fenster/Scharte, Brüstung, Pfeiler, Giebel, Dächer, Treppe) auf Basis der CC0-Geometrie des Modular Builder 0.2.0, Wandhöhe 3 m - BuildSnap: Wände auf Zellkanten, Böden in Zellmitte, Höhe aus Ebenen statt Klickhöhe, Ersetzen (Tür in Wand) - Gebäude kopieren/auswählen/löschen im Bauen-Tab, Kopien bekommen eigene Gruppe - Kollision serverkonsistent über Trimesh-Dateien (Türen/Fenster echte Löcher), tools/gen_bauteile.gd erzeugt GLB, Kollision, Registry-Fragment - Alte gebaeude-Sektion wird beim Laden migriert, altes Bauen-Werkzeug entfernt, Resize behält Gruppennamen - Tests: test_bauen (258 Checks), Playtest läuft Treppe/Tür Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
62 lines
2.9 KiB
Markdown
62 lines
2.9 KiB
Markdown
# Bauen — eigene Häuser aus Modulteilen
|
||
|
||
Stand 25.10.2026 (Umbau). Vorlage: **Modular Builder 0.2.0** von Michel Savadim,
|
||
Godot-Erweiterung, Lizenz **CC0 1.0** (Code, Icons, Doku — siehe
|
||
`addons/modular_builder/LICENSE`). Die Demo-Szene/Demo-Texturen der Vorlage sind
|
||
nicht CC0 und liegen bewusst nicht im Repo (`ADDON_LIZENZ.txt`).
|
||
|
||
## Prinzip
|
||
|
||
Ein Bauteil ist ein **ganz normales Bibliotheks-Objekt** (`bau_*`, Kategorie
|
||
„bauteile“). Gesetzte Teile stehen in `objects`, ein Gebäude ist eine **Gruppe**
|
||
(`group` + `group_names`). Dadurch gelten ohne Sonderfälle:
|
||
|
||
* Undo/Redo, Auswahl, Verschieben, Drehen, Duplizieren, Löschen, Symmetrie
|
||
* Speichern in der `.svmap` (kein eigener Block mehr, Server-Validierung V1–V17)
|
||
* **Kollision serverkonsistent**: jedes Teil hat eine Trimesh-Datei
|
||
(`library/kollisions/bau_*.json`) — Türen, Fenster, Schießscharten sind echte
|
||
Löcher, die Treppe ist eine Stufenfläche (Stufen 20 cm). Editor-Playtest, Client
|
||
und Server lesen dieselbe Datei.
|
||
* Poly-Budget zählt wie bei jedem Objekt (`poly` = Dreiecke des Teils).
|
||
|
||
## Teile (Katalog: `src/editor/bau_katalog.gd`)
|
||
|
||
| Gruppe | Teile |
|
||
| --- | --- |
|
||
| Fundament & Boden | Fundament, Boden/Decke (2 × 2 m, 20 cm) |
|
||
| Wände (2 m breit, 3 m hoch) | Wand, Wand mit Tür (1,2 × 2,2 m), Wand mit Fenster, Wand mit Schießscharte, Brüstung (1,1 m), Eckpfeiler |
|
||
| Dach & Giebel | Giebelwand, Satteldach, Pyramidendach |
|
||
| Treppe | Treppe 4 × 2 m, 3 m hoch (15 Stufen) |
|
||
|
||
Dazu im Tab „Pack-Module“: Container, Hangar-Tore, Betonsperren aus dem
|
||
Military-Desert-Pack (normale Objekte).
|
||
|
||
## Snap (`src/editor/build_snap.gd`)
|
||
|
||
* **XZ:** Wände auf die nächste Zellkante (Drehung ergibt sich aus der Kante, `R`
|
||
dreht die Wand um), Böden/Dächer/Fundamente in die Zellmitte, Pfeiler auf die
|
||
Zellecke, Treppen auf eine 4 × 2-m-Fläche. Zellen sind 2 × 2 m, global ab (0, 0).
|
||
* **Y:** nie die Klickhöhe, sondern eine **Ebene** — Gelände (höchster Punkt unter
|
||
der Grundfläche) oder Oberkante eines tragenden Teils darunter. Klick auf die
|
||
Wandoberkante stapelt das nächste Geschoss.
|
||
* **Ersetzen:** gleiche Art auf demselben Platz wird ersetzt (Tür in vorhandene
|
||
Wand). Dasselbe Teil nochmal wird mit Erklärung abgelehnt.
|
||
|
||
## Dateien erzeugen
|
||
|
||
Meshes, GLBs, Kollision und Registry-Fragment kommen aus dem Katalog:
|
||
|
||
```bash
|
||
godot --headless --path . --script res://tools/gen_bauteile.gd -- \
|
||
--client ../scopedvr-client --server ../scopedvr-match-server
|
||
(cd ../scopedvr-match-server && python3 tools/merge_object_library.py)
|
||
```
|
||
|
||
Danach `library/objects.json` in Client und Editor angleichen (`tools/sync_objects.sh`).
|
||
`tests/test_bauen.gd` prüft, dass die Registry zum Katalog passt.
|
||
|
||
## Alte Maps
|
||
|
||
Die frühere Sektion `gebaeude` (Bauen-Modus vom 20.10.) wird beim Öffnen in
|
||
`bau_*`-Objekte einer Gruppe übernommen (`BauOps.migriere_gebaeude`). Wandhöhe ist
|
||
jetzt 3 m statt 2 m — alte Häuser bitte kurz prüfen und neu speichern.
|