SHOW:
|
|
- or go back to the newest paste.
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() |
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 |