From d59055dd2b1a03449ff11318a2f210d37dd7e76a Mon Sep 17 00:00:00 2001 From: Zefram <zefram@fysh.org> Date: Fri, 25 Jul 2014 16:38:40 +0200 Subject: [PATCH] Audible siren to warn of reactor meltdown --- technic/machines/register/recipes.lua | 83 +++++++++++++++++++++++++++-------------- 1 files changed, 54 insertions(+), 29 deletions(-) diff --git a/technic/machines/register/recipes.lua b/technic/machines/register/recipes.lua index fb5c09e..cff8ca1 100644 --- a/technic/machines/register/recipes.lua +++ b/technic/machines/register/recipes.lua @@ -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 = numitems, 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) -- Gitblit v1.8.0