update to furnace

This commit is contained in:
kamirama 2018-01-03 23:20:30 +01:00
parent c7a7fd3771
commit 59ff7b80f6

View File

@ -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 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
return 0
else
return stack:get_count()
end
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 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)
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
--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("energy.png", 0, 2.1, 9.75, 0.25,
energy, minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max")
, 2))
--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)
end
return
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
})