168 lines
4.2 KiB
JavaScript
168 lines
4.2 KiB
JavaScript
|
/*
|
||
|
* 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 <host> <port> [<name>] [<password>]')
|
||
|
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]
|
||
|
}
|