-- Define peripheral sides
local SIDES = {
TOP = "top",
BOTTOM = "bottom",
LEFT = "left",
RIGHT = "right",
FRONT = "front",
BACK = "back"
}
-- Define peripheral names
local PERIPHERAL_NAMES = {
INPUT = "minecraft:barrel",
BINDER = {
REGULAR = "elementalcraft:binder",
IMPROVED = "elementalcraft:binder_improved"
},
OUTPUT = "minecraft:barrel"
}
-- Function to check for a peripheral
local function findPeripheral(peripheralName, side)
local peripheralObject = peripheral.wrap(side)
if not peripheralObject or peripheral.getType(side) ~= peripheralName then
error("Peripheral '" .. peripheralName .. "' not found on side: " .. side)
end
return peripheralObject
end
-- Function to retrieve peripherals
local function retrievePeripherals()
local output = findPeripheral(PERIPHERAL_NAMES.OUTPUT, SIDES.LEFT)
local input = findPeripheral(PERIPHERAL_NAMES.INPUT, SIDES.BOTTOM)
local binder = findPeripheral(PERIPHERAL_NAMES.BINDER.IMPROVED, SIDES.RIGHT) or findPeripheral(PERIPHERAL_NAMES.BINDER.REGULAR, SIDES.RIGHT)
return output, input, binder
end
-- Retrieve peripherals
local output, input, binder = retrievePeripherals()
-- Constants
local SLEEP_DURATION = 0.1 -- Adjust sleep time as needed
-- Recipe list
local recipeList = {
{
name = "elementalcraft:fireite_ingot",
ingredients = {
{ "minecraft:netherite_ingot", 1 },
{ "elementalcraft:swift_alloy_ingot", 1 },
{ "elementalcraft:springaline_shard", 1 },
{ "elementalcraft:purecrystal", 1 }
}
},
{
name = "elementalcraft:reservoir_fire",
ingredients = {
{ "elementalcraft:container", 1 },
{ "elementalcraft:springaline_glass", 1 },
{ "elementalcraft:purecrystal", 1 },
{ "elementalcraft:pristine_fire_gem", 1 }
}
}
}
-- Function for error handling with line number indication
local function errorWithPosition(message)
local _, line = pcall(error, "", 2) -- Allows retrieving current line number
term.clear()
term.setCursorPos(1, 1)
error("Error in line " .. line .. ": " .. message)
end
-- Function to display a message to the user
local function showMessage(message)
term.clear()
term.setCursorPos(1, 1)
print(message)
end
-- Function to check if the binder is empty
local function isBinderEmpty()
local binderItems = binder.list()
return next(binderItems) == nil
end
-- Function to search for an item in input
local function findItemInInput(itemName, itemList)
for slot, item in pairs(itemList) do
if item.name == itemName then
return slot, item
end
end
return nil, nil
end
-- Function to find a recipe
local function findRecipe(recipeName)
for _, r in ipairs(recipeList) do
if r.name == recipeName then
return r
end
end
return nil
end
-- Function to check if enough materials are available
local function enoughMaterialsAvailable(recipe, inputList)
for _, ingredient in ipairs(recipe.ingredients) do
local ingredientName, requiredCount = ingredient[1], ingredient[2]
local slot, item = findItemInInput(ingredientName, inputList)
if not slot or not item or item.count < requiredCount then
return false
end
end
return true
end
-- Function to push items to the binder
local function pushItemToBinder(recipe, inputList)
for _, ingredient in ipairs(recipe.ingredients) do
local ingredientName, requiredCount = ingredient[1], ingredient[2]
local slot = findItemInInput(ingredientName, inputList)
input.pushItems(peripheral.getName(binder), slot, requiredCount)
end
end
-- Updated function to transfer items to the binder
local function pushItemsToBinder(recipeName, inputList)
local recipe = findRecipe(recipeName)
if not recipe then
errorWithPosition("Recipe not found: " .. recipeName)
return
end
if enoughMaterialsAvailable(recipe, inputList) then
pushItemToBinder(recipe, inputList)
end
end
-- Function to push item to the output peripheral only if there's exactly one item left in the binder
local function pushItemToOutput(container)
local binderItems = binder.list()
local itemCount = 0
for _, item in ipairs(binderItems) do
itemCount = itemCount + item.count
end
if itemCount == 1 then
local success, err = binder.pushItems(container, 1)
if not success then
errorWithPosition("Failed to push item: " .. err)
end
end
end
-- Main function to check for available recipes and start crafting
local function main()
while true do
local crafting = false -- Flag to check if a recipe is currently being crafted
for _, recipe in ipairs(recipeList) do
if not isBinderEmpty() then -- Check if the binder is not empty
for _, binderItem in ipairs(binder.list()) do
if binderItem.name == recipe.name then
showMessage("Crafting " .. recipe.name)
pushItemToOutput(peripheral.getName(output))
crafting = true -- A recipe is currently being crafted
break -- Break out of the recipe loop if a recipe is being crafted
end
end
elseif enoughMaterialsAvailable(recipe, input.list()) then -- Check if enough materials are available
showMessage("Crafting " .. recipe.name)
pushItemsToBinder(recipe.name, input.list())
crafting = true -- A recipe is currently being crafted
break -- Break out of the recipe loop if a recipe is being crafted
end
end
if not crafting then -- If no recipe is currently being crafted
showMessage("No recipe is currently being crafted.")
end
os.sleep(SLEEP_DURATION)
end
end
-- Call function to check and craft recipes
main()
Comments
0 B
|0 👍
/0 👎
To use this you need to change a few things. 1. -- Define peripheral names local PERIPHERAL_NAMES = { INPUT = "minecraft:barrel", BINDER = { REGULAR = "elementalcraft:binder", IMPROVED = "elementalcraft:binder_improved" }, OUTPUT = "minecraft:barrel" } INPUT & OUTPUT-Name could be different. If so change the "minecraft:barrel" to your choosen inventory. ================================================================================================================== 2. -- Function to retrieve peripherals local function retrievePeripherals() local output = findPeripheral(PERIPHERAL_NAMES.OUTPUT, SIDES.LEFT) local input = findPeripheral(PERIPHERAL_NAMES.INPUT, SIDES.BOTTOM) local binder = findPeripheral(PERIPHERAL_NAMES.BINDER.IMPROVED, SIDES.RIGHT) or findPeripheral(PERIPHERAL_NAMES.BINDER.REGULAR, SIDES.RIGHT) return output, input, binder end The direction where the INPUT, OUTPUT and BINDER are. Change "SIDES.LEFT" depending on the peripheral. ================================================================================================================== 3. -- Recipe list local recipeList = { { name = "elementalcraft:fireite_ingot", ingredients = { { "minecraft:netherite_ingot", 1 }, { "elementalcraft:swift_alloy_ingot", 1 }, { "elementalcraft:springaline_shard", 1 }, { "elementalcraft:purecrystal", 1 } } }, { name = "elementalcraft:reservoir_fire", ingredients = { { "elementalcraft:container", 1 }, { "elementalcraft:springaline_glass", 1 }, { "elementalcraft:purecrystal", 1 }, { "elementalcraft:pristine_fire_gem", 1 } } } } The actual recipe you are want to craft. "name" = the Output-tag of your crafted item. "ingredients" are the materials to craft the output item you want to craft but you need to write it in the right order.