first commit

This commit is contained in:
lucashahmann committed 2026-11-04 13:36:01 +01:00
commit 07047c6ee4
53 files changed
+6267

No files matched your search

+190
View File
@@ -0,0 +1,190 @@
# NeoLitematica
Client-seitiger Schematic-Viewer und Bauassistent für **Minecraft 1.21.1 / NeoForge 21.1.265**. Er liest das
originale **`.litematic`-Format** von Litematica, zeigt Blueprints als transparente Vorschau in der Welt und
vergleicht sie mit dem tatsächlich Gebauten. Er ist eine eigenständige Neuimplementierung: Fabric, Malilib und
Code von Litematica werden nicht verwendet.
## Installation
1. `build/libs/neolitematica-1.21.1-1.0.0.jar` in den `mods`-Ordner der ATM10-Instanz kopieren.
2. Minecraft starten. **Auf dem Server muss nichts installiert werden**, auch nicht auf Multiplayer-Servern.
Schematics liegen in `.minecraft/schematics/` (bzw. `<Instanz>/schematics/`). Das ist derselbe Ordner wie bei
Litematica, vorhandene Sammlungen funktionieren also direkt.
## Schnellstart
1. In einer Welt **Alt+L** drücken (oder **Alt+M** → „Schematic laden…").
2. **Importieren…** wählen (Windows-Dateidialog) oder `.litematic`-Dateien ins Minecraft-Fenster ziehen.
3. Schematic auswählen → **Hier platzieren** (oder Doppelklick). Die minimale Ecke liegt an deiner Position.
4. Verschieben: **Pfeiltasten** (relativ zur Blickrichtung), **Bild↑/Bild↓** für hoch/runter,
mit **Strg** in 10er-Schritten. Exakte Koordinaten: **Alt+E** (Placement-Editor).
5. Drehen mit **Alt+R**, Spiegeln im Placement-Editor.
6. Bauen: Im Standardmodus „Nur fehlende" verschwinden korrekt gesetzte Blöcke sofort aus der Vorschau.
Falsche Blöcke werden rot markiert, falsche Ausrichtung/Zustand orange.
## Tastenbelegung
Alle Tasten lassen sich unter Optionen → Steuerung → „NeoLitematica" ändern (auch mit dem ATM10-Mod *Controlling*).
Die Standardbelegung nutzt Alt-Kombinationen, weil `M` in ATM10 bereits von FTB Chunks belegt ist.
| Taste | Funktion |
|---|---|
| Alt+M | Hauptmenü (Placements, Rendering-Einstellungen) |
| Alt+L | Schematic-Übersicht (Import, Laden, Umbenennen, Löschen) |
| Alt+E | Ausgewähltes Placement bearbeiten |
| Pfeiltasten | Placement vor/zurück/links/rechts (relativ zur Blickrichtung), Strg = ×10 |
| Bild↑ / Bild↓ | Placement hoch / runter |
| Alt+R | Im Uhrzeigersinn drehen |
| Alt+P | Placement an Spielerposition setzen |
| Alt+N | Nächstes Placement auswählen |
| Alt+H | Alle Schematics ein-/ausblenden |
| Alt+V | Rendering-Modus wechseln |
| *(nicht belegt)* | Gegen Uhrzeigersinn drehen, Spiegeln X/Y/Z, Placement ein-/ausblenden, Position zurücksetzen |
## Oberfläche
- **Hauptmenü (Alt+M):** Liste aller Placements der aktuellen Dimension mit Position, Größe und Drehung.
Bearbeiten, ein-/ausblenden, an eigene Position setzen, entfernen. Dazu Rendering an/aus, Modus,
Deckkraft, Render-Distanz sowie Links zu den Einstellungen und zur Steuerung.
- **Schematic-Übersicht (Alt+L):** alle `.litematic`-Dateien (auch in Unterordnern) mit Name, Autor,
Abmessungen, Blockanzahl, Volumen, Regionen, Version und Dateigröße. Import per Dialog oder Drag & Drop,
Ordner öffnen, umbenennen, löschen.
- **Placement-Editor (Alt+E):** X/Y/Z-Felder mit −10/−1/+1/+10 (Umschalt = ×10), „Zu meiner Position",
„Position zurücksetzen", „Als Ursprung merken", Drehung 0/90/180/270°, Spiegeln X/Z/Y, Sichtbarkeit,
Blockvergleich. Die Welt wird dabei weder pausiert noch weichgezeichnet, Änderungen sind live sichtbar.
- **HUD (oben links):** ausgewähltes Placement, Position, Größe, Drehung/Spiegelung, fehlende/falsche/korrekte Blöcke.
- **Einstellungen:** Mods → NeoLitematica → Konfiguration, oder Hauptmenü → „Einstellungen…".
Gespeichert in `config/neolitematica-client.toml`.
## Rendering-Modi und Farben
| Modus | Verhalten |
|---|---|
| Alle Blöcke | Alle Blöcke als Geisterblöcke, ohne Vergleich mit der Welt |
| Nur fehlende *(Standard)* | Geisterblöcke nur für fehlende Blöcke; korrekte Blöcke werden ausgeblendet |
| Prüfen | Wie „Nur fehlende", dazu korrekt = grün, überzählig = magenta |
Rot = falscher Block, orange = richtiger Block mit falschem Zustand (z. B. Treppenrichtung), violett = Block-Typ
nicht installiert. Ersetzbare Blöcke wie Gras, Schneeschicht oder Wasser zählen als „fehlend", nicht als „falsch".
## Placements und Speicherung
- Beliebig viele Placements gleichzeitig, jedes unabhängig positionierbar und ausblendbar.
- Gespeichert pro Welt bzw. Server in `config/neolitematica/placements/<welt>.json`, inklusive Dimension,
Position, ursprünglicher Position, Drehung, Spiegelung und Sichtbarkeit. Nach einem Neustart wird alles
wiederhergestellt.
- Die `.litematic`-Datei wird direkt verwendet, es gibt keine Konvertierung.
## Technische Umsetzung
```
de.lucas.litematica
├── NeoLitematica Einstieg, @Mod(dist = CLIENT), Event-Registrierung
├── schematic/ .litematic lesen (NBT, Bit-Array, Paletten, DataFixer), Dateiverwaltung, Cache
├── placement/ Placements, Transformation (Drehung/Spiegelung), Persistenz, Vergleichsstatistik
├── render/ Chunk-basiertes Mesh-Rendering, Blockvergleich, Block-Entity-Geister
├── gui/ Hauptmenü, Schematic-Übersicht, Placement-Editor, HUD
├── input/ Tastenbelegung und Hotkey-Verarbeitung
├── config/ NeoForge ModConfigSpec (Client)
├── mixin/ genau ein Mixin (siehe unten)
└── dev/ automatischer Ingame-Test, nur mit System-Property aktiv
```
**Dateiformat.** `.litematic` ist gzip-komprimiertes NBT: `Version`, `MinecraftDataVersion`, `Metadata`, und
`Regions` mit je `Position`, `Size` (auch negativ), `BlockStatePalette`, `BlockStates` (dicht gepacktes
`long[]`, Einträge können über Long-Grenzen reichen, `max(2, ceil(log2(Palettengröße)))` Bit) und
`TileEntities`. Index = `(y·sizeZ + z)·sizeX + x`. Dateien älterer Minecraft-Versionen werden über
Minecrafts eigenen DataFixer aktualisiert. Unbekannte Blöcke werden erkannt, gezählt, angezeigt und violett
markiert. Ungültige oder beschädigte Dateien liefern eine verständliche Fehlermeldung, kein Absturz.
**Rendering.** Ein Placement wird in 16×16×16-Welt-Sektionen zerlegt. Jede Sektion wird **einmal auf
Hintergrund-Threads** zu GPU-Vertex-Buffern gemesht (vanillas `BlockRenderDispatcher` mit echten Blockmodellen,
Biom-Farben, Flüssigkeiten) und nur neu gebaut, wenn sich das Placement oder ein Block in genau dieser
Sektion ändert. Pro Frame werden nur noch gecachte Buffer gebunden, plus Frustum-Culling und Render-Distanz.
Flächen zwischen benachbarten Schematic-Blöcken werden weggelassen. Connected Textures (CTM, Fusion,
Connected Glass) verbinden sich innerhalb des Schematics. Die Weltdaten für den Vergleich werden auf dem
Main-Thread kopiert, sodass Worker nie auf live Chunk-Daten zugreifen (wie vanillas Chunk-Builder).
Gezeichnet wird in `RenderLevelStageEvent.AFTER_TRANSLUCENT_BLOCKS` mit vanilla-Shadern
(`rendertype_cutout` + Alpha-Blending über `ColorModulator`). Geisterblöcke sind voll beleuchtet und damit
auch nachts und unter Tage sichtbar.
**Warum ein Mixin?** NeoForge hat kein clientseitiges Event für Blockänderungen. Damit die Vorschau sofort
reagiert, wenn ein Block gesetzt oder abgebaut wird, hängt sich ein einzelner `@Inject` an
`LevelRenderer#setSectionDirty`, über den vanilla alle Neuzeichnungs-Anforderungen schickt. Das Mixin ist
mit `require = 0` markiert: Ersetzt ein anderer Mod die Methode, startet das Spiel trotzdem, und Updates
kommen dann nur noch über `ChunkEvent.Load`.
**Client-only.** `@Mod(dist = Dist.CLIENT)` (die Mod-Klasse wird auf dedizierten Servern nie geladen),
`displayTest = "IGNORE_ALL_VERSION"`, das Mixin nur im `client`-Abschnitt, keine Netzwerk-Payloads, und alle
Abhängigkeiten in der `neoforge.mods.toml` mit `side = "CLIENT"`. Außer NeoForge gibt es keine Abhängigkeiten.
**Transformation.** Reihenfolge: Spiegeln Y → X → Z → Drehen um Y, wie bei vanillas Strukturplatzierung.
Blockzustände nutzen vanillas `BlockState.mirror/rotate`, das alle Vanilla- und korrekt implementierten
Mod-Blöcke unterstützt (Treppen, Türen, Öfen, Truhen, Schienen, …). Ein Unit-Test prüft für alle 32
Kombinationen, dass Positions- und Zustandstransformation übereinstimmen.
## Kompatibilität mit ATM10
Grundlage ist eine Analyse von `mods-atm10.txt` (464 Mods):
| Mod(s) | Bewertung |
|---|---|
| Sodium / Embeddium / Iris / Oculus | **Nicht in ATM10.** Damit läuft die Welt über vanillas Renderer, dessen Schnittstellen hier genutzt werden. |
| ImmediatelyFast, ModernFix, FerriteCore | Unkritisch: Es werden nur öffentliche Render-APIs genutzt, Blockmodelle lädt der Mod wie vanilla. |
| CTM, Fusion, Connected Glass, Chisel, Rechiseled, Chipped | Unterstützt: Verbindungen werden aus den Schematic-Nachbarn berechnet. |
| Macaw's (mcw-*), Supplementaries, viele Deko-Mods | Normale Blockmodelle, werden korrekt dargestellt und gedreht. |
| FramedBlocks, Mekanism Covers | **Einschränkung:** Das Tarn-Aussehen hängt an Block-Entity-Daten der echten Welt; in der Vorschau erscheint der leere Rahmen. Der Blockvergleich funktioniert trotzdem. |
| Create (+Addons), AE2, Refined Storage, Mekanism, Pipez, LaserIO | **Einschränkung:** Teile, die über Block-Entity-Renderer oder Flywheel gezeichnet werden (Wellen, Zahnräder, Kabelverbindungen), fehlen in der Vorschau teilweise. Der Grundblock und der Vergleich funktionieren. |
| FTB Chunks, JourneyMap | Belegen `M` bzw. `J` → Standardtasten von NeoLitematica nutzen Alt+… |
| Building Gadgets 2, Construction Sticks, Mining Gadgets | Zeichnen eigene Vorschauen, ohne Konflikt. |
| Controlling, KeybindsPurger | Zum Umbelegen der Tasten nutzbar. |
Kein Mod wird verändert, und Serverkommunikation findet nicht statt. Wer Embeddium oder Oculus nachinstalliert:
Das Rendering sollte weiter funktionieren, aber mit aktiven Shaderpacks sind Darstellungsfehler möglich, und
Embeddium ersetzt eventuell die Methode des Mixins (dann Updates nur bei Chunk-Ladevorgängen). Getestet ist
das nicht.
## Bekannte Einschränkungen
- **Drehung um X- und Z-Achse wird nicht angeboten.** Minecraft-Blockzustände können „seitlich gekippte"
Treppen, Türen usw. nicht abbilden; eine solche Drehung würde zwangsläufig falsche Blöcke erzeugen.
Angeboten werden Drehung um Y in 90°-Schritten sowie Spiegeln an X, Y und Z.
- **Spiegeln an Y ist eine Annäherung:** Halbe Blöcke, Stufen, Türen, oben/unten-Ausrichtung,
Boden/Decke-Befestigung und Tropfstein werden umgedreht. Blöcke ohne vertikales Gegenstück (z. B.
hängende Laternen) behalten ihren Zustand.
- **Entities** (Gemälde, Rahmen, Rüstungsständer) im Schematic werden nicht angezeigt.
- **Block-Entities** werden für Vanilla-Blöcke (Truhen, Schilder, Betten, Banner, Köpfe, Töpfe, …) transparent
dargestellt. Mod-Block-Entities bekommen absichtlich keine Welt-Referenz; schlägt ihr Renderer fehl, wird
der Typ für die Sitzung übersprungen und geloggt.
- **Blockvergleich** gilt nur für Sektionen innerhalb der Render-Distanz und für geladene Chunks. Die
Statistik weist „In der Nähe" aus, solange nicht alles geprüft ist.
- **Umbenennen oder Löschen** einer Schematic-Datei trennt bestehende Placements dieser Datei. Beim nächsten
Betreten der Welt erscheint eine Fehlermeldung; neu platzieren behebt das.
- Kein Speichern neuer Schematics aus der Welt, keine Materialliste und kein automatisches Platzieren
(Litematicas „Easy Place"). Die Architektur ist darauf vorbereitet; die Funktionen fehlen aber noch.
## Aus dem Quellcode bauen
Voraussetzung: JDK 21.
```
gradlew build # Kompilieren + Unit-Tests → build/libs/neolitematica-1.21.1-1.0.0.jar
gradlew test # Nur Unit-Tests (Reader gegen "Another castle", Transformationen)
gradlew runClient # Entwicklungs-Client
gradlew runSmokeTest # Automatischer Ingame-Test, siehe unten
gradlew runServer # Dedizierter Server (vorher EULA in run-server/eula.txt selbst akzeptieren)
```
**Automatischer Ingame-Test** (`runSmokeTest`): erstellt eine Flachwelt, platziert
`ressources/Another castle.litematic`, baut über den integrierten Server einen Teil korrekt, falsch und
überzählig nach, prüft die Vergleichszahlen in allen Modi, dreht das Placement, öffnet alle Bildschirme,
speichert Screenshots nach `run/screenshots/smoke_*.png` und beendet das Spiel. Letztes Ergebnis:
`correct=3452 missing=11355 wrongBlock=78 wrongState=20 extra=25` bei 14905 Blöcken, was genau den gesetzten
Blöcken entspricht.
## Lizenz und Herkunft
MIT. Litematica (LGPLv3, masa) diente nur als funktionale Referenz und für das Dateiformat; es wurde kein
Code übernommen.