Burnergenerator fixes

-fixed energy overflow
-fixed invalid items beeing allowed
-fixed restarting the burnergenrator on recieving new item
This commit is contained in:
Pascal Abresch 2018-02-02 02:11:41 +01:00
parent 5c08a12c8b
commit ceeca9ddde

View File

@ -1,4 +1,6 @@
local fuel_multiplier = 2 local fuel_multiplier = 2
local interval = 0.5
local NAME = minetest.get_current_modname() local NAME = minetest.get_current_modname()
@ -10,6 +12,25 @@ local formspec =
"bgcolor[#FC05E344;false]" .. "bgcolor[#FC05E344;false]" ..
"listcolors[#fc059db0;#fc059dd0]" "listcolors[#fc059db0;#fc059dd0]"
local function is_fuel(items)
local fuel
local afterfuel
fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = items})
return fuel["time"] ~= 0
end
local function is_item_allowed(pos, target, _, stack)
if stack == nil or not is_fuel({stack}) then
return 0
else
return stack:get_count()
end
end
local function ongetitem(pos) -- could add checking if energy >= max energy here, not really required since timer does that first thing anyway
local timer = minetest.get_node_timer(pos):start(interval)
end
local function update_formspec(pos) local function update_formspec(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local inventory = meta:get_inventory() local inventory = meta:get_inventory()
@ -22,12 +43,11 @@ local function update_formspec(pos)
local rem_en_or = meta:get_int("rem_energy_or_") local rem_en_or = meta:get_int("rem_energy_or_")
cfmsp = cfmsp .. cfmsp = cfmsp ..
sparktech.makebar("progress2.png", 1, 0, 8.5, 0.5, sparktech.makebar("progress2.png", 1, 0, 8.5, 0.5, rem_en, rem_en_or, 0)
rem_en, rem_en_or, 0)
cfmsp = cfmsp .. cfmsp = cfmsp ..
sparktech.makebar("energy2.png", 1, 0.5, 8.5, 0.5, sparktech.makebar("energy2.png", 1, 0.5, 8.5, 0.5, energy, energy_max, 0)
energy, energy_max, 0)
meta:set_string("formspec", cfmsp) meta:set_string("formspec", cfmsp)
end end
@ -42,10 +62,15 @@ minetest.register_node(NAME .. ":burnergenerator", {
"generator.png"}, "generator.png"},
paramtype2 = "facedir", paramtype2 = "facedir",
groups = { groups = {
--sparktech_energy_wakeup = 2,
-- sparktech_energy_wakeup
-- mode 1: wake on giving energy (only triggers if previous = 0)
-- mode 2: wake on taking energy (only triggers if previous = max)
-- TODO: Implement sparktech_energy_wakeup, furnace could also use this
sparktech_techy = 1, sparktech_techy = 1,
sparktech_energy_type = 2, sparktech_energy_type = 2,
sparktech_net_trigger = 1, sparktech_net_trigger = 1,
sparktech_energy_max = 5000 sparktech_energy_max = 2000
}, },
on_construct = function(pos) on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -53,12 +78,26 @@ minetest.register_node(NAME .. ":burnergenerator", {
meta:set_int("rem_energy_", 0) meta:set_int("rem_energy_", 0)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size('fuel', 1) inv:set_size('fuel', 1)
minetest.get_node_timer(pos):start(0.5) -- minetest.get_node_timer(pos):start(interval)
-- not required! its not like we got items on construct
end, end,
allow_metadata_inventory_put = is_item_allowed,
on_metadata_inventory_put = ongetitem,
on_timer = function(pos, elapsed) -- Reduce number of ticks like in the furnace on_timer = function(pos, elapsed) -- Reduce number of ticks like in the furnace
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local max_energy = minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max")
local energy = meta:get_int("energy")
if (energy >= max_energy) then
return -- at this point no new cycle is requested, and as such the thing halts,
-- NOTE: would be really usefull to get the energy system to call the
-- ontimer function upon taking energy out here!!
end
local rem_energy = meta:get_int("rem_energy_") local rem_energy = meta:get_int("rem_energy_")
if rem_energy > 0 then if rem_energy > 0 then
local change local change
if rem_energy > 5 then if rem_energy > 5 then
@ -67,7 +106,11 @@ minetest.register_node(NAME .. ":burnergenerator", {
change = rem_energy change = rem_energy
end end
meta:set_int("rem_energy_", meta:get_int("rem_energy_") - change) meta:set_int("rem_energy_", meta:get_int("rem_energy_") - change)
meta:set_int("energy", meta:get_int("energy") + change) if (energy + change >= max_energy) then
meta:set_int("energy", max_energy)
else
meta:set_int("energy", energy + change)
end
else else
local inv = meta:get_inventory() local inv = meta:get_inventory()
local itemlist = inv:get_list("fuel") local itemlist = inv:get_list("fuel")
@ -84,7 +127,7 @@ minetest.register_node(NAME .. ":burnergenerator", {
update_formspec(pos) -- Later this should only be done when a player looks into the block update_formspec(pos) -- Later this should only be done when a player looks into the block
minetest.get_node_timer(pos):start(0.5) minetest.get_node_timer(pos):start(interval)
end end
}) })