thegenghistkhan

OpenComputers Applied Energistics 2 Auto Stock

Sep 10th, 2023
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. local component = require("component")
  2. local fs = require("filesystem")
  3. local serialization = require("serialization")
  4. local meController = component.proxy(component.me_controller.address)
  5. local gpu = component.gpu
  6. gpu.setResolution(160,50)
  7. local gui = require("gui")
  8. local event = require("event")
  9.  
  10. gui.checkVersion(2,5)
  11.  
  12. local prgName = "Applied Energistics 2 Auto Stock"
  13. local version = "v1.3"
  14. local lines = {}
  15. local items = {}
  16. local craftTasks = {}
  17. local maxCpuUsage = 1
  18. local currentCpuUsage = 0
  19.  
  20. local function LoadConfig()
  21.     local file,err = io.open("config.cfg", "r")
  22.     if err == nil then
  23.         local data = file:read("*n")
  24.         maxCpuUsage = tonumber(data)
  25.         gui.setText(mainGui, CpuMaxUsage, maxCpuUsage .. "")
  26.         file:close()
  27.     end
  28. end
  29.  
  30. local function SaveConfig()
  31.     local file,err = io.open("config.cfg", "w")
  32.     file:write(maxCpuUsage)
  33.     file:close()
  34. end
  35.  
  36. local function LoadItems()
  37.     local file,err = io.open("items.cfg", "r")
  38.     if err == nil then
  39.         local data = file:read("*a")
  40.         file:close()
  41.  
  42.         local itemsToLoad = serialization.unserialize(data)
  43.         items = {}
  44.         for index = 1, #itemsToLoad do
  45.             items[index] = itemsToLoad[index]
  46.         end
  47.  
  48.         for index = 1, #items do
  49.             items[index]["Name"] = ""
  50.             items[index]["CurrentCraftAmount"] = 0
  51.             items[index]["CurrentValue"] = 0
  52.             items[index]["Message"] = ""
  53.         end
  54.     end
  55. end
  56.  
  57. local function SaveItems()
  58.     local file,err = io.open("items.cfg", "w")
  59.     local itemsToSave = {}
  60.     for index = 1, #items do
  61.         itemsToSave[index] = {}
  62.         itemsToSave[index]["rawItemName"] = items[index]["rawItemName"]
  63.         itemsToSave[index]["rawItemDamage"] = items[index]["rawItemDamage"]
  64.         itemsToSave[index]["Setpoint"] = items[index]["Setpoint"]
  65.         itemsToSave[index]["CraftAmount"] = items[index]["CraftAmount"]
  66.     end
  67.     file:write(serialization.serialize(itemsToSave))
  68.     file:close()
  69.  
  70.     LoadItems()
  71. end
  72.  
  73. mainGui = gui.newGui(1, 2, 159, 48, true)
  74.  
  75. local function DrawHeaders()
  76.     Header_Name = gui.newLabel(mainGui, 4, 2, "Name", 0xc0c0c0, 0x0, 30)
  77.     Header_Current = gui.newLabel(mainGui, 35, 2, "Current (Setpoint)", 0xc0c0c0, 0x0, 18)
  78.     Header_Crafting = gui.newLabel(mainGui, 54, 2, "Crafting", 0xc0c0c0, 0x0, 8)
  79.     Header_Message = gui.newLabel(mainGui, 63, 2, "Message", 0xc0c0c0, 0x0, 15)
  80.     Header_Line = gui.newHLine(mainGui, 1, 3, 76)
  81.     Header2_Name = gui.newLabel(mainGui, 84, 2, "Name", 0xc0c0c0, 0x0, 30)
  82.     Header2_Current = gui.newLabel(mainGui, 115, 2, "Current (Setpoint)", 0xc0c0c0, 0x0, 18)
  83.     Header2_Crafting = gui.newLabel(mainGui, 134, 2, "Crafting", 0xc0c0c0, 0x0, 8)
  84.     Header2_Message = gui.newLabel(mainGui, 143, 2, "Message", 0xc0c0c0, 0x0, 15)
  85.     Header2_Line = gui.newHLine(mainGui, 81, 3, 76)
  86. end
  87.  
  88. local function DrawLines()
  89.     local rowCount = 1
  90.     for index = 1, 86 do
  91.         if index % 2 == 1 then
  92.             lines[index] = {}
  93.             lines[index]["Radio"] = gui.newRadio(mainGui, 1, 3 + rowCount)
  94.             lines[index]["Name"] = gui.newLabel(mainGui, 4, 3 + rowCount, "", 0xc0c0c0, 0x0, 30)
  95.             lines[index]["Current"] = gui.newLabel(mainGui, 35, 3 + rowCount, "", 0xc0c0c0, 0x0, 18)
  96.             lines[index]["Crafting"] = gui.newLabel(mainGui, 54, 3 + rowCount, "", 0xc0c0c0, 0x0, 8)
  97.             lines[index]["Message"] = gui.newLabel(mainGui, 63, 3 + rowCount, "", 0xc0c0c0, 0x0, 15)
  98.         else
  99.             lines[index] = {}
  100.             lines[index]["Radio"] = gui.newRadio(mainGui, 81, 3 + rowCount)
  101.             lines[index]["Name"] = gui.newLabel(mainGui, 84, 3 + rowCount, "", 0xc0c0c0, 0x0, 30)
  102.             lines[index]["Current"] = gui.newLabel(mainGui, 115, 3 + rowCount, "", 0xc0c0c0, 0x0, 18)
  103.             lines[index]["Crafting"] = gui.newLabel(mainGui, 134, 3 + rowCount, "", 0xc0c0c0, 0x0, 8)
  104.             lines[index]["Message"] = gui.newLabel(mainGui, 143, 3 + rowCount, "", 0xc0c0c0, 0x0, 15)
  105.             rowCount = rowCount + 1
  106.         end
  107.     end
  108.  
  109.     for index = 1, 86 do
  110.         gui.setVisible(mainGui, lines[index]["Radio"], false, true)
  111.     end
  112. end
  113.  
  114. local function EmptyLines()
  115.     for index = 1, 86 do
  116.         gui.setVisible(mainGui, lines[index]["Radio"], false, true)
  117.         gui.setText(mainGui, lines[index]["Name"], "")
  118.         gui.setText(mainGui, lines[index]["Current"], "")
  119.         gui.setText(mainGui, lines[index]["Crafting"], "")
  120.         gui.setText(mainGui, lines[index]["Message"], "")
  121.     end
  122. end
  123.  
  124. local function FillLines()
  125.     for index = 1, #items do
  126.         gui.setVisible(mainGui, lines[index]["Radio"], true, true)
  127.         gui.setEnable(mainGui, lines[index]["Radio"], true, true)
  128.         gui.setText(mainGui, lines[index]["Name"], items[index]["Name"])
  129.         gui.setText(mainGui, lines[index]["Current"], items[index]["CurrentValue"] .. " (" .. items[index]["Setpoint"] .. ")")
  130.         if items[index]["CurrentCraftAmount"] > 0 then
  131.             gui.setText(mainGui, lines[index]["Crafting"], items[index]["CurrentCraftAmount"] .. "")
  132.         else
  133.             gui.setText(mainGui, lines[index]["Crafting"], "")
  134.         end
  135.         gui.setText(mainGui, lines[index]["Message"], items[index]["Message"])
  136.     end
  137. end
  138.  
  139. local addGui_Open
  140. local changeGui_Open
  141. local addItem = {}
  142. local changeItemIndex
  143.  
  144. local function Item_Name_Callback(guiID, textID, text)
  145.    addItem["Name"] = text
  146. end
  147.  
  148. local function Setpoint_Callback(guiID, textID, text)
  149.    addItem["Setpoint"] = tonumber(text)
  150. end
  151.  
  152. local function ItemDamage_Callback(guiID, textID, text)
  153.    addItem["Damage"] = tonumber(text)
  154. end
  155.  
  156. local function CraftAmount_Callback(guiID, textID, text)
  157.    addItem["CraftAmount"] = tonumber(text)
  158. end
  159.  
  160. local function addButtonCallback(guiID, id)
  161.     index = #items + 1
  162.     if index <= 86 then
  163.         items[index] = {}
  164.         items[index]["rawItemName"] = addItem["Name"]
  165.         items[index]["rawItemDamage"] = addItem["Damage"]
  166.         items[index]["Setpoint"] = addItem["Setpoint"]
  167.         items[index]["CraftAmount"] = addItem["CraftAmount"]
  168.  
  169.         SaveItems()
  170.  
  171.         addGui_Open = false
  172.     else
  173.         addGui_Open = false
  174.         gui.showMsg("Maximum number of items reached (86 items).")
  175.     end
  176. end
  177.  
  178. local function changeButtonCallback(guiID, id)
  179.     index = changeItemIndex
  180.     items[index] = {}
  181.     items[index]["rawItemName"] = addItem["Name"]
  182.     items[index]["rawItemDamage"] = addItem["Damage"]
  183.     items[index]["Setpoint"] = addItem["Setpoint"]
  184.     items[index]["CraftAmount"] = addItem["CraftAmount"]
  185.  
  186.     SaveItems()
  187.  
  188.     changeGui_Open = false
  189. end
  190.  
  191. local function exitButtonCallback(guiID, id)
  192.     addGui_Open = false
  193.     changeGui_Open = false
  194. end
  195.  
  196. local function AddItem_Callback(guiID, buttonID)
  197.     local addGui = gui.newGui("center", "center", 62, 10, true, "Add Item")
  198.     Item_Name_Label = gui.newLabel(addGui, 1, 1, "   Item Name: ", 0xc0c0c0, 0x0, 7)
  199.     Item_Name = gui.newText(addGui, 15, 1, 30, "", Item_Name_Callback, 30, false)
  200.     Item_Damage_Label = gui.newLabel(addGui, 1, 3, " Item Damage: ", 0xc0c0c0, 0x0, 7)
  201.     Item_Damage = gui.newText(addGui, 15, 3, 8, "", ItemDamage_Callback, 8, false)
  202.     Item_Damage_Help = gui.newLabel(addGui, 24, 3, "(Metadata number of item)", 0xc0c0c0, 0x0, 7)
  203.     Setpoint_Label = gui.newLabel(addGui, 1, 5, "    Setpoint: ", 0xc0c0c0, 0x0, 7)
  204.     Setpoint = gui.newText(addGui, 15, 5, 8, "", Setpoint_Callback, 8, false)
  205.     Setpoint_Help = gui.newLabel(addGui, 24, 5, "(How many items to keep in stock)", 0xc0c0c0, 0x0, 7) 
  206.     CraftAmount_Label = gui.newLabel(addGui, 1, 7, "Craft Amount: ", 0xc0c0c0, 0x0, 7)
  207.     CraftAmount = gui.newText(addGui, 15, 7, 8, "", CraftAmount_Callback, 8, false)
  208.     CraftAmount_Help = gui.newLabel(addGui, 24, 7, "(How many items to craft max at once)", 0xc0c0c0, 0x0, 7)
  209.     addButton = gui.newButton(addGui, 41, 9, "Add Item", addButtonCallback)
  210.     exitButton = gui.newButton(addGui, 52, 9, "Cancel", exitButtonCallback)
  211.  
  212.     addGui_Open = true
  213.     addItem = {}
  214.  
  215.     gui.displayGui(addGui)
  216.     while addGui_Open do
  217.         gui.runGui(addGui)
  218.     end
  219.     gui.closeGui(addGui)
  220. end
  221.  
  222. local function RemoveItem_Callback(guiID, buttonID)
  223.    local radioIndex = gui.getRadio(guiID)
  224.    local removeIndex
  225.  
  226.    for index = 1, #lines do
  227.         if lines[index]["Radio"] == radioIndex then
  228.             removeIndex = index
  229.         end
  230.    end
  231.    
  232.    table.remove(items, removeIndex)
  233.    SaveItems()
  234.    EmptyLines()
  235. end
  236.  
  237. local function ChangeItem_Callback(guiID, buttonID)
  238.     local radioIndex = gui.getRadio(guiID)
  239.     if radioIndex > 0 then
  240.         for index = 1, #lines do
  241.             if lines[index]["Radio"] == radioIndex then
  242.                 changeItemIndex = index
  243.             end
  244.         end
  245.  
  246.         local changeGui = gui.newGui("center", "center", 62, 10, true, "Change Item")
  247.         Item_Name_Label = gui.newLabel(changeGui, 1, 1, "   Item Name: ", 0xc0c0c0, 0x0, 7)
  248.         Item_Name = gui.newText(changeGui, 15, 1, 30, items[changeItemIndex]["rawItemName"], Item_Name_Callback, 30, false)
  249.         Item_Damage_Label = gui.newLabel(changeGui, 1, 3, " Item Damage: ", 0xc0c0c0, 0x0, 7)
  250.         Item_Damage = gui.newText(changeGui, 15, 3, 8, items[changeItemIndex]["rawItemDamage"], ItemDamage_Callback, 8, false)
  251.         Item_Damage_Help = gui.newLabel(changeGui, 24, 3, "(Metadata number of item)", 0xc0c0c0, 0x0, 7)
  252.         Setpoint_Label = gui.newLabel(changeGui, 1, 5, "    Setpoint: ", 0xc0c0c0, 0x0, 7)
  253.         Setpoint = gui.newText(changeGui, 15, 5, 8, items[changeItemIndex]["Setpoint"], Setpoint_Callback, 8, false)
  254.         Setpoint_Help = gui.newLabel(changeGui, 24, 5, "(How many items to keep in stock)", 0xc0c0c0, 0x0, 7)  
  255.         CraftAmount_Label = gui.newLabel(changeGui, 1, 7, "Craft Amount: ", 0xc0c0c0, 0x0, 7)
  256.         CraftAmount = gui.newText(changeGui, 15, 7, 8, items[changeItemIndex]["CraftAmount"], CraftAmount_Callback, 8, false)
  257.         CraftAmount_Help = gui.newLabel(changeGui, 24, 7, "(How many items to craft max at once)", 0xc0c0c0, 0x0, 7)
  258.         changeButton = gui.newButton(changeGui, 38, 9, "Change Item", changeButtonCallback)
  259.         exitButton = gui.newButton(changeGui, 52, 9, "Cancel", exitButtonCallback)
  260.  
  261.         changeGui_Open = true
  262.         addItem = {}
  263.         addItem["Name"] = items[changeItemIndex]["rawItemName"]
  264.         addItem["Damage"] = items[changeItemIndex]["rawItemDamage"]
  265.         addItem["Setpoint"] = items[changeItemIndex]["Setpoint"]
  266.         addItem["CraftAmount"] = items[changeItemIndex]["CraftAmount"]
  267.  
  268.         gui.displayGui(changeGui)
  269.         while changeGui_Open do
  270.             gui.runGui(changeGui)
  271.         end
  272.         gui.closeGui(changeGui)
  273.     end
  274. end
  275.  
  276. local function CpuMaxUsage_Callback(guiID, textID, text)
  277.     maxCpuUsage = tonumber(text)
  278.     SaveConfig()
  279. end
  280.  
  281. local function DrawButtons()
  282.     AddButton = gui.newButton(mainGui, 1, 1, "Add Item", AddItem_Callback)
  283.     RemoveButton = gui.newButton(mainGui, 12, 1, "Remove Item", RemoveItem_Callback)
  284.     ChangeButton = gui.newButton(mainGui, 26, 1, "Change Item", ChangeItem_Callback)
  285.     CpuUsageLabel = gui.newLabel(mainGui, 118, 1, "CPU usage: ", 0xc0c0c0, 0x0, 13)
  286.     CpuMaxUsageLabel = gui.newLabel(mainGui, 134, 1, "Max CPU usage: ", 0xc0c0c0, 0x0, 15)
  287.     CpuMaxUsage = gui.newText(mainGui, 149, 1, 4, maxCpuUsage .. "", CpuMaxUsage_Callback, 4, false)
  288. end
  289.  
  290. function CheckItemsAndCraft()
  291.     for index = 1, #items do
  292.         items[index]["Message"] = ""
  293.         items[index]["CurrentValue"] = 0
  294.         items[index]["Name"] = ""
  295.        
  296.         local meItem = meController.getItemsInNetwork({ name = items[index]["rawItemName"], damage = items[index]["rawItemDamage"]})
  297.         if meItem.n >= 1 then
  298.             if not meItem[1].isCraftable then
  299.                 items[index]["Message"] = "Not Craftable"
  300.             end
  301.  
  302.             items[index]["CurrentValue"] = meItem[1].size
  303.             items[index]["Name"] = meItem[1].label
  304.  
  305.             indexCraftTask = 1
  306.             for indexCraftTasks = 1, #craftTasks do
  307.                 if craftTasks[indexCraftTasks].Id == index then indexCraftTask = indexCraftTasks end
  308.             end
  309.  
  310.             if craftTasks[indexCraftTask].task ~= nil and indexCraftTask > 1 then
  311.                 if craftTasks[indexCraftTask].task.isDone() or craftTasks[indexCraftTask].task.isCanceled() then
  312.                     currentCpuUsage = currentCpuUsage - 1
  313.                     items[index]["CurrentCraftAmount"] = 0
  314.                     table.remove(craftTasks, indexCraftTask)
  315.                 end
  316.             else
  317.                 if items[index]["CurrentCraftAmount"] == 0 and items[index]["CurrentValue"] < items[index]["Setpoint"] then
  318.                     if currentCpuUsage < maxCpuUsage then
  319.                         local meCpus = meController.getCpus()
  320.                         local occupiedCpus = 0
  321.                         for cpuIndex = 1, #meCpus do
  322.                             if meCpus[cpuIndex].busy then occupiedCpus = occupiedCpus + 1 end
  323.                         end
  324.                    
  325.                         if occupiedCpus < #meCpus then
  326.                             local currentCraftAmount = items[index]["Setpoint"] - items[index]["CurrentValue"]
  327.                             if currentCraftAmount > items[index]["CraftAmount"] then
  328.                                 currentCraftAmount = items[index]["CraftAmount"]
  329.                             end
  330.  
  331.                             local craftables = meController.getCraftables({ name = items[index]["rawItemName"], damage = items[index]["rawItemDamage"]})
  332.                             if craftables.n >= 1 then
  333.                                 craftTask = craftables[1].request(currentCraftAmount)
  334.  
  335.                                 if craftTask.isCanceled() then
  336.                                     items[index]["Message"] = "No ingredients"
  337.                                 else
  338.                                     items[index]["CurrentCraftAmount"] = currentCraftAmount
  339.                                     craftTaskWithId = { Id = index, task = craftTask }
  340.                                     newIndex = #craftTasks + 1
  341.                                     craftTasks[newIndex] = craftTaskWithId
  342.                                     currentCpuUsage = currentCpuUsage + 1
  343.                                 end
  344.                             end
  345.                         else
  346.                             items[index]["Message"] = "All CPUs busy"
  347.                         end
  348.                     else
  349.                         items[index]["Message"] = "All CPUs busy"
  350.                     end
  351.                 end
  352.             end
  353.         end
  354.     end
  355.  
  356.     gui.setText(mainGui, CpuUsageLabel, "CPU Usage: " .. currentCpuUsage)
  357. end
  358.  
  359. DrawHeaders()
  360. DrawLines()
  361. DrawButtons()
  362. LoadConfig()
  363. LoadItems()
  364.  
  365. gui.clearScreen()
  366. gui.setTop("Applied Energistics 2 Auto Stock")
  367. gui.setBottom("")
  368.  
  369. -- Create Empty craftTask
  370. craftTasks[1] = { Id = 0, task = "" }
  371.  
  372. -- Main loop
  373. while true do
  374.    gui.runGui(mainGui)
  375.    CheckItemsAndCraft()
  376.    FillLines()
  377. end
Add Comment
Please, Sign In to add comment