Руководства / Команды и данные
Расширение не сообщает вам формат схематики — 31 из 33 файлов .schematic оказались чьей-то догадкой
Пять форматов, четыре разных способа упаковки блоков, и .schematic используется двумя из них. Определение корня NBT надёжнее доверия к имени файла — с подтверждёнными данными.
В обращении находится пять форматов схематик, и имя файла — это скорее подсказка, чем факт. Просмотрщик здесь определяет, что это за файл, заглядывая внутрь него, и на это есть измеренная причина.
Пять форматов, пять расширений
| расширение | формат |
|---|---|
.nbt | ванильная структура |
.schem | Sponge |
.schematic | Sponge — по умолчанию |
.litematic | Litematica |
.mcstructure | Bedrock |
Проблемная строка — .schematic. Это расширение используется совместно классическим форматом MCEdit и форматом Sponge, а файлы переименовывают люди, которые не знают или которым всё равно.
Подсчитано на реальном корпусе: из 33 файлов .schematic 31 был MCEdit, один — ванильной структурой, а один — Litematica. Так что догадка по умолчанию на основе расширения ошибочна почти для всех них, а два файла не были .schematic ни в каком смысле — просто неправильно названы.
Решение — определить корень NBT и позволить тому, чем файл является, победить то, как он называется:
- ключ
Regions→ Litematica paletteиblocks→ ванильная структура- иначе проверка формы MCEdit, затем откат к расширению
Четыре способа упаковать одни и те же блоки
Форматы различаются не косметически. Каждый хранит данные о блоках по-настоящему по-разному, и каждый выбор имеет последствия:
Ванильный .nbt — список. Одна запись на сохранённую позицию, каждая называет индекс палитры. Воздух хранится как любой другой блок; опускается только пустой блок, так что полая постройка дёшева только если её внутренность была заполнена пустотой перед сохранением.
Sponge .schem — поток varint. Индексы палитры упакованы как целые переменной ширины: семь бит полезной нагрузки на байт, старший бит установлен для продолжения. Маленькие палитры стоят один байт на блок; палитра свыше 127 записей начинает стоить два для высоких индексов. Плотно, но самоописательно.
MCEdit .schematic — плоский массив байтов. Один байт на блок, поэтому максимум 256 типов блоков — именно поэтому у него есть необязательный боковой массив AddBlocks, добавляющий ещё четыре бита id как полубайт на блок, так что id достигают 4 095. Это устаревший формат числовых id из времён до состояний блоков: его id — это числа, разрешаемые через составное SchematicaMapping, когда Schematica его записывала, и через ванильную таблицу id 1.12 в противном случае.
Litematica .litematic — битово упакованные long. Индексы упакованы ровно по max(2, bits needed for the palette) бит каждый, начиная с младшего бита, и запись может пересекать границу между двумя long. Палитра из 5 записей использует 3 бита на блок; из 300 записей — 9.
Минимум в 2 бита важен: даже палитра из двух блоков не сжимается ниже 2 бит на запись, так что монохромная постройка не так мала, как suggests математика.
Bedrock — little-endian
.mcstructure — исключение на более низком уровне: Bedrock записывает little-endian NBT, тогда как каждый формат Java пишет big-endian. Это решается до любого разбора формата — прочитайте байты с неправильной endianness, и вы получите не неправильную структуру, а мусор, который вообще не разбирается.
Что это значит на практике
Если схематика где-то не открывается, первый вопрос — не «файл повреждён», а «этот файл — то, что написано в его имени». .schematic со страницы загрузки гораздо вероятнее окажется MCEdit, чем Sponge, и инструмент, доверяющий расширению, отвергнет совершенно хороший файл.
И при сравнении двух экспортов одной и той же постройки различия в размере в основном касаются кодирования, а не содержимого — ванильный .nbt с пустотами для полой постройки и битово упакованный .litematic для того же самого решают разные задачи.