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 шт):
Скорее всего он ждёт завершения функции 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 <Имя файла>