Формат NBT (от англ. Named Binary Tag — «именованный двоичный тег») используется Minecraft в различных файлах для хранения данных. Формат описан Нотчем в очень краткой спецификации. Формат разработан для хранения данных в структуре-дереве, состоящей из различных тегов. У каждого тега есть идентификатор и название.

Оригинальная известная версия NBT, 19132, была введена в Beta 1.3, и с тех пор была обновлена до 19133 вместе с Anvil; в этом обновлении был добавлен тег для массива целочисленных переменных. Формат NBT был ещё в Indev и использовал теги с 0 по 10.

  • 1 Определение тега
  • 2 Формат файлов
  • 3 Использование в Minecraft
  • 3.1 Область применения

Определение тега

Тег — отдельный элемент дерева данных. Первый байт в теге — это тип тега (также называемый идентификатором или ID), затем 2 байта хранят длину названия, затем название в виде строки в формате UTF-8 (следует отметить, что TAG_End не имеет названия и не включает дополнительные 2 байта; предполагается, что название пустое). Названия тегов могут содержать пробелы, хотя сам Minecraft не имеет таких тегов. Наконец, следующие байты — содержимое тега, зависящее от типа тега. Таблица ниже описывает 12 известных тегов в версии NBT 19133:

Что такое NBT теги или как хранятся миры в Майнкрафте | Майнкрафт изнутри

ID Иконка Тип тега Содержимое Описание Ёмкость
0 TAG_End Нет. Используется для обозначения конца составных тегов. У этого тега нет названия, поэтому он всегда представлен одним байтом, равным 0. Также этот тип используется в пустых тегах списков.
1 TAG_Byte 1 байт / 8 битов, со знаком Целочисленный тип со знаком. Иногда используется для логических переменных. Весь промежуток от -(2 7 ) до (2 7 — 1)
(от -128 до 127)
2 TAG_Short 2 байта / 16 битов, со знаком, обратный порядок байтов Целочисленный тип со знаком. Весь промежуток от -(2 15 ) до (2 15 — 1)
(от -32 768 до 32 767)
3 TAG_Int 4 байта / 32 бита, со знаком, обратный порядок байтов Целочисленный тип со знаком. Весь промежуток от -(2 31 ) до (2 31 — 1)
(от -2 147 483 648 до 2 147 483 647)
4 TAG_Long 8 байт / 64 бита, со знаком, обратный порядок байтов. Целочисленный тип со знаком. Весь промежуток от -(2 63 ) до (2 63 — 1)
(от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807)
5 TAG_Float 4 байта / 32 бита, со знаком, обратный порядок байтов, IEEE 754-2008, binary32 Тип чисел с плавающей точкой со знаком. Точность меняется на протяжении числовой прямой;
см. [ruwiki:Число одинарной точности Число одинарной точности].
6 TAG_Double 8 байт / 64 бита, со знаком, обратный порядок байтов, IEEE 754-2008, binary64 Тип чисел с плавающей точкой со знаком. Точность меняется на протяжении числовой прямой;
см. [ruwiki:Число двойной точности Число двойной точности].
7 TAG_Byte_Array Один TAG_Int, обозначающий размер, затем размер тегов TAG_Byte. Массив байтовых переменных. Максимальное число элементов изменяется от (2 31 — 9) до (2 31 — 1) (от 2 147 483 639 до 2 147 483 647) и зависит от текущей JVM.
8 TAG_String Один TAG_Short, обозначающий длину, затем строка в формате UTF-8 с размером длина. Строка в формате UTF-8. Она имеет размер, а не завершается нулём. 32 767 точек кода UTF-8 (см. [ruwiki:UTF-8 UTF-8]; наиболее распространённые символы состоят из одной точки кода.
9 TAG_List Один TAG_Byte, обозначающий тип, затем TAG_Int, обозначающий размер, затем размер тегов типа тип. Последовательный список тегов без ID и без названий. В связи с ограничениями JVM и реализацией ArrayList, максимальный размер списка — (2 31 — 9) или 2 147 483 639. Также следует отметить, что максимальная глубина размещения списков и составных тегов равна 512.
10 TAG_Compound Полные теги, затем один тег TAG_End. Список полных тегов, включающий их типы, названия и содержимые. Все теги должны иметь различные имена. В отличие от списков, ограничения на количество тегов в составном теге нет (хотя имеется неявное ограничение в виде размера виртуальной памяти). Также следует отметить, что максимальная глубина размещения списков и составных тегов равна 512.
11 TAG_Int_Array Один TAG_Int, обозначающий размер, затем размер тегов TAG_Int. Массив тегов TAG_Int. Максимальное число элементов изменяется от (2 31 — 9) до (2 31 — 1) (от 2 147 483 639 до 2 147 483 647) и зависит от текущей JVM.
12 TAG_Long_Array Одно значение TAG_Int (без заголовка), обозначающий размер, затем набор тегов TAG_Long. Массив тегов TAG_Long. Максимальное число элементов изменяется от (2 31 — 9) до (2 31 — 1) (от 2 147 483 639 до 2 147 483 647) и зависит от текущей JVM.
Читайте также:  Как запустить Майнкрафт на ubuntu

NBT ТЕГИ ДЛЯ МАЙНКРАФТ 1.7 — 1.13+

Списки и составные теги могут быть вложены. Следует отметить, что в списке списков подсписки могут иметь разные типы элементов.

Формат файлов

Файл NBT — это сжатый GZip составной тег, включающий название и тип. Некоторые такие файлы, используемые Minecraft, не являются сжатыми GZip, хотя в большинстве случаев спецификация Нотча, предписывающая сжатие, соблюдается. В Xbox 360 издании чанки сжимаются XMemCompress, разновидностью алгоритма сжатия LZX. Заголовка, указывающего версию или какую-либо иную информацию, в файлах нет, версия указана только в файле Использование в Minecraft

Использование формата NBT в Minecraft местами является странным. В некоторых случаях пустые списки могут быть представлены списками байтов (или тегов End в более новых версиях Minecraft), а не списками правильного типа. К тому же, каждый корневой тег имеет пустое название и включает только один составной тег с самими данными и названием. Например:

  • Корневой тег для большинства структур NBT в Minecraft.
  • Название : Единственный тег, содержащийся в корневом теге. Он имеет название и содержит сами данные.

Ещё одна заметная странность — это то, что, хотя оригинальная спецификация Нотча допускает пробелы в названиях тегов и приведённый в ней пример использует это, в Minecraft нет файлов с пробелами в тегах. Также использование прописных букв в названиях тегов непостоянно: где-то с прописной буквы пишется каждое слово, где-то — каждое, кроме первого, а где-то используются только строчные буквы.

Область применения

  • .dat хранятся в сжатом формате NBT.
  • villages.dat хранится в сжатом формате NBT.
  • Файлы map_.dat хранятся в сжатом формате NBT.
  • Чанки хранятся в сжатом формате NBT в файлах областей .
  • scoreboard.dat хранится в сжатом формате NBT.
  • Натуральные структуры хранятся в сжатом формате NBT.

Программное обеспечение

Mojang предоставила экземпляры классов Java для работы с NBT, предназначенные для использования разработчиками, как часть исходного кода для преобразователя McRegion → Anvil. Помимо этого, сообщество разработало программы для просмотра и изменения сжатых и несжатых файлов NBT, например, NBTExplorer и NBT2YAML (все вышеприведённые программы поддерживают последние версии NBT).

Источник: minecraft.fandom.com

[Гайд] Разбираем NBT теги: Все мобы

[Гайд] Разбираем NBT теги: Все мобы

Итак, теги будут описаны в таком-же формате, как и на англоязычной WIKI.

[Гайд] Разбираем NBT теги: Все мобы

Все мобы:
HealF: Количество здоровья моба. Измеряется в половинках сердец. Если установлен, то Health игнорируется.
Health: Количество здоровья моба.
AbsorptionAmount: Дополнительное здоровье моба.
AttackTime: Сложный перевод. Описать его словами очень трудно (Number of ticks the mob’s «invincibility shield» lasts after the mob was last struck. 0 when not recently hit).
HurtTime: Сложный перевод. Описать его словами очень трудно (Number of ticks the mob turns red for after being hit. 0 when not recently hit.).
DeathTime: Значение «0» показывает, что моб уже мёртв.
Attributes (Массив): Атрибуты моба.
-Name: Имя атрибута.
-Base:: Базовое значение атрибута.
-Modifiers (Массив): Будет описано отдельно.
ActiveEffects (Массив): Эффекты, наложенные на моба
-Id: ID эффекта.
-Amplifier: Уровень эффекта.
-Duration: Длительность эффекта.
-Ambient: 1 — если эффект обеспечивается маяком. Если нет — 0.
-ShowParticles: 1 — если частицы показаны. Если нет — 0.
Equipment (Массив): То, что надето на игрока.
-0: Предмет, который находится в руке.
-1: Ноги
-2: Поножи
-3: Нагрудник
-4: Голова
DropChances (Массив): Выпадающие с моба вещи.
-0: Предмет, который находится в руке.
-1: Ноги
-2: Поножи
-3: Нагрудник
-4: Голова
CanPickUpLoot: 1 — если моб может поднимать вещи. Если нет — 0.
PersistenceRequired: 1 — если моб не может естественно исчезнуть. Если может — 0.
CustomName: Имя моба.
CustomNameVisible: 1 — если пользовательское имя видно. Если нет — 0.
Leashed: 1 — если моб на поводке. Если нет — 0.
Leash (Массив): Значение данного массива и его параметры нужны только для профессионалов. Если они Вам интересны — посмотрите на WIKi.
GoldenAppleOverflow: Удалено.

Читайте также:  Команда чтобы писать цветными буквами в Майнкрафт

Источник: ru-minecraft.ru

Что такое nbt тег в майнкрафт

Формат NBT (Named Binary Tag) широко используется Minecraft в различных файлах для хранения данных. Представляет собой древовидную структуру данных, состоящую из различных тегов. Каждый тег имеет идентификатор и название.

Список тегов#

ID Тип Описание
0 END Используется для обозначения конда данных в файле. Это технический тег и вам он никогда не понадобится.
1 BYTE Целое число со знаком.
2 SHORT Целое число со знаком.
3 INT Целое число со знаком.
4 LONG Целое число со знаком.
5 FLOAT Число с плавающей точкой со знаком.
6 DOUBLE Число с плавающей точкой со знаком.
7 BYTE_ARRAY Массив byte[]
8 STRING Строка в кодировке UTF-8.
9 LIST Последовательный список тегов одного типа.
10 COMPOUND Карта именованных тегов NBT различных типов ( Map ). Является корневым тегом любого древа.
11 INT_ARRAY Массив int[]
  • Подробное описание всех тегов NBT с техническими деталями есть в Minecraft Wiki.
    В Minecraft 1.7.10 отсутствует тег LONG_ARRAY – он появился в более поздних версиях игры.
  • Приведённая таблица типов в основном пригодится при использовании метода NBTTagCompound#hasKey(String, int) для передачи ID тега вторым параметром.
  • Актуальный ID тега всегда можно подсмотреть прямо в коде игры в методе getId() нужного тега.
  • Forge предоставляет вспомогательный класс net.minecraftforge.common.util.Constants.NBT с перечислением всех ID тегов. Используйте его для улучшения читаемости вашего кода (используется в примерах здесь).
  • Список NBTTagList может содержать только теги одного типа. При попытке добавить тег другого типа, игра выдаст предупреждение.
  • Не допускайте зацикливания ссылок на теги – это когда дочерние элементы тега могут являться ссылкой на родительский элемент выше. Может вызвать ошибку ConcurrentModificationException .
  • В NBTTagCompound не допускается передавать в качестве значения тега null – это приведёт к ошибке NullPointerException .

Допущенные опшлошности проявятся не сразу, а в момент записи данных. Возникновение ошибки прервёт запись данных файл, что приведёт к повреждению файлов игрового мира!

Чтение и запись данных#

Первым местом, где потребуется работать с NBT, будет реализация сохранения состояния Entity и TileEntity. Сохранение состояния (данных) необходимо чтобы свойства объекта не сбрасывались при выгрузке чанка или выходе из игры. У приведённых ранее двух объектов это реализуется путём переопределения методов writeToNBT(NBTTagCompound) и readFromNBT(NBTTagCompound) . Оба метода получают в качестве аргумента NBTTagCompound в который требуется произвести запись или прочитать данные.

Читайте также:  Майнкрафт прохождение карт с друзьями паркур

Во время сохранения чанка игра всегда формирует полностью новое древо тегов с нуля 1 . Поэтому теги, которые НЕ были добавлены в момент вызова writeToNBT() пропадут. Аналогичное произойдёт с тегами, добавленными вручную (например, с помощью редакторов NBT).

Всё же, из данного правила существуют исключения. ItemStack#stackTagCompound и Entity#getEntityData() хранят в себе ветвь древа NBTTagCompound вместо полного распределения её элементов по полям объекта. При сохранении данных эта ветвь целиком добавляется к новому древу. Любые добавленные туда пользовательские данные, будут сохраняться ровно до тех пока вы их оттуда не удалите. Далее мы будем называть это тегом свободной формы.

Не рекомендуется использовать такой приём в своих наработках, поскольку структура NBT имеет не самую высокую скорость доступа к данным. Старайтесь распределить все данные тега по полям своих объектов (тайлы, ентити и прочие.).

Примеры работы с NBT#

Ниже приведены примеры записи и чтения различных объектов в NBT, которые могут пригодиться в процессе разработки модификации.

Работа с тегами#

Во избежание краша ClassCastException , перед осуществлением доступа к тегам рекомендуется проверять их существование и соответствие нужному типу. Это касается работы с NBTTagCompound и NBTTagList . Особенно это важно при работе тегом свободной формы (напр. у ItemStack ), где можно ожидать всё что угодно.

import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants.NBT; public void readFromNBT(NBTTagCompound compound) if (compound.hasKey(«Items», NBT.TAG_LIST)) // (1) NBTTagList tagList = compound.getTagList(«Items», NBT.TAG_COMPOUND); // (2) ItemStack[] items = new ItemStack[tagList.tagCount()]; for (int i = 0; i items.length; i++) items[i] = ItemStack.loadItemStackFromNBT(tagList.getCompoundTagAt(i)); > // . > >

  1. Здесь осуществляется проверка наличия ключа Items c типом LIST.
  2. Получаем NBTTagList , содержащий элементы COMPOUND. Если элементы будут другого типа, вернёт пустой список.

ItemStack#

Этот пример кода будет использоваться наиболее для сохранения содержимого инвентаря блока и других объектов.

import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; ItemStack apple = new ItemStack(Items.apple); // Запись NBTTagCompound compound = new NBTTagCompound(); apple.writeToNBT(compound); // Передаём ссылку на тег в который будет осуществлена запись // Чтение ItemStack restored = ItemStack.loadItemStackFromNBT(compound); // Может вернуть null если предмет не существует

TileEntity#

Обычно сохранением тайлов занимается игра, данный код может пригодиться для сохранения и перемещения тайла в другое место.

import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; TileEntity tile = new TileEntity(); // Запись NBTTagCompound compound = new NBTTagCompound(); tile.writeToNBT(compound); // Чтение // ПРИМЕЧАНИЕ: При перемещении на другое место, не забудьте изменить значения ключей x,y,z тега на новые координаты TileEntity restored = TileEntity.createAndLoadEntity(compound);

Entity#

Сохранением существ обычно занимается игра. Данный пример может пригодиться, например для консервации моба в банку, чтобы позже заспавнить его в другом месте.

import net.minecraft.entity.Entity; import net.minecraft.entity.EntityList; import net.minecraft.nbt.NBTTagCompound; Entity entity = new Entity(world); // Запись NBTTagCompound compound = new NBTTagCompound(); boolean saved = entity.writeToNBTOptional(compound); // Метод вернёт boolean значение в зависимости от того была произведена запись или нет // Чтение if (!compound.hasNoTags()) Entity restored = EntityList.createEntityFromNBT(compound, world); >

Хранение данных в ItemStack#

Ранее уже была упомянута возможность хранения пользовательских данных в ItemStack#stackTagCompound . Его можно использовать для хранения уровня заряда предмета, сведений о владельце и других вещей.

Следует упомянуть о зарезервированных универсальных ключах, которые использует Minecraft. Вы не должны их использовать для хранения своих данных в ItemStack .

Ключ Тип Описание
display COMPOUND Пользовательское имя предмета 2 и описание.
ench LIST Наложенные на предмет чары. Для работы с ними используйте EnchantmentHelper
  1. Как осуществляется чтение и запись данных чанка целиком смотрите в исходном коде AnvilChunkLoader . ↩
  2. Задаётся путём переименования предмета на наковальне. ↩

Источник: mcmodding.ru