elepower/elepower_farming/machines/composter.lua
2020-05-30 09:28:42 +03:00

189 lines
4.5 KiB
Lua

local function get_formspec(timer, biomass_buffer, output_buffer)
return "size[8,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
ele.formspec.fluid_bar(0, 0.75, biomass_buffer)..
ele.formspec.fluid_bar(7, 0.75, output_buffer)..
"list[context;src;1,0.5;3,3;]"..
"image[5,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:"..
(timer)..":gui_furnace_arrow_fg.png^[transformR270]"..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
"listring[current_player;main]"..
"listring[context;src]"..
"listring[current_player;main]"..
default.get_hotbar_bg(0, 4.25)
end
local function is_plant(itemname)
if ele.helpers.get_item_group(itemname, "seed") or ele.helpers.get_item_group(itemname, "plant") then
return true
end
local node = itemname .. "_1"
if minetest.registered_nodes[node] then
if ele.helpers.get_item_group(node, "plant") then
return true
end
end
return false
end
local function get_biomass(list)
local list_new = {}
local amnt = 0
for i,stack in pairs(list) do
local sname = stack:get_name()
if is_plant(sname) then
stack:take_item(1)
list_new[i] = stack
amnt = amnt + 1
else
list_new[i] = stack
end
end
return amnt, list_new
end
local function on_timer(pos, elapsed)
local refresh = false
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local in_buffer = fluid_lib.get_buffer_data(pos, "input")
local out_buffer = fluid_lib.get_buffer_data(pos, "output")
local time = meta:get_int("src_time")
local time_max = meta:get_int("src_time_max")
while true do
local amount,list_new = get_biomass(inv:get_list("src"))
if (amount == 0 and in_buffer.amount == 0) or out_buffer.amount == out_buffer.capacity then
break
end
if time_max == 0 then
time_max = 10
refresh = true
break
end
if time < time_max then
time = time + 1
refresh = true
end
if time ~= time_max then
break
end
local amount_fluid = 0
if amount > 0 then
amount_fluid = amount_fluid + (amount * 100)
end
if in_buffer.amount > 0 then
local rm = math.min(in_buffer.amount, 1000)
-- Remove 20% from sludge
if in_buffer.fluid == "elepower_farming:sludge_source" then
local pcr = math.floor(rm * 0.2)
rm = rm - pcr
end
amount_fluid = amount_fluid + rm
in_buffer.amount = in_buffer.amount - rm
if in_buffer.amount <= 0 then
in_buffer.amount = 0
in_buffer.fluid = ""
end
end
out_buffer.amount = out_buffer.amount + amount_fluid
if out_buffer.amount > out_buffer.capacity then
out_buffer.amount = out_buffer.capacity
end
inv:set_list("src", list_new)
meta:set_int("input_fluid_storage", in_buffer.amount)
meta:set_string("input_fluid", in_buffer.fluid)
meta:set_int("output_fluid_storage", out_buffer.amount)
meta:set_string("output_fluid", "elepower_farming:biofuel_source")
time = 0
time_max = 0
refresh = true
break
end
local timer = 0
if time_max > 0 then
timer = math.floor(100 * time / time_max)
end
meta:set_int("src_time", time)
meta:set_int("src_time_max", time_max)
meta:set_string("formspec", get_formspec(timer, in_buffer, out_buffer))
return refresh
end
ele.register_base_device("elepower_farming:composter", {
description = "Composter\nConvert organic matter to Biofuel",
groups = {
oddly_breakable_by_hand = 1,
cracky = 1,
fluid_container = 1,
tubedevice = 1,
tubedevice_receiver = 1
},
fluid_buffers = {
output = {
capacity = 8000,
drainable = true,
},
input = {
capacity = 8000,
drainable = false,
accepts = {
"group:raw_bio",
"elepower_farming:biomass_source",
"elepower_farming:tree_sap_source",
"elepower_farming:sludge_source",
}
},
},
on_timer = on_timer,
on_construct = function (pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("src", 9)
meta:set_string("formspec", get_formspec(0))
end,
tiles = {
"elefarming_machine_top.png", "elefarming_machine_base.png", "elefarming_machine_side.png",
"elefarming_machine_side.png", "elefarming_machine_side.png", "elefarming_machine_side.png",
},
allow_metadata_inventory_put = ele.default.allow_metadata_inventory_put,
allow_metadata_inventory_move = ele.default.allow_metadata_inventory_move,
allow_metadata_inventory_take = ele.default.allow_metadata_inventory_take,
on_metadata_inventory_move = ele.default.metadata_inventory_changed,
on_metadata_inventory_put = ele.default.metadata_inventory_changed,
on_metadata_inventory_take = ele.default.metadata_inventory_changed,
})