UUID

Aus Minecraft Wiki
Zur Navigation springen Zur Suche springen

UUID ist die Abkürzung für Universally Unique Identifier, was soviel wie "weltweit eindeutige Kennzeichnung" bedeutet (siehe Wikipedia). Damit werden in der Softwareentwicklung Elemente in verteilten Systemen eindeutig gekennzeichnet.

Eine UUID besteht aus einer 16-Byte-Zahl, die hexadezimal notiert und in fünf Gruppen unterteilt wird. Beispiel für eine UUID: 1234abcd-1234-1234-9876-9876abcd1234.

UUID in Minecraft

[Bearbeiten | Quelltext bearbeiten]

In Minecraft besteht das verteilte System aus dem Authentication Service von Mojang, der das Login des Spielers prüft, aus den Clients der Spieler und aus den Minecraft-Servern in der ganzen Welt, auf denen man Minecraft spielen kann. In all diesen Elementen des verteilten Systems soll der Spieler (genauer: ein Minecraft-Account) eindeutig identifizierbar sein.

Durch die UUID erhält jeder Minecraft-Account eine eindeutige Seriennummer. Der Accountbesitzer (der Spieler) kann dann seinen Spielernamen oder seine E-Mail-Adresse ändern und behält trotzdem immer die selbe UUID.

Die eigene UUID kann man aus der Datei .minecraft/launcher_profiles.json ablesen. Dort steht sie im Abschnitt "authenticationDatabase". Achtung: Dort stehen verschiedene IDs, die richtige ist die "uuid". Im Spiel wird die UUID beim Fahren mit der Maus über einen Spielernamen im Chat angezeigt.

Mit einer UUID kann man jedoch nicht nur Spieler, sondern beliebige Elemente kennzeichnen. In Minecraft haben z.B. sämtliche Objekte (d.h. alle Kreaturen, Fahrzeuge, Geschosse, Drops etc.) eine UUID.

Darstellungsformen

[Bearbeiten | Quelltext bearbeiten]
  • String: Eine Hexadezimalform der UUID, bei der die unterschiedlichen Abschnitte durch Bindestriche getrennt werden.
    Die Bindestriche sind so gesetzt, dass sie die UUID in das Format 8-4-4-4-12 bringen, wobei jede Nummer die Anzahl an Hexadezimalstellen markiert, die in den entsprechenden Abschnit passen. Weitere Details folgen in dem Abschnitt Technische Aspekte.
    Ein Beispiel für diese Darstellung wäre f81d4fae-7dec-11d0-a765-00a0c91e6bf6.
    • Weil jeder Abschnitt als eine individuelle Zahl ausgewertet wird, können leere Ziffern an dem Anfang eines Abschnitts ignoriert werden.
      Zum Beispiel kann 00000001-0002-0003-0004-000000000005 als das Gleiche wie 1-2-3-4-5 gewertet werden.
  • String ohne Bindestriche: Das Gleiche wie die String-Darstellung, aber ohne eine Trennung der unterschiedlichen Abschnitte.
    Ein Beispiel für diese Darstellung wäre 00000001000200030004000000000005, wobei es, im Gegensatz zu der normalen String-Darstellung, für den Großteil der Ziffern unmöglich ist, ausgelassen zu werden.
  • Most/Least: Eine Trennung der 64 Bits mit dem höchsten Stellenwert von den 64 Bits mit dem niedrigsten Stellenwert. Beide Zahlen sind separat gespeichert und benutzen im Spiel den Long Datentyp.
    Ein Beispiel für diese Darstellung wäre UUIDMost:-568210367123287600, gepaart mit UUIDLeast:-6384696206158828554.
  • int-array: Eine Trennung in vier 32 Bit-Zahlen. Jeder Teil ist in einem integer-array gespeichert und absteigend nach dem Stellenwert sortiert.
    Ein Beispiel dieser Darstellung wäre [I;-132296786,2112623056,-1486552928,-920753162]

Die folgende Tabelle enthält die Situationen, in denen UUIDs an Stellen verwendet werden, auf die der Benutzer Zugriff hat:[Ab 1.16]

Ort (allgemein) Ort (Pfad) Format Verwendung
Alle Objekte (NBT) UUID int-array Eigene UUID
Zähmbare Kreaturen (NBT) Owner int-array Besitzer
Projektile (NBT) Owner int-array Objekt, das das Projektil erzeugt hat
Drops (NBT) Owner int-array Ziel-Spieler für den Befehl /give
Drops (NBT) Thrower int-array Spieler, der den Gegenstand fallen gelassen hat
Shulkergeschoss (NBT) Target int-array Objekt, auf das der Angriff zielt
Aquisatoren (NBT) Target int-array Objekt, das der Aquisator angreift
Spielerköpfe (NBT) profile.id
SelectedItem.components.minecraft:profile.id
int-array Der Spieler, dem der Kopf gehört
Kreaturen (NBT) Leash.UUID int-array Objekt, das die Kreatur an der Leine hat
Kreaturen, die gepaart werden können (NBT) LoveCause int-array Spieler, der die Kreatur gefüttert hat
Dorfbewohnerzombie (NBT) ConversionPlayer int-array Spieler, der gerade den Dorfbewohnerzombie heilt
Bienen und Zombifizierte Piglins (NBT) HurtBy int-array Objekt, das die Kreatur angegriffen hat
Dorfbewohner (NBT) Gossips[].Target int-array Spieler, der den Tratsch verursacht hat
Selektoren (Befehle) - String Alternative zu Spielernamen und Selektorvariablen
Dieser Abschnitt ist unvollständig.
Du kannst helfen, indem Du ihn ergänzt. Fehlende Inhalte: Altes UUID-Format fehlt[Bis 1.16]

Eigene Verwendung

[Bearbeiten | Quelltext bearbeiten]

Wenn man mit dem Befehl /summon ein Objekt spawnt, wird ihm normalerweise vom Spiel automatisch eine UUID gegeben. Man kann aber auch selbst eine UUID vergeben, wodurch man das Objekt unter Anderem über den Befehl /execute if entity eindeutig identifizieren kann. Dieses Verfahren hat den Vorteil, dass die UUID auch als Selektor eingesetzt werden kann, was im Vergleich zu Selektor-Variablen wie @e extrem performant ist.

Dazu belegt man einfach die ersten drei Einträge der UUID mit einer 0 und der vierte Eintrag mit einer kleinen Zahl. Weil es Ganzzahlen sind, muss man ein "I" (Integer) vorstellen (siehe NBT-Format), sonst wird die Eingabe ignoriert und eine automatische UUID vergeben.

Beispiele:

UUID-Array UUID-String
[I;0,0,0,0] 00000000-0000-0000-0000-000000000000
[I;0,0,0,1] 00000000-0000-0000-0000-000000000001
[I;0,0,0,9] 00000000-0000-0000-0000-000000000009
[I;0,0,0,10] 00000000-0000-0000-0000-00000000000a

  • Der Befehl /summon minecraft:pig ~ ~ ~ {UUID:[I;0,0,0,2] } erzeugt ein Schwein mit der UUID 2.
  • Der Befehl /say @e[type=minecraft:pig] nennt alle Schweine. Hat man vorher F3+H gedrückt und fährt mit der Maus über die Namen der Schweine (normalerweise heißen sie einfach "Schwein"), sieht man ihre UUID.
  • Der Befehl /execute if entity @e[type=minecraft:pig,nbt={UUID:[I;0,0,0,2] } ] ist erfolgreich, wenn es ein Schwein mit der UUID 2 gibt.
    Das gleiche Ergebnis erreicht man mit besserer Laufzeit mit dem Befehl /execute if entity 0-0-0-0-2.

Existieren in Minecraft jedoch Objekte mit der selben UUID, kann es zu Fehlern kommen. Unter anderem können dann Fehlermeldungen wie "Dieses Objekt kann nicht gefunden werden" auftreten. Man kann dieses Problem nur lösen, indem man diese Objekte per Hand tötet oder den Befehl /kill anwendet und die Welt neu öffnet.

Dieser Abschnitt ist unvollständig.
Du kannst helfen, indem Du ihn ergänzt. Fehlende Inhalte: Hinweise zur Vermeidung von schon vergebenen UUIDs durch das Umschreiben der Metadaten fehlen

Generieren von Zufallszahlen

[Bearbeiten | Quelltext bearbeiten]

Wenn sie nicht manuell festgelegt wurde, ist die UUID von Objekten oder Attribut-Modifikatoren zufällig gesetzt, wodurch sie sich gut für das Generieren von Zufallszahlen eignet.

Dieser Abschnitt ist unvollständig.
Du kannst helfen, indem Du ihn ergänzt. Fehlende Inhalte: Erläuterung fehlt; braucht zusätzlich Erklärung zum Vermeiden der festen Metadaten, welche nicht zufällig generiert sind

Manipulation von Spielmechaniken

[Bearbeiten | Quelltext bearbeiten]

Weil eine Vielzahl an Spielmechaniken auf dem Auslesen von in NBT-Daten gespeicherten UUIDs beruht, lassen sich diese durch das Umschreiben dieser Daten verändern.

Dieser Abschnitt ist unvollständig.
Du kannst helfen, indem Du ihn ergänzt. Fehlende Inhalte: Erläuterung fehlt

Spielername zu UUID finden

[Bearbeiten | Quelltext bearbeiten]

Um den Spielernamen zu einer UUID zu finden, verwendet man die Mojang API. Die UUID muss dabei ohne Trennstriche eingegeben werden. Beispiel:

https://api.mojang.com/user/profiles/f498513ce8c84773be26ecfc7ed5185d/names liefert den Spielernamen "jeb".

Umgekehrt kann man zu einem Spielernamen auch die UUID ermitteln:

https://api.mojang.com/users/profiles/minecraft/jeb liefert die UUID "f498513ce8c84773be26ecfc7ed5185d".

Alternativ lässt sich ein Spielernamen mit dem folgenden Rechner in eine UUID umwandeln:

Ein interaktives Widget wird gerade geladen. Wenn dies bei dir nicht funktioniert, lade bitte die Seite neu oder überprüfe, ob JavaScript aktiviert ist.

Umrechnung String-UUID in UUIDLeast und UUIDMost

[Bearbeiten | Quelltext bearbeiten]
Dieser Abschnitt enthält Inhalte, die nur in veralteten Versionen von Minecraft existieren.
Diese Funktion war früher im Spiel vorhanden, wurde aber inzwischen entfernt.

In den NBT-Daten wurden bis Vollversion 1.16 (20w12a) UUIDs nicht als String gespeichert, sondern in zwei Hälften geteilt und als vorzeichenbehaftete Long-Zahlen UUIDLeast und UUIDMost gespeichert. Für die Umrechnung ist es am einfachsten, externe Werkzeuge zu benutzen, die neben den hier erklärten Formaten auch in das int-array Format umrechnen können. Ein gutes Beispiel ist diese Seite: https://www.soltoder.com/mc-uuid-converter/
Eine manuelle Umrechnung kann allerdings auch durch die folgenden Schritte umgesetzt werden:

Die UUID ist 32 Ziffern lang, die Trennstriche gehören nicht dazu 1234abcd-1234-1234-9876-9876abcd1234
UUID halbieren: die ersten 16 Ziffern und die letzten 16 Ziffern vorne (most): 1234abcd12341234
hinten (least): 98769876abcd1234
Die ersten und die letzten 16 Ziffern jeweils in eine Dezimalzahl umrechnen, z. B. mit diesem Umrechner der auch mit sehr großen Zahlen umgehen kann 1234abcd12341234 => 1311862288733704756
98769876abcd1234 => 10986135976472810036
Die umgerechneten Dezimalzahlen haben kein Vorzeichen, liegen also im Wertebereich 0 bis 18446744073709551615 = 1616-1. Die gesuchten Long-Zahlen sind dagegen vorzeichenbehaftet, liegen also im Wertebereich -9223372036854775808 bis 9223372036854775807 = -1616/2 bis 1616/2-1 (siehe Long-Zahlen im NBT-Format). Daher muss man von jeder Dezimalzahl, die größer als 9223372036854775807 ist, 18446744073709551616 abziehen. Für diese Rechnung kann man z. B. den Web 2.0 Rechner verwenden 1311862288733704756 ist kleiner als
9223372036854775807, daher: 1311862288733704756 = UUIDMost

10986135976472810036 ist größer als
 9223372036854775807, daher:
10986135976472810036 - 18446744073709551616
= -7460608097236741580
= UUIDLeast

Und umgekehrt:

UUIDMost und UUIDLeast sind vorzeichenbehaftete Long-Zahlen im NBT-Format UUIDMost: 1311862288733704756
UUIDLeast: -7460608097236741580
Wenn UUIDMost oder UUIDLeast negativ ist, dann 18446744073709551616 addieren (mit dem Web 2.0 Rechner) UUIDMost: 1311862288733704756
UUIDLeast: -7460608097236741580 + 18446744073709551616 = 10986135976472810036
In hexadezimale Zahlen umrechnen (mit dem Converter) UUIDMost (vorne): 1234abcd12341234
UUIDLeast (hinten): 98769876abcd1234
UUID zusammensetzen mit Trennstrichen 1234abcd-1234-1234-9876-9876abcd1234

Technische Aspekte

[Bearbeiten | Quelltext bearbeiten]

Eine UUID kann als eine 128 Bit Zahl ausgedrückt werden, was bedeutet, dass sie alle ganzzahligen Werte von -(2^127) bis (2^127)-1 unterstützt. Dabei ist es wichtig, zu wissen, dass diese Auswertung sich nicht auf den potenziell generierten Bereich bezieht, sondern sich stattdessen auf die Kapazität des Formats konzentriert.

String-Format-Abschnittsnamen

[Bearbeiten | Quelltext bearbeiten]

String Format UUIDs folgen dem Muster aaaaaaaa-bbbb-cccc-ddee-ffffffffffff.

Abbschnittsname Verwendetes Zeichen Bit-Bereich
Von Bis Größe
time-low a 96 127 32
time-mid b 80 95 16
time-high-and-version c 54 79 16
clock-seq-and-reserved d 36 53 8
clock-seq-low e 48 45 8
node f 0 47 48

Minecraft verwendet UUIDs der vierten Version, was bedeutet, dass die gesamte Zahl, unter Ausnahme der Metadaten, zufällig generiert wird. Eine Tabelle mit den Platzierungen und Werten der Metadaten innerhalb der UUID:

Lange Version

[Bearbeiten]

Komprimierte Version

[Bearbeiten]
Versionen der Java Edition
Vollversion
1.5 (13w03a)
  • Die Objektdaten (Spieler, Kreaturen, sonstige Objekte) erhalten eine UUID in zwei Teilen.
1.6 (13w16a)
1.7 (13w38a)
1.7.6 (1.7.6-pre1)
  • Das Spiel verwendet überall die UUID, um einen Spieler eindeutig zu identifizieren.
1.8
14w02a
  • Schnellinfo für Objekte im Chat hinzugefügt, wenn man F3+H gedrückt hat, sieht man darin die UUID des Objektes.
14w10a
  • Als Vorbereitung den Spielernamen ändern zu können, werden in allen Spielerlisten automatisch die Spielernamen in UUIDs umgewandelt.
14. April 2014
  • Die Mojang API wird veröffentlicht, mit der man UUID und Spielername von Spielern abfragen kann.
4. Februar 2015
  • Man kann seinen Spielernamen ändern, die UUID bezeichnet den Spieler überall eindeutig.
1.13 (17w45a)
  • Mit dem Befehl /data get entity kann man die UUID-Eigenschaft vom Spieler im Spiel anzeigen lassen und in einen Punktestand speichern, allerdings wird nur int für den long-Wert unterstützt.
1.16
20w12a
  • Die UUID-Eigenschaft in sämtlichen NBT-Daten wird von den long-Datentwerten UUIDLeast und UUIDMost in UUID mit int-Array-Werten geändert.
20w17a
1.21 (24w21a)