Die Dateiendung verrät nicht das Schemaformat – 31 von 33 .schematic-Dateien waren nur Vermutungen
Fünf Formate, vier verschiedene Arten, Blöcke zu packen, und .schematic wird von zweien davon verwendet. Das Auslesen des NBT-Roots ist besser, als dem Dateinamen zu vertrauen, mit gezählten Beweisen.
Es sind fünf Schemaformate im Umlauf, und die Dateiendung ist eher ein Hinweis als eine Tatsache. Der hier verwendete Viewer entscheidet, um welchen Dateityp es sich handelt, indem er in die Datei schaut, und dafür gibt es einen messbaren Grund.
Fünf Formate, fünf Endungen
| Endung | Format |
|---|---|
.nbt | Vanilla-Struktur |
.schem | Sponge |
.schematic | Sponge – standardmäßig |
.litematic | Litematica |
.mcstructure | Grundgestein |
Die problematische Zeile ist .schematic. Diese Endung wird vom klassischen MCEdit-Format und dem von Sponge geteilt, und Dateien werden von Leuten umbenannt, die es nicht wissen oder denen es egal ist.
An einem echten Korpus gezählt: Von 33 .schematic-Dateien waren 31 MCEdit, eine war eine Vanilla-Struktur und eine war eine Litematica. Die Standardvermutung der Endung ist also bei fast allen falsch, und zwei Dateien waren in keiner Weise .schematic – einfach falsch benannt.
Die Lösung besteht darin, den NBT-Root auszulesen und das zu lassen, was die Datei ist, über dem zu stehen, wie sie genannt wird:
- ein
Regions-Schlüssel → Litematica paletteundblocks→ Vanilla-Struktur- ansonsten der MCEdit-Formtest, dann Rückgriff auf die Endung
Vier Arten, dieselben Blöcke zu packen
Die Formate unterscheiden sich nicht kosmetisch. Jedes speichert Blockdaten auf eine wirklich andere Weise, und jede Wahl hat eine Konsequenz:
Vanilla .nbt – eine spärliche Liste. Ein Eintrag pro platziertem Block, jeder benennt einen Palettenindex. Luft ist einfach nicht vorhanden, daher ist ein hohler Bau günstig.
Sponge .schem – ein Varint-Stream. Palettenindizes sind als variabler Länge gepackte Ganzzahlen: sieben Bits Nutzlast pro Byte, höchstes Bit gesetzt, um fortzufahren. Kleine Paletten kosten ein Byte pro Block; eine Palette über 127 Einträgen beginnt, zwei für die hohen Indizes zu kosten. Dicht, aber selbsterklärend.
MCEdit .schematic – ein flaches Byte-Array. Ein Byte pro Block, also maximal 256 Blocktypen – genau deshalb benötigt es ein AddBlocks-Seiten-Array, das ein neuntes Bit als Nibble pro Block packt. Dies ist ein altes numerisches ID-Format aus der Zeit vor den Blockzuständen, und seine IDs werden über ein SchematicaMapping-Compound aufgelöst, anstatt Namen zu sein.
Litematica .litematic – Bit-gepackte Longs. Indizes werden mit genau max(2, bits needed for the palette) Bits pro Stück gepackt, LSB-zuerst, und ein Eintrag kann die Grenze zwischen zwei Longs überschreiten. Eine 5-Einträge-Palette verwendet 3 Bits pro Block; eine 300-Einträge-Palette verwendet 9.
Die Untergrenze von 2 Bits ist wichtig: Selbst eine Zwei-Block-Palette komprimiert nicht unter 2 Bits pro Eintrag, daher ist ein monochromer Bau nicht so klein, wie die Mathematik vermuten lässt.
Grundgestein ist Little-Endian
.mcstructure ist auf einer niedrigeren Ebene der Ausreißer: Grundgestein schreibt Little-Endian NBT, während jedes Java-Format Big-Endian schreibt. Das wird entschieden, bevor irgendeine Format-Analyse stattfindet – liest man die Bytes mit der falschen Endianness, erhält man keine falsche Struktur, sondern Müll, der überhaupt nicht analysiert werden kann.
Was das praktisch bedeutet
Wenn sich ein Schema irgendwo nicht öffnen lässt, ist die erste Frage nicht „ist die Datei beschädigt“, sondern „ist diese Datei das, was ihr Name sagt“. Eine .schematic von einer Download-Seite ist viel wahrscheinlicher MCEdit als Sponge, und ein Tool, das der Erweiterung vertraut, wird eine perfekt gute Datei ablehnen.
Und beim Vergleich zweier Exporte desselben Baus beziehen sich Größenunterschiede meist auf die Kodierung und nicht auf den Inhalt – ein spärliches Vanilla-.nbt eines hohlen Baus und ein Bit-gepacktes .litematic desselben lösen unterschiedliche Probleme.