113 lines
3.0 KiB
JavaScript
113 lines
3.0 KiB
JavaScript
|
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 }
|