diff --git a/elepower_fapi/formspec.lua b/elepower_fapi/formspec.lua new file mode 100644 index 0000000..6d624fb --- /dev/null +++ b/elepower_fapi/formspec.lua @@ -0,0 +1,19 @@ + +-- Fluid bar for formspec +function ele.formspec.fluid_bar(x, y, fluid_buffer) + local texture = "default_water.png" + local metric = 0 + + if fluid_buffer and fluid_buffer.fluid and fluid_buffer.fluid ~= "" and + minetest.registered_nodes[fluid_buffer.fluid] ~= nil then + texture = minetest.registered_nodes[fluid_buffer.fluid].tiles[1] + if type(texture) == "table" then + texture = texture.name + end + metric = math.floor(100 * fluid_buffer.amount / fluid_buffer.capacity) + end + + return "image["..x..","..y..";1,2.8;elepower_gui_barbg.png".. + "\\^[lowpart\\:"..metric.."\\:"..texture.."\\\\^[resize\\\\:64x128]".. + "image["..x..","..y..";1,2.8;elepower_gui_gauge.png]" +end diff --git a/elepower_fapi/init.lua b/elepower_fapi/init.lua index 7a85dd0..bc5c42c 100644 --- a/elepower_fapi/init.lua +++ b/elepower_fapi/init.lua @@ -11,4 +11,5 @@ elefluid.unit_description = "milli-bucket" dofile(modpath.."/transfer.lua") dofile(modpath.."/transfer_node.lua") +dofile(modpath.."/formspec.lua") dofile(modpath.."/buffer.lua") diff --git a/elepower_fapi/transfer.lua b/elepower_fapi/transfer.lua index 84b8874..218f376 100644 --- a/elepower_fapi/transfer.lua +++ b/elepower_fapi/transfer.lua @@ -61,7 +61,7 @@ local function traverse_network(targets, all_nodes, pos, p_pos, pnodeid, queue) end end -local function fluid_targets(p_pos, positions) +local function fluid_targets(p_pos, pos) local provider = minetest.get_node(p_pos) local pnodeid = minetest.pos_to_string(p_pos) --[[ @@ -74,24 +74,20 @@ local function fluid_targets(p_pos, positions) local queue = {} local all_nodes = {} - for pos in pairs(positions) do - queue = {} + local node = minetest.get_node(pos) + if node and ele.helpers.get_item_group(node.name, "elefluid_transport") then + add_duct_node(all_nodes, pos, pnodeid, queue) + elseif node and (ele.helpers.get_item_group(node.name, "fluid_container") or + ele.helpers.get_item_group(node.name, "fluidity_tank")) then + queue = {p_pos} + end - local node = minetest.get_node(pos) - if node and ele.helpers.get_item_group(node.name, "elefluid_transport") then - add_duct_node(all_nodes, pos, pnodeid, queue) - elseif node and (ele.helpers.get_item_group(node.name, "fluid_container") or - ele.helpers.get_item_group(node.name, "fluidity_tank")) then - queue = {p_pos} - end - - while next(queue) do - local to_visit = {} - for _, posi in ipairs(queue) do - traverse_network(targets, all_nodes, posi, p_pos, pnodeid, to_visit) - end - queue = to_visit + while next(queue) do + local to_visit = {} + for _, posi in ipairs(queue) do + traverse_network(targets, all_nodes, posi, p_pos, pnodeid, to_visit) end + queue = to_visit end local prov_id = minetest.hash_node_position(p_pos) @@ -119,35 +115,25 @@ minetest.register_abm({ local meta1 = nil local targets = {} - local source = minetest.registered_nodes[node.name] - local positions = {vector.add(minetest.facedir_to_dir(node.param2), pos)} - - local ntwks = {} - local errored = false - local nw_branches = 0 - for _,pos1 in pairs(positions) do - local name = node.name - local networked = ele.helpers.get_item_group(name, "elefluid_transport_source") or - ele.helpers.get_item_group(name, "elefluid_transport") - if networked then - ntwks[pos1] = true - nw_branches = nw_branches + 1 - end - end - - if errored then - return - end - - if nw_branches == 0 then + -- Only allow the node directly behind to be a start of a network + local tpos = vector.add(minetest.facedir_to_dir(node.param2), pos) + local tname = minetest.get_node(tpos).name + if not ele.helpers.get_item_group(tname, "elefluid_transport") and + not ele.helpers.get_item_group(tname, "fluidity_tank") and + not ele.helpers.get_item_group(tname, "fluid_container") then minetest.forceload_free_block(pos) return - else - minetest.forceload_block(pos) end - targets = fluid_targets(pos, ntwks) + -- Retrieve network + minetest.forceload_block(pos) + targets = fluid_targets(pos, tpos) + + -- No targets, don't proceed + if #targets == 0 then + return + end -- Begin transfer local srcpos = ele.helpers.face_front(pos, node.param2) @@ -169,11 +155,14 @@ minetest.register_abm({ local buffers = elefluid.get_node_buffers(srcpos) if not buffers then return nil end + -- Limit the amount of fluid pumped per cycle local pcapability = ele.helpers.get_node_property(meta, pos, "fluid_pump_capacity") + local pumped = 0 -- Transfer some fluid here for _,pos in pairs(targets) do if not vector.equals(pos, srcpos) then + if pumped >= pcapability then break end local pp = elefluid.get_node_buffers(pos) local changed = false @@ -181,17 +170,20 @@ minetest.register_abm({ if pp ~= nil then for name in pairs(pp) do for bname in pairs(buffers) do + if pumped >= pcapability then break end local buffer_data = elefluid.get_buffer_data(srcpos, bname) local target_data = elefluid.get_buffer_data(pos, name) if (target_data.fluid == buffer_data.fluid or target_data.fluid == "") and buffer_data.fluid ~= "" and buffer_data.amount > 0 and + (buffer_data.drainable == nil or buffer_data.drainable == true) and elefluid.buffer_accepts_fluid(pos, name, buffer_data.fluid) then if elefluid.can_insert_into_buffer(pos, name, buffer_data.fluid, pcapability) > 0 then local res_f, count = elefluid.take_from_buffer(srcpos, bname, pcapability) if count > 0 then elefluid.insert_into_buffer(pos, name, res_f, count) + pumped = pumped + count changed = true end end diff --git a/elepower_farming/formspec.lua b/elepower_farming/formspec.lua index 0c918bf..f995cc0 100644 --- a/elepower_farming/formspec.lua +++ b/elepower_farming/formspec.lua @@ -37,3 +37,21 @@ function elefarm.formspec.harvester_formspec(timer, power) "listring[current_player;main]".. default.get_hotbar_bg(0, 4.25) end + +function elefarm.formspec.tree_processor(timer, power, fluid_buffer, water_buffer, output_buffer) + return "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + ele.formspec.power_meter(power).. + bar(1, 0, 100-timer).. + ele.formspec.fluid_bar(2, 0, fluid_buffer).. + ele.formspec.fluid_bar(3, 0, water_buffer).. + ele.formspec.fluid_bar(7, 0, output_buffer).. + "list[context;dst;5,1;1,1;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[context;dst]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) +end diff --git a/elepower_farming/mod.conf b/elepower_farming/mod.conf index bb9ab28..e622633 100644 --- a/elepower_farming/mod.conf +++ b/elepower_farming/mod.conf @@ -1,3 +1,4 @@ name = elepower_farming description = Electric Farming Automation! depends = elepower_papi, elepower_tools, farming +optional_depends = bucket diff --git a/elepower_farming/nodes/fluids.lua b/elepower_farming/nodes/fluids.lua index bf28084..39a3325 100644 --- a/elepower_farming/nodes/fluids.lua +++ b/elepower_farming/nodes/fluids.lua @@ -19,7 +19,7 @@ minetest.register_node("elepower_farming:tree_sap_source", { liquid_alternative_flowing = "elepower_farming:tree_sap_flowing", liquid_viscosity = 7, post_effect_color = {a = 103, r = 84, g = 34, b = 0}, - groups = {tree_sap = 3, liquid = 3}, + groups = {tree_sap = 3, liquid = 3, raw_bio = 1, tree_fluid = 1}, sounds = default.node_sound_water_defaults(), }) @@ -67,7 +67,7 @@ minetest.register_node("elepower_farming:resin_source", { liquid_alternative_flowing = "elepower_farming:resin_flowing", liquid_viscosity = 8, post_effect_color = {a = 103, r = 84, g = 34, b = 0}, - groups = {resin = 3, liquid = 3}, + groups = {resin = 3, liquid = 3, raw_bio = 1, tree_fluid = 1}, sounds = default.node_sound_water_defaults(), }) @@ -236,3 +236,25 @@ minetest.register_node("elepower_farming:sludge_flowing", { groups = {sludge = 3, liquid = 3, not_in_creative_inventory = 1}, sounds = default.node_sound_water_defaults(), }) + +-- Register buckets +local function bucket_construct(color) + return "bucket.png^(elefarming_bucket_mask.png^[multiply:"..color..")" +end + +if minetest.get_modpath("bucket") ~= nil then + bucket.register_liquid("elepower_farming:tree_sap_source", "elepower_farming:tree_sap_flowing", + "elepower_farming:bucket_tree_sap", bucket_construct("#411400"), "Tree Sap Bucket") + + bucket.register_liquid("elepower_farming:resin_source", "elepower_farming:resin_flowing", + "elepower_farming:bucket_resin", bucket_construct("#411401"), "Resin Bucket") + + bucket.register_liquid("elepower_farming:biomass_source", "elepower_farming:biomass_flowing", + "elepower_farming:bucket_biomass", bucket_construct("#002c01"), "Biomass Bucket") + + bucket.register_liquid("elepower_farming:biofuel_source", "elepower_farming:biofuel_flowing", + "elepower_farming:bucket_biofuel", bucket_construct("#762700"), "Biofuel Bucket") + + bucket.register_liquid("elepower_farming:sludge_source", "elepower_farming:sludge_flowing", + "elepower_farming:bucket_sludge", bucket_construct("#121212"), "Sludge Bucket") +end diff --git a/elepower_farming/nodes/harvester.lua b/elepower_farming/nodes/harvester.lua index ccb7ba9..3b6e1d5 100644 --- a/elepower_farming/nodes/harvester.lua +++ b/elepower_farming/nodes/harvester.lua @@ -1,5 +1,9 @@ -local HARVESTER_TICK = 10 +-- How many seconds there are between runs +local HARVESTER_TICK = 10 + +-- How many plants we can collect in one run +local HARVESTER_SWEEP = 9 local function can_dig(pos, player) local meta = minetest.get_meta(pos) @@ -36,7 +40,7 @@ local function harvest(pos, harvested, fdir) local range_st = vector.add(front, ranges[1]) local range_end = vector.add(front, ranges[2]) - local shots = 9 + local shots = HARVESTER_SWEEP for x = range_st.x, range_end.x do for z = range_st.z, range_end.z do diff --git a/elepower_farming/nodes/init.lua b/elepower_farming/nodes/init.lua index 5ead624..83b5415 100644 --- a/elepower_farming/nodes/init.lua +++ b/elepower_farming/nodes/init.lua @@ -3,3 +3,4 @@ dofile(elefarm.modpath.."/nodes/planter.lua") dofile(elefarm.modpath.."/nodes/harvester.lua") dofile(elefarm.modpath.."/nodes/fluids.lua") dofile(elefarm.modpath.."/nodes/tree_extractor.lua") +dofile(elefarm.modpath.."/nodes/tree_processor.lua") diff --git a/elepower_farming/nodes/planter.lua b/elepower_farming/nodes/planter.lua index c887c3c..030118a 100644 --- a/elepower_farming/nodes/planter.lua +++ b/elepower_farming/nodes/planter.lua @@ -1,6 +1,8 @@ -local PLANTER_TICK = 5 +-- How many seconds there are between runs +local PLANTER_TICK = 10 +-- Growth regions for configured crops local ranges = { -- Slot 1 (starts from upper left corner) { @@ -169,10 +171,10 @@ local function plant(pos, range, stack, inv) if to_place then minetest.set_node(place_pos, {name = to_place}) else - local seeddef = minetest.registered_items[to_plant] - local nodename = seeddef.next_plant or (to_plant .. "_1"):gsub("seed_", "") - farming.place_seed(to_plant, nil, {type = "node", under = base_pos, above = place_pos}, - nodename) + local seeddef = minetest.registered_items[to_plant] + + seeddef.on_place(ItemStack(to_plant), nil, + {type = "node", under = base_pos, above = place_pos}) take = to_plant end diff --git a/elepower_farming/nodes/tree_processor.lua b/elepower_farming/nodes/tree_processor.lua new file mode 100644 index 0000000..c4eee09 --- /dev/null +++ b/elepower_farming/nodes/tree_processor.lua @@ -0,0 +1,159 @@ + +local tree_fluid_recipes = { + ["elepower_farming:tree_sap_source"] = { + water = 100, + amount = 100, + time = 5, + output = { + fluid = "elepower_farming:biofuel_source", + amount = 80, + }, + }, + ["elepower_farming:resin_source"] = { + water = 100, + amount = 100, + time = 5, + output = { + fluid = "elepower_farming:biomass_source", + amount = 80, + item = "elepower_farming:resin" + }, + }, +} + +local function on_timer(pos, elapsed) + local refresh = false + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + local tree_buffer = elefluid.get_buffer_data(pos, "tree") + local water_buffer = elefluid.get_buffer_data(pos, "water") + local out_buffer = elefluid.get_buffer_data(pos, "output") + + local capacity = ele.helpers.get_node_property(meta, pos, "capacity") + local storage = ele.helpers.get_node_property(meta, pos, "storage") + local usage = ele.helpers.get_node_property(meta, pos, "usage") + + local time = meta:get_int("src_time") + local time_max = meta:get_int("src_time_max") + + local recipe = tree_fluid_recipes[tree_buffer.fluid] + + while true do + if not recipe then + break + end + + local conditions = water_buffer.amount >= recipe.water and + tree_buffer.amount >= recipe.amount and + out_buffer.amount + recipe.output.amount < out_buffer.capacity and + storage > usage and + (out_buffer.fluid == "" or out_buffer.fluid == recipe.output.fluid) + + if not conditions then + break + end + + if time_max == 0 then + time_max = recipe.time + meta:set_int("src_time_max", time_max) + refresh = true + break + end + + storage = storage - usage + meta:set_int("storage", storage) + + if time < time_max then + time = time + 1 + meta:set_int("src_time", time) + refresh = true + end + + if time ~= time_max then + break + end + + if recipe.output.item then + local room_for_output = true + local stack = ItemStack(recipe.output.item) + inv:set_size("dst_tmp", inv:get_size("dst")) + inv:set_list("dst_tmp", inv:get_list("dst")) + + if not inv:room_for_item("dst_tmp", stack) then + room_for_output = false + else + inv:add_item("dst_tmp", stack) + end + + if not room_for_output then + break + end + + inv:set_list("dst", inv:get_list("dst_tmp")) + end + + local new_tree_amount = tree_buffer.amount - recipe.amount + meta:set_int("tree_fluid_storage", new_tree_amount) + meta:set_int("output_fluid_storage", out_buffer.amount + recipe.output.amount) + meta:set_int("water_fluid_storage", water_buffer.amount - recipe.water) + + if new_tree_amount == 0 then + tree_buffer.fluid = "" + end + + meta:set_string("tree_fluid", tree_buffer.fluid) + meta:set_string("output_fluid", recipe.output.fluid) + + meta:set_int("src_time", 0) + meta:set_int("src_time_max", 0) + + refresh = true + break + end + + local timer = 0 + local power = math.floor(100 * storage / capacity) + if time_max > 0 then + timer = math.floor(100 * time / time_max) + end + + meta:set_string("formspec", elefarm.formspec.tree_processor(timer, power, tree_buffer, water_buffer, out_buffer)) + + return refresh +end + +ele.register_machine("elepower_farming:tree_processor", { + description = "Tree Fluid Processor", + ele_usage = 8, + ele_no_automatic_ports = true, + groups = {ele_user = 1, oddly_breakable_by_hand = 1, cracky = 1, fluid_container = 1}, + fluid_buffers = { + tree = { + capacity = 8000, + accepts = {"group:tree_fluid"} + }, + water = { + capacity = 8000, + accepts = {"default:water_source"} + }, + output = { + capacity = 8000 + } + }, + on_timer = on_timer, + on_construct = function (pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_size("dst", 1) + meta:set_string("formspec", elefarm.formspec.tree_processor(0, 0)) + + meta:set_string("tree_fluid", "elepower_farming:resin_source") + meta:set_int("tree_fluid_storage", 2000) + end, + tiles = { + "elefarming_machine_tree_processor.png", "elefarming_machine_base.png", "elefarming_machine_side.png", + "elefarming_machine_side.png", "elefarming_machine_side.png", "elefarming_machine_side.png", + }, +}) diff --git a/elepower_farming/textures/elefarming_bucket_mask.png b/elepower_farming/textures/elefarming_bucket_mask.png new file mode 100644 index 0000000..d913b21 Binary files /dev/null and b/elepower_farming/textures/elefarming_bucket_mask.png differ diff --git a/elepower_farming/textures/elefarming_machine_tree_processor.png b/elepower_farming/textures/elefarming_machine_tree_processor.png new file mode 100644 index 0000000..b9490ce Binary files /dev/null and b/elepower_farming/textures/elefarming_machine_tree_processor.png differ