Seite 1 von 1

Minecraft Bot: Fehler? Problem`?

Verfasst: Montag 24. April 2023, 17:30
von hamann.jonas
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)

Re: Minecraft Bot: Fehler? Problem`?

Verfasst: Mittwoch 26. April 2023, 09:15
von Kebap
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.

Re: Minecraft Bot: Fehler? Problem`?

Verfasst: Mittwoch 26. April 2023, 14:49
von hamann.jonas
Der Bot verbindet sich nicht zum Server.

Re: Minecraft Bot: Fehler? Problem`?

Verfasst: Mittwoch 26. April 2023, 15:22
von Kebap
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.

Re: Minecraft Bot: Fehler? Problem`?

Verfasst: Mittwoch 26. April 2023, 19:34
von sparrow
@hamann.jonas: Fehlermeldung?
Warum wird das server Objekt nirgends verwendet?

Re: Minecraft Bot: Fehler? Problem`?

Verfasst: Mittwoch 26. April 2023, 20:53
von __blackjack__
@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()