Files
neolitematica/README.md
T
2026-11-04 13:36:01 +01:00

12 KiB
Raw Blame History

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.