12 KiB
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
build/libs/neolitematica-1.21.1-1.0.0.jarin denmods-Ordner der ATM10-Instanz kopieren.- 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
- In einer Welt Alt+L drücken (oder Alt+M → „Schematic laden…").
- Importieren… wählen (Windows-Dateidialog) oder
.litematic-Dateien ins Minecraft-Fenster ziehen. - Schematic auswählen → Hier platzieren (oder Doppelklick). Die minimale Ecke liegt an deiner Position.
- Verschieben: Pfeiltasten (relativ zur Blickrichtung), Bild↑/Bild↓ für hoch/runter, mit Strg in 10er-Schritten. Exakte Koordinaten: Alt+E (Placement-Editor).
- Drehen mit Alt+R, Spiegeln im Placement-Editor.
- 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.