Code example for Mineflayer API: const mineflayer = require('mineflayer')
const minecraftHawkEye = require('minecrafthawkeye')

const bot = mineflayer.createBot({
  host: process.argv[2],
  port: parseInt(process.argv[3]),
  username: process.argv[4] ? process.argv[4] : 'Archer',
  password: process.argv[5]
})
bot.loadPlugin(minecraftHawkEye)

bot.on('spawn', function () {
  bot.chat(`/give ${bot.username} bow{Enchantments:[{id:unbreaking,lvl:100}]} 1`)
  bot.chat(`/give ${bot.username} crossbow{Enchantments:[{id:quick_charge,lvl:3},{id:unbreaking,lvl:100}]} 1`)
  bot.chat(`/give ${bot.username} minecraft:arrow 300`)
  bot.chat('/time set day')
  bot.chat('/kill @e[type=minecraft:arrow]')

  bot.chat('Ready!')

  // Get target for block position, use whatever you need
  const target = bot.hawkEye.getPlayer()

  if (!target) {
    return false
  }

  // const validWeapons = ['bow', 'crossbow', 'snowball', 'ender_pearl', 'egg', 'splash_potion']
  const weapon = 'crossbow'

  // Auto attack every 1,2 secs with bow
  // With crossbow attack when crossbow is charget (enchant 3 = 0.5s)
  // ['snowball', 'ender_pearl', 'egg', 'splash_potion'] auto attack every 0,1 sec, no recomended use autoAttack for these items, instead use "bot.hawkEye.oneShot(target, weapon)"

  bot.hawkEye.autoAttack(target, weapon)
  // If you force stop attack use:
  // hawkEye.stop();

  // Use one shot time with calc:
  // bot.hawkEye.oneShot(target, weapon);

  // If you want to shot in XYZ position:
  /*
            const blockPosition = {
                    position: {
                        x: 244.5,
                        y: 75.5,
                        z: -220
                    },
                    isValid: true // Fake to is "alive"
                }
            // bot.hawkEye.oneShot(blockPosition, weapon);
            // bot.hawkEye.autoAttack(blockPosition);
  */
})

bot.on('die', () => {
  bot.hawkEye.stop()
})
