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 11:53] lehmannrgf2: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 "Listeners". Das sind Funktionen, die im Hintergrund mitlaufen und darauf warten, dass etwas Bestimmtes passiert. Ist dies der Fall, so wird eine weitere Funktion aufgerufen. Du kennst dies bereits von der Funktion ''player.on_chat'': Man kann auch Python-Funktionen ausführen, wenn bestimmte Bedingungen erfüllt sind. Dazu verwendet man sogenannte "Listeners". Das sind Funktionen, die im Hintergrund mitlaufen und darauf warten, dass etwas Bestimmtes passiert. Ist dies der Fall, so wird eine weitere Funktion aufgerufen. Du kennst dies bereits von der Funktion ''player.on_chat'':
 +
 +==== 2.1 Wenn etwas Bestimmtes in den Chat geschrieben wird, eine Aktion ausführen ====
  
 Wenn der Spieler "baue_Goldhaus" in den Chat tippt, soll der ausgehöhlte Goldblock erstellt werden: Wenn der Spieler "baue_Goldhaus" in den Chat tippt, soll der ausgehöhlte Goldblock erstellt werden:
Zeile 31: Zeile 33:
 (player.on_chat, player.on_item_interacted, blocks.on_block_broken, blocks,on_blocks_placed, (player.on_chat, player.on_item_interacted, blocks.on_block_broken, blocks,on_blocks_placed,
  
-/* Was ich noch selber rausfinden muss: wie ruft man am Besten eine Python-Funktion auf aus Minecraft (so dass man z.B. einen Schalter bewegen kann und die Funktion wird ausgeführt). Aktuell funktioniert für mich nur der Trickdass ich einen Block erstelle und wenn man ihn zerstört wird die Funktion aufgerufendie den Block gleich wieder hinzufügtDies ist dann ein "Pseudo-Schalter"Es wäre aber eleganterwenn man z.B. Command_Blocks verwenden könnte (das scheint aber nicht zu gehen).*/+==== 2.2 Während sich der Spieler bewegt eine Funktion aufrufen ==== 
 + 
 +Ein sehr praktischer "Listener" ist ''player.on_travelled(WALK,<Funktion>)''. Die angegebene <Funktion> wird 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: 
 + 
 +<sxh python> 
 +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) 
 +</sxh> 
 +Statt WALK geht auch: swim water, fall, climb, swim lava, fly, riding, sneak, sprint. 
 + 
 +==== 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 **. 
 +  * 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 ''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 SchalternHebeln, 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 
 +  - Testenwelche 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ückgabewertsodass 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:start|Zurück zur Übersicht des Projektes]] 
  
  • gf2/projekte/minecraft/interaktionen.1668768794.txt.gz
  • Zuletzt geändert: 2022/11/18 11:53
  • von lehmannr