Minecraft Wiki
Registrieren
Advertisement

Der Befehle-Parser analysiert einen eingegebenen Befehl, damit ihn das Spiel ausführen kann. Im Zuge dieser Analyse erkennt der Parser falsch eingegebene Befehle und führt sie nicht aus. Stattdessen erhält der Spieler eine Rückmeldung mit der Angabe seines Eingabefehlers.

Funktionsweise[]

Im Chat reagiert der Befehle-Parser auf einen Schrägstrich an erster Stelle und analysiert die folgende Eingabe noch während sie getätigt wird. Dazu vergleicht er die Eingabe mit einem intern vorhandenen Befehlsbaum. Das ist eine Baumstruktur aller Minecraft-Befehle mit ihren Parametern (statt Parameter kann man auch Argument sagen). Der Befehlsbaum legt aber nicht nur die Reihenfolge fest, sondern enthält auch Informationen zum jeweiligen Datentyp, den der Parser somit auch überprüfen kann. Mit dem Datengenerator kann man sich den Befehlsbaum in Listenform ausgeben lassen. Eine grafische Darstellung gibt es hier im Minecraft Modern-Wiki.

Sobald die Eingabe mit dem ersten Knoten des Befehlsbaumes übereinstimmt, hat der Parser den Befehl erfolgreich identifiziert, denn der Befehl muss immer am Anfang stehen. Aus dem Befehlsbaum nimmt der Parser dann den ersten Parameter des Befehls und zeigt ihn zur Unterstützung im Chat an. Hat der Spieler auch diese Eingabe fehlerfrei getätigt, zeigt der Parser den nächsten Parameter an usw., bis es keinen Parameter mehr gibt.

Die Programmfunktionen des Befehle-Parsers sind in die Programmbibliothek brigadier.jar ausgelagert, deren Quellcode öffentlich zugänglich ist (siehe Open-Source-Bibliotheken).

Beispiel[]

/summon pig ~ ~ ~ {NoAI:true}

Ist die Chateinstellung Befehlsvorschläge aktiviert, reagiert der Parser bereits auf den allerersten Buchstaben nach dem Schrägstrich und zeigt alle Befehle aus dem Befehlsbaum an, die mit diesem Buchstaben beginnen.

Solange die Eingabe nicht mit dem entsprechenden Knoten im Befehlsbaum übereinstimmt, wird sie rot angezeigt. Beendet man die Eingabe an dieser Stelle vorzeitig, gibt der Parser die Meldung aus: "Unbekannter oder unvollständiger Befehl". Bei einigen Befehlsquellen (siehe unten) kann der führende Schrägstrich wegfallen.

Parser help

Die Reihenfolge und Schreibweise der Parameter eines Befehls legt die Befehlssyntax fest. Der Befehlsbaum enthält sämtliche Syntaxen aller Minecraft-Befehle.

Der Befehl /help liefert jeweils den ersten Teil einer Befehlssyntax: /summon <entity> [<pos>]. Dies entspricht den ersten Knoten im Befehlsbaum zu diesem Befehl.

Parser0

Beim Eingeben des Befehls wird die Syntax vom Parser nach und nach vervollständigt. Die vollständige Syntax für den Summon-Befehl lautet: /summon <entity> [<pos>] [<nbt>]. Dabei bezeichnen die spitzen Klammern einen Parameter, die eckigen Klammern bedeuten, dass der Parameter optional ist, also weggelassen werden kann. Der Summon-Befehl hat also drei Parameter, die letzten beiden sind optional.

Parser1

Der Parser arbeitet die Eingaben stur nach dem Befehlsbaum ab und prüft dabei auch die Semantik, d. h. den Datentyp einer Eingabe. Beim summon-Befehl muss der erste Parameter ein Objekt sein. Daher vergleicht der Parser die Eingabe mit seiner internen Liste der Objekt-IDs und zeigt die passenden Objekt-IDs mit dem Namensraum "minecraft" über der Eingabe als Vorschlag an. Findet der Parser die Eingabe nicht in seiner internen Liste der Objekt-IDs, meldet er nach dem Abschicken der Eingabe: "Unbekanntes Objekt".

Parser2

Als nächstes kann beim summon-Befehl eine Position folgen. Die Eingabe wird an eine Unterfunktion übergeben, die prüft, ob es drei Kommazahlen oder Tilde-Zeichen sind, die zusammen eine gültige Positionsangabe ergeben. Gibt man den Befehl /summon pig a 2 3 ein, meldet der Parser: "Kommazahl erwartet". Beim Erkennen des ersten Fehlers bricht der Parser ab und schaut sich die weiteren Eingaben gar nicht erst an.

Parser3

Die Eingabe {NoAI:true} ist Stringified NBT, d. h. NBT-Daten in Textform. Auch diese Eingabe wird von einer Unterfunktion abgearbeitet. Diese erkennt Leerzeichen, geschweifte und eckige Klammern, Doppelpunkte und Kommas als Trennzeichen und erwartet Eingaben mit den Bedeutungen "Eigenschaftsname" und "Eigenschaftswert". Die NBT-Eigenschaft mit dem Namen "NoAI" soll hier den Wert "true" haben. Der Parser prüft bei den NBT-Daten nur die Syntax, nicht die Semantik. Ob ein Eigenschaftsname richtig geschrieben oder der Wert gültig ist, wird vom Parser weder beim Eintippen, noch beim Abschicken der Eingabe geprüft. Vielmehr werden unbekannte NBT-Daten akzeptiert, aber vom Spiel einfach ignoriert.

Parser4

Parser5

Parser6

Parser7

Wenn der Parser alle Eingaben abgearbeitet hat, übergibt er das Ergebnis an die interne Befehlsklasse, in diesem Fall an die Klasse des summon-Befehls. Sie erhält eine Objekt-ID, eine Position und eine SNBT-Textkette. Die Klasse nimmt keine Prüfung der übergebenen Daten vor, das hat der Parser erledigt. Sie führt den Befehl nur noch aus.

Um zu verstehen, wie eine Befehlsklasse die Daten verarbeitet (beispielweise wie die Abarbeitung von zwei Positionsangaben aussieht), kann man sich den Quellcode der Befehle in der minecraft.jar mit Forge, MCP oder Spigot anschauen.

Server-Konsole[]

Wird ein Befehl falsch eingetragen, so wird eine kurze Beschreibung des Fehlers angezeigt. Der Befehl darf sowohl mit / (Schrägstrich) als auch ohne eingetragen werden.

Chat[]

Ein falsch eingetippter Befehl wird nicht ausgeführt und gibt eine Fehlermeldung im Chat aus. Der eingetippte Befehl muss immer mit einem Schrägstrich / beginnen.

Befehlsblock[]

Wenn ein Befehl falsch eingetragen wurde, wird wie beim Chat-Fenster eine Fehlermeldung ausgegeben, die im Befehlsblock steht. Zusätzlich werden bedingte Befehlsblöcke, die an diesen Befehlsblock angeschlossen sind, nicht ausgeführt. Der eingetragene Befehl kann optional einen / besitzen, muss aber nicht. In beiden Fällen wird er ausgeführt.

Funktion[]

Ein Befehl darf nicht mit einem Schrägstrich / beginnen. Der Parser prüft die Syntax aller Funktionen beim Laden (Spielstart oder Befehl /reload). Fehler werden im Fehlerprotokoll gemeldet, das beim Start des Spiels angezeigt wird, wenn man in den Launcher-Einstellungen "Ausgabeprotokoll öffnen" aktiviert hat. Fehlerhafte Funktionen werden bei Eingabe vom Befehl /function nicht in der Auswahlliste angezeigt.

Geschichte[]

Versionsgeschichte der Java Edition
Classic 0.0.15a
  • Die Server-Konsole ermöglicht das Eintippen von Befehlen
Alpha 1.0.16
  • Befehle können im Mehrspielermodus im Chat-Feld eingetragen werden
Vollversion 1.3 (12w16a)
  • Die Chat-Konsole wird auch im Einzelspielermodus benutzbar gemacht
Vollversion 1.4 (12w32a)
  • Der Befehlsblock kann Befehle ausführen
Vollversion 1.7 (13w36a)
  • Einführung von Stringified NBT (SNBT) zur Eingabe von NBT-Daten in Befehlen wie /summon und /give
Vollversion 1.12
17w18a
  • Der Befehle-Parser wird optimiert und beschreibt die falsch eingetippten Stellen des Befehls detaillierter und zeigt an, an welcher Stelle er was erwarten würde
1.12-pre1
Vollversion 1.13
17w45a
  • Einsatz des neuen Befehle-Parsers "Brigadier", die entsprechende Programmbibliothek steht unter .minecraft/libraries/com/mojang/brigadier[1]
  • Der neue Befehle-Parser wird direkt bei der Eingabe eines Befehls im Chat aktiv und zeigt die Eingabehilfe im gesamten Bildschirm oberhalb der Chatzeile an
  • Wenn eine Funktion mit dem Befehl /reload aktualisiert wird, erhält man im Launcher eine Übersicht, falls Fehler vorhanden sind
17w45b
  • Die Komponenten von Stringified NBT (SNBT), die der Befehl /data ausgibt, werden vom Befehle-Parser farbig dargestellt
17w46a
  • Die Anzeige der Eingabehilfe erscheint nicht mehr im gesamten Bildschirm oberhalb der Chatzeile, sondern in einem kleinen Ausschnitt, dessen Inhalt mit Tab ↹ oder der Maus selektiert und mit dem Mausrad verschoben werden kann
18w05a
18w06a
  • Fährt man in der Eingabehilfe mit der Maus über die Liste der Objekte, die beim Befehl /summon vorgeschlagen werden, sieht man die jeweilige Übersetzung
26. September 2018
  • Mojang veröffentlicht den Quellcode der Programmbibliothek für den Minecraft-Befehle-Parser brigadier.jar

Einzelnachweise[]

Advertisement