Minecraft Bot: Fehler? Problem`?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
hamann.jonas
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 00:12

Guten Tag ich habe versucht einen minecraft Bot zu programmieren, der auf einen minecraft Server joint, dann zu einem bestimmten lesepult geht (Koordinaten), hinter dem ein Villager steht, diesen Lesepult dann solange Abbaut und wiederaufstellt bis der Villager ein bestimmtes Entchantetes Buch anbietet. Sobald der dieses Anbietet soll in dem Minecraft Chat eine Nachricht geschrieben werden.

Ich schaffe es einfach nicht. Bzw ich weiß nicht wo der Fehler ist...
ich habe noch nicht ganz so viel Erfahrung mit Python...

Code: Alles auswählen

import time
from mcstatus import MinecraftServer
from mcpi.minecraft import Minecraft
from mcpi.block import Block

# Verbindung zum Minecraft-Server herstellen
server = MinecraftServer.lookup("<Server-IP>")
mc = Minecraft.create("<Server-IP>")

# Koordinaten des Lesepults und des Villagers
read_table_x = <x-Koordinate>
read_table_y = <y-Koordinate>
read_table_z = <z-Koordinate>
villager_x = <x-Koordinate>
villager_y = <y-Koordinate>
villager_z = <z-Koordinate>

# Schleife, die das Lesepult abbaut und wieder aufbaut, bis der Villager das gewünschte Buch anbietet
while True:
    # Bewege den Bot zum Lesepult
    mc.player.setPos(read_table_x, read_table_y, read_table_z)
    time.sleep(1)

    # Baue das Lesepult ab und wieder auf
    mc.setBlock(read_table_x, read_table_y, read_table_z, Block.AIR.id)
    time.sleep(1)
    mc.setBlock(read_table_x, read_table_y, read_table_z, Block.BOOKSHELF.id)
    time.sleep(1)

    # Überprüfe, ob der Villager das gewünschte Buch anbietet
    entities = mc.getEntitiesWithinSphere(villager_x, villager_y, villager_z, 1)
    for entity in entities:
        if entity.getEntityTypeId() == "villager":
            trades = entity.getTrades()
            for trade in trades:
                if trade.getDisplayName() == "<gewünschtes verzaubertes Buch>":
                    # Sende eine Nachricht im Minecraft-Chat
                    mc.postToChat("Gewünschtes Buch verfügbar!")
                    break
    time.sleep(10)
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

hamann.jonas hat geschrieben: Montag 24. April 2023, 17:30 Ich schaffe es einfach nicht. Bzw ich weiß nicht wo der Fehler ist...
Was passiert denn, oder passiert nicht, so wie du es erwartest?

Grundsätzlich hilft, das große Problem in mehrere kleinere zu zerlegen, die man dann einzeln löst:
Verbindet sich der Bot zum Server? Kann er zu den Koordinaten gehen? Kann er den Tisch (einmal) abbauen? Kann er prüfen, ob das Angebot stimmt? Usw.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
hamann.jonas
User
Beiträge: 4
Registriert: Donnerstag 13. April 2023, 00:12

Der Bot verbindet sich nicht zum Server.
Benutzeravatar
Kebap
User
Beiträge: 776
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

OK, dann erstmal nur der Teil.
Kannst du einen neuen Bot schreiben, der sich einfach nur zum Server verbindet?
Meinetwegen kann er noch eine Nachricht in den Chat schreiben, falls man ihn sonst nicht sieht.
Ich kenne mich mit Minecraft Bots nicht so gut aus, daher kann ich das nicht beurteilen.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@hamann.jonas: Fehlermeldung?
Warum wird das server Objekt nirgends verwendet?
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@hamann.jonas: Das kann man mit einer ``for``-Schleife weniger ausdrücken, wobei ich mir selbst dann nicht sicher bin ob das ``break`` den gewünschten Effekt hat.

Ungetestet:

Code: Alles auswählen

import time

from mcpi.block import Block
from mcpi.minecraft import Minecraft
from mcstatus import MinecraftServer


def main():
    server = MinecraftServer.lookup("<Server-IP>")  # TODO Unbenutzt‽
    mc = Minecraft.create("<Server-IP>")

    read_table_x = 1
    read_table_y = 2
    read_table_z = 3
    villager_x = 4
    villager_y = 5
    villager_z = 6

    # Schleife, die das Lesepult abbaut und wieder aufbaut, bis der Villager das
    # gewünschte Buch anbietet.
    while True:
        mc.player.setPos(read_table_x, read_table_y, read_table_z)
        time.sleep(1)

        mc.setBlock(read_table_x, read_table_y, read_table_z, Block.AIR.id)
        time.sleep(1)
        mc.setBlock(
            read_table_x, read_table_y, read_table_z, Block.BOOKSHELF.id
        )
        time.sleep(1)

        for entity in mc.getEntitiesWithinSphere(
            villager_x, villager_y, villager_z, 1
        ):
            if entity.getEntityTypeId() == "villager" and any(
                trade.getDisplayName() == "<gewünschtes verzaubertes Buch>"
                for trade in entity.getTrades()
            ):
                mc.postToChat("Gewünschtes Buch verfügbar!")
                #
                # TODO Sicherstellen, dass das hier wirklich das gewünschte
                #   Verhalten ist.
                #
                break
        time.sleep(10)


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten