拡張子はschematicの形式を教えてくれない — 33個の.schematicファイルのうち31個は別物だった
5つの形式、4通りのブロック格納方法、そして.schematicはそのうち2つが共有している。実測では33個の.schematicのうち31個がMCEdit形式だった。NBTルートを sniff する方がファイル名を信じるより確実だ。
世に出回っているschematic形式は5つあり、ファイル名は事実ではなくヒントにすぎない。ここで紹介するビューアはファイルの中身を見て形式を判定するが、それには測定された理由がある。
5つの形式、5つの拡張子
| 拡張子 | 形式 |
|---|---|
.nbt | バニラ構造物 |
.schem | Sponge |
.schematic | Sponge — デフォルトで |
.litematic | Litematica |
.mcstructure | Bedrock |
問題なのは.schematicの行だ。この拡張子はクラシックMCEdit形式とSpongeの形式が共有しており、知らないか気にしない人によってファイル名が付け替えられる。
実際のコーパスで数えたところ、33個の.schematicファイルのうち31個がMCEdit、1個がバニラ構造物、1個がLitematicaだった。つまり拡張子によるデフォルトの推測はほぼすべてで外れており、2つのファイルはどの意味でも.schematicではなかった — ただの名前間違いだ。
修正方法はNBTルートを sniff し、ファイルが何であるかをファイルが何と呼ばれているかより優先することだ:
Regionsキー → Litematicapaletteかつblocks→ バニラ構造物- それ以外はMCEdit形状テスト、そして拡張子にフォールバック
同じブロックを詰め込む4つの方法
これらの形式は見た目の違いではない。それぞれがブロックデータを本当に異なる方法で格納しており、それぞれの選択には結果が伴う:
バニラ.nbt — リスト。 保存された位置ごとに1エントリ、それぞれがパレットインデックスを指す。空気は他のブロックと同じように格納され、ストラクチャーヴォイドだけが除外される。つまり空洞の建造物が安く済むのは、保存前に内部がヴォイド化されていた場合だけだ。
Sponge .schem — varintストリーム。 パレットインデックスを可変幅整数としてパックする: 1バイトあたり7ビットのペイロードで、継続する場合は上位ビットを立てる。小さなパレットは1ブロックあたり1バイトで済むが、127エントリを超えるパレットでは高いインデックスに2バイトかかり始める。密だが自己記述的だ。
MCEdit .schematic — フラットなバイト配列。 1ブロックあたり1バイトなので、最大256種類のブロック — まさにそのため、オプションのAddBlocksサイド配列があり、ブロックあたり1ニブルでさらに4ビットのIDを追加し、IDは4,095まで届く。これはブロックステート以前のレガシーな数値ID形式だ: そのIDは数値であり、Schematicaが書き込んだ場合はSchematicaMappingコンパウンドを通じて解決され、そうでなければバニラ1.12のIDテーブルを通じて解決される。
Litematica .litematic — ビットパックされたlong。 インデックスはちょうどmax(2, bits needed for the palette)ビットずつ、LSBファーストでパックされ、エントリは2つのlongの境界をまたぐことがある。5エントリのパレットは1ブロックあたり3ビット、300エントリのものは9ビットを使う。
2ビットという下限が重要だ: たとえ2ブロックのパレットでも1エントリあたり2ビットを下回ることはないので、モノクロの建造物は計算が示唆するほど小さくはならない。
Bedrockはリトルエンディアン
.mcstructureはより低いレベルで異端だ: BedrockはリトルエンディアンNBTを書き、すべてのJava形式はビッグエンディアンを書く。これは形式解析が始まる前に決まる — 間違ったエンディアンでバイトを読むと、間違った構造物が得られるのではなく、まったくパースに失敗するゴミが得られる。
実用的に何を意味するか
schematicがどこかで開かない場合、最初の問いは「ファイルが壊れているか」ではなく「このファイルは名前が示す通りのものか」だ。ダウンロードページの.schematicはSpongeよりもMCEditである可能性がはるかに高く、拡張子を信じるツールは完全に正常なファイルを拒否してしまう。
そして同じ建造物の2つのエクスポートを比較するとき、サイズの違いはほとんどが内容ではなくエンコーディングに関するものだ — 空洞建造物のヴォイド化されたバニラ.nbtと、同じもののビットパックされた.litematicは、別の問題を解いているのだ。