-- rnd 2015: -- this node works as a reverse of crafting process with a 25% loss of items (aka recycling). You can select which recipe to use when recycling. -- There is a fuel cost to recycle -- prevent unrealistic recyclings local no_recycle_list = { ["default:steel_ingot"]=1,["default:copper_ingot"]=1,["default:bronze_ingot"]=1,["default:gold_ingot"]=1, ["dye:white"]=1,["dye:grey"]=1,["dye:dark_grey"]=1,["dye:black"]=1, ["dye:violet"]=1,["dye:blue"]=1,["dye:cyan"]=1,["dye:dark_green"]=1, ["dye:green"]=1,["dye:yellow"]=1,["dye:brown"]=1,["dye:orange"]=1, ["dye:red"]=1,["dye:magenta"]=1,["dye:pink"]=1, } local recycler_process = function(pos) local node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name; local meta = minetest.get_meta(pos);local inv = meta:get_inventory(); -- FUEL CHECK local fuel = meta:get_float("fuel"); if fuel-1<0 then -- we need new fuel, check chest below local fuellist = inv:get_list("fuel") if not fuellist then return end local fueladd, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) local supply=0; if fueladd.time == 0 then -- no fuel inserted, try look for outlet -- No valid fuel in fuel list supply = basic_machines.check_power({x=pos.x,y=pos.y-1,z=pos.z},1) or 0; if supply>0 then fueladd.time = 40*supply -- same as 10 coal else meta:set_string("infotext", "Please insert fuel."); return; end else if supply==0 then -- Take fuel from fuel list if no supply available inv:set_stack("fuel", 1, afterfuel.items[1]) fueladd.time = fueladd.time*0.1; -- thats 4 for coal end end if fueladd.time>0 then fuel=fuel + fueladd.time meta:set_float("fuel",fuel); meta:set_string("infotext", "added fuel furnace burn time " .. fueladd.time .. ", fuel status " .. fuel); end if fuel-1<0 then return end end -- RECYCLING: check out inserted items local stack = inv:get_stack("src",1); if stack:is_empty() then return end; -- nothing to do local src_item = stack:to_string(); local p=string.find(src_item," "); if p then src_item = string.sub(src_item,1,p-1) end -- take first word to determine what item was -- look if we already handled this item local known_recipe=true; if src_item~=meta:get_string("node") then-- did we already handle this? if yes read from cache meta:set_string("node",src_item); meta:set_string("itemlist","{}"); meta:set_int("reqcount",0); known_recipe=false; end local itemlist, reqcount; reqcount = 1; -- needed count of materials for recycle to work if not known_recipe then if no_recycle_list[src_item] then meta:set_string("node","") return end -- dont allow recycling of forbidden items local recipe = minetest.get_all_craft_recipes( src_item ); local recipe_id = tonumber(meta:get_int("recipe")) or 1; if not recipe then return else itemlist = recipe[recipe_id]; if not itemlist then meta:set_string("node","") return end; itemlist=itemlist.items; end local output = recipe[recipe_id].output or ""; if string.find(output," ") then local par = string.find(output," "); --if (tonumber(string.sub(output, par)) or 0)>1 then itemlist = {} end if par then reqcount = tonumber(string.sub(output, par)) or 1; end end meta:set_string("itemlist",minetest.serialize(itemlist)); -- read cached itemlist meta:set_int("reqcount",reqcount); else itemlist=minetest.deserialize(meta:get_string("itemlist")) or {}; reqcount = meta:get_int("reqcount") or 1; end if stack:get_count()