Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local component = require("component")
- local term = require("term")
- local string = require("string")
- local meController = component.proxy(component.me_controller.address)
- local gpu = component.gpu
- -- Each element of the array is "item, "damage", "number wanted", "max craft size"
- -- Damage value should be zero for base items
- items = {
- { "minecraft:ender_pearl", 0, 256, 32 },
- { "minecraft:torch", 0, 100, 32 },
- { "thermalexpansion:frame", 0, 10, 2 },
- }
- loopDelay = 1 -- Seconds between runs
- maxCpuUsage = 1 -- How many CPUs the program can use
- twoColumnMode = true -- Show to columns on the screen
- -- Do not touch this variables
- currentCpuUsage = 0
- returnValues = {}
- displayTable = {}
- initDone = false
- --
- function initDisplayTable()
- for itemIndex = 1, #items do
- itemName = items[itemIndex][1]
- itemDamage = items[itemIndex][2]
- itemMinValue = items[itemIndex][3]
- itemMaxCraftValue = items[itemIndex][4]
- meItem = meController.getItemsInNetwork({ name = itemName, damage = itemDamage})
- itemLabel = meItem[1].label
- itemCurrentValue = meItem[1].size
- currentItem = { name = itemName, damage = itemDamage, minValue = itemMinValue, maxCraftValue = itemMaxCraftValue, label = itemLabel, currentValue = itemCurrentValue, currentCrafting = 0, error = false }
- table.insert(displayTable, currentItem)
- displayColumns()
- initDone = true
- end
- end
- function dump(o)
- if type(o) == 'table' then
- local s = '{ '
- for k,v in pairs(o) do
- if type(k) ~= 'number' then k = '"'..k..'"' end
- s = s .. '['..k..'] = ' .. dump(v) .. ','
- end
- return s .. '} '
- else
- return tostring(o)
- end
- end
- function displayColumns()
- term.clear()
- io.write("|-------------Name-------------|-Stock-|-Craft-|-----Fail-----|")
- if twoColumnMode then
- io.write(" |-------------Name-------------|-Stock-|-Craft-|-----Fail-----|")
- end
- io.write("\n")
- io.write("|-------------------------------------------------------------|")
- if twoColumnMode then
- io.write(" |-------------------------------------------------------------|")
- end
- leftColumnIndex = 1
- rightColumnIndex = 74
- k = 1
- lineNumber = 3
- for itemIndex = 1, #displayTable do
- maxLabelLength = 30
- label = displayTable[itemIndex].label
- labelLength = string.len(label)
- if labelLength > maxLabelLength then
- label = string.sub(displayTable[itemIndex].label, 1, maxLabelLenth -3)
- end
- labelLength = string.len(label)
- pos = leftColumnIndex
- if twoColumnMode and k % 2 == 0 then pos = rightColumnIndex end
- gpu.set(pos, lineNumber, "|")
- gpu.setForeground(0xFFC125)
- gpu.set(pos + 1, lineNumber, label)
- gpu.setForeground(0xFFFFFF)
- gpu.set(pos + 31, lineNumber, "| | | |")
- lineNumber = lineNumber + 1
- if twoColumnMode and k % 2 == 1 then
- lineNumber = lineNumber - 1
- end
- k = k + 1
- end
- end
- function displayTableValues()
- leftColumnIndex = 1
- rightColumnIndex = 74
- k = 1
- lineNumber = 3
- for itemIndex = 1, #displayTable do
- pos = leftColumnIndex
- if twoColumnMode and k % 2 == 0 then
- pos = rightColumnIndex
- end
- if displayTable[itemIndex].currentValue < displayTable[itemIndex].minValue then
- gpu.setForeground(0xFF0000)
- else
- gpu.setForeground(0x00FF00)
- end
- amountLength = string.len(dump(displayTable[itemIndex].currentValue))
- spaceLength = 7 - amountLength
- amountString = dump(displayTable[itemIndex].currentValue)
- for i = 1, spaceLength do
- amountString = " " .. amountString
- end
- gpu.set(pos + 32, lineNumber, amountString)
- if displayTable[itemIndex].currentCrafting > 0 then
- craftLength = string.len(dump(displayTable[itemIndex].currentCrafting))
- spaceLength = 7 - craftLength
- craftString = dump(displayTable[itemIndex].currentCrafting)
- for i = 1, spaceLength do
- craftString = " " .. craftString
- end
- gpu.setForeground(0x2F95D7)
- gpu.set(pos + 40, lineNumber, craftString)
- else
- gpu.setForeground(0xFFFFFF)
- gpu.set(pos + 40, lineNumber, " ")
- end
- if displayTable[itemIndex].error then
- gpu.setForeground(0xFF0000)
- gpu.set(pos + 48, lineNumber, "No ingredients")
- else
- gpu.setForeground(0xFFFFFF)
- gpu.set(pos + 48, lineNumber, " ")
- end
- lineNumber = lineNumber + 1
- if twoColumnMode and k % 2 == 1 then
- lineNumber = lineNumber - 1
- end
- k = k + 1
- end
- end
- while true do
- if not initDone then
- initDisplayTable()
- end
- -- term.clear()
- for itemIndex = 1, #displayTable do
- meItem = meController.getItemsInNetwork({ name = displayTable[itemIndex].name, damage = displayTable[itemIndex].damage})
- displayTable[itemIndex].currentValue = meItem[1].size
- for indexReturnValue = 1, #returnValues do
- pcall(
- function()
- if returnValues[indexReturnValue].isDone() or returnValues[indexReturnValue].isCanceled() then
- currentCpuUsage = currentCpuUsage - 1
- table.remove(returnValues, indexReturnValue)
- end
- end
- )
- end
- if displayTable[itemIndex].currentValue < displayTable[itemIndex].minValue and currentCpuUsage < maxCpuUsage then
- delta = displayTable[itemIndex].minValue - displayTable[itemIndex].currentValue
- craftAmount = delta
- if delta > displayTable[itemIndex].maxCraftValue then
- craftAmount = displayTable[itemIndex].maxCraftValue
- end
- craftables = meController.getCraftables({ name = displayTable[itemIndex].name, damage = displayTable[itemIndex].damage})
- if craftables.n >= 1 then
- craftItem = craftables[1]
- returnValue = craftItem.request(craftAmount)
- if returnValue.isCanceled() then
- displayTable[itemIndex].error = true
- else
- displayTable[itemIndex].error = false
- displayTable[itemIndex].currentCrafting = craftAmount
- table.insert(returnValues, returnValue)
- currentCpuUsage = currentCpuUsage + 1
- end
- end
- else
- displayTable[itemIndex].currentCrafting = 0
- displayTable[itemIndex].error = false
- end
- displayTableValues()
- end
- os.sleep(loopDelay)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement