86 lines
No EOL
2.9 KiB
Lua
86 lines
No EOL
2.9 KiB
Lua
-- There are a lot of chest monitors beyond this one
|
|
-- Each branching into countless features of their own
|
|
-- But this monitor is being preserved because it's special
|
|
-- It's special, because despite being so basic...
|
|
-- it was the first practical CC program I ever wrote
|
|
|
|
local chests = {peripheral.find("minecraft:chest")}
|
|
local data_monitor = peripheral.find("monitor")
|
|
local sleep_time = sleep(#(chests)/20)
|
|
|
|
local function move_line()
|
|
data_monitor.setCursorPos(1, select(2, data_monitor.getCursorPos()) + 1)
|
|
if select(2, data_monitor.getCursorPos()) >= select(2, data_monitor.getSize()) then
|
|
data_monitor.scroll(1)
|
|
data_monitor.setCursorPos(1, select(2, data_monitor.getCursorPos()) - 1)
|
|
end
|
|
end
|
|
|
|
local function get_chest_data(chest)
|
|
local count = 0
|
|
local slots = 0
|
|
local calls = {}
|
|
local max_storage = 0
|
|
for i, item in pairs(chest.list()) do
|
|
table.insert(calls,function()
|
|
slots = slots + 1
|
|
count = count + item.count
|
|
max_storage = chest.getItemDetail(i).maxCount + max_storage
|
|
end)
|
|
end
|
|
parallel.waitForAll(table.unpack(calls))
|
|
return count, max_storage + (chest.size() - slots) * 64
|
|
end
|
|
|
|
local function make_progressbar(size, taken, max)
|
|
size = size - 2 -- make space for "[" and "]"
|
|
--[[
|
|
taken/max = x/size
|
|
taken * size = x * max
|
|
x = taken * size / max
|
|
]]
|
|
local progress = math.floor(size * taken / max)
|
|
local hash = ("#"):rep(progress)
|
|
local dots = ("."):rep(size - progress)
|
|
return ("[" .. hash .. dots .. "]")
|
|
end
|
|
|
|
local function write_progressbar(taken, max)
|
|
-- Progressbar
|
|
local percent = 100 - math.floor(100 * taken/max)
|
|
local taken_space = #tostring(percent) + #tostring(taken) + #tostring(max) + 11 -- " taken/free [PROGRESSBAR] percent% free "
|
|
local size = select(1, data_monitor.getSize()) - taken_space
|
|
|
|
data_monitor.write(" " .. tostring(taken) .. "/" .. tostring(max) .. " " .. make_progressbar(size, taken, max) .. " ".. percent .. "% free")
|
|
move_line()
|
|
end
|
|
|
|
local function write_chest_data(index, taken, max)
|
|
local start = " Chest " .. index .. (" "):rep(8 - #tostring(index) - #tostring(taken)) .. tostring(taken) .. "/" .. tostring(max) .. (" "):rep(5 - #tostring(max))
|
|
data_monitor.write(start .. make_progressbar(20, taken, max))
|
|
end
|
|
|
|
while true do
|
|
local max_storage = 0
|
|
local taken_storage = 0
|
|
local chests_list = {}
|
|
|
|
for i, chest in pairs(chests) do
|
|
local taken, max = get_chest_data(chest)
|
|
|
|
taken_storage = taken_storage + taken
|
|
max_storage = max_storage + max
|
|
|
|
table.insert(chests_list, {["taken"] = taken, ["max"] = max})
|
|
end
|
|
|
|
data_monitor.clear()
|
|
data_monitor.setCursorPos(1, 1)
|
|
write_progressbar(taken_storage, max_storage)
|
|
for i, chest in pairs(chests_list) do
|
|
write_chest_data(i, chest["taken"], chest["max"])
|
|
move_line()
|
|
end
|
|
|
|
sleep(sleep_time)
|
|
end |