Die Dateiendung verrät nicht das Schematic-Format — 31 von 33 .schematic-Dateien waren die Vermutung von etwas anderem
Fünf Formate, vier verschiedene Arten der Blockpackung, und .schematic wird von zweien geteilt. Das NBT-Wurzelelement zu sniffen schlägt dem Dateinamen zu vertrauen, mit gezählten Belegen.
Es sind fünf Schematic-Formate im Umlauf, und der Dateiname ist eher ein Hinweis als eine Tatsache. Der Betrachter hier entscheidet, was eine Datei ist, indem er in sie hineinschaut, und dafür gibt es einen gemessenen Grund.
Fünf Formate, fünf Dateiendungen
| Dateiendung | Format |
|---|---|
.nbt | Vanilla-Struktur |
.schem | Sponge |
.schematic | Sponge — standardmäßig |
.litematic | Litematica |
.mcstructure | Bedrock |
Die Problemzeile ist .schematic. Diese Dateiendung wird sowohl vom klassischen MCEdit-Format als auch von dem von Sponge geteilt, und Dateien werden von Leuten umbenannt, die es nicht wissen oder denen es egal ist.
Gezählt an einem echten Korpus: von 33 .schematic-Dateien waren 31 MCEdit, eine war eine Vanilla-Struktur und eine war eine Litematica. Die Standardvermutung der Dateiendung ist also für fast alle von ihnen falsch, und zwei Dateien waren in keiner Hinsicht .schematic — nur falsch benannt.
Die Lösung ist, das NBT-Wurzelelement zu sniffen und das, was die Datei ist, über das gewinnen zu lassen, was sie genannt wird:
- ein
Regions-Schlüssel → Litematica paletteundblocks→ Vanilla-Struktur- andernfalls der MCEdit-Formtest, dann Rückgriff auf die Dateiendung
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 Liste. Ein Eintrag pro gespeicherter Position, jeder nennt einen Palettenindex. Luft wird wie jeder andere Block gespeichert; nur die Konstruktionsleere wird ausgelassen, sodass ein hohler Bau nur dann günstig ist, wenn sein Inneres vor dem Speichern geleert wurde.
Sponge .schem — ein Varint-Stream. Palettenindizes als Ganzzahlen variabler Breite gepackt: sieben Bits Nutzlast pro Byte, hohes Bit gesetzt zum Fortfahren. Kleine Paletten kosten ein Byte pro Block; eine Palette über 127 Einträgen beginnt, zwei für die hohen Indizes zu kosten. Dicht, aber selbstbeschreibend.
MCEdit .schematic — ein flaches Byte-Array. Ein Byte pro Block, also maximal 256 Blocktypen — genau deshalb gibt es ein optionales AddBlocks-Seitenarray, das vier weitere ID-Bits als Nibble pro Block hinzufügt, sodass IDs 4.095 erreichen. Dies ist ein Legacy-Format mit numerischen IDs von vor den Blockzuständen: seine IDs sind Zahlen, aufgelöst durch ein SchematicaMapping-Compound, wenn Schematica eines geschrieben hat, und andernfalls durch die Vanilla-1.12-ID-Tabelle.
Litematica .litematic — bitgepackte 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 überspannen. Eine Palette mit 5 Einträgen verwendet 3 Bits pro Block; eine mit 300 Einträgen verwendet 9.
Die Untergrenze von 2 Bits ist wichtig: Selbst eine Palette mit zwei Blöcken komprimiert nicht unter 2 Bits pro Eintrag, sodass ein einfarbiger Bau nicht so klein ist, wie die Mathematik vermuten lässt.
Bedrock ist Little-Endian
.mcstructure ist auf einer tieferen Ebene der Sonderfall: Bedrock schreibt Little-Endian-NBT, wo jedes Java-Format Big-Endian schreibt. Das wird entschieden, bevor irgendein Format-Parsing stattfindet — liest man die Bytes mit der falschen Endianness, bekommt man keine falsche Struktur, sondern Müll, der gar nicht erst geparst werden kann.
Was das praktisch bedeutet
Wenn ein Schematic irgendwo nicht geöffnet werden kann, lautet 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 Werkzeug, das der Dateiendung vertraut, wird eine völlig gute Datei ablehnen.
Und beim Vergleich zweier Exporte desselben Baus geht es bei Größenunterschieden meist um die Kodierung und nicht um den Inhalt — eine geleerte Vanilla-.nbt eines hohlen Baus und eine bitgepackte .litematic desselben Dings lösen unterschiedliche Probleme.