elepower/elepower_machines/machines/bases/fluid_generator.lua

156 lines
4.4 KiB
Lua

local function get_formspec_default(power, percent, buffer, state)
return "size[8,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
ele.formspec.power_meter(power)..
ele.formspec.state_switcher(7, 2.5, state)..
ele.formspec.fluid_bar(7, 0, buffer)..
"image[3.5,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
(percent)..":default_furnace_fire_fg.png]"..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
default.get_hotbar_bg(0, 4.25)
end
-- A generator that creates power using a fuel
function ele.register_fluid_generator(nodename, nodedef)
local btime = nodedef.fuel_burn_time or 8
local busage = nodedef.fuel_usage or 1000
local buffer_name = nil
-- Autodetect fluid buffer and the fuel if necessary
if not nodedef.fluid_buffers then return nil end
for buf,data in pairs(nodedef.fluid_buffers) do
buffer_name = buf
break
end
-- Allow for custom formspec
local get_formspec = get_formspec_default
if nodedef.get_formspec then
get_formspec = nodedef.get_formspec
nodedef.get_formspec = nil
end
local defaults = {
groups = {
fluid_container = 1,
ele_provider = 1,
oddly_breakable_by_hand = 1,
},
ele_upgrades = {
capacitor = {"capacity"},
},
tube = false,
on_timer = function (pos, elapsed)
local refresh = false
local meta = minetest.get_meta(pos)
local burn_time = meta:get_int("burn_time")
local burn_totaltime = meta:get_int("burn_totaltime")
local capacity = ele.helpers.get_node_property(meta, pos, "capacity")
local generation = ele.helpers.get_node_property(meta, pos, "usage")
local storage = ele.helpers.get_node_property(meta, pos, "storage")
local state = meta:get_int("state")
local is_enabled = ele.helpers.state_enabled(meta, pos, state)
-- Fluid buffer
local flbuffer = fluid_lib.get_buffer_data(pos, buffer_name)
local pow_buffer = {capacity = capacity, storage = storage, usage = 0}
local status = "Idle"
while true do
if not is_enabled then
status = "Off"
break
end
-- If more to burn and the energy produced was used: produce some more
if burn_time > 0 then
if storage + generation > capacity then
break
end
pow_buffer.storage = pow_buffer.storage + generation
pow_buffer.usage = generation
burn_time = burn_time - 1
meta:set_int("burn_time", burn_time)
refresh = true
end
status = "Active"
-- Burn another bucket of fluid fuel
if burn_time == 0 then
if not flbuffer or flbuffer.fluid == "" then break end
local inv = meta:get_inventory()
if flbuffer.amount >= busage then
meta:set_int("burn_time", btime)
meta:set_int("burn_totaltime", btime)
-- Take fluid fuel
flbuffer.amount = flbuffer.amount - busage
pow_buffer.usage = generation
if nodedef.ele_active_node then
local active_node = nodename .. "_active"
if nodedef.ele_active_node ~= true then
active_node = nodedef.ele_active_node
end
ele.helpers.swap_node(pos, active_node)
end
refresh = true
else
status = "Idle"
ele.helpers.swap_node(pos, nodename)
refresh = false
end
end
if burn_totaltime == 0 then burn_totaltime = 1 end
if flbuffer.fluid ~= "" and flbuffer.amount == 0 then flbuffer.fluid = "" end
break
end
local percent = math.floor((burn_time / burn_totaltime) * 100)
meta:set_string("formspec", get_formspec(pow_buffer, percent, flbuffer, state))
meta:set_string("infotext", ("%s %s\n%s\n%s"):format(nodedef.description, status,
ele.capacity_text(capacity, pow_buffer.storage), fluid_lib.buffer_to_string(flbuffer)))
meta:set_string(buffer_name .. "_fluid", flbuffer.fluid)
meta:set_int(buffer_name .. "_fluid_storage", flbuffer.amount)
meta:set_int("storage", pow_buffer.storage)
return refresh
end,
on_construct = function (pos)
local meta = minetest.get_meta(pos)
local capacity = ele.helpers.get_node_property(meta, pos, "capacity")
local storage = ele.helpers.get_node_property(meta, pos, "storage")
meta:set_string("formspec", get_formspec({capacity = capacity, storage = storage, usage = 0}, 0))
end
}
nodedef.fuel_burn_time = nil
nodedef.fuel_usage = nil
for key,val in pairs(defaults) do
if not nodedef[key] then
nodedef[key] = val
end
end
ele.register_machine(nodename, nodedef)
end