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 }