|
|
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; |
|
|
} |
|
|
|