From 787d08dd318e04e4d3e7e87538936234f3588c08 Mon Sep 17 00:00:00 2001 From: jay Date: Tue, 22 Dec 2020 15:29:06 +0500 Subject: [PATCH] feat: :sparkles: add automatic eater plugin --- lib/plugins/eater.js | 113 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 lib/plugins/eater.js diff --git a/lib/plugins/eater.js b/lib/plugins/eater.js new file mode 100644 index 0000000..225dcff --- /dev/null +++ b/lib/plugins/eater.js @@ -0,0 +1,113 @@ +let cfg = {} +let bot = {} +let isEating = false + +function callbackHandle(err) { + if (err) console.error(err) +} + +function eat(callback) { + isEating = true + + const foodNames = require('minecraft-data')(bot.version).foodsArray.map((item) => item.name) + + let available_food = bot.inventory + .items() + .filter((item) => foodNames.includes(item.name)) + + if (available_food.length === 0 || !available_food) { + isEating = false + return callback(new Error('No food found.')) + } + + if (cfg.eat.bannedFood.length > 0) { + available_food = available_food.filter( + (item) => !cfg.eat.bannedFood.includes(item.name) + ) + } + let priority = cfg.eat.priority + let best_food = available_food.reduce((prev, current) => (prev[priority] > current[priority]) ? prev : current) + + if (!best_food) { + isEating = false + return callback(new Error('No best food has been found.')) + } + + bot.emit('eat_start') + + bot.equip(best_food, 'hand', function (error) { + if (error) { + console.error(error) + isEating = false + bot.emit('eat_stop') + } else { + bot.consume(function (err) { + if (err) { + console.error(err) + isEating = false + bot.emit('eat_stop') + return callback(err) + } else { + isEating = false + bot.emit('eat_stop') + callback(null) + if (!bot.food === 20) eat(callbackHandle) + } + }) + } + }) +} + +function checkFood() { + console.info("eater: " + // , " status: ", !isEating + , cfg.eat.auto && "auto" + , bot.food < cfg.eat.startAt && "hungry" + , "hunger:", bot.food + , "at:", cfg.eat.startAt) + if ( + !isEating + && cfg.eat.auto + && bot.food < cfg.eat.startAt + ) { + if ( + (bot.pathfinder + && !(bot.pathfinder.isMining() || bot.pathfinder.isBuilding()) + // TODO implement better idle state + ) || true // idle most likely + ) { + eat(callbackHandle) + } + } +} + +function resetEat(value) { + // to prevent the plugin from breaking if the bot gets killed while eating btw + isEating = !!value // false +} + +const load = (config) => { + cfg = config + bot = cfg.bot + cfg.eat = { + priority: 'saturation', //'foodPoints', // + // startAt: 19, //anarchy + // startAt: 18, + startAt: 14, + bannedFood: [ + "enchanted_golden_apple", "golden_apple", "pufferfish", "chorus_fruit" + ], + auto: true + } + + bot.on('health', checkFood) + bot.on('spawn', resetEat) + +} + +const unload = () => { + bot.off('health', checkFood) + bot.off('spawn', resetEat) +} + +module.exports = { load, unload, eat, resetEat } \ No newline at end of file