104 lines
3.0 KiB
JavaScript
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
|
||
|
}
|