Change the recipe code to be able to handle recipes with more than one input, and use it for the alloy furnace.

Reorganize the init.lua files.
This commit is contained in:
Novatux
2014-07-03 15:57:39 +02:00
parent 95fcc435f1
commit d55ecc39f9
14 changed files with 178 additions and 384 deletions

View File

@ -1,63 +1,88 @@
technic.recipes = {}
function technic.register_recipe_type(typename, desc)
technic.recipes = {cooking = {numitems = 1}}
function technic.register_recipe_type(typename, desc, numitems)
numitems = numitems or 1
if unified_inventory and unified_inventory.register_craft_type then
unified_inventory.register_craft_type(typename, {
description = desc,
height = 1,
height = numtiems,
width = 1,
})
end
technic.recipes[typename] = {}
technic.recipes[typename] = {numitems = numitems, recipes = {}}
end
function technic.register_recipe(typename, data)
local src = ItemStack(data.input):get_name()
technic.recipes[typename][src] = data
local function get_recipe_index(items)
local l = {}
for i, stack in ipairs(items) do
l[i] = ItemStack(stack):get_name()
end
table.sort(l)
return table.concat(l, "/")
end
local function register_recipe(typename, data)
-- Handle aliases
for i, stack in ipairs(data.input) do
data.input[i] = ItemStack(stack):to_string()
end
data.output = ItemStack(data.output):to_string()
local recipe = {time = data.time, input = {}, output = data.output}
local index = get_recipe_index(data.input)
for _, stack in ipairs(data.input) do
recipe.input[ItemStack(stack):get_name()] = ItemStack(stack):get_count()
end
technic.recipes[typename].recipes[index] = recipe
if unified_inventory then
unified_inventory.register_craft({
type = typename,
output = data.output,
items = {data.input},
items = data.input,
width = 0,
})
end
end
function technic.get_recipe(typename, item)
function technic.register_recipe(typename, data)
minetest.after(0.01, register_recipe, typename, data) -- Handle aliases
end
function technic.get_recipe(typename, items)
if typename == "cooking" then -- Already builtin in Minetest, so use that
local result = minetest.get_craft_result({
local result, new_input = minetest.get_craft_result({
method = "cooking",
width = 1,
items = {item}})
items = items})
-- Compatibility layer
if not result or result.time == 0 then
return nil
else
return {time = result.time,
input = item:get_name(),
output = result.item:to_string()}
new_input = new_input.items,
output = result.item}
end
end
local recipe = technic.recipes[typename][item:get_name()]
if recipe and item:get_count() >= ItemStack(recipe.input):get_count() then
return recipe
local index = get_recipe_index(items)
local recipe = technic.recipes[typename].recipes[index]
if recipe then
local new_input = {}
for i, stack in ipairs(items) do
if stack:get_count() < recipe.input[stack:get_name()] then
print(stack:get_name())
return nil
else
new_input[i] = ItemStack(stack)
new_input[i]:take_item(recipe.input[stack:get_name()])
end
end
return {time = recipe.time,
new_input = new_input,
output = recipe.output}
else
return nil
end
end
-- Handle aliases
minetest.after(0.01, function ()
for _, recipes_list in pairs(technic.recipes) do
for ingredient, recipe in pairs(recipes_list) do
ingredient = minetest.registered_aliases[ingredient]
while ingredient do
recipes_list[ingredient] = recipe
ingredient = minetest.registered_aliases[ingredient]
end
end
end
end)