Compare commits
4 Commits
f8df1fa319
...
de0af4d2ac
Author | SHA1 | Date |
---|---|---|
jay | de0af4d2ac | 3 years ago |
jay | 73d5f43ad3 | 3 years ago |
jay | b970231519 | 3 years ago |
jay | 787d08dd31 | 3 years ago |
3 changed files with 216 additions and 8 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 } |
@ -0,0 +1,95 @@ |
||||
// import { EntityFilters } from "mineflayer-statemachine"
|
||||
// import v from "vec3"
|
||||
|
||||
// import { Movements } from "mineflayer-pathfinder"
|
||||
|
||||
// const mineflayer = require('mineflayer')
|
||||
const { Movements } = require('mineflayer-pathfinder') |
||||
// const { GoalBLah } = require('mineflayer-pathfinder').goals
|
||||
const v = require('vec3') |
||||
|
||||
let cfg = {} |
||||
let bot = {} |
||||
// let moving
|
||||
let pathfinder |
||||
let movements = [] |
||||
|
||||
|
||||
function initMoves(bot = bot, mcData = require('minecraft-data')(bot.version)) { |
||||
let defaultMove = new Movements(bot, mcData) |
||||
defaultMove.canDig = false |
||||
defaultMove.scafoldingBlocks.push(mcData.blocksByName.slime_block.id) |
||||
// defaultMove.blocksCantBreak.add(mcData.blocksByName.glass.id)
|
||||
// defaultMove.blocksToAvoid.add(mcData.blocksByName.magma.id)
|
||||
movements.defaultMove = defaultMove |
||||
|
||||
bot.pathfinder.setMovements(defaultMove) |
||||
} |
||||
|
||||
|
||||
function moveNear(pos, distance = 3) { |
||||
const { GoalNear } = require('mineflayer-pathfinder').goals |
||||
cfg.quiet || bot.chat(`moving to ${pos}`) |
||||
|
||||
pos = v(pos) |
||||
bot.pathfinder.setMovements(movements.defaultMove) |
||||
bot.pathfinder.setGoal(new GoalNear(pos.x, pos.y, pos.z, distance)) |
||||
} |
||||
|
||||
function follow(entity, dynamic = true) { |
||||
console.assert(entity) |
||||
const { GoalFollow } = require('mineflayer-pathfinder').goals |
||||
|
||||
|
||||
|
||||
cfg.quiet && console.log(entity) |
||||
|| bot.chat( |
||||
`following ${entity.type |
||||
}: ${entity.username || entity.displayName |
||||
}${dynamic ? "" : " once"}` |
||||
) |
||||
|
||||
entity = entity.entity ? entity.entity : entity |
||||
|
||||
// console.log(entity)
|
||||
|
||||
bot.pathfinder.setMovements(movements.defaultMove) |
||||
bot.pathfinder.setGoal(new GoalFollow(entity, 3), dynamic) |
||||
} |
||||
|
||||
function hit(blockOrEntity) { |
||||
bot.chat(`hitting ${entity.name || entity.type}`) |
||||
} |
||||
|
||||
function stop() { |
||||
bot.pathfinder.setGoal(null) |
||||
bot.stopDigging() |
||||
} |
||||
|
||||
const load = (config) => { |
||||
cfg = config |
||||
bot = cfg.bot |
||||
cfg.move = { |
||||
// auto: true,
|
||||
canDig: false, |
||||
// list: ["hello", "wassup"],
|
||||
quiet: !!cfg.quiet, |
||||
movements: [] |
||||
} |
||||
|
||||
pathfinder = bot.pathfinder || bot.loadPlugin(require('mineflayer-pathfinder').pathfinder) |
||||
|
||||
// initMoves(bot, mcData)
|
||||
setTimeout(initMoves, 500, bot) |
||||
|
||||
// bot.loadPlugin(pathfinder)
|
||||
|
||||
// bot.on('time', hello)
|
||||
|
||||
} |
||||
|
||||
const unload = () => { |
||||
// TODO stop pathfinding maybe?
|
||||
} |
||||
|
||||
module.exports = { load, unload, stop, initMoves, moveNear, follow } |
Loading…
Reference in new issue