Download Adam/control_primitives/useChest.js from OpenCausaLab/ADAM: direct link, hf CLI and curl.
- Browser
- Download file 4.22 kB
-
https://huggingface.co/OpenCausaLab/ADAM/resolve/main/Adam/control_primitives/useChest.js
- Command line
-
hf download hf://OpenCausaLab/ADAM/Adam/control_primitives/useChest.js
-
curl -L -o useChest.js https://huggingface.co/OpenCausaLab/ADAM/resolve/main/Adam/control_primitives/useChest.js
4.22 kB
| async function getItemFromChest(bot, chestPosition, itemsToGet) { | |
| // return if chestPosition is not Vec3 | |
| 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) { | |
| // return if chestPosition is not Vec3 | |
| 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) { | |
| // return if chestPosition is not Vec3 | |
| 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; | |
| } | |