如何修改Mineflayer PvP机器人代码 实现死亡检测并修复单次攻击问题
Mineflayer PvP机器人问题修复方案
问题原因说明
你遇到的两个问题根源分别是:
- 单次攻击:
mineflayer-pvp插件的attack方法本身支持持续攻击,你当前代码大概率是调用攻击时目标实体未完全加载、或丢失了目标跟踪导致攻击中断 - 死亡状态检测:未监听对应的实体死亡事件,无法判断目标和自身的存活状态
修复后完整代码
首先确保你已经正确安装依赖:npm install mineflayer mineflayer-pvp
const mineflayer = require('mineflayer') const pvp = require('mineflayer-pvp').plugin // 全局未定义sleep方法需要先加这行 const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)) const bot = mineflayer.createBot({ host: '你的服务器地址', port: 25565, username: '机器人用户名' }) bot.loadPlugin(pvp) // 全局变量存储当前攻击目标,用于死亡检测 let currentTarget = null // 监听自身死亡事件 bot.on('death', () => { if (currentTarget) { bot.chat('我被击杀了,PvP结束') bot.pvp.stop() currentTarget = null } }) // 监听实体死亡事件,判断是不是目标被击杀 bot.on('entityDead', (entity) => { if (currentTarget && entity === currentTarget) { bot.chat(`已击杀${currentTarget.username},PvP结束`) bot.pvp.stop() currentTarget = null } }) bot.on('chat', (username, message) =>{ if (message === 'fight me') { const player = bot.players[username] if (!player || !player.entity) { bot.chat("我看不到你,无法发起PvP") return } // 已经在PvP中就拒绝新请求 if (currentTarget) { bot.chat("我正在和别人PvP,稍后再来") return } bot.chat("准备好,10秒后开始PvP!") const sword = bot.inventory.items().find(item => item.name.includes('sword')) if (sword) bot.equip(sword, 'hand') const shield = bot.inventory.items().find(item => item.name.includes('shield')) if (shield) bot.equip(shield, 'off-hand') // 等待10秒和提示文案匹配 sleep(10000).then(() => { // 你自己实现的beeingAlive()方法可以保留在这里 bot.chat(`/tp notbreadbutter ${username}`) // 延迟1秒确保传送完成后再攻击,避免实体加载失败 setTimeout(() => { if (player.entity) { currentTarget = player.entity currentTarget.username = username bot.pvp.attack(currentTarget) } else { bot.chat("传送后丢失目标,PvP取消") } }, 1000) }) } if (message === 'stop') { bot.pvp.stop() currentTarget = null bot.chat("已停止PvP") } }) // 可选:增加错误监听避免程序崩溃 bot.on('error', err => console.log(err)) bot.on('end', () => console.log('机器人断开连接'))
核心修改点说明
- 新增
currentTarget全局变量跟踪当前攻击目标,避免多请求冲突 - 新增自身
death事件监听,被击杀时自动停止PvP并发送提示 - 新增
entityDead事件监听,目标被击杀时自动停止PvP并发送击杀提示 - 优化攻击调用逻辑,传送后延迟1秒再判断目标是否存在,避免因为实体未加载导致只攻击一次的问题
- 修复了准备时间不匹配的问题:原代码提示10秒准备但只等1.5秒,修改为等待10秒后再传送攻击
- 新增PvP状态校验,已经在PvP时拒绝新的请求
内容的提问来源于stack exchange,提问作者Bread_butter
相关产品推荐
相关产品推荐

