parent
f8df1fa319
commit
787d08dd31
1 changed files with 113 additions and 0 deletions
@ -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