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
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
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
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
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 = {"\\","-","/","|"}
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)