Hindi sinasabi ng extension ang schematic format — 31 sa 33 .schematic file ay hula ng iba
Limang format, apat na magkakaibang paraan ng pag-pack ng mga block, at ang .schematic ay pinagsasaluhan ng dalawa sa kanila. Mas mainam ang pagsuri sa NBT root kaysa sa pagtitiwala sa pangalan ng file, na may binilang na ebidensya.
May limang schematic format na ginagamit, at ang pangalan ng file ay pahiwatig lamang sa halip na katotohanan. Tinutukoy ng viewer dito kung ano ang file sa pamamagitan ng pagtingin sa loob nito, at may nasukat na dahilan para doon.
Limang format, limang extension
| extension | format |
|---|---|
.nbt | vanilla structure |
.schem | Sponge |
.schematic | Sponge — bilang default |
.litematic | Litematica |
.mcstructure | Bedrock |
Ang linyang may problema ay .schematic. That extension is shared by the klasikong MCEdit format at ng Sponge, at pinapalitan ang pangalan ng mga file ng mga taong hindi alam o walang pakialam.
Binilang sa isang totoong corpus: sa 33 .schematic files, 31 were MCEdit, one was a vanilla structure and one was a Litematica. Kaya ang default na hula ng extension ay mali para sa halos lahat ng mga ito, at dalawang file ay hindi .schematic in any sense — just misnamed.
Ang solusyon ay suriin ang NBT root at hayaan kung ano ang file ay ang manaig sa kung ano ang tawag dito:
- a
Regionskey → Litematica paletteatblocks→ vanilla structure- kung hindi ay ang MCEdit shape test, pagkatapos ay bumalik sa extension
Apat na paraan upang i-pack ang parehong mga block
Hindi lang sa panlabas nagkakaiba ang mga format. Bawat isa ay nag-iimbak ng data ng block sa totoong magkakaibang paraan, at bawat pagpili ay may epekto:
Vanilla .nbt — a sparse list. Isang entry bawat nakalagay na block, bawat isa ay nagpapangalan ng palette index. Sadyang wala ang Air, kaya magaan ang hungkag na build.
Sponge .schem — a varint stream. Naka-pack ang mga palette index bilang mga variable-width integer: pitong bit ng payload bawat byte, nakatakda ang mataas na bit upang magpatuloy. Ang maliliit na palette ay nagkakahalaga ng isang byte bawat block; ang palette na higit sa 127 entry ay nagsisimulang magkahalaga ng dalawa para sa matataas na index. Siksik, ngunit nagpapaliwanag sa sarili.
MCEdit .schematic — a flat byte array. Isang byte bawat block, kaya 256 uri ng block ang maximum — kung kaya't eksaktong kailangan nito ng isang AddBlocks side-array packing a ikasiyam na bit bilang nibble bawat block. Isa itong legacy numeric-id format mula bago ang mga block state, at nalulutas ang mga id nito sa pamamagitan ng isang SchematicaMapping compound rather than being names.
Litematica .litematic — bit-packed longs. Naka-pack ang mga index sa eksaktong 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.
Ang floor na 2 bits ang mahalaga: kahit ang two-block palette ay hindi nagko-compress nang mas mababa sa 2 bits bawat entry, kaya ang monochrome na build ay hindi kasingliit ng iminumungkahi ng matematika.
Ang Bedrock ay little-endian
.mcstructure is the odd one out at a lower level: Bedrock writes little-endian NBT kung saan ang bawat Java format ay nagsusulat ng big-endian. Napagpapasyahan iyon bago mangyari ang anumang pag-parse ng format — basahin ang mga byte nang may maling endianness at hindi ka makakakuha ng maling structure, makakakuha ka ng basura na hindi ma-parse kahit kailan.
Ano ang ibig sabihin nito sa praktika
Kung hindi magbubukas ang isang schematic sa isang lugar, ang unang tanong ay hindi "sira ba ang file" kundi "ito ba ang sinasabi ng pangalan nito". Isang .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.
At kapag naghahambing ng dalawang export ng parehong build, ang pagkakaiba sa laki ay kadalasang tungkol sa encoding sa halip na nilalaman — isang sparse na vanilla .nbt of a hollow build and a bit-packed .litematic of the same thing are solving different problems.