Um arquivo de estrutura .nbt armazena índices de paleta, não nomes de blocos — é por isso que é tão pequeno
Três chaves contêm uma construção inteira: tamanho, paleta e blocos. Cada bloco é um número inteiro que aponta para a paleta, então um volume de pedra de 32³ custa uma string e 32.768 números.
Um arquivo de estrutura .nbt — o que um Gerador de Estruturas salva e um pacote de dados envia — é um formato muito mais simples do que parece por fora. Tudo o que uma construção precisa está em um punhado de chaves de nível superior, e uma decisão de design explica por que os arquivos são tão pequenos quanto são.
As três chaves que carregam a construção
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 contém cada estado de bloco distinto exatamente uma vez. Uma entrada é um Name — o ID do bloco, como minecraft:oak_stairs — mais um composto Properties opcional contendo seu estado de bloco (blockstate), como facing: north e half: bottom.
blocks nunca repete um nome. Cada entrada contém um pos de três números inteiros e um state, e state é um índice para a paleta, não um ID de bloco. Escadas de Carvalho viradas para o norte são dados de string uma vez, e cada uma delas depois disso é um pequeno número inteiro.
Esse é todo o truque. Um volume de 32 × 32 × 32 de Pedra simples é uma entrada de paleta e 32.768 números de índice — não 32.768 cópias da palavra minecraft:stone. A paleta cresce com quantas coisas diferentes você construiu, e a lista de blocos cresce com o quão grande você construiu. Esses são números muito diferentes, e apenas um deles geralmente é grande.
Duas consequências que valem a pena considerar no design
Os estados de bloco (blockstates) multiplicam sua paleta, não sua lista de blocos. Escadas de Carvalho não são uma entrada de paleta — elas são uma por orientação que você realmente usou. Viradas para quatro direções, metade superior e inferior, retas e ambos os cantos internos e externos: o mesmo bloco pode ocupar uma dúzia de espaços na paleta. Assim, uma construção rica em detalhes tem uma paleta grande e uma simples não, independentemente do tamanho.
Apenas blocos colocados recebem uma entrada. A lista de blocos é uma lista, não um array 3D denso, e uma entrada que não está lá simplesmente não está lá — o visualizador nesta página preenche sua grade com -1 e trata uma coordenada ausente como nada colocado. Uma construção oca é genuinamente mais barata de armazenar do que uma sólida das mesmas dimensões.
nbt é por bloco e opcional
Cada entrada em blocks pode conter seu próprio composto nbt, e a maioria não o faz. É aqui que o conteúdo de um Baú, o texto de uma placa, o mob de um gerador e os padrões de um estandarte vivem — anexados ao bloco individual, em vez de à paleta.
A distinção importa: os dados da paleta são compartilhados e os dados do bloco não. Dois Baús são uma entrada de paleta, porque são o mesmo estado de bloco — mas cada um mantém seu próprio inventário em seu próprio nbt. Mude o estado do bloco e você toca na paleta; mude o que está dentro dele e você toca em uma entrada na lista de blocos.
Lendo uma camada por vez
O visualizador aqui é deliberadamente 2D. Para desenhar a camada y, ele percorre a lista de blocos, mantém as entradas cujo pos[1] é igual a y, e procura o state de cada uma na paleta. Esse é o algoritmo inteiro, e vale a pena saber porque é também como você inspecionaria um desses arquivos: não há índice espacial para construir e nenhuma descompressão além do wrapper gzip. O formato é uma lista plana que você filtra.
O que também significa que um arquivo de estrutura não diz nada sobre onde ele pertence em um mundo. size é uma caixa delimitadora e os valores pos são relativos ao seu canto. O posicionamento é responsabilidade do Gerador de Estruturas, não do arquivo.