feat: ✨ add automatic eater plugin
This commit is contained in:
parent
f8df1fa319
commit
787d08dd31
113
lib/plugins/eater.js
Normal file
113
lib/plugins/eater.js
Normal file
|
@ -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 }
|
Loading…
Reference in New Issue
Block a user