Dies ist eine alte Version des Dokuments!
Tipps zur Programmierung von Interaktionen
1. Deny, Allow und Border-Blocks
- Wenn man möchte, dass sich die Spieler nur in einem bestimmten Bereich aufhalten können, kann man sogenannte Border-Blocks verwenden.
- Wenn man verhindern will, dass man auf einer Fläche bauen kann, verwendet man Deny-Blocks.
- Wenn die ganze Welt unveränderbar ist (man kann nirgends bauen), kann man mit Allow-Blocks Bereiche definieren, wo doch gebaut werden kann.
Um diese drei speziellen Blöcke von Hand setzen zu können, benötigt man Worldbuilder-Rechte. Diese kann man sich geben mit /worldbuilder.
Zudem findet man die Blöcke nicht im Inventar, man muss sich diese mit /give @s allow <Anzahl>, /give @s deny <Anzahl>, /give @s border_block <Anzahl> geben.
Um die Welt unveränderbar zu machen, verwendet man \immutableworld
Will man diese allow-, deny, oder border-Blöcke mit Code erstellen (z.B. über blocks.fill), dann muss man statt des Namens die ID verwenden (210 = Allow-Block, 211=Deny-Block, 212 = Border-Block)
In diesem Video (3 Minuten, engl.) wird das Grundprinzip kurz erklärt.
2. Mit Listeners Interaktionen programmieren
Man kann auch Python-Funktionen ausführen, wenn bestimmte Bedingungen erfüllt sind. Dazu verwendet man sogenannte „Listeners“, Diese funktionieren genau wie bei Tigerjython:
Wenn der Spieler „baue_Goldhaus“ in den Chat tippt, soll der ausgehöhlte Goldblock erstellt werden:
def on_chat():
blocks.fill(GOLD_BLOCK, pos(1, 1, 1), pos(10, 10, 10))
blocks.fill(AIR, pos(2,2,2), pos(9, 9, 9))
player.on_chat("baue_Goldhaus", on_chat)
Es gibt verschiedene von diesen Listenern. Alle beginnen mit player.on, oder mit blocks.on . (player.on_chat, player.on_item_interacted, blocks.on_block_broken, blocks,on_blocks_placed etc.)
2.1 Während sich der Spieler bewegt eine Funktion aufrufen
Verwendet man den Listener on_travelled_walk() so wird die entsprechende Funktion bei jeder Bewegung des Spielers aufgerufen. Dadurch kann man beliebige Interaktionen auslösen. Beispielsweise kann man den Spieler töten, wenn er bei einer bestimmten Position in die Falle getreten ist etc.
Hierfür fragt man in der Funktion die Position des Spielers ab und kann dann in einem if-Befehl entsprechend dieser Position eine Aktion programmieren. Das folgende Programm wird bei jeder Bewegung des Spielers ausgeführt und platziert 4 Felder neben dem Spieler einen Glasblock, wenn sich dieser in einem bestimmten Bereich aufhält:
def on_travelled_walk():
x = player.position().get_value(Axis.X)
y = player.position().get_value(Axis.Y)
z = player.position().get_value(Axis.Z)
player.say("x:"+str(x)+" y:"+str(y)+" z:"+str(z))
if (10<x<20) and (y==4) and (z==15):
blocks.place(GLASS,pos(4,0,0))
player.on_travelled(WALK, on_travelled_walk)
3. Mit player.execute() Spielkommandos ausführen
Mit dem Befehl player.execute kann man die Spielkommandos ausführen, die man sonst in den Chat schreibt. Beispielsweise kill @s (um den Spieler zu töten, Achtung, hierfür muss man im Survival- oder im Adventure-Modus sein) setworldspawn x y z (um den Weltspawnpunkt zu setzen), spawnpoint x y z um den Spawnpunkt des Spielers zu setzen.
Hierfür gibt man das Kommando in Anführungszeichen ein, ohne den Schrägstrich. Das folgende Programm lässt den Spieler sterben, wenn er das goldene Schwert verwendet (um dem Spieler ein goldenes Schwert zu geben: „/give @s GOLDEN_SWORD“ in den Chat schreiben). BEVOR er gestorben ist, kann man noch seinen neuen Spawnpunkt setzen (so kann man ihn bei verschiedenen Aufgaben immer wieder am Anfang der neuen Aufgabe erscheinen lassen).
def on_goldensword_interacted():
player.say("Sorry, du bist leider gestorben")
player.execute("spawnpoint @s 20 10 30")
player.execute("kill @s")
player.on_item_interacted(GOLDEN_SWORD, on_goldensword_interacted)
Dafür kann man auch Command-Blocks verwenden (siehe Punkt 4 unten), doch es ist meist viel einfacher, dies direkt im Python-Code zu tun.
Achtung: in der Funktion player.on_died() kann man player.execute nicht ausführen (da er tot ist).
4. Code durch Command-Blocks ausführen lassen
Man kann z.B. eine Pressure-Plate mit Redstone mit einem Command-Block verbinden.
Im Commandblock verwendet man den Befehl /tell @p letsgo
Im Codebuilder kann man nun eine Funktion on_tell_command() machen:
def on_tell_command():
blocks.place(ACACIA_FENCE,pos(4,3,0))
player.on_tell_command("letsgo", on_tell_command)
Dasselbe funktioniert auch mit Schaltern, Hebeln, Redstone-Truhen etc.
def on_tell_command_maches():
blocks.fill(GOLD_BLOCK,world(12,4,13),world(15,12,13))
player.on_tell_command("mach_es", on_tell_command_maches)
def on_tell_command_abbauen():
blocks.fill(AIR,world(12,4,13),world(15,12,13))
player.on_tell_command("abbauen", on_tell_command_abbauen)
5. Weitere Beispiele
Wie kann man Items per Programm verwenden?
Z.B. BONE_MEAL. Mit dem Agenten klappt es (siehe unten), wenn man aber direkt per blocks.place arbeiten will, erhält man eine Fehlermeldung.
Wenn Setzlinge verwendet werden, direkt düngen…
def on_item_interacted():
agent.teleport_to_player()
agent.set_item(BONE_MEAL,1,1)
agent.place(FORWARD)
player.on_item_interacted(SEEDS, on_item_interacted)
Testen, ob man einen bestimmten Gegenstand gefunden oder im Inventar hat?
Komplexeres Beispiel: Nur wenn Goldapfel gefunden wurde, Türe öffnen
Ich definiere eine globale Variable found welche ich auf False setze. Sobald der goldene Apfel gefunden wurde und mit ihm interagiert wird (rechte Maustaste), wird die Variable found auf True gesetzt.
Wenn sich der Spieler bewegt, wird immer geschaut, an welcher x-, y- und z-Position er sich befindet, wenn er an der richtigen Stelle ist (vor dem Tor) und wenn found auf True gesetzt ist, soll dann etwas ausgeführt werden (hier wird einfach „Hallo“ geschrieben, aber man könnte die Blöcke abbauen, so dass das „Tor“ geöffnet wird.
found = False
def on_item_interacted():
global found
player.say("Goldapfel gefunden huhuiii")
found = True
player.on_item_interacted(GOLDEN_APPLE, on_item_interacted)
def on_travelled_walk():
x = player.position().get_value(Axis.X)
y = player.position().get_value(Axis.Y)
z = player.position().get_value(Axis.Z)
if (x == 36) and (y==4) and (z==-46) and found==True:
player.say("Hallo")
blocks.place(AIR,world(33,5,-46))
player.say(str(x)+str(y)+str(z))
player.on_travelled(WALK, on_travelled_walk)