diff --git a/sparkgenerators/burnergenerator.lua b/sparkgenerators/burnergenerator.lua index c825c34..5209788 100644 --- a/sparkgenerators/burnergenerator.lua +++ b/sparkgenerators/burnergenerator.lua @@ -1,4 +1,6 @@ local fuel_multiplier = 2 +local interval = 0.5 + local NAME = minetest.get_current_modname() @@ -10,9 +12,28 @@ local formspec = "bgcolor[#FC05E344;false]" .. "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 meta = minetest.get_meta(pos) - local inventory = meta:get_inventory() + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() local cfmsp = formspec local energy = meta:get_int("energy") @@ -22,75 +43,97 @@ local function update_formspec(pos) local rem_en_or = meta:get_int("rem_energy_or_") cfmsp = cfmsp .. - sparktech.makebar("progress2.png", 1, 0, 8.5, 0.5, - rem_en, rem_en_or, 0) - + sparktech.makebar("progress2.png", 1, 0, 8.5, 0.5, rem_en, rem_en_or, 0) + cfmsp = cfmsp .. - sparktech.makebar("energy2.png", 1, 0.5, 8.5, 0.5, - energy, energy_max, 0) + sparktech.makebar("energy2.png", 1, 0.5, 8.5, 0.5, energy, energy_max, 0) + meta:set_string("formspec", cfmsp) end minetest.register_node(NAME .. ":burnergenerator", { - description = "Burner Generator", - tiles = { - "generator2.png", - "generator2.png", - "generator2.png", - "generator2.png", - "generator2.png", - "generator.png"}, - paramtype2 = "facedir", - groups = { - sparktech_techy = 1, - sparktech_energy_type = 2, - sparktech_net_trigger = 1, - sparktech_energy_max = 5000 - }, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec) - meta:set_int("rem_energy_", 0) - local inv = meta:get_inventory() - inv:set_size('fuel', 1) - minetest.get_node_timer(pos):start(0.5) - end, - on_timer = function(pos, elapsed) -- Reduce number of ticks like in the furnace - local meta = minetest.get_meta(pos) - - local rem_energy = meta:get_int("rem_energy_") - if rem_energy > 0 then - local change - if rem_energy > 5 then - change = 5 - else - change = rem_energy - end - meta:set_int("rem_energy_", meta:get_int("rem_energy_") - change) - meta:set_int("energy", meta:get_int("energy") + change) - else - local inv = meta:get_inventory() - local itemlist = inv:get_list("fuel") - local fuel, product = minetest.get_craft_result({method = "fuel", width = 1, items = itemlist}) - local node = minetest.get_node(pos) - if fuel["time"] ~= 0 then - inv:set_stack("fuel", 1, product["items"][1]) + description = "Burner Generator", + tiles = { + "generator2.png", + "generator2.png", + "generator2.png", + "generator2.png", + "generator2.png", + "generator.png"}, + paramtype2 = "facedir", + 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_energy_type = 2, + sparktech_net_trigger = 1, + sparktech_energy_max = 2000 + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", formspec) + meta:set_int("rem_energy_", 0) + local inv = meta:get_inventory() + inv:set_size('fuel', 1) + -- minetest.get_node_timer(pos):start(interval) + -- not required! its not like we got items on construct + end, - local fuel_energy = fuel["time"] * fuel_multiplier - meta:set_int("rem_energy_or_", fuel_energy) - meta:set_int("rem_energy_", fuel_energy) - 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 + 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 - update_formspec(pos) -- Later this should only be done when a player looks into the block - - minetest.get_node_timer(pos):start(0.5) - end + local rem_energy = meta:get_int("rem_energy_") + + if rem_energy > 0 then + local change + if rem_energy > 5 then + change = 5 + else + change = rem_energy + end + meta:set_int("rem_energy_", meta:get_int("rem_energy_") - change) + if (energy + change >= max_energy) then + meta:set_int("energy", max_energy) + else + meta:set_int("energy", energy + change) + end + else + local inv = meta:get_inventory() + local itemlist = inv:get_list("fuel") + local fuel, product = minetest.get_craft_result({method = "fuel", width = 1, items = itemlist}) + local node = minetest.get_node(pos) + if fuel["time"] ~= 0 then + inv:set_stack("fuel", 1, product["items"][1]) + + local fuel_energy = fuel["time"] * fuel_multiplier + meta:set_int("rem_energy_or_", fuel_energy) + meta:set_int("rem_energy_", fuel_energy) + end + end + + update_formspec(pos) -- Later this should only be done when a player looks into the block + + minetest.get_node_timer(pos):start(interval) + end }) minetest.register_craft({ output = NAME .. ":burnergenerator", recipe = {{ 'group:steelplate', 'group:steelplate', 'group:steelplate' }, - { 'group:steelplate', 'default:clay_brick', 'group:steelplate' }, - { 'group:steelplate', 'default:copper_ingot', 'group:steelplate' }} -}) + { 'group:steelplate', 'default:clay_brick', 'group:steelplate' }, + { 'group:steelplate', 'default:copper_ingot', 'group:steelplate' }} +}) \ No newline at end of file