diff --git a/elepower_farming/crafting.lua b/elepower_farming/crafting.lua index 3bc11f3..b1504e4 100644 --- a/elepower_farming/crafting.lua +++ b/elepower_farming/crafting.lua @@ -48,3 +48,13 @@ minetest.register_craft({ {"elepower_dynamics:copper_gear", "elepower_dynamics:servo_valve", "elepower_dynamics:copper_gear"}, } }) + +-- Composter +minetest.register_craft({ + output = "elepower_farming:composter", + recipe = { + {"elepower_dynamics:motor", "bucket:bucket_empty", "elepower_dynamics:motor"}, + {"elepower_dynamics:electrum_gear", "elepower_farming:device_frame", "elepower_dynamics:electrum_gear"}, + {"elepower_dynamics:copper_gear", "elepower_dynamics:servo_valve", "elepower_dynamics:copper_gear"}, + } +}) diff --git a/elepower_farming/nodes/composter.lua b/elepower_farming/nodes/composter.lua new file mode 100644 index 0000000..01c1eb4 --- /dev/null +++ b/elepower_farming/nodes/composter.lua @@ -0,0 +1,145 @@ + +local function get_formspec(timer, output_buffer) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + 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 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 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 = amount * 100 + 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("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, out_buffer)) + + return refresh +end + +ele.register_base_device("elepower_farming:composter", { + description = "Composter\nConvert plant matter to Biofuel", + groups = {oddly_breakable_by_hand = 1, cracky = 1, fluid_container = 1, tube = 1}, + fluid_buffers = { + output = { + capacity = 8000, + drainable = true, + } + }, + 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, +}) diff --git a/elepower_farming/nodes/init.lua b/elepower_farming/nodes/init.lua index e22814b..e8146a6 100644 --- a/elepower_farming/nodes/init.lua +++ b/elepower_farming/nodes/init.lua @@ -13,6 +13,7 @@ dofile(elefarm.modpath.."/nodes/planter.lua") dofile(elefarm.modpath.."/nodes/harvester.lua") dofile(elefarm.modpath.."/nodes/tree_extractor.lua") dofile(elefarm.modpath.."/nodes/tree_processor.lua") +dofile(elefarm.modpath.."/nodes/composter.lua") -- Mobs Redo support if minetest.get_modpath("mobs") ~= nil and mobs.mod and mobs.mod == "redo" then diff --git a/elepower_farming/textures/elefarming_machine_top.png b/elepower_farming/textures/elefarming_machine_top.png new file mode 100644 index 0000000..048a554 Binary files /dev/null and b/elepower_farming/textures/elefarming_machine_top.png differ