Розширення не вказує формат схеми — 31 із 33 файлів .schematic виявилися чимось іншим
П'ять форматів, чотири різні способи пакування блоків, а .schematic використовується двома з них. Перевірка кореня NBT надійніша за назву файлу, що підтверджено підрахунками.
В обігу є п'ять форматів схем, і назва файлу — це радше підказка, ніж факт. Цей переглядач визначає тип файлу, заглядаючи всередину, і для цього є вагома причина.
П'ять форматів, п'ять розширень
| розширення | формат |
|---|---|
.nbt | ванільна структура |
.schem | Sponge |
.schematic | Sponge — за замовчуванням |
.litematic | Litematica |
.mcstructure | Bedrock |
Проблемний рядок — .schematic. That extension is shared by the класичний MCEdit формат та Sponge, а файли перейменовують люди, які про це не знають або яким байдуже.
Підраховано на реальній вибірці: з 33 .schematic files, 31 were MCEdit, one was a vanilla structure and one was a Litematica. Тож типове припущення за розширенням є хибним майже для всіх, а два файли взагалі не були .schematic in any sense — just misnamed.
Рішення полягає в перевірці кореня NBT, щоб те, чим файл є переважало над тим, як він називається:
- a
Regionskey → Litematica paletteіblocks→ vanilla structure- інакше перевірка форми MCEdit, а потім повернення до розширення
Чотири способи спакувати ті самі блоки
Формати відрізняються не просто косметично. Кожен із них зберігає дані блоків по-різному, і кожен вибір має наслідки:
Vanilla .nbt — a sparse list. Один запис на кожен розміщений блок, кожен вказує на індекс у палітрі. Повітря просто відсутнє, тому порожні споруди займають мало місця.
Sponge .schem — a varint stream. Індекси палітри спаковані як цілі числа змінної довжини: сім бітів корисного навантаження на байт, старший біт вказує на продовження. Малі палітри коштують один байт на блок; палітра понад 127 записів починає потребувати двох для вищих індексів. Щільно, але самоописово.
MCEdit .schematic — a flat byte array. Один байт на блок, тому максимум 256 типів блоків — саме тому йому потрібен AddBlocks side-array packing a дев'ятий біт у вигляді півбайта на блок. Це застарілий формат числових ID з часів до появи станів блоків, і його ID зіставляються через SchematicaMapping compound rather than being names.
Litematica .litematic — bit-packed longs. Індекси спаковані рівно по 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.
Нижня межа в 2 біти має значення: навіть палітра з двох блоків не стискається менше ніж до 2 бітів на запис, тож монохромна споруда не настільки мала, як передбачають розрахунки.
Bedrock використовує little-endian
.mcstructure is the odd one out at a lower level: Bedrock writes NBT у форматі little-endian тоді як кожен формат Java записує big-endian. Це вирішується ще до розбору формату — прочитайте байти з неправильним порядком, і ви отримаєте не просто помилкову структуру, а сміття, яке взагалі не вдасться розібрати.
Що це означає на практиці
Якщо схема десь не відкривається, перше питання не «чи пошкоджено файл», а «чи є цей файл тим, що зазначено в назві». А .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.
А при порівнянні двох експортів однієї споруди різниця в розмірі здебільшого стосується кодування а не вмісту — розріджена ванільна .nbt of a hollow build and a bit-packed .litematic of the same thing are solving different problems.