From b08ad33f5837cfe7d6a4ea7fc2e869ef6fa28187 Mon Sep 17 00:00:00 2001 From: Olav Bakke Svendsen Date: Tue, 17 Oct 2023 07:17:18 +0200 Subject: [PATCH] Adding farm management --- steam/temporary-coal-feeder.lua | 102 ++++++++++++++++++++++++-------- 1 file changed, 78 insertions(+), 24 deletions(-) diff --git a/steam/temporary-coal-feeder.lua b/steam/temporary-coal-feeder.lua index 096d7d8..7324f9f 100644 --- a/steam/temporary-coal-feeder.lua +++ b/steam/temporary-coal-feeder.lua @@ -3,9 +3,15 @@ local refill_when = function(amt) return amt < 2 end local refill_amt = 2 +local start_wood_when = function(amt) return amt < 1000 end +local stop_wood_when = function(amt) return amt > 40000 end +local rs_wood_side = "back" +local start_coal_when = function(amt) return amt < 500 end +local stop_coal_when = function(amt) return amt > 8000 end +local rs_coal_side = "left" + local main_monitor_name = "monitor_3" local main_monitor = peripheral.wrap(main_monitor_name) --- local treefarm_monitor = peripheral.wrap("monitor_0") local coal_barrels = {} for _,n in pairs({ "1", "0" }) do @@ -25,19 +31,26 @@ for _,p in pairs(peripheral.getNames()) do end end -local find_coal = function() - local stock = {} +local take_stock = function() + local coal_stock = {} for addr, barrel in pairs(coal_barrels) do local item = barrel.getItemDetail(1) local amt = item and item.count or 0 - stock[addr] = amt + coal_stock[addr] = amt + end + local wood_stock = 0 + for slot, item in pairs(tree_barrel.list()) do + if item.name and item.name == "minecraft:spruce_log" then + wood_stock = item.count + break + end end - return stock + return coal_stock, wood_stock end -local fullest_coal_barrel = function(stock) +local fullest_coal_barrel = function(coal_stock) local r = { addr = false, count = 0 } - for barrel_addr, count in pairs(stock) do + for barrel_addr, count in pairs(coal_stock) do if count >= r.count then r = { addr = barrel_addr, count = count } end @@ -45,16 +58,16 @@ local fullest_coal_barrel = function(stock) return r.addr, r.count end -local feed = function(stock) - local stock = stock +local feed = function(coal_stock) + local coal_stock = coal_stock for deployer_addr,deployer in pairs(deployers) do local deployer_item = deployer.getItemDetail(1) if refill_when(deployer_item and deployer_item.count or 0) then local f = function() return false, "No coal available" end - local barrel_addr, count = fullest_coal_barrel(stock) + local barrel_addr, count = fullest_coal_barrel(coal_stock) -- for barrel_addr,count in pairs(stock) do if count >= refill_amt then - stock[barrel_addr] = count - refill_amt + coal_stock[barrel_addr] = count - refill_amt f = function() return deployer.pullItems(barrel_addr, 1, refill_amt, 1) end -- break end @@ -67,13 +80,39 @@ local feed = function(stock) end end +local manage_farms = function(coal_stock, wood_stock) + local coal_online = not rs.getOutput(rs_coal_side) + local wood_online = not rs.getOutput(rs_wood_side) + + local total_coal = 0 + for _, v in pairs(coal_stock) do + total_coal = total_coal + v + end + + if coal_online then + if stop_coal_when(total_coal) then rs.setOutput(rs_coal_side, true) end + else + if start_coal_when(total_coal) then rs.setOutput(rs_coal_side, false) end + end + + if wood_online then + if stop_wood_when(wood_stock) then rs.setOutput(rs_wood_side, true) end + else + if start_wood_when(wood_stock) then rs.setOutput(rs_wood_side, false) end + end + + coal_online = not rs.getOutput(rs_coal_side) + wood_online = not rs.getOutput(rs_wood_side) + return coal_online, wood_online +end + local coal_at_boot = false local minutes_passed = -1 -local print_stats = function(monitor, stock) +local print_stats = function(monitor, coal_stock, wood_stock, coal_online, wood_online) local total_coal = 0 local str = "" - for k,v in pairs(stock) do + for k,v in pairs(coal_stock) do total_coal = total_coal + v str = str.." + "..tostring(v) end @@ -88,18 +127,32 @@ local print_stats = function(monitor, stock) monitor.setCursorPos(1,4) monitor.setTextColor(colors.gray) monitor.write(string.gsub(str, "^%s++%s*", "")) + + monitor.setCursorPos(1,6) + monitor.setTextColor(colors.white) + monitor.write("treefarm: ") + monitor.setTextColor(wood_online and colors.green or colors.red) + monitor.write(wood_online and "online" or "offline") + + monitor.setCursorPos(1,7) + monitor.setTextColor(colors.white) + monitor.write("charcoal blasters: ") + monitor.setTextColor(coal_online and colors.green or colors.red) + monitor.write(wood_online and "online" or "offline") + monitor.setCursorPos(1,12) + monitor.setTextColor(colors.gray) monitor.write("refreshes once every minute") -- this doesn't work for some reason.. - monitor.setTextColor(colors.white) - coal_at_boot = coal_at_boot or total_coal - minutes_passed = minutes_passed + 1 - if minutes_passed < 0 then - local avg = (coal_at_boot - total_coal)/minutes_passed - monitor.setCursorPos(1,6) - monitor.write("losing on average "..tostring(avg).."cc/m") - end +-- monitor.setTextColor(colors.white) +-- coal_at_boot = coal_at_boot or total_coal +-- minutes_passed = minutes_passed + 1 +-- if minutes_passed < 0 then +-- local avg = (coal_at_boot - total_coal)/minutes_passed +-- monitor.setCursorPos(1,6) +-- monitor.write("losing on average "..tostring(avg).."cc/m") +-- end end local spinner_chars = {"\\","-","/","|"} @@ -129,10 +182,11 @@ while true do main_timer = os.startTimer(60) os.cancelTimer(spinner_timer) print_spinner(main_monitor, 29,12, "?") - local stock = find_coal() - print_stats(main_monitor, stock) + local coal_stock, wood_stock = take_stock() + local coal_online, wood_online = manage_farms(coal_stock, wood_stock) + print_stats(main_monitor, coal_stock, wood_stock, coal_online, wood_online) print_spinner(main_monitor, 29,12, "*") - feed(stock) + feed(coal_stock) spinner_timer = os.startTimer(0) elseif e[1] == "timer" and e[2] == spinner_timer then spinner_timer = os.startTimer(0.5) -- 2.30.2