Advertisement
switch72

Untitled

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