Minecraft Wiki
Registrieren
Advertisement

Funktionen sind Textdateien, die Befehle enthalten. Beim Aufruf mit dem Befehl /function [Namensraum]:Funktionsname werden die Befehle ausgeführt.

Erstellung[]

Funktionen sind immer Bestandteil von einem Datenpaket, welches bereits vorhanden oder erst angelegt werden muss. Ein Datenpaket wird als Unterordner im Verzeichnis .minecraft\saves\Name des Weltordners\datapacks\ erstellt und muss eine Definitionsdatei namens pack.mcmeta enthalten um von Minecraft erkannt zu werden. Diese Datei ist eine Textdatei, die man selbst erstellen kann: siehe Datenpaket.

Funktionen sind Textdateien mit der Dateiendung .mcfunction und können mit einem normalen Texteditor erstellt und geändert werden. Innerhalb des Datenpaket-Ordners müssen Funktionen an der richtigen Stelle in einer Unterordnerstruktur abgelegt werden. Dabei muss man zunächst entscheiden, ob man einen eigenen Namensraum oder den Standard-Namensraum minecraft verwenden möchte. Bei Verwendung eines eigenen Namensraumes besteht kaum eine Verwechslungsgefahr mit fremden Funktionen oder Befehlen, da man den Namensraum immer vor den Funktionsnamen schreiben muss, zum Beispiel wäre eigene-funktionen:funktion_hallo die Funktion funktion_hallo.mcfunction aus dem Namensraum meine_funktionen. Verwendet man stattdessen den Standard-Namensraum minecraft, so kann man ihn beim Aufrufen der Funktion weglassen.

Der Funktionsname und der Namensraum-Name dürfen keine Großbuchstaben enthalten.

Funktionsdateien werden in folgende Unterordner abgelegt:

.minecraft\saves\Name des Weltordners\datapacks\Name des Datenpakets\data\eigener-namensraum\functions\eigene-funktion.mcfunction

bzw.

.minecraft\saves\Name des Weltordners\datapacks\Name des Datenpakets\data\minecraft\functions\eigene-funktion.mcfunction


Nach dem nächsten Spielstart (oder Serverstart) oder nach dem Befehl /reload können die Funktionen verwendet werden. Für die Beispiele sieht das so aus:

Eigenschaften[]

  • Jede Zeile in der Funktion steht für einen Befehl.
  • Dabei muss der Schrägstrich, der bei Eingabe eines Befehls im Chat benötigt wird, weggelassen werden.
  • Im Gegensatz zu einem Befehlsblock gibt es in Funktionen keine Begrenzung für die Länge von Befehlen.
  • Kommentare beginnen mit einer Raute #. Diese Zeilen werden bei der Ausführung der Funktion nicht beachtet. Mit Kommentaren kann und sollte man beschreiben, was die Funktion oder einzelne Befehle tun. Das Kommentarzeichen ist außerdem nützlich, um Befehle in der Testphase zu deaktivieren.
  • Befehle mit Argumenten beginnen mit einem Dollar-Symbol $. Diese Zeilen verwenden die Argumente die beim Aufruf der Funktion mitgegeben wurden. Diese Argumente kann man als Platzhalter verstehen die durch den jeweiligen konkreten Wert ersetzt werden.
  • Leerzeilen werden ignoriert.
  • Funktionen mit unbekannten Befehlen oder Syntaxfehlern werden vom Befehl /reload nicht geladen. Die Ursache kann im Fehlerprotokoll nachgesehen werden, das beim Start des Spiels angezeigt wird, wenn man in den Launcher-Einstellungen "Ausgabeprotokoll öffnen" aktiviert hat.
  • Mehrere Funktionen können zu Funktions-Aliasen zusammengefasst werden. Die Funktionen in einer Aliasgruppe werden innerhalb eines Ticks nacheinander ausgeführt.
  • Funktionen können über den Befehl /function weitere Funktionen oder Funktions-Aliase aufrufen.
  • Alle Befehle einer Funktion werden in einem einzelnen Tick ausgeführt, auch wenn innerhalb der Funktion weitere Funktionen aufgerufen werden.
  • Beim Aufruf einer Funktion werden maximal 65.536 Befehle ausgeführt. Dieser Wert kann durch den Befehl /gamerule maxCommandChainLength geändert werden.
  • Beim Aufruf über den Befehl /function werden alle Befehle in der Funktion durch die Befehlsquelle ausgeführt, die die Funktion gestartet hat.
  • Eine Funktion kann aber auch über die rewards-Eigenschaft in den Fortschrittsdaten gestartet werden. Dann werden die Befehle in der Funktion durch den Spieler ausgeführt, der den Fortschritt erreicht hat.
  • Ein einzelner Rückstrich \ als letztes Zeichen einer Zeile, das kein Leerzeichen ist, ermöglicht die Fortsetzung eines Befehls in der nächsten Zeile.

Spezielle Funktions-Aliase:

  • Trägt man eine oder mehrere Funktionen in den Funktions-Alias minecraft:tick ein, werden sie automatisch mit jedem Tick am Spawnbereich-Mittelpunkt, welcher über den Befehl /setworldspawn gesetzt werden kann, ausgeführt.
  • Trägt man eine oder mehrere Funktionen in den Funktions-Alias minecraft:load ein, werden sie automatisch beim Laden der Welt, beim Aktivieren oder Deaktivieren eines Datenpaketes mit dem Befehl /datapack, beim Befehl /reload und beim Drücken der Tastenkombination F3+T ausgeführt.
  • Ausführliche Informationen und ein Beispiel stehen unter Aliasdaten#tick.json und load.json

Einschränkungen[]

Mit Funktionen lassen sich mit nur einem Aufruf mehr Befehle ausführen als mit den größten Befehlsblocktechniken. Allerdings gibt es auch ein paar Einschränkungen gegenüber Befehlsblöcken:

  • Fehler in geschriebene Funktionen lassen sich nur über das Fehlerprotokoll überprüfen, welches immer nur den ersten Fehler pro Funktion dokumentiert.
  • Das Schreiben von Befehlen in Funktionen geschieht außerhalb von Minecraft und wird diesbezüglich nicht durch einen Befehle-Parser unterstützt. Stattdessen muss man auf externe Programme zurückgreifen.
  • Sie lassen sich nur von außen erstellen und bearbeiten, ein Operator im Spiel kann sie nicht beeinflussen.
  • Um den Erfolg oder Misserfolg eines Vorgängerbefehls zu prüfen, benötigt man einiges an Vorwissen (/execute store). Im Befehlsblock kann man einfach auf die Schaltfläche "Bedingt" klicken um das zu prüfen.

Beispiele[]

Bedingungen und Wiederholungen[]

  • Bedingungen werden mit dem Befehl /execute geprüft.
  • Wiederholungen sind möglich, indem sich eine Funktion selbst aufruft ([{de.wikipedia:Rekursion|Rekursion]]). Damit dies nicht endlos geschieht, muss es eine Abbruchbedingung geben. Ansonsten beendet das Spiel einen Funktionsaufruf nach der Anzahl ausgeführter Befehle, die in der Spielregel maxCommandChainLength hinterlegt ist (standardmäßig 65536).

Im Beispiel werden folgende Befehle im Chat eingegeben:

/scoreboard objectives add durchlauf dummy
/scoreboard objectives add ende dummy
/scoreboard players set #test durchlauf 0 
/scoreboard players set #test ende 10
/function test:schleife

Die Befehle legen das Ziel "durchlauf" an, das jeden Schleifendurchlauf zählt und das Ziel "ende", das das Ende der Schleife bestimmt. Danach wird der Zähler "#test" initialisiert: Die Testschleife soll bei 0 beginnen und bei 10 enden. Schließlich wird die Funktion test/schleife.mcfunction aufgerufen, die so aussieht:

scoreboard players add #test durchlauf 1
tellraw @a { "score":{ "name":"#test", "objective":"durchlauf" } }
execute if score #test durchlauf < #test ende run function test:schleife

Die Funktion erhöht zuerst den Durchlauf der Testschleife um 1 und gibt die Zahl dann im Chat aus. Zum Schluss wird die Schleifenfunktion erneut aufgerufen, wenn der Durchlaufwert kleiner als der Endwert ist. Dadurch erscheinen die Zahlen 1 bis 10 im Chat. Es empfiehlt sich, nach dem execute-if-Befehl keine weiteren Befehle in der Funktion zu haben, denn diese werden mit jedem Funktionsaufruf ausgeführt, also in diesem Beispiel zehn Mal.

Rückgabewert und vorzeitiges Beenden[]

  • Rückgabewerte werden mit dem Befehl /return geändert und können durch den Befehl /execute store result ... run function ... ausgelesen werden.
  • Vorzeitiges Beenden innerhalb einer Funktion ist möglich, wenn man den Befehl /return innerhalb einer Funktion vor anderen Befehlen in der Liste verwendet. Man sollte jedoch immer darauf achten dass der return-Befehl nur mit einer if-Abfrage die Funktion vorzeitig beendet, da ansonsten die nachfolgenden Befehle nie erreicht werden können.

Im Beispiel werden folgende Befehle im Chat eingegeben:

/scoreboard objectives add wert dummy
/scoreboard players set #test wert 0
/execute store result score #rueckgabe wert run function test:rueckgabe

Die Befehle legen das Ziel "wert" an. Danach wird die Variable "test" initialisiert. Der Wert bestimmt an welcher Stelle die Funktion abrechen wird. Anschließend wird die Funktion aufgerufen und der Rückgabewert wird in die Variable "rueckgabe" gespeichert.

execute if score #test wert matches ..-1 run return -1
execute if score #test wert matches 0 run return 0
return 1

Die Funktion gibt den Wert -1 aus, wenn die Variable negative Werte besitzt, 0 wenn die Variable diesen Wert ebenfalls besitzt und ansonsten 1 wenn die Variable eine positiven Wert besitzt

Argumente[]

  • Argumente werden über den Befehl /function ... {argument:<Wert>} übergeben werden. Funktionen mit dem Aufruf von Argumenten können diese mit $(argument) überall in einem Befehl verwenden, welcher mit$ gekennzeichnet ist.

Im Beispiel wird folgende Funktion im Chat aufgerufen:

/function test:argumente {x:66,y:128,z:42,befehl:"effect give @s minecraft:regeneration"}

Die Funktion wird mit den Argumenten x, y und z aufgerufen. Diese werden in der Funktion verwendet:

$tellraw @s "Du wurdest zu den Koordinaten X:$(x) Y:$(y) Z:$(z) teleportiert."
$teleport @s $(x) $(y) $(z)
$$(befehl)

Die Funktion gibt dem Spieler im Chat die Koordinaten aus und teleportiert den Spieler zu den gewünschten Koordinaten.

Positionsübertragung[]

  • Raycasting (siehe Wikipedia) in diesen Kontext mit Positionsübertragung übersetzt ermöglicht es einem, ohne Bezugsobjekt von der aktuellen relativen Position, einen weiteren Schritt zu gehen.

Für das Beispiel wird nachfolgender Befehl eingetippt:

/execute anchored eyes if block ~ ~ ~ minecraft:air positioned ^ ^ ^2 run function test:position

Der Befehl führt von der Position der Augen aus einen if-block-Test aus um festzustellen ob sich etwas im Weg befindet, wenn nur Luft erfolgreich getestet wurde, wird die Funktion test/position.mcfunction vom Blickwinkel des Spielers zwei Blöcke vor ihm ausgeführt, welche so aussieht:

particle minecraft:barrier ~ ~ ~ 0 0 0 1 1
execute if block ~ ~ ~ minecraft:air positioned ^ ^ ^1 run function test:position

Zur Visualisierung wurde ein Barrieren-Partikel verwendet, das dem Spieler anzeigt wo die Funktion überall schon gewesen ist. Dann erfolgt die Prüfbedingung, bei der wie beim Chat-Aufruf getestet wird ob, an der aktuellen relativen Position Luft ist. Wenn das der Fall ist, wird in Blickrichtung um einen Block nach vorne die selbe Funktion erneut aufgerufen. Diesen Selbstaufruf nennt man "Rekursion". Die Funktion wird aufhören, sobald sie die Prüfbedingung fehl schlägt oder sie bis zu den Chunk-Grenzen gelangt.

Geschichte[]

Versionsgeschichte der Java Edition
Vollversion 1.12
17w17a
  • Die neue commands-Eigenschaft in den Fortschrittsdaten ermöglicht die Eingabe einer Liste von Befehlen, die beim Erreichen des Fortschritts ausgeführt werden.
1.12-pre1
  • Funktionen hinzugefügt, sie ersetzen die Liste der Befehle in den Fortschrittsdaten.
  • In den Fortschrittsdaten wird die commands-Eigenschaft durch die function-Eigenschaft ersetzt.
  • Funktionen können auch unabhängig vom Erreichen eines Fortschritts über den neuen Befehl /function ausgeführt werden.
1.12-pre3
  • Man kann Zeilen in Funktionen nicht mehr durch // auskommentieren, sondern nur noch durch #.
  • Der Schrägstrich vor Befehlen muss in der Funktionsdatei weggelassen werden.
1.12-pre4
  • Funktionen können durch den Befehl /function if|unless bedingt aufgerufen werden.
Vollversion 1.13
17w43a
  • Eigene Funktionen werden pro Welt in Datenpaketen gespeichert.
17w45a
17w49a
  • Funktionen können zu Aliasen zusammengefasst werden.
17w49b
  • Der Funktions-Alias #minecraft:tick führt die enthaltenen Funktionen mit jedem Tick aus.
18w01a
  • Der Funktions-Alias #minecraft:load führt die enthaltenen Funktionen bei jedem Laden der Datenpakete aus.
Vollversion 1.13.1 (18w31a)
  • Das Fehlerprotokoll zählt die Zeilen einer Funktion beginnend bei Zeile 1 und nicht mehr bei 0.
Vollversion 1.14 (18w43a)
  • Mit dem Befehl /schedule ist es erstmalig möglich, Funktionen mit einer Tick-Verzögerung aufzurufen.
Vollversion 1.14.3 (1.14.3-pre2)
Vollversion 1.14.4 (1.14.4-pre4)
Vollversion 1.20 (23w16a)
  • Der Befehl /return wird hinzugefügt, mit Hilfe dessen man den Rückgabewert einer Funktion überschreiben und die Funktion vorzeitig beenden kann.
Vollversion 1.20.2
23w31a
  • Ein einzelner Rückstrich \ als letztes Zeichen einer Zeile, das kein Leerzeichen ist, ermöglicht die Fortsetzung eines Befehls in der nächsten Zeile.
  • Befehle einer Funktion können Argumente enthalten, diese können beim Aufruf einer Funktion übergeben werden.
1.20.2-pre1
  • Zahlen, die als Argumente verwendet werden, werden immer ohne Suffixe eingefügt, unabhängig vom numerischen Typ.
Vollversion 1.20.3 (23w41a)
  • Funktionen haben keinen Rückgabewert mehr, es sei denn, der Befehl /return wird verwendet oder ein Fehler bei der Suche oder Instanziierung ist aufgetreten.

Advertisement