De extensie vertelt je niet het schematic-formaat — 31 van de 33 .schematic-bestanden waren een aanname van iets anders
Vijf formaten, vier verschillende manieren om blokken in te pakken, en .schematic wordt door twee ervan gedeeld. Het inspecteren van de NBT-root wint het van het vertrouwen op de bestandsnaam, met geteld bewijs.
Er zijn vijf schematic-formaten in omloop, en de bestandsnaam is eerder een hint dan een feit. De viewer hier bepaalt wat een bestand is door erin te kijken, en daar is een gegronde reden voor.
Vijf formaten, vijf extensies
| extensie | formaat |
|---|---|
.nbt | vanilla-structuur |
.schem | Sponge |
.schematic | Sponge — standaard |
.litematic | Litematica |
.mcstructure | Bedrock |
De probleemrij is .schematic. That extension is shared by the klassiek MCEdit formaat en dat van Sponge, en bestanden worden hernoemd door mensen die het niet weten of er niet om geven.
Geteld op een echt corpus: van de 33 .schematic files, 31 were MCEdit, one was a vanilla structure and one was a Litematica. Dus de standaard aanname van de extensie is voor bijna allemaal onjuist, en twee bestanden waren niet .schematic in any sense — just misnamed.
De oplossing is om de NBT-root te inspecteren en wat het bestand is te laten winnen van hoe het heet:
- a
Regionskey → Litematica paletteenblocks→ vanilla structure- anders de MCEdit-vormtest, en val dan terug op de extensie
Vier manieren om dezelfde blokken in te pakken
De formaten verschillen niet alleen cosmetisch. Elk slaat blokgegevens op een wezenlijk andere manier op, en elke keuze heeft gevolgen:
Vanilla .nbt — a sparse list. Eén vermelding per geplaatst blok, die elk naar een paletindex verwijzen. Lucht ontbreekt simpelweg, dus een hol bouwwerk is goedkoop.
Sponge .schem — a varint stream. Paletindices ingepakt als integers met variabele breedte: zeven bits payload per byte, hoogste bit ingesteld om door te gaan. Kleine paletten kosten één byte per blok; een palet van meer dan 127 vermeldingen begint twee bytes te kosten voor de hoge indices. Compact, maar zelfbeschrijvend.
MCEdit .schematic — a flat byte array. Eén byte per blok, dus maximaal 256 bloktypen — wat precies de reden is waarom het een AddBlocks side-array packing a negende bit als een nibble per blok nodig heeft. Dit is een verouderd numeriek ID-formaat van vóór bloktoestanden, en de ID's ervan worden herleid via een SchematicaMapping compound rather than being names.
Litematica .litematic — bit-packed longs. Indices zijn ingepakt op exact max(2, bits needed for the palette) bits each, LSB-first, and an entry may straddle the boundary between two longs. A 5-entry palette uses 3 bits per block; a 300-entry one uses 9.
De ondergrens van 2 bits maakt uit: zelfs een palet van twee blokken comprimeert niet onder de 2 bits per vermelding, dus een monochroom bouwwerk is niet zo klein als de wiskunde suggereert.
Bedrock is little-endian
.mcstructure is the odd one out at a lower level: Bedrock writes little-endian NBT terwijl elk Java-formaat big-endian schrijft. Dat wordt bepaald voordat er enige formaatparsing plaatsvindt — lees de bytes met de verkeerde endianness en je krijgt geen verkeerde structuur, maar troep die helemaal niet geparsed kan worden.
Wat dit praktisch betekent
Als een schematic ergens niet opent, is de eerste vraag niet "is het bestand beschadigd", maar "is dit bestand wat de naam zegt". Een .schematic from a download page is much more likely to be MCEdit than Sponge, and a tool that trusts the extension will reject a perfectly good file.
En bij het vergelijken van twee exports van hetzelfde bouwwerk gaan grootteverschillen vooral over codering in plaats van inhoud — een spaarzame vanilla .nbt of a hollow build and a bit-packed .litematic of the same thing are solving different problems.