|
|
async function smeltItem(bot, itemName, fuelName, count = 1) { |
|
|
|
|
|
if (typeof itemName !== "string" || typeof fuelName !== "string") { |
|
|
throw new Error("itemName or fuelName for smeltItem must be a string"); |
|
|
} |
|
|
|
|
|
if (typeof count !== "number") { |
|
|
throw new Error("count for smeltItem must be a number"); |
|
|
} |
|
|
const item = mcData.itemsByName[itemName]; |
|
|
const fuel = mcData.itemsByName[fuelName]; |
|
|
if (!item) { |
|
|
throw new Error(`No item named ${itemName}`); |
|
|
} |
|
|
if (!fuel) { |
|
|
throw new Error(`No item named ${fuelName}`); |
|
|
} |
|
|
const furnaceBlock = bot.findBlock({ |
|
|
matching: mcData.blocksByName.furnace.id, |
|
|
maxDistance: 32, |
|
|
}); |
|
|
if (!furnaceBlock) { |
|
|
throw new Error("No furnace nearby"); |
|
|
} else { |
|
|
await bot.pathfinder.goto( |
|
|
new GoalLookAtBlock(furnaceBlock.position, bot.world) |
|
|
); |
|
|
} |
|
|
const furnace = await bot.openFurnace(furnaceBlock); |
|
|
let success_count = 0; |
|
|
for (let i = 0; i < count; i++) { |
|
|
if (!bot.inventory.findInventoryItem(item.id, null)) { |
|
|
bot.chat(`No ${itemName} to smelt in inventory`); |
|
|
break; |
|
|
} |
|
|
if (furnace.fuelSeconds < 15 && furnace.fuelItem()?.name !== fuelName) { |
|
|
if (!bot.inventory.findInventoryItem(fuel.id, null)) { |
|
|
bot.chat(`No ${fuelName} as fuel in inventory`); |
|
|
break; |
|
|
} |
|
|
await furnace.putFuel(fuel.id, null, 1); |
|
|
await bot.waitForTicks(20); |
|
|
if (!furnace.fuel && furnace.fuelItem()?.name !== fuelName) { |
|
|
throw new Error(`${fuelName} is not a valid fuel`); |
|
|
} |
|
|
} |
|
|
await furnace.putInput(item.id, null, 1); |
|
|
await bot.waitForTicks(12 * 20); |
|
|
if (!furnace.outputItem()) { |
|
|
throw new Error(`${itemName} is not a valid input`); |
|
|
} |
|
|
await furnace.takeOutput(); |
|
|
success_count++; |
|
|
} |
|
|
furnace.close(); |
|
|
if (success_count > 0) bot.chat(`Smelted ${success_count} ${itemName}.`); |
|
|
else { |
|
|
bot.chat( |
|
|
`Failed to smelt ${itemName}, please check the fuel and input.` |
|
|
); |
|
|
_smeltItemFailCount++; |
|
|
if (_smeltItemFailCount > 10) { |
|
|
throw new Error( |
|
|
`smeltItem failed too many times, please check the fuel and input.` |
|
|
); |
|
|
} |
|
|
} |
|
|
} |
|
|
|