|
|
async function craftItem(bot, name, count = 1) { |
|
|
|
|
|
if (typeof name !== "string") { |
|
|
throw new Error("name for craftItem must be a string"); |
|
|
} |
|
|
|
|
|
if (typeof count !== "number") { |
|
|
throw new Error("count for craftItem must be a number"); |
|
|
} |
|
|
const itemByName = mcData.itemsByName[name]; |
|
|
if (!itemByName) { |
|
|
throw new Error(`No item named ${name}`); |
|
|
} |
|
|
const craftingTable = bot.findBlock({ |
|
|
matching: mcData.blocksByName.crafting_table.id, |
|
|
maxDistance: 32, |
|
|
}); |
|
|
if (!craftingTable) { |
|
|
bot.chat("Craft without a crafting table"); |
|
|
} else { |
|
|
await bot.pathfinder.goto( |
|
|
new GoalLookAtBlock(craftingTable.position, bot.world) |
|
|
); |
|
|
} |
|
|
const recipe = bot.recipesFor(itemByName.id, null, 1, craftingTable)[0]; |
|
|
if (recipe) { |
|
|
bot.chat(`I can make ${name}`); |
|
|
try { |
|
|
await bot.craft(recipe, count, craftingTable); |
|
|
bot.chat(`I did the recipe for ${name} ${count} times`); |
|
|
} catch (err) { |
|
|
bot.chat(`I cannot do the recipe for ${name} ${count} times`); |
|
|
} |
|
|
} else { |
|
|
failedCraftFeedback(bot, name, itemByName, craftingTable); |
|
|
_craftItemFailCount++; |
|
|
if (_craftItemFailCount > 10) { |
|
|
throw new Error( |
|
|
"craftItem failed too many times, check chat log to see what happened" |
|
|
); |
|
|
} |
|
|
} |
|
|
} |
|
|
|