LookAtMySuitBot/js/node_modules/mineflayer/lib/plugins/enchantment_table.js

104 lines
3.0 KiB
JavaScript

const assert = require('assert')
const { once } = require('events')
module.exports = inject
function inject (bot) {
async function openEnchantmentTable (enchantmentTableBlock) {
assert.strictEqual(enchantmentTableBlock.name, 'enchanting_table')
let ready = false
const enchantmentTable = await bot.openBlock(enchantmentTableBlock)
if (!enchantmentTable.type.startsWith('minecraft:enchant')) {
throw new Error('This is not an enchantment table')
}
resetEnchantmentOptions()
enchantmentTable.enchant = enchant
enchantmentTable.takeTargetItem = takeTargetItem
enchantmentTable.putTargetItem = putTargetItem
enchantmentTable.putLapis = putLapis
enchantmentTable.targetItem = function () { return this.slots[0] }
bot._client.on('craft_progress_bar', onUpdateWindowProperty)
enchantmentTable.once('close', () => {
bot._client.removeListener('craft_progress_bar', onUpdateWindowProperty)
})
return enchantmentTable
function onUpdateWindowProperty (packet) {
if (packet.windowId !== enchantmentTable.id) return
assert.ok(packet.property >= 0)
const slots = enchantmentTable.enchantments
if (packet.property < 3) {
const slot = slots[packet.property]
slot.level = packet.value
} else if (packet.property === 3) {
enchantmentTable.xpseed = packet.value
} else if (packet.property < 7) {
const slot = slots[packet.property - 4]
slot.expected.enchant = packet.value
} else if (packet.property < 10) {
const slot = slots[packet.property - 7]
slot.expected.level = packet.value
}
if (slots[0].level >= 0 && slots[1].level >= 0 && slots[2].level >= 0) {
if (!ready) {
ready = true
enchantmentTable.emit('ready')
}
} else {
ready = false
}
}
function resetEnchantmentOptions () {
enchantmentTable.xpseed = -1
enchantmentTable.enchantments = []
for (let slot = 0; slot < 3; slot++) {
enchantmentTable.enchantments.push({
level: -1,
expected: {
enchant: -1,
level: -1
}
})
}
ready = false
}
async function enchant (choice) {
if (!ready) await once(enchantmentTable, 'ready')
choice = parseInt(choice, 10) // allow string argument
assert.notStrictEqual(enchantmentTable.enchantments[choice].level, -1)
bot._client.write('enchant_item', {
windowId: enchantmentTable.id,
enchantment: choice
})
const [, newItem] = await once(enchantmentTable, 'updateSlot:0')
return newItem
}
async function takeTargetItem () {
const item = enchantmentTable.targetItem()
assert.ok(item)
await bot.putAway(item.slot)
return item
}
async function putTargetItem (item) {
await bot.moveSlotItem(item.slot, 0)
}
async function putLapis (item) {
await bot.moveSlotItem(item.slot, 1)
}
}
bot.openEnchantmentTable = openEnchantmentTable
}