Pack-Kaserne/-Checkpoint/-Container sind innen geschlossen; die Vorlagen sind begehbare Gebäude aus bau_*-Teilen. Test beweist per Strahl durch die echte Kollision. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
89 lines
4.6 KiB
Markdown
89 lines
4.6 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 (klein 2 m) | Giebelwand, Satteldach, Pyramidendach |
|
||
| Dach & Giebel (mittel 4 m) | Giebelwand 4 m, Satteldach 4×4, Pyramidendach 4×4 (Spitze 2 m) |
|
||
| Dach & Giebel (groß 6 m) | Giebelwand 6 m, Satteldach 6×6, Pyramidendach 6×6 (Spitze 3 m) |
|
||
| Treppe | Treppe 4 × 2 m, 3 m hoch (15 Stufen) |
|
||
|
||
## Begehbare Vorlagen
|
||
|
||
Die Pack-Gebäude Kaserne, Checkpoint und Container sind innen geschlossen
|
||
(einseitige Wände, Türen nur aufgemalt) — Spieler laufen dagegen, nicht hinein. Statt die
|
||
Pack-Modelle zu verbiegen, setzt der Bauen-Tab unter „Begehbare Vorlagen“ per Klick ein
|
||
fertiges Gebäude aus Bauteilen in die Bildmitte (`src/editor/bau_vorlagen.gd`, ein
|
||
Undo-Schritt, danach als Gruppe markiert):
|
||
|
||
| Vorlage | Größe | Ausstattung |
|
||
| --- | --- | --- |
|
||
| Wachhaus (Checkpoint) | 4 × 4 m | Tür vorn, Fenster seitlich, Flachdach |
|
||
| Kaserne | 6 × 12 m | Tür vorn + hinten, Fenster an den Längsseiten, Flachdach |
|
||
| Lagerraum (Container-Größe) | 4 × 6 m | Tür vorn, Schießscharten seitlich |
|
||
|
||
Alles sind normale `bau_*`-Objekte (Trimesh, Türen/Fenster echte Löcher), Quest-tauglich:
|
||
kein Innenausbau, ein Draw-Call je Teil. `tests/test_bau_vorlagen.gd` beweist per Strahl
|
||
durch die echte Kollision: Tür frei (0,5–2,1 m), Wand massiv, Boden und Dach da, ≥ 2,4 m
|
||
Stehhöhe, ein Undo nimmt das Gebäude zurück.
|
||
|
||
Fertige Pack-Objekte (Container, Hangar-Tore, Betonsperren) stehen NICHT im Bauen-Tab,
|
||
sondern wie alle Objekte in der Objekt-Bibliothek unten.
|
||
|
||
## Snap (`src/editor/build_snap.gd`)
|
||
|
||
* **XZ:** Wände auf die nächste Zellkante — und zwar GANZ in die Zelle, in der die
|
||
Maus ist (Außenseite bündig mit der Kante, kein Überhang, Ecken schließen ohne
|
||
Lücke). Klick auf eine vorhandene Wand (Seite oder Oberkante) übernimmt deren Lage
|
||
exakt (ersetzen bzw. stapeln). Böden/Dächer/Fundamente in die Zellmitte, große
|
||
Dächer (4 m / 6 m) je nach Zellzahl auf Zellecke bzw. Zellmitte, Pfeiler auf die
|
||
Zellecke, Treppen auf eine 4 × 2-m-Fläche. `R` dreht die Wand um. 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. **Wände und
|
||
Pfeiler zählen von der Unterkante einer Decke/eines Fundaments**, die Decke selbst
|
||
liegt auf der Wandoberkante: jedes Geschoss liegt auf Vielfachen von 3 m, mit oder
|
||
ohne Decke darunter stehen die oberen Wände gleich hoch.
|
||
* **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.
|