Структура .nbt зберігає індекси палітри, а не назви блоків — ось чому вона така мала
Уся споруда тримається на трьох ключах: size, palette та blocks. Кожен блок — це ціле число, яке вказує на палітру, тому об'єм каменю 32³ займає один рядок і 32,768 чисел.
A .nbt structure file — the thing a structure block saves and a datapack ships — is a much simpler format than it looks from the outside. Everything a build needs sits in a handful of top-level keys, and one design decision explains why the files are as small as they are.
Три ключі, на яких тримається споруда
size [x, y, z] — a list of exactly three integers
palette [ { Name, Properties } … ] — every DISTINCT block state, once
blocks [ { pos, state, nbt } … ] — one entry per placed block
palette holds each distinct block state exactly once. Запис — це Name — the block id, like minecraft:oak_stairs — plus an optional Properties compound holding its blockstate, such as facing: north and half: bottom.
blocks never repeats a name. Кожен запис містить pos of three integers and a state, and state is an індекс у палітрі, а не block id. Дубові сходи, повернені на північ, записуються як текстовий рядок лише один раз, а всі наступні — як мале ціле число.
У цьому й увесь секрет. Об'єм звичайного каменю 32 × 32 × 32 — це один запис у палітрі та 32,768 індексних чисел, а не 32,768 копій слова minecraft:stone. The palette grows with how many різних речей ви використали для будівництва, а список блоків зростає разом із тим, наскільки великою є ваша споруда. Це зовсім різні числа, і зазвичай лише одне з них є великим.
Два наслідки, які варто враховувати під час проєктування
Стани блоків розширюють вашу палітру, а не список блоків. Дубові сходи — це не один запис у палітрі, а окремий для кожної фактично використаної орієнтації. Чотири сторони світу, верхня чи нижня половина, прямі та внутрішні/зовнішні кути: один і той самий блок може займати десяток слотів палітри. Тому деталізована споруда має велику палітру, а проста — ні, незалежно від розміру.
Лише розміщені блоки отримують запис. Список блоків — це саме список, а не щільний 3D-масив, і запис, якого там немає, просто відсутній — переглядач на цій сторінці заповнює свою сітку -1 and treats a missing coordinate as nothing placed. A hollow build is genuinely cheaper to store than a solid one of the same dimensions.
nbt is per-block and optional
Кожен запис у blocks may carry its own nbt compound, and most do not. This is where a chest's contents, a sign's text, a spawner's mob and a banner's patterns live — attached to the individual block rather than to the palette.
Ця різниця має значення: дані палітри є спільними, а дані блоків — ні. Дві скрині — це один запис у палітрі, оскільки вони мають однаковий стан блоку, але кожна зберігає власний інвентар у своєму nbt. Change the block state and you touch the palette; change what is inside it and you touch one entry in the block list.
Читання по одному шару за раз
Переглядач тут навмисно зроблений 2D. Щоб намалювати шар y він переглядає список блоків, залишає записи, чий pos[1] equals y, і шукає для кожного його state up in the palette. That is the entire algorithm, and it is worth knowing because it is also how you would inspect one of these files yourself: there is no spatial index to build and no decompression beyond the gzip wrapper. The format is a flat list you filter.
Це також означає, що файл структури нічого не повідомляє про те, де він розташований у світі. size is a bounding box and pos values are relative to its corner. The placement is the structure block's business, not the file's.