Path: blob/master/lib/plugins/enchantment_table.js
1467 views
const assert = require('assert')1const { once } = require('../promise_utils')23module.exports = inject45function inject (bot) {6async function openEnchantmentTable (enchantmentTableBlock) {7assert.strictEqual(enchantmentTableBlock.name, 'enchanting_table')8let ready = false9const enchantmentTable = await bot.openBlock(enchantmentTableBlock)10if (!enchantmentTable.type.startsWith('minecraft:enchant')) {11throw new Error('Expected minecraft:enchant when opening table but got ' + enchantmentTable.type)12}1314resetEnchantmentOptions()1516enchantmentTable.enchant = enchant17enchantmentTable.takeTargetItem = takeTargetItem18enchantmentTable.putTargetItem = putTargetItem19enchantmentTable.putLapis = putLapis20enchantmentTable.targetItem = function () { return this.slots[0] }2122bot._client.on('craft_progress_bar', onUpdateWindowProperty)23enchantmentTable.once('close', () => {24bot._client.removeListener('craft_progress_bar', onUpdateWindowProperty)25})2627return enchantmentTable2829function onUpdateWindowProperty (packet) {30if (packet.windowId !== enchantmentTable.id) return31assert.ok(packet.property >= 0)3233const slots = enchantmentTable.enchantments3435if (packet.property < 3) {36const slot = slots[packet.property]37slot.level = packet.value38} else if (packet.property === 3) {39enchantmentTable.xpseed = packet.value40} else if (packet.property < 7) {41const slot = slots[packet.property - 4]42slot.expected.enchant = packet.value43} else if (packet.property < 10) {44const slot = slots[packet.property - 7]45slot.expected.level = packet.value46}4748if (slots[0].level >= 0 && slots[1].level >= 0 && slots[2].level >= 0) {49if (!ready) {50ready = true51enchantmentTable.emit('ready')52}53} else {54ready = false55}56}5758function resetEnchantmentOptions () {59enchantmentTable.xpseed = -160enchantmentTable.enchantments = []61for (let slot = 0; slot < 3; slot++) {62enchantmentTable.enchantments.push({63level: -1,64expected: {65enchant: -1,66level: -167}68})69}70ready = false71}7273async function enchant (choice) {74if (!ready) await once(enchantmentTable, 'ready')75choice = parseInt(choice, 10) // allow string argument76assert.notStrictEqual(enchantmentTable.enchantments[choice].level, -1)77bot._client.write('enchant_item', {78windowId: enchantmentTable.id,79enchantment: choice80})81const [, newItem] = await once(enchantmentTable, 'updateSlot:0')82return newItem83}8485async function takeTargetItem () {86const item = enchantmentTable.targetItem()87assert.ok(item)88await bot.putAway(item.slot)89return item90}9192async function putTargetItem (item) {93await bot.moveSlotItem(item.slot, 0)94}9596async function putLapis (item) {97await bot.moveSlotItem(item.slot, 1)98}99}100101bot.openEnchantmentTable = openEnchantmentTable102}103104105