From 799d6b1cfa8d6c583ce55189e9cc7f673cd11af9 Mon Sep 17 00:00:00 2001 From: MaxRobinsonTheGreat Date: Tue, 18 Mar 2025 12:54:06 -0500 Subject: [PATCH] fix craftingplan to bias towards common ingredients --- src/agent/commands/queries.js | 1 - src/agent/library/skills.js | 2 +- src/utils/mcdata.js | 15 +++++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/agent/commands/queries.js b/src/agent/commands/queries.js index a23bb9b..8150c70 100644 --- a/src/agent/commands/queries.js +++ b/src/agent/commands/queries.js @@ -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); }, }, diff --git a/src/agent/library/skills.js b/src/agent/library/skills.js index 51f9860..607ec40 100644 --- a/src/agent/library/skills.js +++ b/src/agent/library/skills.js @@ -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); } diff --git a/src/utils/mcdata.js b/src/utils/mcdata.js index 33b0142..b42a532 100644 --- a/src/utils/mcdata.js +++ b/src/utils/mcdata.js @@ -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]) =>