Minecraft Wiki
Registrieren
Advertisement

Named Binary Tag ist ein Format, das von Minecraft in den verschiedenen Dateien zum Speichern der Welten verwendet wird. Es wurde von Notch entwickelt, um Eigenschaften in einer Baumstruktur abzulegen. Die Bezeichnung Named Binary Tag beschreibt die Tatsache, dass die Dateien keine lesbaren Texte enthalten, sondern binär (binary) gespeichert sind und dass die Eigenschaften (tags) jeweils einen bestimmten Namen haben (named).

Alle Eigenschaften sind von einem bestimmten Datentyp, der im Wiki als Icon dargestellt wird. Wenn man mit der Maus über das Icon fährt, sieht man zusätzlich einen Text. Beispiel:

  • Eine unsortierte Liste (Compound)
    • ID Die ID als String
    • Pos Die XYZ-Koordinaten als sortierte Liste von Integer-Zahlen
      • Die X-Koordinate als Integer-Zahl
      • Die Y-Koordinate als Integer-Zahl
      • Die Z-Koordinate als Integer-Zahl
    • visible Die Sichtbarkeit als Byte mit 1 = true und 0 = false

Vom NBT-Format existieren mittlerweile mehrere Versionen:

  • Das NBT-Format wurde erstmalig in Minecraft Indev mit den Datentyp-IDs 0 bis 10 benutzt (siehe Indev Level Format).
  • Version 19132: die erste bekannte Versionsnummer für das NBT-Format. Sie wurde in Minecraft Beta 1.3 verwendet.
  • Version 19133: Erweiterung des NBT-Formates um das Int-Array für das Anvil Format.
  • Bei der Erweiterung des NBT-Formates um das Long-Array in Vollversion 1.13 blieb die Versionsnummer unverändert.

Da das Datenformat Binary ist, können die Dateien nicht mit einem Texteditor gelesen werden. Es gibt aber einige spezielle Programme, mit denen man Dateien im NBT-Format ansehen kann. Einige stellen die Daten graphisch dar, sodass man eine Welt außerhalb von Minecraft sehen und verändern kann (z.B. "MCEdit"), andere stellen die Daten in ihrer Baumstruktur dar (z.B. "NBT-Explorer").

Verwendung in Befehlen[]

Bei einigen Befehlen kann man NBT-Daten als zusätzliche Informationen übergeben. Dies wird Stringified NBT (SNBT) genannt und bedeutet, dass NBT-Daten als Text (String) eingegeben werden. Die dafür verwendete Notation ist hier beschrieben. Beispiele siehe Befehl#NBT-Daten.

Der in Minecraft integrierte Datengenerator wandelt NBT-Dateien in SNBT um, so dass man ihren Inhalt ohne Fremdprogramm sehen kann.

SNBT wird auch vom Befehl /data angezeigt. Beispiel für die NBT-Daten eines Schafes:

SNBT data-Befehl

Datentypen[]

In einer gespeicherten Datei hat eine Eigenschaft als erstes Byte eine Datentyp-ID. Dann folgen zwei Bytes, die die Länge des Eigenschaftsnamens angeben, gefolgt von dem Eigenschaftsnamen als UTF-8-String. Der Name kann Leerzeichen enthalten, obwohl Minecraft nie Eigenschaften mit Leerzeichen im Namen speichert. Schließlich - abhängig vom Datentyp - folgen die Nutzdaten der Eigenschaft.

Diese Tabelle beschreibt die 13 bekannten Datentypen des NBT-Formates in der Version 19133. Bei der Eingabe von Zahlen in Befehlen mit SNBT ist es manchmal (aber nicht immer) notwendig, den Datentyp mit einem Buchstaben zu markieren. Auch bei Arrays ist das notwendig.

Datentyp-ID Icon Datentyp Zahl-Markierung Nutzdaten Beschreibung
0 End Keine Markiert das Ende einer Compound-Eigenschaft. Dieser Datentyp hat keinen Namen, damit reduziert er sich auf eine einzelne 0.
1 Byte b 1 Byte (= 8 Bit) Vorzeichenbehaftete Ganzzahl.
Manchmal für Booleans benutzt (0=false, 1=true), siehe auch "String".
Wertebereich: -128 bis 127.
2 Short s 2 Bytes (= 16 Bit) Vorzeichenbehaftete Ganzzahl im Big-Endian-Format.
Wertebereich: -32768 bis 32767.
3 Int Keine Markierung 4 Bytes (= 32 Bit) Vorzeichenbehaftete Ganzzahl im Big-Endian-Format.
Wertebereich: -2.147.483.648 bis 2.147.483.647. Beispiele:
  • C2 1A 00 00 = 194×2560+26×2561+0×2562+0×2563 = 6850
  • 0E FB FF FF = 00 00 00 00 - F1 04 00 00 =
    - (241×2560+4×2561+0×2562+0×2563) = -1265
4 Long l 8 Bytes (= 64 Bit) Vorzeichenbehaftete Ganzzahl im Big-Endian-Format.
Wertebereich: -9.223.372.036.854.775.808 bis 9.223.372.036.854.775.807.
5 Float f 4 Bytes (= 32 Bit) Fließkommazahl im Big-Endian-Format nach der Norm IEEE 754-2008.
6 Double d 8 Bytes (= 64 Bit) Fließkommazahl im Big-Endian-Format nach der Norm IEEE 754-2008.
7 Byte-Array B; Zuerst die Arraylänge als Integer-Zahl gefolgt vom Array aus Bytes Ein Array (indizierte Liste) aus Bytes.
8 String Zuerst die Stringlänge als Short-Zahl gefolgt von dem String Ein String im UTF-8 Format ohne weitere Ende-Kennzeichnung (nicht Null-terminiert). Manchmal für Booleans benutzt, indem die Worte false oder true verwendet werden, siehe auch "Byte".
9 List Zuerst einmalig die Datentyp-ID der Listenelemente (alle sind immer vom selben Datentyp) als Byte, dann die Anzahl der Listenelemente als Integer-Zahl gefolgt von den Listenelementen ohne Namen Eine Liste von Eigenschaften, ohne Wiederholung von Datentyp-ID und Eigenschaft-Name.
10 Compound Liste von Eigenschaften mit einem abschließenden End-Datentyp Datenverbund. Ein Verbund kann beliebig viele Eigenschaften (mit Datentyp-ID, Eigenschaft-Name und Nutzdaten) enthalten, darunter auch wiederum Compound-Datentypen, woraus sich die Baumstruktur ergibt. Die Anzahl der Eigenschaften in einem Verbund wird nicht gespeichert, vielmehr wird das Ende des Verbundes am End-Datentyp erkannt.
11 Int-Array I; Zuerst die Arraylänge als Integer-Zahl gefolgt vom Array aus Integer-Zahlen Ein Array (indizierte Liste) von Integer-Zahlen.
12 Long-Array L; Zuerst die Arraylänge als Integer-Zahl gefolgt vom Array aus Long-Zahlen Ein Array (indizierte Liste) von Long-Zahlen.

Array-Sortierung[]

Oft enthält ein Array die Werte einer Fläche oder eines Raumes der Minecraft-Welt. Die Angabe zur Sortierung der Array-Daten ist entscheidend, um die korrekte Position eines Blockes im Array zu finden. Bei Flächen ist die Sortierung meistens XZ. Das bedeutet, dass erst alle X-Werte für Z=0 aufgeführt sind, gefolgt von allen X-Werten für Z=1 etc. Beispiel: die Position X=4 / Z=7 befindet sich in einem 16×16-XZ-Array an Position 7×16+4 = 116.

Die seltenere ZX-Sortierung bedeutet, dass erst alle Z-Werte für X=0 aufgeführt sind, gefolgt von allen Z-Werten für X=1 etc. Beispiel: die Position X=4 / Z=7 befindet sich in einem 16×16-ZX-Array an Position 4×16+7 = 71.

Chunk-Sektionen werden in einem Array in XZY-Sortierung abgelegt. Das bedeutet, dass erst alle XZ-Flächen für Y=0 aufgeführt sind, gefolgt von allen XZ-Flächen für Y=1 etc. Beispiel: die Position X=4 / Y=5 / Z=7 befindet sich in einem 16×16×16-XZY-Array an Position 5×256+7×16+4 = 1396.

Dateiformat[]

Eine NBT-Datei ist eine per GZip komprimierte Compound-Eigenschaft inklusive Name und Datentyp-ID. Manche der von Minecraft benutzten Dateien sind unkomprimiert. In den meisten Fällen folgen die Dateien jedoch der Original-Spezifikation von Notch und sind mit GZip komprimiert. Bei Verwendung von zlib muss die Kompressionsstufe Z_BEST_SPEED verwendet werden. Es gibt keinen Header der die Version angibt, nur in den Weltdaten steht eine Versionsangabe.

Die Benutzung des NBT-Formats von Minecraft ist manchmal merkwürdig. In manchen Fällen werden leere Listen als leere Liste von Bytes anstellen einer leeren Liste des korrekten Datentyps dargestellt. Zusätzlich hat fast jede Haupt-Eigenschaft einen leeren Namen und beinhaltet nur eine Compound-Eigenschaft mit dem tatsächlichen Namen und den Daten. Zum Beispiel:

  • Die namenlose Haupt-Eigenschaft in den meisten Minecraft NBT-Strukturen
    • Name: Die einzige Eigenschaft innerhalb der Haupt-Eigenschaft. Diese hat einen Namen und hält alle Daten.

Eine andere Merkwürdigkeit ist, dass obwohl die originale Spezifikation Leerzeichen in Eigenschaftsnamen erlaubt, in Minecraft keine Datei bekannt ist, die Leerzeichen in den Eigenschaftsnamen enthält. Auch ist die Groß-/Kleinschreibung inkonsistent. Meistens werden einzelne Worte in den Eigenschaftsnamen durch einen Großbuchstaben markiert, wobei der Eigenschaftsname manchmal mit einem Kleinbuchstaben beginnt, manchmal mit einem Großbuchstaben. Manchmal wird der Eigenschaftsname aber auch komplett in Kleinbuchstaben geschrieben. Beispiele: "BlockLight", "carriedData", "mayfly".

Bei der Eingabe von Zahlen in Befehlen mit SNBT ist es meist nicht notwendig, den Datentyp mit einem Buchstaben zu markieren. Manchmal funktioniert der Befehl aber ohne Buchstabe nicht, sondern nur, wenn der korrekte Buchstabe hinzugefügt wird.

Dateien[]

Beispiel[]

Hier wird kurz anhand eines Beispiels gezeigt, wie man die NBT-Daten aus den Wiki-Artikeln, die alle Informationen zu den Daten besitzen, ausliest und überträgt:

Das Ziel ist es, einen gezähmten und gesattelten Esel, der eine Truhe trägt, mit dem Befehl /summon zu erschaffen. In der Truhe soll sich ein Stein befinden. Zuerst muss unter Kreaturdaten der Esel gefunden werden, dann sucht man sich alle NBT-Daten, die man für die Ziel-Vorgaben benötigt:

  • Esel hat die Objekt-ID "donkey"
    • ChestedHorse: true oder false - true wenn die Kreatur Truhen trägt.
    • Items: Nur für Esel, Maultiere und Lamas und nur wenn ChestedHorse true ist: Liste der Gegenstandsdaten, die die Kreatur trägt mit Slot. Die Slots haben die Nummern 2 bis 16.
      • Ein Gegenstand in der Satteltasche der Kreatur.
    • SaddleItem: Optional und nur für Pferde, Esel und Maultiere. Die Gegenstandsdaten des Sattels, den die Kreatur trägt, ohne Slot.
    • Tame: true oder false - true wenn die Kreatur gezähmt ist.

Die Objekt-ID des Esels lautet "donkey", diese wird für den Befehl /summon verwendet. Jetzt werden die NBT-Daten in Form von SNBT eingetragen: Alle Daten, die auf gleicher Ebene liegen, können jetzt direkt als Angaben eingebunden werden. Stehen Angaben in zweiter Ebene, wie bei "Items:", muss herausgefunden werden, welche Klammer hier verwendet wird. Bei "compound" sind das geschwungene Klammern {}, bei "list" eckige []. Dort trägt man dann alle Werte ein.

/summon minecraft:donkey ~ ~ ~
 { ChestedHorse:true,
   Items:
   [
     { Slot:2b, id:"minecraft:stone", Count:1b }
   ],
   SaddleItem:{ id:"minecraft:saddle", Count:1b },
   Tame:true
 }
Eine ausführliche Anleitung zur Verwendung von NBT-Daten in Befehlen steht im Artikel Befehl#NBT-Daten.
Weitere Beispiele mit NBT-Daten siehe: Anleitungen/Befehle mit NBT

Geschichte[]

Versionsgeschichte der Java Edition
4. November 2009
  • Notch kündigt eine neue Entwicklungsphase für das Spiel an, die auch ein neues Speicherformat beinhalten würde[1].
Indev 23. Dezember 2009
  • Als Einblick in die weitere Entwicklung des Spiels werden Indev-Versionen veröffentlicht, in denen man das Spiel absichtlich nicht speichern kann[2][3].
21. Januar 2010
  • Notch hat verschiedene Datenformate getestet, aber weil sie entweder zu komplex waren oder seine Anforderungen nicht erfüllten, hat er ein eigenes Named-Binary-Tag-Format entwickelt[4], das er in dieser Spezifikation kurz beschreibt.
Indev 22. Januar 2010
  • Erstmals in der Indev-Version kann man Spielstände speichern und laden, als Datenformat wird das NBT-Format verwendet, das Speicherformat wird Indev Level Format genannt
Beta 1.3
  • Bei Einführung des Region Formates wird den Weltdaten die neue Eigenschaft version hinzugefügt, die die aktuelle Version des NBT-Formates enthält, welche "19132" lautet.
Vollversion 1.2 (12w07a)
  • Bei Einführung des Anvil Formates erhält das NBT-Format den neuen Datentyp "Int-Array" (ID 11), die version-Eigenschaft in den Weltdaten wird dabei auf "19133" geändert.
Vollversion 1.7 (13w36a)
  • Einführung von Stringified NBT (SNBT) zur Eingabe von NBT-Daten in Befehlen wie /summon und /give.
Vollversion 1.12 (17w16a)
  • Verbessertes NBT-Parsing und verbesserte Fehlermeldung in Befehlen.
Vollversion 1.13
17w45a
17w45b
17w47a
  • Neuen Datentyp "Long-Array" hinzugefügt, die Version bleibt bei 19133.
18w01a
  • Datengenerator hinzugefügt, sowohl für den Client als auch für den Server.

Einzelnachweise[]

Advertisement