1
0
mirror of https://github.com/LDDestroier/CC/ synced 2024-11-18 07:44:53 +00:00
ldd-CC/chestlist.lua
2019-05-20 03:13:25 -04:00

214 lines
6.9 KiB
Lua

--Initially started by MinerMan132
--Also made by LDDestroier I guess
--Config
--List your chest type
--(String)
local chestType = "minecraft:ironchest_diamond"
--Select what container you want for dispensing
--(String)
local dropperName = "minecraft:dropper_240"
local dropper = peripheral.wrap(dropperName)
--Determine how far from the bottom of the screen the list will cut off at
--(Number)
local listBottom = 4
--Choose what direction you want to dispense
--(String)
local dropdir = "east"
--Choose your input chest
--(String)
local input = "quark:quark_chest_1241"
--===============================================--
if chestType == nil then
error("Chest type is empty!")
end
if dropperName == nil then
error("Output not selected!")
end
if dropdir == nil then
error("Dropper direction not selected!")
end
if input == nil then
error("Input container not selected!")
end
--34 26
--==============================================--
local chests, chestNames = {}, {}
for k,v in pairs(peripheral.getNames()) do
if peripheral.getType(v) == chestType then
chests[#chests + 1] = peripheral.wrap(v)
chestNames[#chestNames + 1] = v
end
end
local input = peripheral.wrap(input)
local dropper = peripheral.wrap(dropperName)
local monitor = peripheral.find("monitor")
if monitor == nil then
error("Monitor not found!")
end
monitor.setTextScale(0.5)
local width, height = monitor.getSize()
print(width,height)
if (width <= 33) or (height <= 23) then
error("Monitor too small!")
end
local max = 0
for temp = 1, table.getn(chests) do
local max = chests[temp].size() + max
end
term.redirect(monitor)
term.clear()
--===============================================--
local getBiggestKey = function(tbl)
local output = 0
for k, v in pairs(tbl) do
output = math.max(output, k)
end
return output
end
local pos = 0
local maxScroll
local fulllist, fullchecklist = {}, {}
local itemData, itemCheckData = {}, {}
function display()
while true do
fulllist = {}
itemData = {}
--term.setCursorPos(7,height - 2)
--term.setTextColor(colors.orange)
--write("<"..pos.."> ")
-- temp: vertical scroll offset when going through chests
-- list: per-chest item list
-- maxScroll: self-explanatory
local temp, list = 0
for i = 1, table.getn(chests) do
list = chests[i].list()
fulllist[temp + 1] = "PARTITION " .. ("-"):rep(width)
fulllist[temp + 2] = "PARTITION " .. chestNames[i]
fulllist[temp + 3] = "PARTITION " .. ("-"):rep(width)
temp = temp + 3
for k,v in pairs(list) do
fulllist[temp + k] = v
itemData[temp + k] = {
chestName = chestNames[i],
item = v,
slot = k,
}
end
--error(getBiggestKey(list))
--error(textutils.serialize(list))
temp = temp + getBiggestKey(list)
fulllist[temp + 1] = "PARTITION "
temp = temp + 1
if i == table.getn(chests) then
fulllist[temp + 1] = "PARTITION " .. ("-"):rep(width)
temp = temp + 1
end
end
fulllist[temp + 1] = "PARTITION End of the line, bucko"
maxScroll = math.max(0, temp - height + (listBottom + 1))
fullchecklist = fulllist
itemCheckData = itemData
term.setCursorPos(7, height - 2)
term.setTextColor(colors.orange)
term.write("<" .. pos .. "/" .. maxScroll .. ">")
term.setCursorPos(1,2)
-- temp: line number on screen
-- temp2: current chest number
-- pos: scroll position
for temp = 1, height - listBottom do
--for temp2 = 1, getBiggestKey(fulllist) do
term.setCursorPos(1, temp)
term.clearLine()
if string.sub(tostring(fulllist[temp + pos] or ""), 1, 9) == "PARTITION" then
term.setTextColor(colors.gray)
term.write(fulllist[temp + pos]:sub(11))
else
if temp + pos <= getBiggestKey(fulllist) then
term.setTextColor(colors.yellow)
term.write("> ")
end
--if temp + pos <= getBiggestKey(fulllist[temp2]) then
--if fulllist[temp2][temp + pos] ~= nil then
if fulllist[temp + pos] ~= nil then
term.setTextColor(colors.cyan)
--write(fulllist[temp2][temp + pos].name)
write(fulllist[temp + pos].count .. " x ")
term.setTextColor(colors.green)
write(fulllist[temp + pos].name)
local xp = term.getCursorPos()
term.write((" "):rep(width - xp))
--print("")
else
term.write((" "):rep(width))
end
--end
--print("")
--end
end
end
end
end
function control()
while true do
local _, _2, xm, ym = os.pullEvent("monitor_touch")
if ym == height - 2 then
if xm == 2 then
--if pos ~= 0 then
pos = pos - 1
--end
elseif xm == 5 then
--if pos ~= max - (height - listBottom) then
pos = pos + 1
--end
end
elseif ym == height - 1 then
if xm == 2 then
--if pos >= 10 then
pos = pos - 10
--end
elseif xm == 5 then
--if pos >= max - (height - 17) then
pos = pos + 10
--end
end
elseif ym >= 1 and ym <= (height - listBottom) then
if fullchecklist[ym + pos] then
--error(fullchecklist[ym + pos].name)
if tostring(fullchecklist[ym + pos] or ""):sub(1,9) ~= "PARTITION" then
--error(tostring(itemCheckData[ym + pos]))
dropper.pullItems(itemCheckData[ym + pos].chestName, itemCheckData[ym + pos].slot, 1)
dropper.drop(1)
--error(fullchecklist[ym + pos].name)
end
end
end
pos = math.min(pos, maxScroll)
pos = math.max(pos, 0)
end
end
term.setCursorPos(2,height - 2)
term.setBackgroundColor(colors.green)
term.setTextColor(colors.white)
write("<")
term.setCursorPos(5,height - 2)
write(">")
term.setBackgroundColor(colors.blue)
term.setCursorPos(2,height - 1)
write("<")
term.setCursorPos(5,height - 1)
write(">")
term.setBackgroundColor(colors.black)
parallel.waitForAll(display,control)