| | async function getItemFromChest(bot, chestPosition, itemsToGet) { |
| | |
| | if (!(chestPosition instanceof Vec3)) { |
| | bot.chat("chestPosition for getItemFromChest must be a Vec3"); |
| | return; |
| | } |
| | await moveToChest(bot, chestPosition); |
| | const chestBlock = bot.blockAt(chestPosition); |
| | const chest = await bot.openContainer(chestBlock); |
| | for (const name in itemsToGet) { |
| | const itemByName = mcData.itemsByName[name]; |
| | if (!itemByName) { |
| | bot.chat(`No item named ${name}`); |
| | continue; |
| | } |
| |
|
| | const item = chest.findContainerItem(itemByName.id); |
| | if (!item) { |
| | bot.chat(`I don't see ${name} in this chest`); |
| | continue; |
| | } |
| | try { |
| | await chest.withdraw(item.type, null, itemsToGet[name]); |
| | } catch (err) { |
| | bot.chat(`Not enough ${name} in chest.`); |
| | } |
| | } |
| | await closeChest(bot, chestBlock); |
| | } |
| |
|
| | async function depositItemIntoChest(bot, chestPosition, itemsToDeposit) { |
| | |
| | if (!(chestPosition instanceof Vec3)) { |
| | throw new Error( |
| | "chestPosition for depositItemIntoChest must be a Vec3" |
| | ); |
| | } |
| | await moveToChest(bot, chestPosition); |
| | const chestBlock = bot.blockAt(chestPosition); |
| | const chest = await bot.openContainer(chestBlock); |
| | for (const name in itemsToDeposit) { |
| | const itemByName = mcData.itemsByName[name]; |
| | if (!itemByName) { |
| | bot.chat(`No item named ${name}`); |
| | continue; |
| | } |
| | const item = bot.inventory.findInventoryItem(itemByName.id); |
| | if (!item) { |
| | bot.chat(`No ${name} in inventory`); |
| | continue; |
| | } |
| | try { |
| | await chest.deposit(item.type, null, itemsToDeposit[name]); |
| | } catch (err) { |
| | bot.chat(`Not enough ${name} in inventory.`); |
| | } |
| | } |
| | await closeChest(bot, chestBlock); |
| | } |
| |
|
| | async function checkItemInsideChest(bot, chestPosition) { |
| | |
| | if (!(chestPosition instanceof Vec3)) { |
| | throw new Error( |
| | "chestPosition for depositItemIntoChest must be a Vec3" |
| | ); |
| | } |
| | await moveToChest(bot, chestPosition); |
| | const chestBlock = bot.blockAt(chestPosition); |
| | await bot.openContainer(chestBlock); |
| | await closeChest(bot, chestBlock); |
| | } |
| |
|
| | async function moveToChest(bot, chestPosition) { |
| | if (!(chestPosition instanceof Vec3)) { |
| | throw new Error( |
| | "chestPosition for depositItemIntoChest must be a Vec3" |
| | ); |
| | } |
| | if (chestPosition.distanceTo(bot.entity.position) > 32) { |
| | bot.chat( |
| | `/tp ${chestPosition.x} ${chestPosition.y} ${chestPosition.z}` |
| | ); |
| | await bot.waitForTicks(20); |
| | } |
| | const chestBlock = bot.blockAt(chestPosition); |
| | if (chestBlock.name !== "chest") { |
| | bot.emit("removeChest", chestPosition); |
| | throw new Error( |
| | `No chest at ${chestPosition}, it is ${chestBlock.name}` |
| | ); |
| | } |
| | await bot.pathfinder.goto( |
| | new GoalLookAtBlock(chestBlock.position, bot.world, {}) |
| | ); |
| | return chestBlock; |
| | } |
| |
|
| | async function listItemsInChest(bot, chestBlock) { |
| | const chest = await bot.openContainer(chestBlock); |
| | const items = chest.containerItems(); |
| | if (items.length > 0) { |
| | const itemNames = items.reduce((acc, obj) => { |
| | if (acc[obj.name]) { |
| | acc[obj.name] += obj.count; |
| | } else { |
| | acc[obj.name] = obj.count; |
| | } |
| | return acc; |
| | }, {}); |
| | bot.emit("closeChest", itemNames, chestBlock.position); |
| | } else { |
| | bot.emit("closeChest", {}, chestBlock.position); |
| | } |
| | return chest; |
| | } |
| |
|
| | async function closeChest(bot, chestBlock) { |
| | try { |
| | const chest = await listItemsInChest(bot, chestBlock); |
| | await chest.close(); |
| | } catch (err) { |
| | await bot.closeWindow(chestBlock); |
| | } |
| | } |
| |
|
| | function itemByName(items, name) { |
| | for (let i = 0; i < items.length; ++i) { |
| | const item = items[i]; |
| | if (item && item.name === name) return item; |
| | } |
| | return null; |
| | } |
| |
|