Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| gf2:projekte:minecraft:interaktionen [2022/11/18 11:56] – lehmannr | gf2:projekte:minecraft:interaktionen [2024/12/09 14:07] (aktuell) – marroc | ||
|---|---|---|---|
| Zeile 17: | Zeile 17: | ||
| Man kann auch Python-Funktionen ausführen, wenn bestimmte Bedingungen erfüllt sind. Dazu verwendet man sogenannte " | Man kann auch Python-Funktionen ausführen, wenn bestimmte Bedingungen erfüllt sind. Dazu verwendet man sogenannte " | ||
| + | |||
| + | ==== 2.1 Wenn etwas Bestimmtes in den Chat geschrieben wird, eine Aktion ausführen ==== | ||
| Wenn der Spieler " | Wenn der Spieler " | ||
| Zeile 31: | Zeile 33: | ||
| (player.on_chat, | (player.on_chat, | ||
| - | ==== 2.1 Während sich der Spieler bewegt eine Funktion aufrufen ==== | + | ==== 2.2 Während sich der Spieler bewegt eine Funktion aufrufen ==== |
| - | Verwendet man den Listener '' | + | Ein sehr praktischer "Listener" ist '' |
| 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: | 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: | ||
| - | + | <sxh python> | |
| - | <sxh python> | + | def on_travelled_walk(): |
| x = player.position().get_value(Axis.X) | x = player.position().get_value(Axis.X) | ||
| y = player.position().get_value(Axis.Y) | y = player.position().get_value(Axis.Y) | ||
| Zeile 49: | Zeile 51: | ||
| player.on_travelled(WALK, | player.on_travelled(WALK, | ||
| + | </ | ||
| + | Statt WALK geht auch: swim water, fall, climb, swim lava, fly, riding, sneak, sprint. | ||
| + | |||
| + | ==== 2.3 Weitere Ereignis-Listeners ==== | ||
| + | Es gibt weitere solche " | ||
| + | * player.on_chat | ||
| + | * playe.on | ||
| + | * player.on_item_interacted | ||
| + | * player.on_died | ||
| + | * player.on_teleported | ||
| + | * blocks.on_block_broken | ||
| + | * blocks.on_blocks_placed | ||
| + | |||
| + | ===== 3. Mit player.execute() Spielkommandos ausführen ===== | ||
| + | Mit dem Befehl '' | ||
| + | |||
| + | 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" | ||
| + | |||
| + | <sxh python> | ||
| + | |||
| + | def on_goldensword_interacted(): | ||
| + | player.say(" | ||
| + | player.execute(" | ||
| + | player.execute(" | ||
| + | |||
| + | player.on_item_interacted(GOLDEN_SWORD, | ||
| + | |||
| + | </ | ||
| + | |||
| + | Falls ein Spieler nicht durch das Programm durch '' | ||
| + | |||
| + | 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: | ||
| + | |||
| + | |||
| + | ===== 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 ''/ | ||
| + | |||
| + | Im Codebuilder kann man nun eine Funktion '' | ||
| + | |||
| + | <sxh python> | ||
| + | def on_tell_command(): | ||
| + | blocks.place(ACACIA_FENCE, | ||
| + | |||
| + | player.on_tell_command(" | ||
| + | </ | ||
| + | |||
| + | Dasselbe funktioniert auch mit Schaltern, Hebeln, Redstone-Truhen etc. | ||
| + | |||
| + | |||
| + | <sxh python> | ||
| + | |||
| + | def on_tell_command_maches(): | ||
| + | blocks.fill(GOLD_BLOCK, | ||
| + | |||
| + | player.on_tell_command(" | ||
| + | |||
| + | def on_tell_command_abbauen(): | ||
| + | blocks.fill(AIR, | ||
| + | |||
| + | player.on_tell_command(" | ||
| + | |||
| + | </ | ||
| + | |||
| + | ===== 5. Testen, welche Items sich in einer Kiste befinden ===== | ||
| + | Hierzu kann man einen Trick verwenden: | ||
| + | - Die Kiste an einen fernen Ort kopieren | ||
| + | - Den Agenten auch dorthin teleportieren | ||
| + | - Die Kiste zerstören | ||
| + | - Agent sammelt die Items ein | ||
| + | - Testen, welche Items der Agent im Inventar hat | ||
| + | - Diesen Vorgang könnte man in eine '' | ||
| + | |||
| + | Beispielcode | ||
| + | <sxh python> | ||
| + | # Die folgende Funktion testet, ob ein Diamant in der Truhe ist. | ||
| + | # Sie gibt true oder false als Rückgabewert, | ||
| + | |||
| + | def isDiamondInChest(): | ||
| + | diamondFound = False | ||
| + | # Agent weit weg teleportieren und alles wegschmeissen | ||
| + | agent.teleport(world(20, | ||
| + | agent.drop_all(FORWARD) | ||
| + | | ||
| + | # Kiste kopieren (sie steht bei (-7,-60,3)) | ||
| + | blocks.clone(world(2, | ||
| + | | ||
| + | # Agenten zur Kiste teleportieren | ||
| + | agent.teleport(world(10, | ||
| + | | ||
| + | # Kiste zerstören und Objekte aufsammeln | ||
| + | agent.destroy(FORWARD) | ||
| + | agent.collect_all() | ||
| + | for slotNumber in range(1, | ||
| + | itemID = agent.get_item_detail(slotNumber) | ||
| + | if (itemID == 264): | ||
| + | diamondFound = True | ||
| + | return diamondFound | ||
| + | |||
| + | # Nun können wir z.B. ein Mal pro Sekunde testen, ob ein Diamand in der Truhe ist | ||
| + | def on_forever(): | ||
| + | if (isDiamondInChest()==True): | ||
| + | player.say(" | ||
| + | else: | ||
| + | player.say(" | ||
| + | loops.pause(1000) | ||
| + | loops.forever(on_forever) | ||
| </ | </ | ||
| - | [[gf2: | ||