Un archivo de estructura .nbt almacena índices de paleta, no nombres de bloques — por eso es tan pequeño
Tres claves contienen una construcción entera: size, palette y blocks. Cada bloque es un número entero que apunta a la paleta, así que un volumen de piedra de 32³ cuesta una cadena y 32.768 entradas pequeñas —una posición y un índice cada una, nunca un nombre—.
Un archivo de estructura .nbt —lo que guarda un bloque estructural y lo que incluye un datapack— es un formato mucho más sencillo de lo que parece desde fuera. Todo lo que necesita una construcción cabe en un puñado de claves de nivel superior, y una sola decisión de diseño explica por qué los archivos son tan pequeños como son.
Las tres claves que sostienen la construcción
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 contiene cada estado de bloque distinto exactamente una vez. Una entrada es un Name —el id del bloque, como minecraft:oak_stairs— más un compuesto Properties opcional que contiene su estado de bloque, como facing: north y half: bottom.
blocks nunca repite un nombre. Cada entrada lleva un pos de tres números enteros y un state, y state es un índice dentro de la paleta, no un id de bloque. Las escaleras de roble orientadas al norte son datos de cadena una vez, y cada una de ellas después de eso es un número entero pequeño.
Ese es todo el truco. Un volumen de 32 × 32 × 32 de piedra lisa es una entrada de paleta y 32.768 entradas de bloque de una posición más un índice —no 32.768 copias de la palabra minecraft:stone. La paleta crece según cuántas cosas distintas construiste, y la lista de bloques crece según lo grande que construiste. Esos son números muy diferentes, y normalmente solo uno de ellos es grande.
Dos consecuencias que conviene tener en cuenta al diseñar
Los estados de bloque multiplican tu paleta, no tu lista de bloques. Las escaleras de roble no son una entrada de paleta —son una por cada orientación que realmente usaste. Mirando hacia cuatro direcciones, mitad superior e inferior, rectas y con esquinas tanto internas como externas: el mismo bloque puede ocupar una docena de ranuras de la paleta. Así que una construcción con mucho detalle tiene una paleta grande y una sencilla no, independientemente de su tamaño.
Solo las posiciones guardadas reciben una entrada. La lista de bloques es una lista, no un arreglo 3D denso, y una entrada que no está simplemente no está —el visor de esta página llena su cuadrícula con -1 y trata una coordenada ausente como nada colocado. Pero un bloque estructural guarda el aire como cualquier otro bloque; solo el vacío estructural (structure void) se omite. Una construcción hueca solo es más barata de almacenar si rellenas su interior con vacío estructural antes de guardar.
nbt es por bloque y opcional
Cada entrada en blocks puede llevar su propio compuesto nbt, y la mayoría no lo hace. Aquí es donde viven el contenido de un cofre, el texto de un cartel, el mob de un generador y los patrones de un estandarte —adjuntos al bloque individual en lugar de a la paleta.
La distinción importa: los datos de la paleta se comparten y los datos del bloque no. Dos cofres son una entrada de paleta, porque son el mismo estado de bloque —pero cada uno guarda su propio inventario en su propio nbt. Cambia el estado de bloque y tocas la paleta; cambia lo que hay dentro y tocas una entrada de la lista de bloques.
Leer una capa a la vez
El visor de aquí es deliberadamente 2D. Para dibujar la capa y recorre la lista de bloques, conserva las entradas cuyo pos[1] es igual a y, y busca el state de cada una en la paleta. Ese es todo el algoritmo, y vale la pena conocerlo porque también es como inspeccionarías uno de estos archivos tú mismo: no hay ningún índice espacial que construir ni ninguna descompresión más allá del envoltorio gzip. El formato es una lista plana que filtras.
Lo cual también significa que un archivo de estructura no te dice nada sobre dónde pertenece en un mundo. size es una caja delimitadora y los valores de pos son relativos a su esquina. La colocación es cosa del bloque estructural, no del archivo.