A Tag binária nomeada (NBT) formato é usado pelo Minecraft para os vários arquivos nos quais ele salva dados. O formato é projetado para armazenar dados em uma estrutura de árvore composta de várias tags. Todas as tags têm um ID e um nome.
Outro formato de NBT mais amigável é em string simples, como usado em comandos. Este formato é conhecido como SNBT, abreviatura de NBT stringified.
- 1 formato SNBT
- 2 objeto NBT
- 2.1 Gerando objeto NBT
- 2.2 Conversão para SNBT
- 2.3 Conversão de SNBT
- 2.4 Modificando entidade / bloco com base no objeto NBT
- 2.5 Teste de tags NBT
- 3 arquivo NBT
- 3.1 Definição de TAG
- Uso do 3.2
- 3.2.1 Usos
- 4 software oficial
- História 5
- 6
- 7 links externos
Formato SNBT
Este recurso é exclusivo para o Java Edition.SNBT, também conhecido como etiqueta de dados, é freqüentemente usado no comando em Java Edition. Ele pode ser descrito começando com pares de valor de atributo entre chaves. Um uso comum de tags de dados no Java Edition é em comandos, usados para especificar dados complexos para qualquer entidade.
Uma tag de dados consiste em zero ou mais pares de valor de atributo delimitados por vírgulas e colocados entre chaves. Cada par atributo-valor consiste em um nome de tag e o valor da tag, separados por dois pontos. Alguns valores, no entanto, podem ser uma marca composta e eles próprios contêm pares de valor de atributo, permitindo que uma marca de dados descreva uma estrutura de dados hierárquica.
Example: {name1:123,name2:"sometext1",name3:{subname1:456,subname2:"sometext2"}}O nome da tag pode ser colocado entre aspas duplas, se necessário.
É diferente do formato JSON; portanto, qualquer JSON usado em NBT, como texto JSON bruto, deve ser colocado dentro de uma tag de string.
Formato de cada tipo
As estruturas de dados definidas também esperam que os valores sejam do tipo correto.
Tipos de valores de tags de dadosTipo | Descrição | Formato | Exemplo |
---|---|---|---|
Byte | Um número inteiro de 8 bits com sinal, variando de -128 a 127 (inclusive). | b ou B | 34B, -20b |
Baixo | Um número inteiro de 16 bits com sinal, variando de -32,768 a 32,767 (inclusive). | s ou S | 31415s, -27183s |
int | Um número inteiro assinado de 32 bits, variando de -2,147,483,648 e 2,147,483,647 (inclusive). | 31415926 | |
longo | Um número inteiro de 64 bits com sinal, variando de -9,223,372,036,854,775,808 a 9,223,372,036,854,775,807 (inclusive). | eu ou eu | 31415926l |
Flutuador | Um número de ponto flutuante de precisão única de 32 bits, variando de -3.4E + 38 a + 3.4E + 38.
Consulte o ponto flutuante IEEE para obter detalhes. |
para F | 3.1415926f |
Duplo | Um ponto flutuante de precisão dupla de 64 bits, variando de -1.7E + 308 a + 1.7E + 308.
Consulte o ponto flutuante IEEE para obter detalhes. |
, d ou D | 3.1415926 |
Tanga | Uma sequência de caracteres entre aspas. Para strings sem vírgulas, colchetes, colchetes ou espaços, o fechamento das aspas é opcional. As aspas podem ser aspas simples ou duplas ". Aspas aninhadas podem ser incluídas em uma string escapando o caractere com um escape. | , " "(" dentro precisa ser escapado para "), ou ' '(' dentro precisa ser escapado para ') |
"Me chame de" Ismael "" 'Me chame de' Ismael '' 'Me chame de' Ismael '' "Me chame de 'Ismael'" |
Lista | Uma lista ordenada de tags, entre colchetes e delimitadas por vírgulas. As tags devem ser do mesmo tipo, determinado pela primeira tag da lista. | [ , , ...] | [3.2,64.5,129.5] |
Compound | Uma lista ordenada de pares de atributo-valor, colocados entre chaves e delimitados por vírgulas.
Cada tag pode ser de qualquer tipo. |
{ : , : , ...} | {X: 3, Y: 64, Z: 129} |
Byte Array | B; seguido por uma lista ordenada de inteiros de 8 bits, delimitados por vírgulas. A tag está entre colchetes. | [B; b, B, ...] | [B; 1b, 2b, 3b] |
Array Int | EU; seguido por uma lista ordenada de inteiros de 32 bits, delimitados por vírgulas. A tag está entre colchetes. | [EU; , , ...] | [I; 1,2,3] |
Long Array | EU; seguido por uma lista ordenada de inteiros de 64 bits, delimitados por vírgulas. A tag está entre colchetes. | [EU; eu, EU,...] | [L; 1l, 2l, 3l] |
Booleano | Um valor expresso como verdadeiro, falso. Ele é resolvido pelo jogo em uma tag Byte como 0b (para falso) e 1b (para verdadeiro). | verdadeiro, falso ou 0b, 1b | {doFoo: true} |
Objeto NBT
Quando o jogo está em execução, entidades e entidades de bloco em blocos de carregamento são armazenadas na memória. Eles não são armazenados com o NBT; em vez disso, são apenas objetos programáticos.
Ao processar operações NBT, o jogo precisa gerar objeto NBT programático a partir de entidades / entidades de bloco, analisar SNBT em objeto NBT, modificar entidades / blocos com base no objeto NBT fornecido ou converter objeto NBT em SNBT.
Gerando objeto NBT
Ao gerar NBT a partir de uma entidade / bloco, as propriedades da entidade / bloco são adicionadas ao objeto NBT programático.
Observe que nem todas as propriedades são adicionadas. Por exemplo, o valor de se um jogador está abrindo um baú não será adicionado ao objeto NBT.
Um valor é adicionado com determinado tipo de dados. Por exemplo, um ID com namespace será convertido em um valor de string.
Esses objetos NBT também serão armazenados em arquivos salvos do jogo como arquivos NBT quando o jogo for encerrado ou salvo automaticamente. Portanto, as estruturas de dados que as tags NBT descrevem e o tipo de dados para cada tag são basicamente os mesmos usados nos arquivos salvos do jogo. Essas estruturas de dados são descritas em outros artigos e comandos esperam que as tags de dados usem os mesmos nomes de atributos (que diferenciam maiúsculas de minúsculas):
Links de especificação de estrutura de dadosobjetos | Exemplos |
---|---|
Entidades de bloco | baús, fornalhas, blocos de comando, geradores de turba, sinais, etc. |
Unid | itens em estoques (inclui especificações para encantamentos, tradição, nomes personalizados, etc.) |
Entidades de item | itens no chão |
Mobs | trepadeiras, vacas, aldeões, etc. |
Projéteis | flechas, bolas de fogo, poções de arremesso, etc. |
Veículos | barcos, minecarts, etc. |
Ladrilhos dinâmicos | TNT preparado, queda de areia / cascalho / pó de concreto / bigornas |
Outras entidades | foguetes de fogos de artifício, pinturas e molduras de itens |
Conversão para SNBT
Este recurso é exclusivo para o Java Edition.Um objeto NBT programático seria convertido em um SNBT ao tentar obtê-lo com / data get etc.
Depois de convertido, um número é sempre seguido por uma letra (minúscula para b, s, f, d e maiúscula para L), exceto inteiro. Por exemplo, 3s para um short, 3.2f para um float, etc.
E uma string está sempre entre aspas duplas ou simples.
Outros tipos de dados são expressos como o #Format de cada tabela de tipo acima.
Conversão de SNBT
Este recurso é exclusivo para o Java Edition.Um SNBT será convertido em um objeto NBT programático quando analisado pelo jogo.
Um número seguido por uma letra (B, S, L, F, D ou suas minúsculas) é resolvido para o tipo de dados correspondente. Por exemplo, 3s para um curto, 3.2f para um float, etc. A letra pode ser maiúscula ou minúscula. Quando nenhuma letra é usada, ele assume double se houver um ponto decimal, int se não houver um ponto decimal e o tamanho couber em 32 bits, ou corda se nenhum for verdadeiro.
Um literal entre colchetes é considerado uma lista, a menos que um identificador seja usado: [I; 1,2,3] para uma matriz interna e [L; 1L, 2L, 3L] para uma matriz longa.
verdadeiro e falso são convertidos em 1b e 0b, respectivamente.
Modificar entidade / bloco com base no objeto NBT
Este recurso é exclusivo para o Java Edition.Modificar entidade / bloco com base em um objeto NBT programático não é um progresso simples. Todas as tags certas precisam ser resolvidas antes de alterar as propriedades de um bloco / entidade. Observe que apenas algumas propriedades podem ser alteradas. Por exemplo, ao usar o comando / data para modificar uma entidade de bloco, suas coordenadas não podem ser alteradas.
Se uma propriedade precisa de um valor de ID com espaço de nomes e obtém uma tag de string, a string será convertida em um ID.
Se uma propriedade precisa de um valor de texto JSON e obtém uma tag de string, a string será analisada em um objeto de texto JSON.
Se uma propriedade precisa de um valor numérico de certo tipo e obtém uma etiqueta numérica do tipo errado, o número obterá alguma operação de arredondamento e será convertido para o tipo necessário.
Se uma propriedade precisar de um valor numérico e receber uma tag não numérica, o número se tornará 0.
Se uma propriedade precisar de um valor de string e receber uma tag que não seja de string, a string se tornará uma string vazia.
Se uma propriedade precisa de uma lista ou array de certo tipo e obtém uma tag do tipo errado, uma lista / array vazio será obtido.
Se uma propriedade precisa de uma tag de compount e obtém uma tag não-compount, uma tag de compount vazia será obtida.
Teste de tags NBT
Este recurso é exclusivo para o Java Edition.Quando comandos como / clear, / execute se os dados forem usados para coincidir com as tags de dados, ou o argumento nbt no seletor de destino tenta a entidade de destino, o jogo converte SNBT em objeto NBT programático e obtém o objeto NBT programático de bloco / entidade / armazenamento, então compara os dois objetos NBT.
Eles verificam apenas a presença das tags fornecidas na entidade / bloco / armazenamento de destino. Isso significa que a entidade / bloco / armazenamento pode ter tags adicionais e ainda corresponder. Isso é verdadeiro até mesmo para listas: a ordem e o número de elementos em uma lista de uma lista não são considerados e, desde que cada elemento solicitado esteja na lista, ele corresponde mesmo se houver elementos adicionais. Por exemplo, uma entidade com dados {Pos: [1d, 2d, 3d], Tags: ["a", "b"]} pode ser segmentada por @e [nbt = {Pos: [3d, 2d, 1d]} ] ou mesmo apenas @e [nbt = {Pos: [2d]}], embora a primeira represente uma posição totalmente diferente e a última não seja uma posição válida. Observe que @e [nbt = {Tags:}] não pode corresponder, porque uma lista vazia só pode corresponder a uma lista vazia.
No entanto, a ordem e o número de elementos em uma matriz byte / long / int is reconhecido.
As tags de dados solicitadas na entidade / bloco / armazenamento de destino devem corresponder exatamente para que as tags fornecidas passem, incluindo o tipo de dados (por exemplo, 1, um int, não corresponderá 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 em um ID de namespace (por exemplo, @e [nbt = {Item: {id: "stone"}}] não corresponderá a uma pedra entidade do item, deve ser @e [nbt = {Item: {id: "minecraft: stone"}}]). O mesmo é verdadeiro para string de texto JSON, que deve ser exatamente igual para corresponder à tag fornecida (por exemplo, @e [nbt = {CustomName: '"a"'}] não corresponderá a nenhuma entidade, deve ser @e [ nbt = {CustomName: "{" text ":" a "}"}] ou @e [nbt = {CustomName: '{"text": "a"}'}]).
Arquivo NBT
Um arquivo NBT é uma tag Compound compactada, com o nome e o ID da tag incluídos. O arquivo no zip deve conter a tag Compound como os primeiros bytes. Alguns dos arquivos utilizados pelo Minecraft podem ser descompactados, mas na maioria dos casos, os arquivos seguem a especificação original do Notch e são compactados com GZip.
Definição de TAG
Uma tag é uma parte individual da árvore de dados. O primeiro byte em uma tag é o tipo de tag (ID), seguido por um inteiro não assinado big-endian de dois bytes para o comprimento do nome, então o nome como uma string no formato UTF-8 (Nota TAG_Fim não é nomeado e não contém os 2 bytes extras; o nome é considerado vazio). Finalmente, dependendo do tipo de tag, os bytes que seguem fazem parte da carga útil dessa tag. Esta tabela descreve cada uma das 13 tags conhecidas na versão 19133 do formato NBT:
ID | ícone | Tipo de Tag | carga paga | Descrição | Capacidade de Armazenamento |
---|---|---|---|---|---|
0 | MARCAÇÃO_Fim | - | Usado para marcar o fim das tags compostas. Esta tag não tem nome, por isso é sempre um único byte 0. Também pode ser o tipo de tags de Lista vazias. | N / D | |
1 | MARCAÇÃO_Byte | 1 byte / 8 bits, assinado | Um tipo integral assinado. Às vezes usado para booleanos. | Faixa completa de - (27) a (27 - 1) (-128 a 127) | |
2 | MARCAÇÃO_Baixo | 2 bytes / 16 bits, assinado, big endian | Um tipo integral assinado. | Faixa completa de - (215) a (215 - 1) (-32,768 a 32,767) | |
3 | MARCAÇÃO_int | 4 bytes / 32 bits, assinado, big endian | Um tipo integral assinado. | Faixa completa de - (231) a (231 - 1) (-2,147,483,648 a 2,147,483,647) | |
4 | MARCAÇÃO_longo | 8 bytes / 64 bits, assinado, big endian | Um tipo integral assinado. | Faixa completa de - (263) a (263 - 1) (-9,223,372,036,854,775,808 a 9,223,372,036,854,775,807) | |
5 | MARCAÇÃO_Flutuador | 4 bytes / 32 bits, assinado, big endian, IEEE 754-2008, binário32 | Um tipo de ponto flutuante assinado. | A precisão varia ao longo da linha numérica; Consulte Formato de ponto flutuante de precisão única. Valor máximo de cerca de 3.4 * 1038 | |
6 | MARCAÇÃO_Duplo | 8 bytes / 64 bits, assinado, big endian, IEEE 754-2008, binário64 | Um tipo de ponto flutuante assinado. | A precisão varia ao longo da linha numérica; Consulte Formato de ponto flutuante de precisão dupla. Valor máximo de cerca de 1.8 * 10308 | |
7 | MARCAÇÃO_Byte_Ordem | Tamanho da carga útil de TAG_Int, então dimensione as cargas úteis de TAG_Byte. | Uma matriz de bytes. | O número máximo de elementos varia entre (231 - 9) e (231 - 1) (2,147,483,639 e 2,147,483,647), dependendo da JVM específica. | |
8 | MARCAÇÃO_Tanga | Um comprimento de carga útil semelhante a TAG_Short, mas em vez disso não assinado [1], então uma string UTF-8 semelhante por bytes de comprimento. | Uma string UTF-8. Ele tem um tamanho, em vez de ser terminado em nulo. | 65,535 bytes interpretáveis como UTF-8 (consulte o formato UTF-8 modificado; os caracteres mais comumente usados são um único byte). | |
9 | MARCAÇÃO_Lista | TAG_Byte's payload tagId, depois TAG_Int's payload size, então size tags 'payloads, todos do tipo tagId. | Uma lista de cargas úteis de tag, sem IDs de tag repetidos ou quaisquer nomes de tag. | Devido às limitações da JVM e à implementação de ArrayList, o número máximo de elementos da lista é (231 - 9), ou 2,147,483,639. Observe também que as tags List e Compound não podem ser aninhadas além de uma profundidade de 512. | |
10 | MARCAÇÃO_Compound | Tags totalmente formadas, seguidas por um TAG_End. | Uma lista de tags totalmente formadas, incluindo seus IDs, nomes e cargas úteis. Duas tags não podem ter o mesmo nome. | Ao contrário das listas, não há um limite rígido para o número de tags em um Composto (é claro, sempre há o limite implícito de memória virtual). Observe, no entanto, que as tags Compound e List não podem ser aninhadas além de uma profundidade de 512. | |
11 | MARCAÇÃO_int_Ordem | Tamanho da carga útil de TAG_Int, então dimensione cargas úteis de TAG_Int. | Uma matriz de cargas úteis de TAG_Int. | O número máximo de elementos varia entre (231 - 9) e (231 - 1) (2,147,483,639 e 2,147,483,647), dependendo da JVM específica. | |
12 | MARCAÇÃO_longo_Ordem | Tamanho da carga útil de TAG_Int, então dimensione as cargas úteis de TAG_Long. | Uma matriz de cargas úteis de TAG_Long. | O número máximo de elementos varia entre (231 - 9) e (231 - 1) (2,147,483,639 e 2,147,483,647), dependendo da JVM específica. |
As tags List e Compound podem ser e freqüentemente são aninhadas recursivamente. Também deve ser observado que, em uma lista de listas, cada uma das sublistas pode listar um tipo diferente de tag.
Uso
O Minecraft às vezes usa o formato NBT de maneira inconsistente; em alguns casos, as listas vazias podem ser representadas como uma lista de tags de bytes em vez de uma lista do tipo correto, ou como uma lista de tags de fim em versões mais recentes do Minecraft, o que pode quebrar algumas ferramentas NBT mais antigas. Além disso, quase toda tag raiz tem uma string de nome vazia e encapsula apenas uma tag Compound com os dados reais e um nome. Por exemplo:
- A marca raiz para a maioria das estruturas NBT do Minecraft.
- SomeName: a única marca contida na marca raiz - tem um nome e contém todos os dados reais.
Além disso, há também o uso inconsistente de maiúsculas e minúsculas, principalmente camelCase ou PascalCase, mas às vezes até em minúsculas.
Uso
Esta seção não contém informações sobre os NBTs da Bedrock Edition. Por favor, expanda a seção para incluir essas informações. Mais detalhes podem existir na página de discussão.- level.dat é armazenado em formato NBT compactado.
- Os arquivos .dat são armazenados no formato NBT compactado.
- idcounts.dat é armazenado em formato NBT compactado.
- village.dat é armazenado em formato NBT compactado.
- raids.dat é armazenado em formato NBT compactado.
- Os arquivos map _ <#>. dat são armazenados no formato NBT compactado.
- servers.dat, que é usado para armazenar a lista de servidores multijogador salvos como NBT descompactado.
- hotbar.nbt, que é usado para salvar hotbars como formato NBT descompactado.
- Os pedaços são armazenados no formato NBT compactado nos arquivos de região.
- scoreboard.dat é armazenado em formato NBT compactado.
- As estruturas geradas são armazenadas no formato NBT compactado.
- As estruturas salvas são armazenadas no formato NBT compactado.
Software oficial
: Tutoriais / Executando o Gerador de DadosA Mojang forneceu exemplos de classes Java NBT para os desenvolvedores usarem e fazerem referência como parte do código-fonte do conversor de formato de arquivo MCRegion para Anvil. [2] Desde o Java Edition 1.13, o Minecraft inclui um conversor embutido entre o formato SNBT e o formato NBT compactado, que vem com o cliente e o servidor oficial. [3]
O gerador de dados do Minecraft é capaz de converter arquivos NBT stringificados não compactados com extensão .snbt em uma pasta de entrada para arquivos no formato NBT compactados GZip com extensão .nbt em uma pasta de saída e vice-versa.
O gerador de dados vanilla pode converter qualquer formato NBT compactado GZip para o formato SNBT. A extensão de um arquivo pode simplesmente ser alterada, como level.dat para level.nbt e colocada na pasta de entrada, e o gerador então decodifica os dados NBT compactados GZip.
História
O formato do arquivo NBT foi descrito por Notch em uma breve especificação. [4]
A versão original conhecida era a 19132, introduzida no Beta 1.3, e desde então foi atualizada para 19133 com o formato de arquivo Anvil, que adiciona a tag Int Array. O formato NBT remonta a Indev com tags de 0 a 10 em uso.
Java Edition | |||||
---|---|---|---|---|---|
1.0.0 | 28 de Setembro de 2011 | Notch trabalha para "salvar dados arbitrários com instâncias de itens". | |||
1.8 | 14w03a | Os dados NBT agora são compatíveis com o uso de IDs de string em vez de IDs numéricos. | |||
1.12 | ? | Adicionadas tags de matriz longa. | |||
1.13 | 18w01a | Adicionado um gerador de dados ao cliente Minecraft e ao software multijogador padrão. | |||
1.14 | 19w08a | As tags de string no SNBT agora podem estar entre aspas simples, além das aspas duplas ". [5] |
- ↑ https://docs.oracle.com/javase/8/docs/api/java/io/DataOutput.html#writeUTF-java.lang.String-
- ↑ http://www.mojang.com/2012/02/new-minecraft-map-format-anvil/
- ↑ https: // web page.vg/Data_Generators#NBT_converters
- ↑ http://web.archive.org/web/20110723210920/http://www.minecraft.net/docs/NBT.txt especificação
- ↑ "Permitir aspas simples em strings por boq · Pull Request # 52" - Mojang / brigadier - GitHub.
Links externos
- nbt, uma biblioteca Java para trabalhar com o formato NBT.
- NBT na página web.vg
- NBTExplorer, uma ferramenta para visualizar e editar arquivos NBT.
- NBT Studio, sucessor do NBTExplorer que inclui recursos adicionais, como suporte a Bedrock e SNBT.
- webNBT, uma ferramenta online para visualizar e editar arquivos NBT.
Java Edition | |||||||
---|---|---|---|---|---|---|---|
versões |
| ||||||
Desenvolvimento |
| ||||||
Técnico |
| ||||||
Multiplayer |
| ||||||
Personalização do jogo |
|