/* * Using the inventory is one of the first things you learn in Minecraft, * now it's time to teach your bot the same skill. * * Command your bot with chat messages and make him toss, equip, use items * and even craft new items using the built-in recipe book. * * To learn more about the recipe system and how crafting works * remember to read the API documentation! */ const mineflayer = require('mineflayer') if (process.argv.length < 4 || process.argv.length > 6) { console.log('Usage : node inventory.js [] []') process.exit(1) } const bot = mineflayer.createBot({ host: process.argv[2], port: parseInt(process.argv[3]), username: process.argv[4] ? process.argv[4] : 'inventory', password: process.argv[5] }) bot.on('chat', async (username, message) => { if (username === bot.username) return const command = message.split(' ') switch (true) { case message === 'loaded': await bot.waitForChunksToLoad() bot.chat('Ready!') break case /^list$/.test(message): sayItems() break case /^toss \d+ \w+$/.test(message): // toss amount name // ex: toss 64 diamond tossItem(command[2], command[1]) break case /^toss \w+$/.test(message): // toss name // ex: toss diamond tossItem(command[1]) break case /^equip [\w-]+ \w+$/.test(message): // equip destination name // ex: equip hand diamond equipItem(command[2], command[1]) break case /^unequip \w+$/.test(message): // unequip testination // ex: unequip hand unequipItem(command[1]) break case /^use$/.test(message): useEquippedItem() break case /^craft \d+ \w+$/.test(message): // craft amount item // ex: craft 64 stick craftItem(command[2], command[1]) break } }) function sayItems (items = null) { if (!items) { items = bot.inventory.items() if (bot.registry.isNewerOrEqualTo('1.9') && bot.inventory.slots[45]) items.push(bot.inventory.slots[45]) } const output = items.map(itemToString).join(', ') if (output) { bot.chat(output) } else { bot.chat('empty') } } async function tossItem (name, amount) { amount = parseInt(amount, 10) const item = itemByName(name) if (!item) { bot.chat(`I have no ${name}`) } else { try { if (amount) { await bot.toss(item.type, null, amount) bot.chat(`tossed ${amount} x ${name}`) } else { await bot.tossStack(item) bot.chat(`tossed ${name}`) } } catch (err) { bot.chat(`unable to toss: ${err.message}`) } } } async function equipItem (name, destination) { const item = itemByName(name) if (item) { try { await bot.equip(item, destination) bot.chat(`equipped ${name}`) } catch (err) { bot.chat(`cannot equip ${name}: ${err.message}`) } } else { bot.chat(`I have no ${name}`) } } async function unequipItem (destination) { try { await bot.unequip(destination) bot.chat('unequipped') } catch (err) { bot.chat(`cannot unequip: ${err.message}`) } } function useEquippedItem () { bot.chat('activating item') bot.activateItem() } async function craftItem (name, amount) { amount = parseInt(amount, 10) const item = bot.registry.itemsByName[name] const craftingTableID = bot.registry.blocksByName.crafting_table.id const craftingTable = bot.findBlock({ matching: craftingTableID }) if (item) { const recipe = bot.recipesFor(item.id, null, 1, craftingTable)[0] if (recipe) { bot.chat(`I can make ${name}`) try { await bot.craft(recipe, amount, craftingTable) bot.chat(`did the recipe for ${name} ${amount} times`) } catch (err) { bot.chat(`error making ${name}`) } } else { bot.chat(`I cannot make ${name}`) } } else { bot.chat(`unknown item: ${name}`) } } function itemToString (item) { if (item) { return `${item.name} x ${item.count}` } else { return '(nothing)' } } function itemByName (name) { const items = bot.inventory.items() if (bot.registry.isNewerOrEqualTo('1.9') && bot.inventory.slots[45]) items.push(bot.inventory.slots[45]) return items.filter(item => item.name === name)[0] }