feat: ✨ add automatic eater plugin
This commit is contained in:
		
							
								
								
									
										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 } | ||||
		Reference in New Issue
	
	Block a user