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

92 lines
2.5 KiB
JavaScript

const assert = require('assert')
const { once } = require('events')
module.exports = inject
function inject (bot) {
const Item = require('prismarine-item')(bot.registry)
let editBook
if (bot.supportFeature('editBookIsPluginChannel')) {
bot._client.registerChannel('MC|BEdit', 'slot')
bot._client.registerChannel('MC|BSign', 'slot')
editBook = (book, signing = false) => {
if (signing) bot._client.writeChannel('MC|BSign', Item.toNotch(book))
else bot._client.writeChannel('MC|BEdit', Item.toNotch(book))
}
} else if (bot.supportFeature('hasEditBookPacket')) {
editBook = (book, signing = false, hand = 0) => {
bot._client.write('edit_book', {
new_book: Item.toNotch(book),
signing,
hand
})
}
}
async function write (slot, pages, author, title, signing) {
assert.ok(slot >= 0 && slot <= 44, 'slot out of inventory range')
const book = bot.inventory.slots[slot]
assert.ok(book && book.type === bot.registry.itemsByName.writable_book.id, `no book found in slot ${slot}`)
const quickBarSlot = bot.quickBarSlot
const moveToQuickBar = slot < 36
if (moveToQuickBar) {
await bot.moveSlotItem(slot, 36)
}
bot.setQuickBarSlot(moveToQuickBar ? 0 : slot - 36)
const modifiedBook = await modifyBook(moveToQuickBar ? 36 : slot, pages, author, title, signing)
editBook(modifiedBook, signing)
await once(bot.inventory, `updateSlot:${moveToQuickBar ? 36 : slot}`)
bot.setQuickBarSlot(quickBarSlot)
if (moveToQuickBar) {
await bot.moveSlotItem(36, slot)
}
}
function modifyBook (slot, pages, author, title, signing) {
const book = Object.assign({}, bot.inventory.slots[slot])
if (!book.nbt || book.nbt.type !== 'compound') {
book.nbt = {
type: 'compound',
name: '',
value: {}
}
}
if (signing) {
if (bot.supportFeature('clientUpdateBookIdWhenSign')) {
book.type = bot.registry.itemsByName.written_book.id
}
book.nbt.value.author = {
type: 'string',
value: author
}
book.nbt.value.title = {
type: 'string',
value: title
}
}
book.nbt.value.pages = {
type: 'list',
value: {
type: 'string',
value: pages
}
}
bot.inventory.updateSlot(slot, book)
return book
}
bot.writeBook = async (slot, pages) => {
await write(slot, pages, null, null, false)
}
bot.signBook = async (slot, pages, author, title) => {
await write(slot, pages, author, title, true)
}
}