The Best Resource for Minecraft
The Best Resource for Minecraft

Розширення не вказує формат схеми — 31 із 33 файлів .schematic виявилися чимось іншим

Розширення не вказує формат схеми — 31 із 33 файлів .schematic виявилися чимось іншим

П'ять форматів, чотири різні способи пакування блоків, а .schematic використовується двома з них. Перевірка кореня NBT надійніша за назву файлу, що підтверджено підрахунками.

В обігу є п'ять форматів схем, і назва файлу — це радше підказка, ніж факт. Цей переглядач визначає тип файлу, заглядаючи всередину, і для цього є вагома причина.

П'ять форматів, п'ять розширень

розширенняформат
.nbtванільна структура
.schemSponge
.schematicSponge — за замовчуванням
.litematicLitematica
.mcstructureBedrock

Проблемний рядок — .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 Regions key → 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.

Спробувати інструмент: Schematic 3D Viewer →