Crafting improvements

master
D4VID 10 months ago
parent bb0ba44c11
commit d9127165c5

@ -1,7 +1,7 @@
local component = require("component")
local robot = require("robot")
local sides = require("sides")
local event = require("event")
local io = require("io")
local recipes = require('recipes')
@ -70,8 +70,9 @@ end
local function confirm()
while true do
print("Proceed? [y/n]")
local _, _, ascii, _, _ = event.pull("key_down")
local ch = string.char(ascii)
-- local _, _, ascii, _, _ = term.pull("key_down")
-- local ch = string.char(ascii)
local ch = io.read()
if ch == 'y' then
return true
elseif ch == 'n' then
@ -147,8 +148,13 @@ end
---Returns number of items fetched
---@param item string
---@param output_slot number
---@param count number how many items to take
---@return boolean
local function fetch_item(item, output_slot)
local function fetch_item(item, output_slot, count)
if count == nil then
count = 1
end
local name, damage = parse_item(item, ";")
robot.select(output_slot)
local size = inventory.getInventorySize(sides.forward)
@ -161,7 +167,7 @@ local function fetch_item(item, output_slot)
local stack = inventory.getStackInSlot(sides.forward, slot)
if stack then
if stack.name == name and stack.damage == damage then
inventory.suckFromSlot(sides.forward, slot, 1)
inventory.suckFromSlot(sides.forward, slot, count)
return true
end
end
@ -173,15 +179,16 @@ end
---accepts a recipe table containing result and ingredients
---@param recipe table
---@param count number how many items to craft
---@return boolean
local function craft_single_recipe(recipe)
local function craft_single_recipe(recipe, count)
if inventory.getStackInInternalSlot(RESULT_SLOT) then
print('Cannot craft - output slot occupied')
return false
end
for i, ingredient in pairs(recipe.shape) do
-- print('Fetching ' .. ingredient)
if not fetch_item(ingredient, slot_map[i]) then
if not fetch_item(ingredient, slot_map[i], count) then
print('Failed to fetch ' .. ingredient)
confirm()
end
@ -191,7 +198,7 @@ local function craft_single_recipe(recipe)
robot.select(RESULT_SLOT)
-- craft the resulting item
local crafted = crafting.craft(1)
local crafted = crafting.craft()
if not crafted then
print('Crafting failed')
return false
@ -278,16 +285,56 @@ local function craft_recipe_recursion(recipe, available_items, currently_availab
end
---accepts a recipe table
---@param item string
---@param search string search for an craftable item
---@return boolean
local function craft_item(item)
print('Trying to craft ' .. item)
local recipe = recipes[item]
if not recipe then
print('Cannot craft ' .. item)
local function craft_item(search)
search = string.lower(search) -- convert to unified lowercase
local matches = {}
for key, value in pairs(recipes) do
if string.find(value.result, search) then
print(#matches+1 .. ") " .. value.result)
matches[#matches+1] = key
elseif value.name ~= nil then
if string.find(value.name, search) then
print(#matches+1 .. ") " .. value.result)
matches[#matches+1] = key
end
end
end
local selected
if #matches == 0 then
print(selected .. ' not found')
return false
elseif #matches == 1 then
selected = matches[1]
else
local input = io.read()
if not input then
print('Interrupted')
return false
end
local index = tonumber(input)
if not index then
print('Invalid index')
return false
end
if index < 1 or index > #matches then
print('Invalid index')
return false
end
selected = matches[index]
end
local recipe = recipes[selected]
print('Trying to craft ' .. recipe.result)
local available_items = read_chest_contents()
if not available_items then
print('Not facing a chest')
@ -332,7 +379,7 @@ local function craft_item(item)
-- proceed to crafting the things
for i, rec in ipairs(crafting_order) do
print('Step #' .. i .. ' - ' .. rec.result)
if not craft_single_recipe(rec) then
if not craft_single_recipe(rec, 1) then
print('Unexpected error')
return false
end
@ -350,6 +397,3 @@ end
craft_item(target)
-- craft_item('minecraft:iron_pickaxe;0')
-- craft_item('opencomputers:keyboard;0')
-- craft_item('opencomputers:material;10')

Loading…
Cancel
Save