fix craftingplan to bias towards common ingredients

This commit is contained in:
MaxRobinsonTheGreat 2025-03-18 12:54:06 -05:00
parent 9f91e189de
commit 799d6b1cfa
3 changed files with 14 additions and 4 deletions

View file

@ -211,7 +211,6 @@ export const queryList = [
// Generate crafting plan
let craftingPlan = mc.getDetailedCraftingPlan(target_item, quantity, curr_inventory);
craftingPlan = prefixMessage + craftingPlan;
console.log(craftingPlan);
return pad(craftingPlan);
},
},

View file

@ -79,7 +79,7 @@ export async function craftRecipe(bot, itemName, num=1) {
}
}
if (!recipes || recipes.length === 0) {
log(bot, `You do not have the resources to craft a ${itemName}.`);
log(bot, `You do not have the resources to craft a ${itemName}. It requires: ${Object.entries(mc.getItemCraftingRecipes(itemName)[0][0]).map(([key, value]) => `${key}: ${value}`).join(', ')}.`);
if (placedTable) {
await collectBlock(bot, 'crafting_table', 1);
}

View file

@ -205,6 +205,13 @@ export function getItemCraftingRecipes(itemName) {
{craftedCount : r.result.count}
]);
}
// sort recipes by if their ingredients include common items
const commonItems = ['oak_planks', 'oak_log', 'coal', 'cobblestone'];
recipes.sort((a, b) => {
let commonCountA = Object.keys(a[0]).filter(key => commonItems.includes(key)).reduce((acc, key) => acc + a[0][key], 0);
let commonCountB = Object.keys(b[0]).filter(key => commonItems.includes(key)).reduce((acc, key) => acc + b[0][key], 0);
return commonCountB - commonCountA;
});
return recipes;
}
@ -403,7 +410,7 @@ export function getDetailedCraftingPlan(targetItem, count = 1, current_inventory
const inventory = { ...current_inventory };
const leftovers = {};
const plan = craftItem(targetItem, count, inventory, leftovers);
return formatPlan(plan);
return formatPlan(targetItem, plan);
}
function isBaseItem(item) {
@ -469,7 +476,7 @@ function craftItem(item, count, inventory, leftovers, crafted = { required: {},
return crafted;
}
function formatPlan({ required, steps, leftovers }) {
function formatPlan(targetItem, { required, steps, leftovers }) {
const lines = [];
if (Object.keys(required).length > 0) {
@ -485,6 +492,10 @@ function formatPlan({ required, steps, leftovers }) {
lines.push('');
lines.push(...steps);
if (Object.keys(required).some(item => item.includes('oak')) && !targetItem.includes('oak')) {
lines.push('Note: Any varient of wood can be used for this recipe.');
}
if (Object.keys(leftovers).length > 0) {
lines.push('\nYou will have leftover:');
Object.entries(leftovers).forEach(([item, count]) =>