local NAME = minetest.get_current_modname() local MAX_ENERGY = 300 local modifier = 10 -- Cooking cost modifier local time_modifier = 1.5 -- Cooking time modifier local formspec = sparktech.add_inventory(6,1.5, "list[current_name;source;0,0;2,1;]" .. "list[current_name;product;7.5,0;2,1;]") local function is_smeltable(items) local cooked local aftercooked cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = items}) return cooked.time ~= 0 end local function is_item_allowed(pos, target, _, stack) if target ~= "source" then return 0 end --so no items get moved into the produce inventory by the user if stack == nil or not is_smeltable({stack}) then --invalid or unsmeltable items dont get in return 0 else return stack:get_count() end end local function is_item_allowed_move(pos, src, sidx, target, tidx, c, p) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local stack = inv:get_stack(src, sidx) return is_item_allowed(pos, target, tidx, stack, p) end local function ongetitem(pos) local meta = minetest.get_meta(pos) if meta:get_int("energy") < modifier then return end local timer = minetest.get_node_timer(pos) timer:start(1.0) end local function update_formspec(pos) local meta = minetest.get_meta(pos) local inventory = meta:get_inventory() local cfmsp = formspec local energy = meta:get_int("energy") cfmsp = cfmsp .. sparktech.makebar("energy2.png", 0, 1.125, 9.75, 0.25, energy, minetest.get_item_group(MAX_ENERGY) , 0) for item=0, 1 do local cooked local aftercooked local progress = meta:get_int("progress_" .. (item+1)) cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = {inventory:get_stack("source", (item +1))}}) cfmsp = cfmsp .. sparktech.makebar("progress2.png", item * 1.25, 0, 1, 1, progress, math.ceil(cooked.time * time_modifier), 0) end meta:set_string("formspec", cfmsp) end local function mytime(pos, elapsed) local meta = minetest.get_meta(pos) local energy = meta:get_int("energy") local inventory = meta:get_inventory() local source = inventory:get_list("source") local product = inventory:get_list("product") for item=1,2 do if energy >= modifier then local cooked local aftercooked local progress = meta:get_int("progress_" .. item) cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = {inventory:get_stack("source", item)}}) --source and product assigned if progress >= math.ceil(cooked.time * time_modifier) then if inventory:room_for_item("product", cooked.item) then inventory:add_item("product", cooked.item) inventory:set_stack("source", item, aftercooked.items[1]) meta:set_int("progress_" .. item, 0) end else meta:set_int("progress_" .. item, progress + 1) energy = energy - modifier end end end meta:set_int("energy", energy) update_formspec(pos) -- Later this should only be done when a player looks into the block --TODO: for the formspec code, if it is marked as active update it here local has_items = false -- Keep updating if there are still items for _, e in pairs(meta:get_inventory():get_list("source")) do has_items = has_items or not e:is_empty() end if has_items then minetest.get_node_timer(pos):start(1.0) -- it was determined that a new cycle is required, this is the case if energy and material to cook is available end return end local function maytake(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if listname == "product" then return tonumber(stack:get_count()) --sure, take the stuff that the furnace has cooked for you :D end -- TODO: code to stop people from taking halfcooked items, they'd burn their fingers end minetest.register_node( NAME .. ":lv_furnace", { description = "Electric furnace", tiles = { NAME .. "_steel_sideplate.png", NAME .. "_steel_sideplate.png", NAME .. "_steel_sideplate.png", NAME .. "_steel_sideplate.png", NAME .. "_steel_backplate.png", NAME .. "_furnace_frontplate.png" }, paramtype2 = "facedir", groups = { sparktech_techy = WRENCHABLE, sparktech_energy_type = ENERGY_CONSUMER, sparktech_net_trigger = TRUE, sparktech_energy_max = MAX_ENERGY, sparktech_energy_wakeup = 10 }, on_timer = mytime, -- add a mytimer function allow_metadata_inventory_take = maytake, --on_righclick = function(pos, node, player, itemstack, pointed_thing) --TODO show formspec here, and store that a formspec is open in meta, the mytimer function schould update the formspec if it is open, recievefields schould mark it as closed --end, on_construct = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_string("formspec",formspec) --gonna replace this with crafting the formspec on rightclick instead local inventory = meta:get_inventory() inventory:set_size('source',2) inventory:set_size('product',2) end, on_rightclick = function(pos, clicker) -- Requires Version >0.4.16 to trigger because a custom formspec is set return false end, allow_metadata_inventory_put = is_item_allowed, allow_metadata_inventory_move = is_item_allowed_move, allow_metadata_inventory_take = function(_, _, _, stack) return stack:get_count() end, -- Might want to improve this --on_metadata_inventory_move = ongetitem, --doesnt seem necesarry to me, if the item moves in the inventory schould not change the cooking process on_metadata_inventory_put = ongetitem })