python mineflayer

создал бота

from javascript import require, On

 mineflayer = require('mineflayer')
 bot = mineflayer.createBot({
'host': 'какой то сервер',
'username': 'bot_test',
})

@On(bot, 'spawn')
def spawn_handle(*args):
    time.sleep(5)
    entity = bot.entityAtCursor()
    entity = entity2
    while True:
        time.sleep(0.1)
        bot.useOn(entity2)
        bot.attack(entity2)
        time.sleep(0.7)

и после 100 сек ошибка:

    [JSE] C:\Users\qwerty213\AppData\Local\Programs\Python\Python311\Lib\site-packages\javascript\js\pyi.js:149
    [JSE]       throw new BridgeException(`Attempt to access '${stack.join('.')}' failed.`)
    [JSE]             ^
    [JSE]
    [JSE] BridgeException [Error]: Attempt to access '' failed. Python didn't respond in time (100000ms), look above for any Python errors. If no errors, the API call hung.
    [JSE]     at C:\Users\qwerty213\AppData\Local\Programs\Python\Python311\Lib\site-packages\javascript\js\pyi.js:149:13
    [JSE]     at waitFor (C:\Users\qwerty213\AppData\Local\Programs\Python\Python311\Lib\site-packages\javascript\js\pyi.js:46:26)
    [JSE]     at runNextTicks (node:internal/process/task_queues:60:5)
    [JSE]     at listOnTimeout (node:internal/timers:533:9)
    [JSE]     at process.processTimers (node:internal/timers:507:7)
    [JSE]     at async PyBridge.call (C:\Users\qwerty213\AppData\Local\Programs\Python\Python311\Lib\site-packages\javascript\js\pyi.js:148:18)
    [JSE]
    [JSE] Node.js v19.3.0

как я понял какой это то таймаут но какой и как его убрать я не понял искал искал но так и не нашел, пытался сам что то передать при создании бота но это тоже не увенчалось успехом

Немного про код чтобы не было вопросов зачем, почему, бот заходит на сервер и перед ним стоит рамка он ставит в рамку предмет и сразу же выбивает дюп такой на сервере, почему entity равняется entity2 потому что иногда бот пытается поставить рамку на летящий предмет и его кикает с сервера, entity2 хранит информацию только о рамке в момент захода и все нормально работает. Я пытался сделать условие если entity = item то оно не будет работать но это не сработало как бы я не пытался


Ответы (1 шт):

Автор решения: gord1402

Скорее всего он ждёт завершения функции spawn_handle которая никогда не завершится. Будем смотреть когда у бота изменяется активный предмет и смотреть наличие предмета в рамке:

import time

from javascript import require, On

mineflayer = require('mineflayer')
bot = mineflayer.createBot({
    'host': 'Сервер',
    'username': 'bot_test',
})


@On(bot, 'spawn')
def spawn_handle(*args):
    entity = bot.nearestEntity(lambda entity: entity.name == "item_frame")

    @On(bot, 'heldItemChanged')
    def change_handle(*args):
        if (bot.heldItem is not None) and ((entity.metadata[8] is None) or (not entity.metadata[8].present)):
            bot.useOn(entity)
        else:
            bot.attack(entity)

    change_handle()

Также можно попробовать использовать просто nodejs:

const mineflayer = require("mineflayer");


const bot = mineflayer.createBot({
  host: "Сервер",
  username: "bot_test",
  auth: "offline",
});

bot.once("spawn", () => {

  await new Promise(function(resolve){ setTimeout(function() { resolve(); }, 10000); });

  var entity = bot.nearestEntity((entity) =>{return entity.name == "item_frame"});

  console.log(entity)

  bot.on("heldItemChanged", async () =>{
    if ((bot.heldItem) && (!entity.metadata[8] || !entity.metadata[8].present)){
      console.log("insert");
      bot.useOn(entity);
    }
    else{
      console.log("hold");
      bot.attack(entity);
    }
  });
  bot.useOn(entity);
});

Для запуска:

npm init
npm install mineflayer
node <Имя файла>
→ Ссылка