L'estensione non indica il formato dello schematic — 31 file .schematic su 33 erano un'ipotesi errata
Cinque formati, quattro modi diversi di impacchettare i blocchi, e .schematic è condiviso da due di essi. Analizzare la radice NBT batte il fidarsi del nome file, con prove concrete.
Ci sono cinque formati di schematic in circolazione e il nome del file è un indizio piuttosto che una certezza. Il visualizzatore qui decide cosa sia un file guardandoci dentro, e c'è una ragione ben precisa per questo.
Cinque formati, cinque estensioni
| estensione | formato |
|---|---|
.nbt | struttura vanilla |
.schem | Sponge |
.schematic | Sponge — di default |
.litematic | Litematica |
.mcstructure | Bedrock |
La riga problematica è .schematic. That extension is shared by the MCEdit classico e quello di Sponge, e i file vengono rinominati da persone che non sanno o a cui non importa.
Conteggiato su un corpus reale: su 33 .schematic files, 31 were MCEdit, one was a vanilla structure and one was a Litematica. Quindi l'ipotesi predefinita dell'estensione è errata per quasi tutti loro, e due file non erano .schematic in any sense — just misnamed.
La soluzione è analizzare la radice NBT e lasciare che ciò che il file è abbia la meglio su come viene chiamato:
- a
Regionskey → Litematica paletteeblocks→ vanilla structure- altrimenti il test della forma di MCEdit, per poi ripiegare sull'estensione
Quattro modi per impacchettare gli stessi blocchi
I formati non differiscono solo nell'aspetto. Ognuno memorizza i dati dei blocchi in modo davvero diverso, e ogni scelta ha una conseguenza:
Vanilla .nbt — a sparse list. Una voce per blocco piazzato, ciascuna indicante un indice della tavolozza. L'aria è semplicemente assente, quindi una costruzione cava è leggera.
Sponge .schem — a varint stream. Indici della tavolozza impacchettati come interi a larghezza variabile: sette bit di carico utile per byte, bit alto impostato per continuare. Le tavolozze piccole costano un byte per blocco; una tavolozza oltre le 127 voci inizia a costarne due per gli indici alti. Compatto, ma autodescrittivo.
MCEdit .schematic — a flat byte array. Un byte per blocco, quindi massimo 256 tipi di blocchi — motivo esatto per cui necessita di un AddBlocks side-array packing a nono bit come semibyte per blocco. Questo è un formato legacy a ID numerici precedente agli stati dei blocchi, e i suoi ID si risolvono tramite una SchematicaMapping compound rather than being names.
Litematica .litematic — bit-packed longs. Gli indici sono impacchettati esattamente a 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.
Il minimo di 2 bit conta: persino una tavolozza a due blocchi non si comprime sotto i 2 bit per voce, quindi una costruzione monocromatica non è così piccola come suggerisce la matematica.
Bedrock è little-endian
.mcstructure is the odd one out at a lower level: Bedrock writes NBT little-endian dove ogni formato Java scrive in big-endian. Ciò viene stabilito prima dell'analisi di qualsiasi formato: leggendo i byte con l'endianness errata non si ottiene una struttura sbagliata, ma dati spazzatura che non possono essere analizzati affatto.
Cosa significa in pratica
Se uno schematic non si apre da qualche parte, la prima domanda non è "il file è danneggiato?", ma "questo file è davvero ciò che dice il suo nome?". Un .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.
E quando si confrontano due esportazioni della stessa costruzione, le differenze di dimensioni riguardano principalmente la codifica piuttosto che il contenuto — un file vanilla sparso .nbt of a hollow build and a bit-packed .litematic of the same thing are solving different problems.