Minecraft Wiki
Markierung: Visuelle Bearbeitung
(Java: 1.14.3-pre2;)
Zeile 49: Zeile 49:
 
tellraw @a { "score":{ "name":"#test", "objective":"durchlauf" } }
 
tellraw @a { "score":{ "name":"#test", "objective":"durchlauf" } }
 
execute if score #test durchlauf < #test ende run function schleife
 
execute if score #test durchlauf < #test ende run function 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 Endewert 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.
+
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.
   
 
== Positionsübertragung ==
 
== Positionsübertragung ==
Zeile 58: Zeile 58:
 
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:
 
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
 
particle minecraft:barrier ~ ~ ~ 0 0 0 1 1
execute if block ~ ~ ~ air positioned ^ ^ ^1 run function test:position
+
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 Chunkgrenzen gelangt.
+
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.
   
 
== Einschränkungen ==
 
== Einschränkungen ==
 
Mit Funktionen lassen sich mit nur einem Aufruf mehr Befehle ausführen als mit den größten {{tw|Technik/Befehle|Befehlsblocktechniken}}. Allerdings gibt es auch ein paar Einschränkungen gegenüber Befehlsblöcken:
 
Mit Funktionen lassen sich mit nur einem Aufruf mehr Befehle ausführen als mit den größten {{tw|Technik/Befehle|Befehlsblocktechniken}}. Allerdings gibt es auch ein paar Einschränkungen gegenüber Befehlsblöcken:
* Funktionen lassen sich, außerhalb von Minecraft selbst, ausschließlich mit einem Atom-Plugin prüfen.
+
* Funktionen lassen sich, außerhalb von Minecraft selbst, ausschließlich nur mit externen Programmen direkt prüfen.
 
* Sie lassen sich nur von außen erstellen und bearbeiten, ein [[Operator]] im Spiel kann sie nicht beeinflussen.
 
* 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 (<code>[[Befehl/execute|/execute]]</code>). Im Befehlsblock kann man einfach auf die Schaltfläche "Bedingt" klicken um das zu prüfen.
+
* Um den Erfolg oder Misserfolg eines Vorgängerbefehls zu prüfen, benötigt man einiges an Vorwissen (<code>[[Befehl/execute|/execute store]]</code>). Im Befehlsblock kann man einfach auf die Schaltfläche "Bedingt" klicken um das zu prüfen.
   
 
== Geschichte ==
 
== Geschichte ==
Zeile 105: Zeile 105:
 
|list3= *Das Fehlerprotokoll zählt die Zeilen einer Funktion beginnend bei Zeile <code>1</code> und nicht mehr bei <code>0</code>
 
|list3= *Das Fehlerprotokoll zählt die Zeilen einer Funktion beginnend bei Zeile <code>1</code> und nicht mehr bei <code>0</code>
 
|group4= {{ver|1.14|18w43a}}
 
|group4= {{ver|1.14|18w43a}}
|list4= *Mit dem {{b|/schedule}} können Funktionen sehr einfach in bestimmen Intervallen ausgeführt werden
+
|list4= *Mit dem {{b|/schedule}} ist es erstmalig möglich, Funktionen mit einer [[Tick]]-Verzögerung aufzurufen
  +
|group5= {{ver|1.14.3|1.14.3-pre2}}
  +
|list5= *Funktionen sind jetzt auf dem [[Server.properties#ops.json|Operator-Level-4]] und können sämtliche Operator-Befehle ausführen, unter anderem so auch den {{b|/forceload}}
 
}}
 
}}
   

Version vom 9. Juli 2019, 17:20 Uhr

Funktionen sind Textdateien, die Befehle enthalten. Beim Aufruf mit dem Befehl /function werden die Befehle ausgeführt.

Dateien

Funktionen müssen selbst angelegt werden, das Spiel hat keine Funktionen, die man als Vorbild nutzen könnte.

Funktionen werden in einem Datenpaket gespeichert. Idealerweise hinterlegt man Funktionen in einem eigenen Namensraum. Es kann auch der minecraft-Namensraum verwendet werden. Das hat den Vorteil, dass man ihn beim Aufrufen der Funktion weglassen kann, stört aber, wenn zukünftig eine Minecraft-Funktion mit diesem Namen hinzugefügt wird.

Funktionen sind vom Dateityp .mcfunction und können mit einem normalen Texteditor angesehen und geändert werden. Beispiele:

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

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

Nach dem nächsten Spielstart 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 Befehlsblöcken 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.
  • 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 65536 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.

Spezielle Funktions-Aliasse:

  • Trägt man eine oder mehrere Funktionen in den Funktions-Alias minecraft:tick ein, werden sie automatisch mit jedem Tick an den Koordinaten (0,4,1) ausgeführt.
  • Trägt man eine oder mehrere Funktionen in den Funktions-Alias minecraft:load ein, werden sie automatisch beim Laden der Welt, beim disable/enable eines Datenpaketes mit 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

Beispiele

  • Bedingungen werden mit dem Befehl /execute geprüft.
  • Wiederholungen sind möglich, indem sich eine Funktion selbst aufruft. 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 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.

Positionsübertragung

Die Möglichkeit der Positionsübertragung (engl. Ray Casting direkt übersetzt für Strahlenumsetzung) 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.

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:

  • Funktionen lassen sich, außerhalb von Minecraft selbst, ausschließlich nur mit externen Programmen direkt prüfen.
  • 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.

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 nun weggelassen werden
1.12-pre4
  • Funktionen können nun durch den Befehl /function bedingt aufgerufen werden
Vollversion 1.13
17w43a
  • Eigene Funktionen werden jetzt 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)