164 lines
5.4 KiB
Lua
164 lines
5.4 KiB
Lua
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
|
|
})
|