gf2:projekte:minecraft:interaktionen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
gf2:projekte:minecraft:interaktionen [2022/11/18 12:05] lehmannrgf2:projekte:minecraft:interaktionen [2024/12/09 14:07] (aktuell) marroc
Zeile 52: Zeile 52:
 player.on_travelled(WALK, on_travelled_walk) player.on_travelled(WALK, on_travelled_walk)
 </sxh> </sxh>
 +Statt WALK geht auch: swim water, fall, climb, swim lava, fly, riding, sneak, sprint.
  
 ==== 2.3 Weitere Ereignis-Listeners ==== ==== 2.3 Weitere Ereignis-Listeners ====
 Es gibt weitere solche "Listener", die auf ein bestimmtes Ereignis reagieren. Alle beginnen mit ** player.on, ** oder mit ** blocks.on **. Es gibt weitere solche "Listener", die auf ein bestimmtes Ereignis reagieren. Alle beginnen mit ** player.on, ** oder mit ** blocks.on **.
-  * player.on_chat  +  * player.on_chat 
-  * player.on_item_interacted +  * playe.on  
 +  * player.on_item_interacted 
 +  * player.on_died 
 +  * player.on_teleported
   * blocks.on_block_broken    * blocks.on_block_broken 
   * blocks.on_blocks_placed   * blocks.on_blocks_placed
-  *   
  
-[[gf2:projekte:minecraft:start|Zurück zur Übersicht des Projektes]]+===== 3. Mit player.execute() Spielkommandos ausführen ===== 
 +Mit dem Befehl ''player.execute'' kann man die Spielkommandos in Python 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).  
 + 
 +<sxh python> 
 + 
 +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) 
 + 
 +</sxh> 
 + 
 +Falls ein Spieler nicht durch das Programm durch ''player.execute("kill @s")'' stirbt, sondern z.B. im Kampf mit Monstern, funktioniert der Trick von oben natürlich nicht so. Dann muss man den neuen Spawnpoint des Spielers einfach setzen, wenn er eine bestimmte Leistung erreicht hat (genügend Punkte erzielt, bis zu einem bestimmten Block gekommen etc.). 
 + 
 +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 der Spieler tot ist und nichts mehr ausführen kann). 
 + 
 + 
 +===== 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: 
 + 
 +<sxh python> 
 +def on_tell_command(): 
 +    blocks.place(ACACIA_FENCE,pos(4,3,0)) 
 + 
 +player.on_tell_command("letsgo", on_tell_command) 
 +</sxh> 
 + 
 +Dasselbe funktioniert auch mit Schaltern, Hebeln, Redstone-Truhen etc. 
 + 
 + 
 +<sxh python> 
 + 
 +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) 
 + 
 +</sxh> 
 + 
 +===== 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 ''loops.forever''-Schleife packen (siehe Beispiel unten) 
 +  
 +Beispielcode 
 +<sxh python> 
 +# Die folgende Funktion testet, ob ein Diamant in der Truhe ist. 
 +# Sie gibt true oder false als Rückgabewert, sodass man sie weiterverwenden kann. 
 + 
 +def isDiamondInChest(): 
 +    diamondFound = False 
 +    # Agent weit weg teleportieren und alles wegschmeissen 
 +    agent.teleport(world(20,-60,12),NORTH) 
 +    agent.drop_all(FORWARD) 
 +     
 +     # Kiste kopieren (sie steht bei (-7,-60,3)) 
 +    blocks.clone(world(2, -60, 12), world(2,-60,12), world(10,-60,12), CloneMask.REPLACE, CloneMode.NORMAL) 
 +     
 +    # Agenten zur Kiste teleportieren 
 +    agent.teleport(world(10, -60, 13), NORTH) 
 +     
 +    # Kiste zerstören und Objekte aufsammeln 
 +    agent.destroy(FORWARD) 
 +    agent.collect_all() 
 +    for slotNumber in range(1,10): 
 +        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("Ein Diamant in der Truhe"
 +    else: 
 +        player.say("Nope, kein Diamand in der Truhe"
 +    loops.pause(1000) 
 + 
 +loops.forever(on_forever) 
 +</sxh> 
 + 
  
  • gf2/projekte/minecraft/interaktionen.1668769534.txt.gz
  • Zuletzt geändert: 2022/11/18 12:05
  • von lehmannr