let cfg let bot let mcData const v = require('vec3') function block(pos) { const block = pos ? bot.blockAt(v(pos)) : bot.blockAtCursor() console.log(block, block && block.getProperties()) if (!block) { cfg.quiet || bot.chat("empty block") return block } let info = [block.type, block.name] if (block.metadata) info.push(Object.entries(block.getProperties())) cfg.quiet || bot.chat(info.join(": ")) } function item( // hand loc = bot.quickBarSlot ) { const item = bot.inventory.slots[loc + bot.QUICK_BAR_START] console.log(item) if (!item) { cfg.quiet || bot.chat("no item") return item } let info = [item.type, item.name] if (item.metadata) info.push(item.metadata) cfg.quiet || bot.chat(info.join(": ")) } function entity(name) { const entity = bot.nearestEntity((entity) => { const ename = entity.name || entity.username return name && ename ? ename == name : true }) console.log(entity) if (!entity) { cfg.quiet || bot.chat("no entity") return entity } let info = [entity.type, entity.name || entity.username] if (entity.metadata) info.push("len: " + entity.metadata.length) cfg.quiet || bot.chat(info.join("; ")) } function command(message_parts) { switch (message_parts.length) { case 0: // TODO most recent command? block() break; case 1: switch (message_parts[0]) { case "item": item() break case "entity": entity() break case "block": default: block() break; } break; case 2: switch (message_parts[0]) { case "item": item(message_parts[1]) break case "entity": default: entity(message_parts[1]) break; } break case 4: switch (message_parts[0]) { case "block": default: block(message_parts.slice(1)) break; } break; default: break; } } const load = (config) => { cfg = config bot = cfg.bot cfg.info = { quiet: cfg.quiet, } mcData = bot.mcData || (bot.mcData = require('minecraft-data')(bot.version)) } const unload = () => {} module.exports = { load, unload, command, block, item, entity }