This repository has been archived on 2020-05-24. You can view files and clone it, but cannot push or open issues or pull requests.
minetest-mod-sparktech/sparkgenerator/lua/burnergenerator.lua

134 lines
4.0 KiB
Lua

local FUEL_MULTIPLIER = 2
local INTERVAL= 0.5
local MAX_ENERGY = 2000
local NAME = minetest.get_current_modname()
local formspec = sparktech.add_inventory(8,1.5,
"list[current_name;fuel;0,0;1,1;]")
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}) or target ~= "fuel" then
return 0 -- returning nil here crashes minetest 1942660955bc3684a60d527e2fafa0ec3e02dd54
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 cfmsp = formspec
local energy = meta:get_int("energy")
local energy_max = minetest.get_item_group(minetest.get_node(pos).name, "sparktech_energy_max")
local rem_en = meta:get_int("rem_energy_")
local rem_en_or = meta:get_int("rem_energy_or_")
cfmsp = cfmsp ..
sparktech.makebar("progress2.png", 1.25, 0, 8.5, 0.5, rem_en, rem_en_or, 0)
cfmsp = cfmsp ..
sparktech.makebar("energy2.png", 1.25, 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 = WRENCHABLE,
sparktech_energy_wakeup = TRUE,
sparktech_energy_type = ENERGY_PRODUCER,
sparktech_net_trigger = TRUE,
sparktech_energy_max = MAX_ENERGY
},
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,
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
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 = {
{ "default:clay_brick", "default:clay_brick", "default:clay_brick" },
{ "sparkcore:cable", "group:steel_chasis", "sparkcore:cable" },
{ "default:clay_brick", "default:clay_brick", "default:clay_brick" }
}
})