Бот 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 шт):

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

Для решения вашей задачи вам скорее всего понадобятся методы 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();
}
→ Ссылка