Бот mineflayer не может совмещать autoeat и attack
Я пишу бота, использую mineflayer. Его задача - цикличное повторение определенных действий. Ниже приведен отрывок кода, с помощью которого я осуществляю цикличную атаку ближайшего моба. Дело в том, что я планирую оставлять бота в таком состоянии достаточно продолжительный отрезок времени, но у него начинает уменьшаться сытость. Я попытался применить autoeat, но у меня не получается совместить эти две функции. Вот код для автокликера:
if (message == 'Farm')
{
const mobFilter = e => e.type === 'mob'
const mob = bot.nearestEntity(mobFilter)
const pos = mob.postion;
bot.lookAt(pos)
while (true)
{
bot.attack(mob)
sleep(1000)
}
Буду благодарен за помощь
POV: После изменения своего кода соответствующим образом я получаю вот такую ошибку:
(node:7163) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'minus' of undefined
er by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 2)
(node:7163) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code
В связи с ошибкой прилагаю полный код программы:
"use strict";
const mineflayer = require('mineflayer')
const mineflayerViewer = require('prismarine-viewer').mineflayer
const bot = mineflayer.createBot
({
host: 'localhost',
port: *port*,
username: 'Bot',
})
function sleep(milliseconds) {
const date = Date.now();
let currentDate = null;
do {
currentDate = Date.now();
} while (currentDate - date < milliseconds);
}
bot.once("spawn", () =>
{
mineflayerViewer(bot, { port: 3007, firstPerson: false });
})
async function eating() {
const foodItem = bot.inventory[1]; // Выбираем первый предмет из инвенторя
await bot.equip(foodItem, "hand"); // Берем в руку нашу еду
await bot.consume(); // Употребляем, то что у нас в руке
}
async function attackNearMob() {
const mobFilter = (e) => e.type === "mob";
const mob = bot.nearestEntity(mobFilter);
const pos = mob.postion;
await bot.lookAt(pos);
await bot.attack(mob);
}
async function farmerLogic() {
bot.food <= 6 ? await eating() : await attackNearMob(); // Если показатель еды опустился до 6 (из 20), то кушаем иначе атакуем
await new Promise((res) => setTimeout(res, 1000)); // Аналог функции sleep() из вопроса, только для асинхронных функций
return farmerLogic(); // Создаем бесконечный цикл
}
bot.on('chat', (username, message) =>
{
if (username === 'nick')
{
var arr = message.split(' ')
if (arr[0] == 'Бей')
{
console.log("бью")
bot.swingArm()
}
if (arr[0] == 'Слот')
{
console.log("Меняю активный слот на " + arr[1])
bot.setQuickBarSlot(Number(arr[1]) - 1);
}
if (arr[0] == 'Используй')
{
console.log("Использую")
bot.activateItem();
}
if (arr[0] == 'Скажи')
{
console.log("Говорю");
arr.shift();
var str = arr.join(' ');
bot.chat(str)
}
if (message == "Фарм")
{
farmerLogic();
}
}
})
Ответы (1 шт):
Для решения вашей задачи вам скорее всего понадобятся методы equip() и consume()
Также я настоятельно рекомендую вам ознакомиться с принципами работы промисов в js, так как уже предвижу как вы попадете в ад из callback функций при попытке написания логики.
"use strict";
// Функция которой кушаем
async function eating() {
const foodItem = bot.inventory[0]; // Выбираем первый предмет из инвенторя
await bot.equip(foodItem, "hand"); // Берем в руку нашу еду
await bot.consume(); // Употребляем, то что у нас в руке
}
// Функция для атаки
async function attackNearMob() {
const mobFilter = (e) => e.type === "mob";
const mob = bot.nearestEntity(mobFilter);
const pos = mob.postion;
await bot.lookAt(pos);
await bot.attack(mob);
}
async function farmerLogic() {
bot.food <= 6 ? await eating() : await attackNearMob(); // Если показатель еды опустился до 6 (из 20), то кушаем иначе атакуем
await new Promise((res) => setTimeout(res, 1000)); // Аналог функции sleep() из вопроса, только для асинхронных функций
return farmerLogic(); // Создаем бесконечный цикл
}
if (message == "Farm") {
// Запускаем цикл
farmerLogic();
}