File size: 4,216 Bytes
36ba3ef |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
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;
}
|