diff --git a/sparkfurnace/metalfurnace.lua b/sparkfurnace/metalfurnace.lua index 8e57ab8..d65a716 100644 --- a/sparkfurnace/metalfurnace.lua +++ b/sparkfurnace/metalfurnace.lua @@ -1,130 +1,115 @@ local formspec = - "size[8,6.5]".. - "list[current_name;source;0,0;1,2;]" .. - "list[current_name;product;7,0;1,2;]" .. - "list[current_player;main;0,2.5;8,3;8]" .. - "list[current_player;main;0,5.7;8,1;]".. - "bgcolor[#FC05E344;false]" .. - "listcolors[#fc059db0;#fc059dd0]" + "size[8,6.5]".. + "list[current_name;source;0,0;1,2;]" .. + "list[current_name;product;7,0;1,2;]" .. + "list[current_player;main;0,2.5;8,3;8]" .. + "list[current_player;main;0,5.7;8,1;]".. + "bgcolor[#FC05E344;false]" .. + "listcolors[#fc059db0;#fc059dd0]" 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 + 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 == "product" then return 0 end - - if stack == nil or not is_smeltable({stack}) then - return 0 - else - return stack:get_count() - end + if target == "product" then return 0 end --so no items get moved into the souce 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) + 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") == 0 then return end - local timer = minetest.get_node_timer(pos) - timer:start(1.0) -end - -local function storeprogress(progress) --store the progress of burning in the node meta, burning items aren't take from source, they simply cant be removed any longer when starting to burn - for x=1,table_getn(progress),1 - do - meta.get_string("cookprogess_" + i.progress[x]) - end -end - -local function restoreprogress(meta,count) - local progress = {} - for x=1,count,1 - do - progress[x] = meta:get_string("cookprogess_" .. x) - end - return progress + local meta = minetest.get_meta(pos) + if meta:get_int("energy") == 0 then return end + local timer = minetest.get_node_timer(pos) + timer:start(1.0) 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 progress = restoreprogress(meta,table.getn(source)) - local product = inventory:get_list("product") - - local newcycle = false -- this is false, if we feel that we need a new cycle we set this to true so that the furnace may cook again (e.g enough fuel and items are available) - - --TODO: start cook logic (if there is any energy available start to cook (progress[inventoryslot]++ and commit to meta after all were processed + local meta = minetest.get_meta(pos) + local energy = meta:get_int("energy") + local inventory = meta:get_inventory() + local source = inventory:get_list("source") + local progress = restoreprogress(meta,table.getn(source)) + local product = inventory:get_list("product") - meta:set_string("formspec", formspec .. - sparktech.makebar("energy.png", 0, 2.1, 9.75, 0.25, - energy, minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max") - , 2)) + local newcycle = false -- this is false, if we feel that we need a new cycle we set this to true so that the furnace may cook again (e.g enough fuel and items are available) - if (newcycle) then - minetest.get_node_timer(pos):start(1.0) - end - return + --TODO: start cook logic (if there is any energy available start to cook (progress[inventoryslot]++ and commit to meta after all were processed + + --meta:set_string("formspec", formspec .. + --sparktech.makebar( + --"energy2.png", + -- 0, 2.1, 9.75, 0.25, + --energy, + --minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max"), 0)) + + if (newcycle) 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 - local table = restoreprogress(meta,2) - if table[pos] == nil then return stack:get_count() end - if listname == "source" then - if table[pos] > 0 then - return tonumber(stack:get_count() -1) - end - return tonumber(stack:get_count()) - end + 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(minetest.get_current_modname() .. ":lv_furnace", { - description = "Electric furnace", - tiles = { - "furnace2.png", - "furnace2.png", - "furnace2.png", - "furnace2.png", - "furnace2.png", - "furnace.png" - }, - paramtype2 = "facedir", - groups = { - sparktech_techy = 1, - sparktech_energy_type = 4, - sparktech_net_trigger = 1, - sparktech_energy_max = 300, - spark_energy_timer = 2 - }, + description = "Electric furnace", - on_timer = mytime, -- add a mytimer function - allow_metadata_inventory_take = maytake, + tiles = { + "furnace2.png", + "furnace2.png", + "furnace2.png", + "furnace2.png", + "furnace2.png", + "furnace.png" + }, + paramtype2 = "facedir", - on_construct = function(pos, placer) - local meta = minetest.get_meta(pos) - meta:set_string("formspec",formspec) - local inventory = meta:get_inventory() - inventory:set_size('source',2) - inventory:set_size('product',2) - end, - allow_metadata_inventory_put = is_item_allowed, - allow_metadata_inventory_move = is_item_allowed_move, - on_metadata_inventory_move = ongetitem, --TODO: test these - on_metadata_inventory_put = ongetitem -}) + groups = { + sparktech_techy = 1, + sparktech_energy_type = 4, + sparktech_net_trigger = 1, + sparktech_energy_max = 300, + spark_energy_timer = 2 + }, + + 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, + + allow_metadata_inventory_put = is_item_allowed, + allow_metadata_inventory_move = is_item_allowed_move, + --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 +}) \ No newline at end of file