Formato NBT

De Minecraft Wiki
Ir para navegação Ir para pesquisar

O Named Binary Tag (NBT) é uma estrutura de dados em forma de árvore usado pelo Minecraft em muitos arquivos salvos para armazenar dados arbitrários. O formato é composto por um aglomerado de "etiquetas". As etiquetas têm um ID numérico, um nome e um payload. Uma versão acessível ao utilizador sob a forma de strings é o formato stringified Named Binary Tag (SNBT).

Formato SNBT[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

SNBT, também conhecido como data tag, é frequentemente utilizado em comandos na Edição Java. Pode ser descrito começando com pares de valores-chave entre chaves. Um exemplo de SNBT é a especificação de dados complexos para entidades com comandos.

Uma data tag consiste em zero ou mais pares atributo-valor delimitados por vírgulas e entre chaves. Cada par atributo-valor consiste num nome de etiqueta e no valor da etiqueta, separados por dois pontos. Alguns valores, no entanto, podem ser uma etiqueta composta e conter pares atributo-valor, permitindo que uma etiqueta de dados descreva uma estrutura de dados hierárquica.

Exemplo: {name1:123,name2:"sometext1",name3:{subname1:456,subname2:"sometext2"}}

O nome da etiqueta pode ser colocado entre aspas duplas, se necessário.

É diferente do formato JSON; portanto, qualquer JSON usado no NBT, como texto JSON bruto, deve ser incluído em uma tag de string .

Tipos de dados[editar | editar código-fonte]

Tipos de valores de data tags
Tipo Descrição Formato SNBT Exemplo SNBT
 Byte Um número inteiro de 8 bits com sinal, que varia entre -128 e 127 (inclusive). <number>b ou <number>B 34B, -20b
 Boolean A NBT não tem um tipo de dados booleano, mas os valores de byte 0 e 1 podem ser representados como true, false. Quando um campo de bytes é utilizado como um valor booleano, o ícone é mostrado. true, false true
 Short Um número inteiro de 16 bits com sinal, que varia entre -32,768 e 32,767 (inclusive). <number>s ou <number>S 31415s, -27183s
 Int Um número inteiro de 32 bits com sinal, entre -2.147.483.648 e 2.147.483.647 (inclusive). <integer_number> 31415926
 Long Um número inteiro de 64 bits com sinal, que varia entre -9,223,372,036,854,775,808 e 9,223,372,036,854,775,807 (inclusive). <number>l ou <number>L 31415926l
 Float Um número de ponto flutuante de precisão simples de 32 bits, que varia entre -3,4E+38 e +3,4E+38.

Veja IEEE ponto flutuante para detalhes.

<number>f ou <number>F 3.1415926f
 Double Um ponto flutuante de dupla precisão de 64 bits, que varia entre -1,7E+308 e +1,7E+308.

Veja IEEE ponto flutuante para detalhes.

<decimal_number>, <number>d ou <number>D 3.1415926
 String Uma sequência de caracteres Uma cadeia de caracteres entre aspas. Para strings contendo apenas 0-9, A-Z, a-z, _, -, ., e +, e não confundir com outros tipos de dados, as aspas são opcionais. As aspas podem ser simples ' ou dupla ". As aspas aninhadas podem ser incluídas dentro de uma cadeia de caracteres, escapando o carácter com um \ escape.

<[a-zA-Z0-9_\-\.\+] text>, "<text>" (" dentro precisa de ser escapado para \"), ou '<text>' (' dentro precisa de ser escapado para \')

"Me chame de \"Ishmael\"" 'Me chame de "Ishmael"' 'Me chame de \'Ishmael\'' "Me chame de 'Ishmael'"

 List Uma lista ordenada de tags. As tags devem ser do mesmo tipo, determinado pela primeira etiqueta da lista. Tags sem nome entre parênteses retos e delimitadas por vírgulas.

[<value>,<value>,...]

[3.2,64.5,129.5]
 Compound Uma lista ordenada de pares atributo-valor.

Cada tag pode ser de qualquer tipo.

Tags nomeadas entre chaves e delimitadas por vírgulas.

A chave (tag name) pode não estar entre aspas se contiver apenas 0-9, A-Z, a-z, _, -, ., e +. Caso contrário, a chave deve ser colocada entre aspas. As aspas podem ser simples ' ou dupla ". As aspas aninhadas podem ser incluídas dentro de uma cadeia de caracteres, escapando o carácter com um \ escape. {<[a-zA-Z0-9_\-\.\+] tag_name>:<value>,"<tag name>":<value>,...}

{X:3,Y:64,Z:129}
 Byte Array Uma lista ordenada de números inteiros de 8 bits. Note-se que [B;1b,2b,3b] e [1b,2b,3b] são considerados de tipos diferentes, o segundo é um  list. B; seguido de uma lista ordenada de byte tags, delimitada por vírgulas. A etiqueta é colocada entre parênteses rectos.

[B;<byte>b,<byte>B,true,false...]

[B;1b,2b,3b]
 Int Array Uma lista ordenada de números inteiros de 32 bits. Note-se que [I;1,2,3] e [1,2,3] são considerados de tipos diferentes, o segundo é um  list. I; seguido de uma lista ordenada de int tags, delimitada por vírgulas. A etiqueta é colocada entre parênteses rectos.

[I;<integer>,<integer>,...]

[I;1,2,3]
 Long Array Uma lista ordenada de números inteiros de 64 bits. Note-se que [L;1l,2l,3l] e [1l,2l,3l] são considerados de tipos diferentes, o segundo é um  list. L; seguido de uma lista ordenada de long tags, delimitadas por vírgulas. A etiqueta é colocada entre parênteses rectos.

[L;<long>l,<long>L,...]

[L;1l,2l,3l]

Objeto NBT[editar | editar código-fonte]

Quando o jogo está sendo executado, as entidades e as entidades de blocos em chunks carregadas são armazenadas na memória. Não são armazenadas com NBT, mas sim como objetos programáticos.

Ao processar operações NBT, o jogo tem de gerar um objeto NBT programático a partir de entidades/blocos, analisar o SNBT no objeto NBT, modificar entidades/blocos com base no objeto NBT fornecido ou converter o objeto NBT em SNBT.

Geração de objeto NBT[editar | editar código-fonte]

Ao gerar NBT a partir de uma entidade/bloco, as propriedades da entidade/bloco são adicionadas ao objeto NBT programático.

Note que nem todas as propriedades são adicionadas. Por exemplo, o valor que indica se um jogador está a abrir um baú não será adicionado ao objeto NBT.

É acrescentado um valor a um determinado tipo de dados. Por exemplo, um local de recurso é convertido num valor de string.

Estes objetos NBT são também armazenados nos diretórios de gravação do jogo como arquivos NBT quando o jogo é encerrado ou salvo automaticamente. Assim, as estruturas de dados que as tags NBT descrevem e o tipo de dados para cada tag são basicamente os mesmos utilizados nos diretórios de gravação do jogo. Estas estruturas de dados são descritas noutros artigos e os comandos esperam que as data tags utilizem os mesmos nomes de atributos (que são sensíveis a maiúsculas e minúsculas):


Links para Especificações de Estrutura de Dados
Objetos Exemplos
Blocos entidades baús, fornalhas, blocos de comandos, geradores de criaturas, placas, etc.
Itens objetos nos inventários (inclui especificações para encantamentos, descrições, nomes personalizados, etc.)
Entidade de itens itens no chão
Criaturas creepers, vacas, aldeões, etc.
Projéteis flechas, bolas de fogo, poções arremessáveis, etc.
Veículos botes, carrinhos de mina, etc.
Blocos Dinâmicos dinamite ativada, areia/cascalho/cimento/bigornas em queda
Outras entidades fogos de artifício, quadros, e molduras

Conversão para SNBT[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

Um objeto NBT programático seria convertido num SNBT quando se tentasse obtê-lo com /data get etc.

Depois de convertido, um número é sempre seguido de uma letra (minúscula para b, s, f, d, e maiúscula para L) exceto  Integer. Por exemplo, 3s para uma curta, 3.2f para uma float, etc.

Um literal entre colchetes é considerado uma lista, a menos que seja utilizado um identificador: [I;1,2,3] para um inter array e [L;1L,2L,3L] para uma long array.

true e false são convertidos como 1b e 0b respectivamente.

Modificando blocos/entidades baseados em objetos NBT[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

A modificação da entidade/bloco baseados em objetos NBT programático não é um processo simples. Todas as etiquetas têm de ser resolvidas antes de alterar as propriedades de um bloco/entidade. Nota-se que apenas determinadas propriedades podem ser alteradas. Por exemplo, quando se utiliza o comando /data para modificar uma entidade de bloco, as suas coordenadas não podem ser alteradas.

Se uma propriedade precisar de um valor do local do recurso e obtiver uma tag  string, a string é convertida em um local de recurso

Se uma propriedade precisar de um valor de texto JSON e obtém uma tag  string a string é analisada num objeto de texto JSON.

Se uma propriedade precisar de um valor booleano e obtém uma tag numérica, se o número não for 0 após alguma operação de arredondamento e conversão para byte o valor será verdadeiro.

Se uma propriedade precisar de um valor booleano e obtém uma tag não numérica, a propriedade torna-se falsa.

Se uma propriedade precisar de um valor numérico de determinado tipo receber uma tag numérica do tipo errado, o valor recebe uma operação de arredondamento e é convertido para o tipo necessário.

Se uma propriedade precisar de um valor numérico e recebe uma tag não numérica, o número se tornará 0.

Se uma propriedade precisar de uma string e recebe uma etiqueta que não é uma string, a string torna-se uma string vazia.

Se uma propriedade precisar de um lista ou array de determinado tipo e obtém uma tag do tipo errada, obtém-se uma lista/array vazia.

Se uma propriedade precisar de uma compound tag e obtém uma tag diferente de compound, é obtida uma compound tag vazia.

Testando tags NBT[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

Quando comandos como /clear, /execute if data são utilizados para fazer corresponder data tags, ou um argumento nbt no seletor de destino tenta atingir a entidade-alvo, o jogo converte o SNBT em objeto NBT programático e obtém o objeto NBT programático do bloco/entidade/armazenamento, comparando depois os dois objetos NBT.

Verificam apenas a presença das tags fornecidas na entidade/bloco/armazenamento de destino. Isto significa que a entidade/bloco/armazenamento pode ter tags adicionais e ainda assim corresponder. Isto é verdade mesmo em listas: a ordem e o número de elementos numa lista não são considerados e, desde que todos os elementos solicitados estejam na lista, esta corresponde mesmo que existam elementos adicionais. Por exemplo, uma entidade com dados {Pos:[1d,2d,3d],Tags:["a","b"]} pode ser alvo de @e[nbt={Pos:[3d,2d,1d]}] ou simplesmente @e[nbt={Pos:[2d]}] embora a primeira represente uma posição totalmente diferente e a segunda não seja uma posição válida. Note-se que @e[nbt={Tags:[]}] não pode corresponder-lhe, porque uma lista vazia só pode corresponder a uma lista vazia.

No entanto, a ordem e o número de elementos num array de byte/long/int são reconhecidos.

As data tags solicitadas na entidade/bloco/armazenamento de destino devem corresponder "exatamente" para que as tags fornecidas sejam aprovadas, incluindo o data type (por exemplo: 1 um int, não corresponde a 1d, um duplo). Os namespaces também não podem ser omitidos porque no objeto NBT é apenas uma string simples que não será resolvida numa localização de recurso (por exemplo: @e[nbt={Item:{id:"stone"}}] não corresponde a um bloco de pedra como item/entidade, deve ser @e[nbt={Item:{id:"minecraft:stone"}}]). O mesmo se aplica à string de textos JSON, que deve ser exatamente a mesma para corresponder à tag fornecida (por exemplo: @e[nbt={CustomName:'"a"'}] não corresponde a nenhuma entidade, deve ser @e[nbt={CustomName:"{\"text\":\"a\"}"}] ou @e[nbt={CustomName:'{"text":"a"}'}]).

Formato Binário[editar | editar código-fonte]

Um arquivo NBT é uma tag Compound compactada. Alguns dos arquivos utilizados pelo Minecraft podem ser descomprimidos, mas na maioria dos casos, os arquivos seguem a especificação original de Notch e são comprimidos com GZip.

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

Uma tag é uma parte individual da árvore de dados. O primeiro byte de uma etiqueta é o tipo da tag (ID), seguido por dois bytes em formato big-endian para o comprimento do nome e, em seguida, o nome como uma string no formato UTF-8 (Nota: TAG_End não é nomeada e não contém os 2 bytes extras; o nome é assumido como vazio). Finalmente, dependendo do tipo de tag, os bytes que se seguem fazem parte do payload dessa tag. Esta tabela descreve cada uma das 13 etiquetas conhecidas 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 Dupla precisão no formato de ponto flutuante. 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.

Utilização[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.

Na maioria dos casos, os arquivos seguem a especificação original de Notch e são comprimidos com GZip. Mas alguns dos arquivos utilizados pelo Minecraft podem ser descomprimidos, ou com zlib (também conhecido como DEFLATE com alguns bytes extra).

Todos os arquivos NBT criados pelo Minecraft contém dados  compound ou, por vezes, um  list[Edição Bedrock apenas] como tag raiz, esta tag tem um nome mas é frequentemente conhecida como string vazia.

Na Edição Bedrock, todos os números são codificados em little-endian. Isto inclui o prefixo de tamanho antes dos nomes das tags,  string valores e  list ou  array bem como os valores em todas as tags numéricas.

Na Edição Bedrock, O level.dat é um arquivo NBT descomprimido com um cabeçalho de 8 bytes, constituído por um número inteiro de 4 bytes little-endian que indica a versão da ferramenta utilizada para guardar o arquivo. É seguido por outro número inteiro que contém o comprimento do arquivo, menos o cabeçalho.

Usos[editar | editar código-fonte]

Esta section está faltando informação sobre: Bedrock Edition NBTs. 
Por favor, expanda este section para incluir esta informação. Mais detalhes podem existir na página de discussão.

JSON e NBT[editar | editar código-fonte]

JSON é um formato de troca de dados leve baseado em texto. O padrão do texto JSON é especificado em ECMA-404. Veja também JSON.

JSON é muito diferente de NBT. A NBT é uma estrutura de dados que pode ser representada por um arquivo binário ou strings. O JSON é um formato de texto para transferência de dados. Existem apenas seis tipos de dados em JSON: JsonString, JsonNumber, JsonBoolean, JsonNull, JsonObject, e JsonArray. No NBT, há mais tipos para números diferentes e não há tipos de dados nulos e booleanos.

No NBT, existem listas, byte array, int array e long array, e os elementos em uma lista ou um array devem ser do mesmo tipo. No entanto, em JSON, há apenas JsonArray, na qual os elementos podem ser de diferentes tipos de dados. A chave de uma tag em SNBT pode não ser colocada entre aspas, enquanto a chave de um name-value em JSON deve ser colocada entre aspas duplas.

A conversão entre NBT e JSON pode resultar na perda de muitas informações, ao mesmo tempo que adiciona muitas informações redundantes. No entanto, essa conversão é ocasionalmente utilizada pelo jogo vanilla. na Edição Java Atualmente usado nas partículas ambientes de biomas personalizados e na [[Lista de processadores |lista de processadores]] que "ditam" o tipo de processamento. Abaixo está como o jogo vanilla os converte.

Conversão a partir de JSON[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

Conversão para JSON[editar | editar código-fonte]

Esse recurso é exclusivo para Edição Java. 

Software oficial[editar | editar código-fonte]

A Mojang forneceu exemplos de classes Java NBT para os programadores utilizarem e referenciarem como parte do código-fonte do MCRegion para conversor de Formato de arquivo bigorna. [1] Des da Edição Java 1.13, Minecraft inclui um conversor integrado entre o formato SNBT e o formato NBT comprimido, que acompanha ambos os clientes e servidores oficiais.[2]

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

O gerador de dados padrão pode converter qualquer formato NBT comprimido com GZip para o formato SNBT. A extensão do arquivo pode ser simplesmente alterada, como level.dat para level.nbt, e colocada na pasta de entrada. O gerador, então, decodifica os dados NBT comprimidos com GZip.

Histórico[editar | editar código-fonte]

O formato de arquivo NBT foi descrito por Notch em uma breve especificação.[3]

A versão original conhecida foi 19132, introduzida na Beta 1.3, e desde então foi atualizada para 19133 com o Formato de arquivo bigorna, que adiciona a tag Int Array. O formato NBT remonta a Indev com as tags de 0 a 10 em uso.

[ocultar]Edição Java
1.0.028 de setembro de 2011Notch trabalhou em "salvar dados arbitrários com instâncias de itens"."
1.814w03aOs dados NBT agora suportam o uso de IDs de string em vez de IDs numéricos.
1.1217w18aAdicionada a tag long array.
1.1318w01aAdicionado a gerador de dados tanto para o Minecraft cliente quanto para o software multiplayer padrão.
1.1419w08a As tags de string e os nomes de tags em compound no SNBT agora podem estar entre aspas simples ' além de aspas duplas. ".[4]
1.1620w21aAdicionada função de conversão entre NBT e JSON.

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

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

  • nbt, Biblioteca Java para trabalhar com o formato NBT.
  • NBT na wiki.vg
  • NBTExplorer, Uma ferramenta para visualizar e editar arquivos NBT.
  • NBT Studio, Sucessor do NBTExplorer que inclui recursos adicionais, como suporte ao Bedrock e SNBT.
  • webNBT, Uma ferramenta online para visualizar e editar arquivos NBT.
  • XNBTEdit, Editor e conversor NBT em XML.

Navegação[editar | editar código-fonte]

Esta página já foi uma tarefa pendente na wiki e foi completamente revisada pela última vez em fevereiro de 2024
Atribuído a: Werkhauser (discussão)

Motivo: Página atualizada seguindo o padrão da wiki EN.