====== 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 '', ''/give @s deny '', ''/give @s border_block '' 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 [[https://educommunity.minecraft.net/hc/en-us/articles/360047116852-Specialty-Blocks-Allow-Deny-Border-Structure-| 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 ===== 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) [[gf2:start|Zurück zur Übersicht]]