Skip to content

Instantly share code, notes, and snippets.

@HurricanKai
Created January 11, 2019 16:34
Show Gist options
  • Save HurricanKai/a9a26bb4ced87e46601ebb87397cdf5f to your computer and use it in GitHub Desktop.
Save HurricanKai/a9a26bb4ced87e46601ebb87397cdf5f to your computer and use it in GitHub Desktop.

<link, Wiki: Execute>

Branching

Branching ist wenn sich der Exekutionsweg aufteilt.

Dies passiert ausschliesslich wenn execute as <selektor der mehr als ein entity auswählt> ... verwendet wird. d.h. @e oder @a.

In diesem Artikel werden allerdings auch Kontexte erklärt.

Was ist ein Kontext?

Jede "stufe" der exekution bekommt einen eigenen Kontext, der auf dem der vorherigen stufe basiert.

Ein kontext wird hauptzächlich von execute verändert.

Mit Stufe ist hier gemeint wenn z.b. eine Funktion aufgerufen wird, oder mit execute ... run ein Command ausgeführt wird.

Ein Kontext enthält alle Informationen die benötigt werden um die Kommandos auszuführen, das enthält den ausführenden, den Status der Welt, um nur wenige zu nennen.

Beispiel

Zur visualisierung verwenden wir 2 Funktionen, in kombination mit execute

a.mcfunction

execute as @e run function b

b.mcfunction

say @s

Selbstverständlich ist das ein sehr simples beispiel, das keinen wirklich nutzen hat, Praktische Anwendungen gibt es in #Anwendungsbereiche.

execute as @e hier wird alles nachfolgende für jedes Entity ausgeführt, d.h. es wird für jedes Entity ein neuer Branch angefangen, in welchem die Exekution weiter geht.

run function b

in jedem branch wird die Funktion b gestartet:

say @s extrem simpel, @s ist das entity das der ausführende des momentanen Branches ist, und dessen name wird einfach ausgegeben.

Das Ergebniss wenn wir nur zwei Armor Stands Steffen und Peter in der Welt haben:

[Steffen] Steffen
[Peter] Peter

Anwendungsbreiche

Dies wird sehr oft ohne weiter darüber nachzudenken verwendet, daher zuerst einige Fehler die oftmals gemacht werden.

Synkronisierung

Da jeder Kontext seine eigene "Kopie" der Welt enthält, und änderungen erst übernommen werden wenn der bereich des Kontext (Die Funktion, bzw. die execute anweisung) beendet ist werden z.b. Tags, Entities nicht übernommen.

So wird gelegentlich ein Tag, oder ein Entity zum beenden eines Prozesses verwendet, falls dieser Tag/dieses Entity in einem Tieferen Branch (sprich mehr Branches liegen dazwischen, mehr aufteilungen) gesetzt wird übernehmen andere Branches dies nicht, und beenden ihre eigene Exekution als währe dieser Tag nicht übernommen werden (anzumerken ist auch das die exekutionen nacheinander passieren, allerdings werden Kontexte vor aller exekution erstellt)

Dies kann ein erwünscht sein, allerdings auch bugs hervorrufen.

Rekursions-erweiterung

Gemeint ist hier das durch Rekursion der Ausführungspfad immer tiefer und tiefer wird, und gerade wenn rekursion mit Branching verbunden wird (d.h. eine Funktion ruft sich selber in mehreren Entities auf) kann es oft zu fehlern kommen.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment