Formato NBT

De Minecraft Wiki
Ir para: navegação, pesquisa
Disambig color.svg Esse artigo fala sobre o formato de arquivo NBT. Para usar NBT em comandos, veja Tutorials/Command NBT Tags.

O formato Named Binary Tag (Rótulo Binário Nomeado) é usado por Minecraft para os vários arquivos em que ele salva os dados. O formato é descrito por Notch em uma breve especificação.O formato é projetado para armazenar dados em uma estrutura de árvore composta de várias tags (rótulos/etiquetas). Todas as tags têm um ID e um nome. A versão original era conhecida como 19.132, introduzida em Minecraft Beta 1.3, e desde então tem sido atualizada para 19.133 com o Anvil file format, o qual adiciona a tag Int Array. O formato NBT data desde do Minecraft Indev, com as tags de 0 a 10 em uso.

Outro formato de NBT mais amigável é em plena string, assim como usado em comandos. Esse formato é conhecido como SNBT, que significa Stringified NBT. Ele é diferente do formato JSON; logo, qualquer JSON usado em NBT, como por exemplo texto JSON bruto, deve ser incluso dentro de uma tag string.

Definição de TAG[editar | editar código-fonte]

Uma tag é uma parte individual da árvore de dados. O primeiro byte em uma tag é o tipo da tag (ID), seguido por dois bytes para o comprimento do nome, e então o nome como uma string no formato UTF-8 (Nota: a TAG_End não é nomeada e não contém os 2 extra bytes; o nome é assumido como vazio). O nome das tags pode conter espaços, embora o Minecraft em si nunca salva tags com espaços no nome. Finalmente, dependendo do tipo da tag, os próximos bytes fazem parte do conteúdo (carga) da tag. A tabela abaixo descreve cada um dos 12 tipos de tags conhecidos na versão 19133 do formato NBT:

ID Ícone Tipo da Tag Conteúdo (carga) Formato SNBT‌[EJ apenas] Descrição Capacidade de Armazenamento
0 TAG_End Nenhum. - Usado para marcar o fim de tags Compound. Esta tag não tem um nome, logo ela sempre é um único byte 0. Ela pode também ser o tipo de tags List vazias. N/A
1 TAG_Byte 1 byte / 8 bits, com sinal. <numero>b ou <numero>B Um inteiro com sinal. Às vezes utilizado para booleanos. Alcance completo de -(27) até (27 - 1)
(-128 até 127)
2 TAG_Short 2 bytes / 16 bits, com sinal, big-endian. <numero>s ou <numero>S Um inteiro com sinal. Alcance completo de -(215) até (215 - 1)
(-32,768 até 32,767)
3 TAG_Int 4 bytes / 32 bits, com sinal, big-endian. <numero> Um inteiro com sinal. Alcance completo de -(231) até (231 - 1)
(-2,147,483,648 até 2,147,483,647)
4 TAG_Long 8 bytes / 64 bits, com sinal, big-endian. <numero>l ou <numero>L Um inteiro com sinal. Alcance completo de -(263) até (263 - 1)
(-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807)
5 TAG_Float 4 bytes / 32 bits, com sinal, big-endian, padrão IEEE 754-2008, binary32. <numero>f ou <numero>F Um ponto flutuante com sinal. A precisão varia ao longo do alcance de números; Veja Single-precision floating-point format. Valor máximo é cerca de 3.4*1038
6 TAG_Double 8 bytes / 64 bits, com sinal, big-endian, padrão IEEE 754-2008, binary64. <numero decimal>, <numero>d, ou <numero>D Um ponto flutuante com sinal. A precisão varia ao longo do alcance de números; Veja Double-precision floating-point format. Valor máximo é cerca de 1.8*10308
7 TAG_Byte_Array Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Byte. [B;<byte>,<byte>,...] Uma lista (array) de cargas de tag Byte. Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica.
8 TAG_String Um tamanho tam do tipo carga de TAG_Short, e então uma string UTF-8 de comprimento tam. <a-zA-Z0-9 texto>, "<texto>" (na qual aspas duplas " interiores precisam ser escritas como \"), ou '<text>' (na qual aspas simples ' interiores precisam ser escritas como \') Uma string de codificação UTF-8. Ela tem um tamanho, ao invés de ser terminada por um caractere nulo. 32,767 bytes interpretáveis como UTF-8 (veja formato UTF-8; a maioria dos caracteres mais comuns ocupam um único byte).
9 TAG_List Um ID do tipo carga de TAG_Byte, e então um tamanho tam do tipo carga de TAG_Int, e então tam cargas de tag, todas do tipo ID. [<valor>,<valor>,...] Uma lista de cargas de tag, sem aparecer repetidamente IDs ou qualquer nomes de tag. Estes são inferidos do ID da própria tag List. Devido a algumas limitações da JVM e a implementação da ArrayList, o número máximo de elementos da lista é (231 - 9), ou 2,147,483,639. Também notar que as tags List e Compound não podem ser aninhadas além da profundidade máxima de 512.
10 TAG_Compound Tags completas, seguidas de uma TAG_End. {<nome da tag>:<valor>,<nome da tag>:<valor>,...} Uma lista de tags completas, incluindo ID, nome e carga. Não é permitido duas tags com o mesmo nome. Diferentemente das listas, não há um limite rígido para a quantidade de tags dentro de um composto (Compound). É claro, contudo, que sempre há o limite implícito de memória virtual. Note, entretanto, que as tags List e Compound não podem ser aninhadas além da profundidade máxima de 512.
11 TAG_Int_Array Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Int. [I;<inteiro>,<inteiro>,...] Uma lista (array) de cargas de tag Int. Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica.
12 TAG_Long_Array Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Long. [L;<inteiro longo>,<inteiro longo>,...] Uma lista (array) de cargas de tag Long. Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica.

As tags List e Compound podem ser - e frequentemente são - aninhadas recursivamente. Também é bom notar que, em uma lista de listas, cada sub-lista pode listar um tipo de tag diferente.

Formato do Arquivo[editar | editar código-fonte]

Um arquivo de NBT é uma tag Compound comprimida (zipada), com o nome e tag ID incluídos. Alguns dos arquivos utilizados por Minecraft podem estar descompactados, mas na maioria dos casos, os arquivos seguem a especificação original do Notch e são compactados com o algoritmo GZip. Na Edição Xbox 360, as chunks são comprimidas com o XMemCompress, uma variação de um algoritmo de compressão LZX. Não há cabeçalho para especificar a versão ou qualquer outra informação - apenas o arquivo level.dat especifica a versão.

Uso[editar | editar código-fonte]

Minecraft às vezes usa o formato NBT de maneira inconsistente; em alguns casos, listas vazias pode ser representadas como uma lista de tags Byte ao invés de uma lista do tipo correto, ou como uma lista de tags End em versões mais recentes do Minecraft, o que pode quebrar algumas ferramentas para manipulação de NBT mais antigas. Além disso, quase todas as tags raízes têm uma string de nome vazia, e encapsula uma única tag Compound com os verdadeiros dados e um nome. Por exemplo:

  • A tag raíz para a maioria das estruturas NBT do Minecraft.
    •  AlgumNome:A única tag contida dentro da tag raiz - ela tem um nome e contém todos os dados reais.

Adicionalmente, embora a especificação original por Notch permite espaços em nomes de tags, e até mesmo o exemplo dado nessa especificação usa espaços nos nomes das tags, Minecraft não tem arquivos conhecidos, onde uma tag sequer possui espaços em seu nome. Há também o uso inconsistente de letras maiúsculas e minúsculas, na maioria das vezes ou CamelCase ou PascalCase, mas em alguns casos, até tudo em minúsculo.

Usos[editar | editar código-fonte]

  • level.dat é armazenado em formato NBT compactado.
  • <player>.dat é armazenado em formato NBT compactado.
  • idcounts.dat é armazenado em formato NBT compactado.
  • villages.dat é armazenado em formato NBT compactado.
  • map_<#>.dat é armazenado em formato NBT compactado.
  • servers.dat, que é usado para salvar a lista de servidores multiplayers em formato NBT descompactado.
  • Chunks são armazenadas em formato NBT comprimido dentro de arquivos Region.
  • scoreboard.dat é armazenado em formato NBT compactado.
  • Estruturas geradas são armazenadas em formato NBT compactado.

Programas oficiais[editar | editar código-fonte]

Veja também: Tutorials/Running the Data Generator

A Mojang providenciou amostras de classes NBT Java para os desenvolvedores usarem e referenciarem como parte do código fonte do conversor de [./http://minecraft.gamepedia.com/MCRegion MCRegion] para [./http://minecraft.gamepedia.com/Anvil_file_format Anvil file format].[1] Desde a [./http://minecraft.gamepedia.com/Java_Edition_1.13 Versão 1.13 da Edição Java], Minecraft inclui um conversor embutido entre o formato SNBT e o formato NBT comprimido, que vem tanto com o [./http://minecraft.gamepedia.com/Client.jar cliente] quanto com o servidor oficial.[2]

O gerador de dados do Minecraft é capaz de converter arquivos SNBT descomprimidos com a extensão.snbt em uma pasta de entrada para arquivos no formato NBT comprimido com GZip, com extensão .nbt em uma pasta de saída, e vice-versa.

O gerador de dados vanilla consegue converter o formato NBT comprimido com GZip para o formato SNBT. A extensão de um arquivo pode simplesmente ser trocada, como em level.dat para level.nbt, e o arquivo colocado na pasta de entrada, que o gerador irá decodificar os dados NBT comprimidos com GZip.

Referências[editar | editar código-fonte]

Links Externos[editar | editar código-fonte]

  • NBT em wiki.vg
  • NBTExplorer, uma ferramenta para visualizar e editar arquivos NBT.
  • webNBT, uma ferramenta online para visualizar e editar arquivos NBT.