diff --git a/lib/plugins/inventory.js b/lib/plugins/inventory.js index da97f37..c5f3a83 100644 --- a/lib/plugins/inventory.js +++ b/lib/plugins/inventory.js @@ -10,22 +10,18 @@ */ 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] -// }) let cfg = {} let bot = {} // let mcd +const alt_destinations = { + offhand: "off-hand", + lefthand: "off-hand", + shield: "off-hand", + chest: "torso", +} + function inventory(username, message) { if (username === bot.username) return const command = message.split(' ') @@ -72,8 +68,8 @@ function inventory(username, message) { function sayItems(items = bot.inventory.items()) { const output = items.map(itemToString).join(', ') + console.info("inventory:", output) if (output) { - console.info("inventory:", output) !cfg.quiet && bot.chat(output) } else { !cfg.quiet && bot.chat('empty') @@ -104,8 +100,20 @@ function tossItem(name, amount) { function equipItem(name, destination, quiet = false) { const item = itemByName(name) + if (item) { - bot.equip(item, destination, checkIfEquipped) + if (Object.keys(alt_destinations).includes(destination)) { + destination = alt_destinations[destination] + } + try { + bot.equip(item, destination, checkIfEquipped) + } catch (error) { + if (error.code == 'ERR_ASSERTION' && error.message.startsWith("invalid destination:")) { + bot.chat(error.message) + } else { + console.error(error) + } + } } else { !quiet && bot.chat(`I have no ${name}`) } @@ -120,6 +128,9 @@ function equipItem(name, destination, quiet = false) { } function unequipItem(destination) { + if (Object.keys(alt_destinations).includes(destination)) { + destination = alt_destinations[destination] + } bot.unequip(destination, (err) => { if (err) { bot.chat(`cannot unequip: ${err.message}`) @@ -134,27 +145,54 @@ function useEquippedItem() { bot.activateItem() } -function craftItem(name, amount) { +function craftItem(name, amount = 1) { amount = parseInt(amount, 10) - const item = require('minecraft-data')(bot.version).findItemOrBlockByName(name) + const mcData = require('minecraft-data')(bot.version) + const item = mcData.findItemOrBlockByName(name) const craftingTable = bot.findBlock({ - matching: 58 + matching: mcData.blocksByName["crafting_table"].id }) + const recipesNoTable = bot.recipesFor(item.id) + let recipes + + if (recipesNoTable.length > 0) { + bot.chat("can make without crafting table!") + recipes = recipesNoTable + } else if (craftingTable) { + recipes = bot.recipesFor(item.id, null, null, craftingTable) + } else { + bot.chat("Couldn't find a crafting table. Maybe craft one?") + } + if (item) { - const recipe = bot.recipesFor(item.id, null, 1, craftingTable)[0] - if (recipe) { - bot.chat(`I can make ${name}`) - bot.craft(recipe, amount, craftingTable, (err) => { - if (err) { - bot.chat(`error making ${name}`) - } else { - bot.chat(`did the recipe for ${name} ${amount} times`) - } - }) - } else { - bot.chat(`I cannot make ${name}`) + let craftSuccess + recipes && cfg.quiet || bot.chat(`${recipes.length} recipes`) + for (let recipe in recipes) { + if (craftSuccess) { + break + } + setTimeout(craftIt, Math.random() * 5000, recipes[recipe], amount, craftingTable) + } + function craftIt(recipe, amount, craftingTable) { + cfg.quiet || bot.chat(`I can make ${name}`) + console.log("craft:", recipe) + console.time("craft recipe") + bot.craft(recipe, amount, craftingTable, craftError) + console.timeEnd("craft recipe") + } + function craftError(err) { + if (err) { + console.error(err) + cfg.quiet || bot.chat(`error making ${name}: ${err.message}`) + // continue + } else { + craftSuccess = true + bot.chat(`did the recipe for ${name} ${amount} times`) + // break + } } + craftSuccess || cfg.quiet || bot.chat(`I couldn't make ${name}`) } else { bot.chat(`unknown item: ${name}`) } @@ -187,4 +225,4 @@ const unload = () => { bot.off('chat', inventory) } -module.exports = { load, unload, equipItem } \ No newline at end of file +module.exports = { load, unload, equipItem, craftItem } \ No newline at end of file