当我的机器人移动 10 个街区时 - 它应该再移动 20 个街区,但在经过前 10 个街区后它根本没有移动!我尝试了很多东西 - 但在经过前 10 个区块后它根本不想移动。我做错了什么?我想学习如何让机器人遵循我指定的路线,例如向前 10 个街区,然后向后 5 个街区等等。
const mineflayer = require('mineflayer')
const { pathfinder, Movements, goals: { GoalBlock } } = require('mineflayer-pathfinder')
const bot = mineflayer.createBot({
host: 'localhost', // minecraft server ip
port: '3333',
username: 'test', // minecraft username
})
bot.loadPlugin(pathfinder)
bot.once('spawn', () => {
const defaultMove = new Movements(bot)
bot.pathfinder.setMovements(defaultMove)
const startPosition = bot.entity.position
console.log(startPosition)
// Первая цель - 10 блоков вперед
const targetPosition1 = startPosition.offset(10, 0, 0)
bot.pathfinder.setGoal(new GoalBlock(targetPosition1.x, targetPosition1.y, tar getPosition1.z))
// Добавляем обработчик события для достижения первой цели
bot.on('goal_reached', (arg) => {
const startPosition2 = bot.entity.position
const targetPosition2 = startPosition2.offset(20, 0, 0)
bot.pathfinder.setGoal(new GoalBlock(targetPosition2.x, targetPosition2.y, targetPosition2.z))
console.log('Прошел 10 шагов', startPosition2)
})
})
bot.on('kicked', (info) => {
console.log(`Бота кикнули из сервера ${info}`)
})
bot.on('error', console.log)
您面临的问题源于mineflayer-pathfinder 中目标系统的工作原理。当机器人达到第一个目标时,您正确设置了移动另外 20 个街区的新目标。但是,goal_reached 事件在机器人到达目标后触发,如果您在同一事件处理程序中直接更新目标而不确保机器人已停止处理第一条路径,则可能会导致冲突或导致下一条路径无法移动目标。
您可以稍微延迟或更好地控制何时设置新目标,让机器人在继续下一个任务之前正确完成当前操作。
bot.once('goal_reached', () => {
console.log('Reached first goal at 10 blocks')
// Wait a second before setting the next goal of 20 blocks
setTimeout(() => {
const startPosition2 = bot.entity.position
const targetPosition2 = startPosition2.offset(20, 0, 0)
bot.pathfinder.setGoal(new GoalBlock(targetPosition2.x, targetPosition2.y, targetPosition2.z))
console.log('Setting second goal: 20 blocks forward')
}, 1000)
})