Savage_Me55iah

CC_AutoCrafter

Jul 19th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 30.37 KB | None | 0 0
  1. --Script by Savage_Me55iah of CraftAU.com.au and Nuqube.co--
  2. local scriptName, version, pastebinCode = "CC_AutoCrafter", "v1.0", "gECkmMyg"
  3.  
  4. --Other Savage_Me55iah scripts @ http://pastebin.com/u/Savage_Me55iah
  5.  
  6. --INSTRUCTIONS ON USE--
  7. --Instruction video on http://youtube.com/savagemessiah5
  8.  
  9. --Contact Savage_Me55iah @ CraftAU.com.au or Nuqube.co or http://www.computercraft.info/forums2/ with suggestions/fixes/bugs
  10.  
  11. -- CHANGELOG --
  12. --V1.0
  13.  
  14. -- SETUP --
  15.  
  16. local tArgs = {...}
  17.  
  18. local functionNum = "0"
  19.  
  20. do
  21.     update = function(param_functionNum, scriptDetails)
  22.         term.clear()
  23.         print("UPDATING") shell.run("pastebin get "..scriptDetails[2].." update")
  24.         if fs.exists("update") then
  25.             fs.delete(scriptDetails[1]) fs.copy("update", scriptDetails[1]) fs.delete("update") print("UPDATE SUCCESS")
  26.         else
  27.             print("UPDATE FAILED")
  28.         end
  29.         sleep(2) os.reboot()
  30.     end
  31. end
  32.  
  33. if tArgs[1] == "update" then update(functionNum, {scriptName, pastebinCode}) end
  34.  
  35. shell.run("sm_API".."\\".."loadAPIs")
  36.    
  37. role = {"craft", "stock"}
  38. termX, termY = term.getSize()
  39.  
  40. settings = tablemanip.import("autocrafterSettings")[2] or {
  41.     timer = 0.5,
  42.     inputSides = {false, false, false, false, true, false},
  43.     observe = 3,
  44.     output = 3,
  45.     emptyChest = 6,
  46.     extInput = 1,
  47.     extOutput = 2,
  48.     craftingLoc = {1, 2, 3, 5, 6, 7, 9, 10, 11},
  49.     craftingResults = {4, 8, 12},
  50.     redstoneOutput = 6,
  51.     redstoneInput = 6,
  52.     operation = false,
  53.     role = 1
  54. }
  55.  
  56. facingNum = 1
  57. generalinfo.chestDirTranslator(functionNum)
  58. generalInfo = generalinfo.generalInfo
  59. redstone.setOutput(generalInfo["sides"]["turtle"][settings["redstoneOutput"]], false)
  60.  
  61.  
  62.  
  63. function dirFacing(param_functionNum, param_function)
  64.     local result, functionNum = {true}, param_functionNum.."/007"
  65.     if booleanmanip.check(functionNum, param_function)[2] == ">" or booleanmanip.check(functionNum, param_function)[2] == "<" then
  66.         if param_function == ">" then facingNum = booleanmanip.quickChoice(functionNum, ((facingNum + 1) > 4), 1, facingNum + 1)[2] end
  67.         if param_function == "<" then facingNum = booleanmanip.quickChoice(functionNum, ((facingNum - 1) < 1), 4, facingNum - 1)[2] end
  68.     end
  69.     facing = generalInfo["cardinalDirections"][facingNum]
  70.     generalinfo.chestDirTranslator(functionNum)
  71.     if booleanmanip.check(functionNum, buttonList["terminal"]["facing"])[1] then
  72.         local text = facing
  73.         if text == "east" or text == "west" then text = text.." " end
  74.         buttonList["terminal"]["facing"]["text"] = text
  75.         buttonmanip.generate(functionNum, "terminal", "facing")
  76.     end
  77.     return result
  78. end
  79.  
  80. craftingData = tablemanip.import("craftingData")[2] or {}
  81.  
  82. function wrapper(param)
  83.     local result = false
  84.     result = peripheral.wrap(param) or false
  85.     return result
  86. end
  87.  
  88. function checkEmptyChest(param_functionNum)
  89.     local result, functionNum = {false}, param_functionNum.."/007"
  90.     local lock, tempChest = true, nil
  91.     while lock do
  92.         term.clear() term.setCursorPos(1,1)
  93.         print("Needs empty chest @ "..generalInfo["sides"]["turtle"][settings["emptyChest"]].." to work")
  94.         print("Scanning for empty chest @ "..generalInfo["sides"]["turtle"][settings["emptyChest"]])
  95.         tempChest = wrapper(generalInfo["sides"]["turtle"][settings["emptyChest"]])
  96.         if tempChest ~= false then
  97.             result = tempChest.condenseItems() or false
  98.             result = tempChest.getAllStacks() or false
  99.             if result ~= false then
  100.                 if not booleanmanip.check(functionNum, result[1])[1] then
  101.                     print("Success: Empty Chest found")
  102.                     lock = false
  103.                 else
  104.                     print("Error: Chest isn't empty")
  105.                 end
  106.                 print("Error: That is not a valid Inventory")
  107.             end
  108.         else
  109.             print("Error: Peripheral not found")
  110.         end
  111.         os.startTimer(1)
  112.         coroutine.yield()
  113.     end
  114.     return result
  115. end
  116.  
  117. function addItem(param_functionNum, param_data)
  118.     local result, functionNum = {true}, param_functionNum.."/007"
  119.     while setting["operation"] == true do
  120.         coroutine.yield()
  121.     end
  122.     setting["operation"] = true
  123.     checkEmptyChest(functionNum)
  124.     local tempPeripheral, listA, listB, paramMin, paramMax, tempData, num, hold = wrapper(generalInfo["sides"]["turtle"][settings["emptyChest"]]), nil, {}, nil, nil, craftingData, 0, nil
  125.     local lock = true
  126.     while lock do
  127.         term.clear() term.setCursorPos(1,1)
  128.         print("Place observing item in first slot of turtle and hit enter")
  129.         read()
  130.         if turtle.getItemCount(1) >= 1 then lock = false end
  131.     end
  132.     tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], 1, 1, 1)
  133.     listA = tempPeripheral.getAllStacks()
  134.     hold = listA[1]["id"]..":"..listA[1]["rawName"]
  135.     tempData[hold] = {["min"] = false, ["max"] = false, ["craftMin"] = {["recipe"] = false, ["materials"] = false, ["results"] = false}, ["craftMax"] = {["recipe"] = false, ["materials"] = false, ["results"] = false}}
  136.     tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], 1, 1, 1)
  137.    
  138. -- Minium Crafting Data
  139.     term.clear() term.setCursorPos(1,1)
  140.     print("Minium Crafting:")
  141.     print("Type minium quantity to keep stocked or leave blank skip and hit enter")
  142.     tempData[hold]["min"] = tonumber(read()) or false
  143.     if tempData[hold]["min"] ~= false then
  144.         term.clear() term.setCursorPos(1,1)
  145.         print("Minium Crafting:")
  146.         print("Allow multiple crafting? <Y/N>")
  147.         tempData[hold]["craftMin"]["multiple"] = booleanmanip.quickChoice(functionNum, (read():lower() == "y"))[2]
  148.         term.clear() term.setCursorPos(1,1)
  149.         print("Minium Crafting:")
  150.         print("External/Machine craft? <Y/N>")
  151.         tempData[hold]["craftMin"]["external"] = booleanmanip.quickChoice(functionNum, (read():lower() == "y"))[2]
  152.         lock = true
  153.         while lock do
  154.             term.clear() term.setCursorPos(1,1)
  155.             print("Minium Crafting:")
  156.             print("Remove previous setup items")
  157.             print("Place minium craft recipe in top-left 3x3 format")
  158.             print("Place craft results in turtle slots 4, 8 and 12 (correct quantities)")
  159.             print("Hit enter")
  160.             read()
  161.             num = 0
  162.             if turtle.getItemCount(settings["craftingResults"][1]) >= 1 then
  163.                 for a,b in pairs(settings["craftingLoc"]) do num = num + turtle.getItemCount(b) end
  164.             end
  165.             if num >= 1 then lock = false end
  166.         end
  167.         for a,b in pairs(settings["craftingLoc"]) do tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], b, 64, a) end
  168.         listA = tempPeripheral.getAllStacks()
  169.         tempData[hold]["craftMin"]["materials"], tempData[hold]["craftMin"]["recipe"] = {}, {}
  170.         for a,b in pairs(listA) do
  171.             tempData[hold]["craftMin"]["materials"][listA[a]["id"]..":"..listA[a]["rawName"]] = (tempData[hold]["craftMin"]["materials"][listA[a]["id"]..":"..listA[a]["rawName"]] or 0) + listA[a]["qty"]
  172.             tempData[hold]["craftMin"]["recipe"][a] = {["id"] = listA[a]["id"]..":"..listA[a]["rawName"], ["qty"] = listA[a]["qty"]}
  173.         end
  174.         for a,b in pairs(settings["craftingLoc"]) do tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], a, 64, b) end
  175.  
  176.         for a,b in pairs(settings["craftingResults"]) do tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], b, 64, a) end
  177.         listA = tempPeripheral.getAllStacks()
  178.         tempData[hold]["craftMin"]["results"] = {}
  179.         for a,b in pairs(listA) do
  180.             tempData[hold]["craftMin"]["results"][a] = {["id"] = listA[a]["id"]..":"..listA[a]["rawName"], ["qty"] = listA[a]["qty"]}
  181.         end
  182.         for a,b in pairs(settings["craftingResults"]) do tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], a, 64, b) end
  183.     end
  184.    
  185. -- Maxium Crafting Data
  186.     term.clear() term.setCursorPos(1,1)
  187.     print("Maxium Crafting:")
  188.     print("Type Maxium quantity to keep stocked or leave blank skip and hit enter")
  189.     tempData[hold]["min"] = tonumber(read()) or false
  190.     if tempData[hold]["min"] ~= false then
  191.         term.clear() term.setCursorPos(1,1)
  192.         print("Maxium Crafting:")
  193.         print("Allow multiple crafting? <Y/N>")
  194.         tempData[hold]["craftMax"]["multiple"] = booleanmanip.quickChoice(functionNum, (read():lower() == "y"))[2]
  195.         term.clear() term.setCursorPos(1,1)
  196.         print("Maxium Crafting:")
  197.         print("External/Machine craft? <Y/N>")
  198.         tempData[hold]["craftMax"]["external"] = booleanmanip.quickChoice(functionNum, (read():lower() == "y"))[2]
  199.         lock = true
  200.         while lock do
  201.             term.clear() term.setCursorPos(1,1)
  202.             print("Maxium Crafting:")
  203.             print("Remove previous setup items")
  204.             print("Place Maxium craft recipe in top-left 3x3 format")
  205.             print("Place craft results in turtle slots 4, 8 and 12 (correct quantities)")
  206.             print("Hit enter")
  207.             read()
  208.             num = 0
  209.             if turtle.getItemCount(settings["craftingResults"][1]) >= 1 then
  210.                 for a,b in pairs(settings["craftingLoc"]) do num = num + turtle.getItemCount(b) end
  211.             end
  212.             if num >= 1 then lock = false end
  213.         end
  214.         for a,b in pairs(settings["craftingLoc"]) do tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], b, 64, a) end
  215.         listA = tempPeripheral.getAllStacks()
  216.         tempData[hold]["craftMax"]["materials"], tempData[hold]["craftMax"]["recipe"] = {}, {}
  217.         for a,b in pairs(listA) do
  218.             tempData[hold]["craftMax"]["materials"][listA[a]["id"]..":"..listA[a]["rawName"]] = (tempData[hold]["craftMax"]["materials"][listA[a]["id"]..":"..listA[a]["rawName"]] or 0) + listA[a]["qty"]
  219.             tempData[hold]["craftMax"]["recipe"][a] = {["id"] = listA[a]["id"]..":"..listA[a]["rawName"], ["qty"] = listA[a]["qty"]}
  220.         end
  221.         for a,b in pairs(settings["craftingLoc"]) do tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], a, 64, b) end
  222.  
  223.         for a,b in pairs(settings["craftingResults"]) do tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], b, 64, a) end
  224.         listA = tempPeripheral.getAllStacks()
  225.         tempData[hold]["craftMax"]["results"] = {}
  226.         for a,b in pairs(listA) do
  227.             tempData[hold]["craftMax"]["results"][a] = {["id"] = listA[a]["id"]..":"..listA[a]["rawName"], ["qty"] = listA[a]["qty"]}
  228.         end
  229.         for a,b in pairs(settings["craftingResults"]) do tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["emptyChest"]]]], a, 64, b) end
  230.     end
  231.     craftingData = tempData
  232.     tablemanip.export("craftingData", craftingData)
  233. end
  234.  
  235.  
  236. function delItem(param_functionNum, param_data)
  237.     local result, functionNum = {true}, param_functionNum.."/007"
  238.    
  239.  
  240. end
  241.  
  242. inputSides, settingsSides, roleChange = nil, nil, nil
  243.  
  244. function blankFunction(param_functionNum, ...) local result, functionNum = {true}, param_functionNum.."/007" return result end
  245.  
  246. function inputSidesPlacemarker(...) if tostring(inputSides) ~= "nil" then result = inputSides(...) end return result end
  247. inputSidesNum = nil
  248.  
  249. function inputSides(param_functionNum, param_args)
  250.     local result, functionNum = {true}, param_functionNum.."/007"
  251.     if param_args == "<" then
  252.         inputSidesNum = booleanmanip.quickChoice(functionNum, ((inputSidesNum - 1) < 1), table.maxn(generalInfo["sides"]["turtle"]), (inputSidesNum - 1))[2]
  253.         local colorbkg = booleanmanip.quickChoice(functionNum, booleanmanip.check(functionNum, settings["inputSides"][inputSidesNum])[2], "green", "red")[2]
  254.         buttonmanip.add(functionNum, "terminal", "inputSides", generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][inputSidesNum]), "white", colorbkg, termX - 8, termY - 7, inputSidesPlacemarker, "select")
  255.     elseif param_args == ">" then
  256.         inputSidesNum = booleanmanip.quickChoice(functionNum, ((inputSidesNum + 1) > table.maxn(generalInfo["sides"]["turtle"])), 1, (inputSidesNum + 1))[2]
  257.         local colorbkg = booleanmanip.quickChoice(functionNum, booleanmanip.check(functionNum, settings["inputSides"][inputSidesNum])[2], "green", "red")[2]
  258.         buttonmanip.add(functionNum, "terminal", "inputSides", generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][inputSidesNum]), "white", colorbkg, termX - 8, termY - 7, inputSidesPlacemarker, "select")
  259.     elseif param_args == "select" then
  260.         settings[inputSides][inputSidesNum] = booleanmanip.quickChoice(functionNum, booleanmanip.check(functionNum, settings["inputSides"][inputSidesNum])[2], false, true)[2]
  261.         local colorbkg = booleanmanip.quickChoice(functionNum, booleanmanip.check(functionNum, settings["inputSides"][inputSidesNum])[2], "green", "red")[2]
  262.         buttonmanip.add(functionNum, "terminal", "inputSides", generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][inputSidesNum]), "white", colorbkg, termX - 8, termY - 7, inputSidesPlacemarker, "select")
  263.         tablemanip.export("autocrafterSettings", settings)
  264.     elseif param_args == "start" then
  265.         inputSidesNum = 1
  266.         local colorbkg = booleanmanip.quickChoice(functionNum, booleanmanip.check(functionNum, settings["inputSides"][inputSidesNum])[2], "green", "red")[2]
  267.         buttonmanip.add(functionNum, "terminal", "inputSidesLabel", "Inputs:", "white", "blue", termX - 17, termY - 7, blankFunction, "boop")
  268.         buttonmanip.add(functionNum, "terminal", "inputSides<", "< ", "white", "blue", termX - 10, termY - 7, inputSidesPlacemarker, "<")
  269.         buttonmanip.add(functionNum, "terminal", "inputSides", generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][inputSidesNum]), "white", colorbkg, termX - 8, termY - 7, inputSidesPlacemarker, "select")
  270.         buttonmanip.add(functionNum, "terminal", "inputSides>", " >", "white", "blue", termX - 2, termY - 7, inputSidesPlacemarker, ">")
  271.     else
  272.     end
  273.     return result
  274. end
  275.  
  276. function settingsSidesPlacemarker(...) if tostring(settingsSides) ~= "nil" then result = settingsSides(...) end return result end
  277. settingsSidesList = {}
  278.  
  279. function settingsSides(param_functionNum, param_args)
  280.     local result, functionNum = {true}, param_functionNum.."/007"
  281.     if param_args[2] == "<" then
  282.         settingsSidesList[param_args[1]] = booleanmanip.quickChoice(functionNum, ((settingsSidesList[param_args[1]] - 1) < 1), table.maxn(generalInfo["sides"]["turtle"]), (settingsSidesList[param_args[1]] - 1))[2]
  283.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings[param_args[1]] == settingsSidesList[param_args[1]]), "green", "red")[2]
  284.         buttonmanip.add(functionNum, "terminal", param_args[1], generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][settings[param_args[1]]]), "white", colorbkg, termX - 8, buttonList["terminal"][param_args[1]]["y"], settingsSidesPlacemarker, "select")
  285.     elseif param_args[2] == ">" then
  286.         settingsSidesList[param_args[1]] = booleanmanip.quickChoice(functionNum, ((settingsSidesList[param_args[1]] + 1) > table.maxn(generalInfo["sides"]["turtle"])), 1, (settingsSidesList[param_args[1]] + 1))[2]
  287.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings[param_args[1]] == settingsSidesList[param_args[1]]), "green", "red")[2]
  288.         buttonmanip.add(functionNum, "terminal", param_args[1], generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][settings[param_args[1]]]), "white", colorbkg, termX - 8, buttonList["terminal"][param_args[1]]["y"], settingsSidesPlacemarker, "select")
  289.     elseif param_args[2] == "select" then
  290.         settings[param_args[1]] = settingsSidesList[param_args[1]]
  291.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings[param_args[1]] == settingsSidesList[param_args[1]]), "green", "red")[2]
  292.         buttonmanip.add(functionNum, "terminal", param_args[1], generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][settings[param_args[1]]]), "white", colorbkg, termX - 8, buttonList["terminal"][param_args[1]]["y"], settingsSidesPlacemarker, "select")
  293.         tablemanip.export("autocrafterSettings", settings)
  294.     elseif param_args[2] == "start" then
  295.         settingsSidesList[param_args[1]] = settings[param_args[1]]
  296.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings[param_args[1]] == settingsSidesList[param_args[1]]), "green", "red")[2]
  297.         buttonmanip.add(functionNum, "terminal", param_args[1].."Label", param_args[1]..":", "white", "blue", (termX - 10) - string.len(param_args[1]..":"), termY - table.maxn(settingsSidesList) - 1, blankFunction, {param_args[1], "boop"})
  298.         buttonmanip.add(functionNum, "terminal", param_args[1].."<", "< ", "white", "blue", termX - 10, termY - table.maxn(settingsSidesList) - 1, settingsSidesPlacemarker, {param_args[1], "<"})
  299.         buttonmanip.add(functionNum, "terminal", param_args[1], generalinfo.stringAdjuster(functionNum, generalInfo["sides"]["turtle"][settings[param_args[1]]]), "white", "green", termX - 8, termY - table.maxn(settingsSidesList) - 1, settingsSidesPlacemarker, {param_args[1], "select"})
  300.         buttonmanip.add(functionNum, "terminal", param_args[1]..">", " >", "white", "blue", termX - 2, termY - table.maxn(settingsSidesList) - 1, settingsSidesPlacemarker, {param_args[1], ">"})
  301.     else
  302.     end
  303.     return result
  304. end
  305.  
  306. function roleChangePlaceMarker(...) if tostring(roleChange) ~= "nil" then result = roleChange(...) end return result end
  307. roleNum = nil
  308.  
  309. function roleChange(param_functionNum, param_args)
  310.     local result, functionNum = {true}, param_functionNum.."/007"
  311.     if param_args == "<" then
  312.         roleNum = booleanmanip.quickChoice(functionNum, ((roleNum - 1) < 1), table.maxn(role), (roleNum - 1))[2]
  313.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings["role"] == role[roleNum]), "green", "red")[2]
  314.         buttonmanip.add(functionNum, "terminal", "role", role[roleNum].." ", "white", colorbkg, termX - 8, termY - 1, roleChangePlaceMarker, "select")
  315.     elseif param_args == ">" then
  316.         roleNum = booleanmanip.quickChoice(functionNum, ((roleNum + 1) > table.maxn(generalInfo["sides"]["turtle"])), 1, (roleNum + 1))[2]
  317.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings["role"] == role[roleNum]), "green", "red")[2]
  318.         buttonmanip.add(functionNum, "terminal", "role", role[roleNum].." ", "white", colorbkg, termX - 8, termY - 1, roleChangePlaceMarker, "select")
  319.     elseif param_args == "select" then
  320.         settings["role"] = roleNum
  321.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings["role"] == role[roleNum]), "green", "red")[2]
  322.         buttonmanip.add(functionNum, "terminal", "role", role[roleNum].." ", "white", colorbkg, termX - 8, termY - 1, roleChangePlaceMarker, "select")
  323.         tablemanip.export("autocrafterSettings", settings)
  324.     elseif param_args == "start" then
  325.         roleNum = 1
  326.         local colorbkg = booleanmanip.quickChoice(functionNum, (settings["role"] == role[roleNum]), "green", "red")[2]
  327.         buttonmanip.add(functionNum, "terminal", "roleLabel", "Role:", "white", "blue", termX - 15, termY - 1, blankFunction, "boop")
  328.         buttonmanip.add(functionNum, "terminal", "role<", "< ", "white", "blue", termX - 10, termY - 1, roleChangePlaceMarker, "<")
  329.         buttonmanip.add(functionNum, "terminal", "role", role[roleNum].." ", "white", colorbkg, termX - 8, termY - 1, roleChangePlaceMarker, "select")
  330.         buttonmanip.add(functionNum, "terminal", "role>", " >", "white", "blue", termX - 2, termY - 1, roleChangePlaceMarker, ">")
  331.     else
  332.     end
  333.     return result
  334. end
  335.    
  336. buttonmanip.add(functionNum, "terminal", "addItem", " Add Item ", "white", "green", termX - 10, termY - 10, addItem, "blank")
  337. buttonmanip.add(functionNum, "terminal", "delItem", " Del Item ", "white", "red", termX - 10, termY - 9, addItem, "blank")
  338. buttonmanip.add(functionNum, "terminal", "update", " Update   ", "white", "cyan", termX - 10, termY - 8, update, {scriptName, pastebinCode})
  339. inputSides(functionNum, "start")
  340. settingsSides(functionNum, {"observe", "start"})
  341. settingsSides(functionNum, {"output", "start"})
  342. settingsSides(functionNum, {"emptyChest", "start"})
  343. settingsSides(functionNum, {"extInput", "start"})
  344. settingsSides(functionNum, {"extOutput", "start"})
  345. roleChange(functionNum, {"role", "start"})
  346.  
  347. function crafting(param_functionNum, param_name, param_target, param_recipe, param_qty)
  348.     local result, functionNum = {true}, param_functionNum.."/007"
  349.     local tempPeripheral, inputData, materialsData, requiredMaterials, gatheringMaterials, matReturn, trueQty = false, {}, {}, true, true, {}, 1
  350.     -- get the item lists from the input chests
  351.     for a,b in pairs(settings["inputSides"]) do
  352.         if b then
  353.             tempPeripheral = wrapper(generalInfo["sides"]["turtle"][a])
  354.             if tempPeripheral ~= false then
  355.                 tempPeripheral.condenseItems()
  356.                 inputData[generalInfo["sides"]["turtle"][a]] = tempPeripheral.getAllStacks()
  357.     end end end
  358.     -- consolidate input data
  359.     for a,b in pairs(inputData) do
  360.         for c,d in pairs(inputData[a]) do
  361.             materialsData[inputData[a][c]["id"]..":"..inputData[a][c]["rawName"]] = (materialsData[inputData[a][c]["id"]..":"..inputData[a][c]["rawName"]] or 0) + inputData[a][c]["qty"]
  362.     end end
  363.     -- work out if qty if affected by crafting results
  364.     if param_qty > 1 then
  365.         if craftingData[param_name][param_recipe]["results"][1]["id"] == param_name then
  366.             trueQty = math.floor(param_qty / craftingData[param_name][param_recipe]["results"][1]["qty"]) + 1
  367.         else
  368.             trueQty = param_qty
  369.         end
  370.     end
  371.     -- work out materials required under qty
  372.     local craftable, uncraftable, tempMaterialsData, tempCraftable = false, false, {}, true
  373.     while craftable == false and uncraftable == false do
  374.         for a,b in pairs(craftingData[param_name][param_recipe]["materials"]) do tempMaterialsData[a] = trueQty * b end
  375.         tempCraftable = true
  376.         for a,b in pairs(tempMaterialsData[param_name][param_recipe]["materials"]) do
  377.             if tostring(materialsData[a]) ~= "nil" then
  378.                 tempCraftable = booleanmanip.quickChoice(functionNum, (materialsData[a] >= b), tempCraftable, false)[2]
  379.             else
  380.                 tempCraftable = false
  381.         end end
  382.         craftable = tempCraftable
  383.         if not craftable then trueQty = trueQty - 1 end
  384.         if trueQty == 0 then uncraftable = true end
  385.     end
  386.     -- crafting
  387.     if craftable then
  388.         -- gathering the materials
  389.         for y,z in pairs(craftingData[param_name][param_recipe]["recipe"]) do
  390.             qtyRequired = craftingData[param_name][param_recipe]["recipe"][y]["qty"] * trueQty
  391.             inputData = {}
  392.             for a,b in pairs(settings["inputSides"]) do
  393.                 if b then
  394.                     tempPeripheral = wrapper(generalInfo["sides"]["turtle"][a])
  395.                     if tempPeripheral ~= false then
  396.                         tempPeripheral.condenseItems()
  397.                         inputData[generalInfo["sides"]["turtle"][a]] = tempPeripheral.getAllStacks()
  398.             end end end
  399.             for a,b in pairs(inputData) do
  400.                 if qtyRequired ~= 0 then
  401.                     for c,d in pairs(inputData[a]) do
  402.                         if qtyRequired ~= 0 then
  403.                             if inputData[a][c]["id"]..":"..inputData[a][c]["rawName"] == craftingData[param_name][param_recipe]["recipe"][y]["id"] then
  404.                                 tempPeripheral, matReturn[y] = wrapper(a), a
  405.                                 qtyRequired = qtyRequired - (tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][a]]], c, qtyRequired, settings["craftingLoc"][y]) or 0)
  406.         end end end end end end
  407.  
  408.         turtle.select(4)
  409.         -- checking for correct amounts
  410.         done = true
  411.         for y,z in pairs(craftingData[param_name][param_recipe]["recipe"]) do
  412. --          print(y..":"..turtle.getItemCount(y)..":"..data[paramA][paramB]["recipe"][y]["qty"])
  413.             if turtle.getItemCount(setttings["craftingLoc"][y]) == (craftingData[param_name][param_recipe]["recipe"][y]["qty"] * trueQty) then
  414.                 done = done
  415.             else
  416.                 done = false
  417.             end
  418.         end
  419.         -- craft (finally)
  420.         if done then
  421.             if craftingData[param_name][param_recipe]["external"] then
  422.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["extInput"]])
  423.                 for a,b in pairs(setttings["craftingLoc"]) do
  424.                     tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["extInput"]]]], b, 64)
  425.                 end
  426.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["extOutput"]])
  427.                 local waiting, craftResultData = true, {}
  428.                 while waiting do
  429.                     tempPeripheral.condenseItems()
  430.                     craftResultData = {[3] = true}
  431.                     craftResultData[1] = tempPeripheral.getAllStacks()
  432.                     for a,b in pairs(craftResultData[1]) do
  433.                         for c,d in pairs(craftResultData[1][a]) do
  434.                             craftResultData[2][craftResultData[1][a][c]["id"]..":"..craftResultData[1][a][c]["rawName"]] = (craftResultData[2][craftResultData[1][a][c]["id"]..":"..craftResultData[1][a][c]["rawName"]] or 0) + craftResultData[1][a][c]["qty"]
  435.                     end end
  436.                     for a,b in pairs(craftingData[param_name][param_recipe]["results"]) do
  437.                         craftResultData[3] = booleanmanip.quickChoice(functionNum, craftResultData[2][craftingData[param_name][param_recipe]["results"]["id"]] >= (craftingData[param_name][param_recipe]["results"]["qty"] * trueQty), craftResultData[3], false)[2]
  438.                     end
  439.                     if craftResultData[3] then waiting = false else coroutine.yield() end
  440.                 end
  441.                 for a,b in pairs(craftResultData[1]) do
  442.                     tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["extOutput"]])
  443.                     tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["extOutput"]]]], a, 64, 4)
  444.                     tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["output"]])
  445.                     tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["output"]]]], 4, 64)
  446.                 end
  447.             else
  448.                 result = turtle.craft()
  449.             end
  450.         end
  451.         for a,b in pairs(matReturn) do
  452.             tempPeripheral = wrapper(matReturn[a])
  453.             tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][matReturn[a]]]], craftingLoc[a], 64)
  454.         end
  455.         tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["output"]])
  456.         for a,b in pairs(settings["craftingResults"]) do
  457.             tempPeripheral.pullItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["output"]]]], b, 64)
  458.         end
  459.     end
  460.     return result
  461. end
  462.    
  463.    
  464. function stockUnload(param_functionNum, param_name, param_qty)
  465.     local result, functionNum = {true}, param_functionNum.."/007"
  466.     local tempPeripheral, qtyRequired = wrapper(generalInfo["sides"]["turtle"][settings["extOutput"]]), param_qty
  467.     tempPeripheral.condenseItems()
  468.     local inputData = tempPeripheral.getAllStacks()
  469.     for a,b in pairs(inputData) do
  470.         if qtyRequired ~= 0 and inputData[a]["qty"] > 1 then
  471.             if inputData[a]["id"]..":"..inputData[a]["rawName"] == param_name then
  472.                 local availableQty = booleanmanip.quickChoice(functionNum, (inputData[a]["qty"] > qtyRequired), qtyRequired, (inputData[a]["qty"] - 1))[2]
  473.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["extOutput"]])
  474.                 qtyRequired = qtyRequired - (tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["extOutput"]]]], a, availableQty, 1) or 0)
  475.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["output"]])
  476.                 tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["output"]]]], 1, 64)
  477.     end end end
  478.     return result
  479. end
  480.  
  481. function stockLoad(param_functionNum, param_name, param_qty)
  482.     local result, functionNum = {true}, param_functionNum.."/007"
  483.     local tempPeripheral, qtyRequired = wrapper(generalInfo["sides"]["turtle"][settings["observe"]]), param_qty
  484.     tempPeripheral.condenseItems()
  485.     local inputData = tempPeripheral.getAllStacks()
  486.     for a,b in pairs(inputData) do
  487.         if qtyRequired ~= 0 and inputData[a]["qty"] > 1 then
  488.             if inputData[a]["id"]..":"..inputData[a]["rawName"] == param_name then
  489.                 local availableQty = booleanmanip.quickChoice(functionNum, (inputData[a]["qty"] > qtyRequired), qtyRequired, (inputData[a]["qty"] - 1))[2]
  490.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["observe"]])
  491.                 qtyRequired = qtyRequired - (tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["observe"]]]], a, availableQty, 1) or 0)
  492.                 tempPeripheral = wrapper(generalInfo["sides"]["turtle"][settings["extInput"]])
  493.                 tempPeripheral.pushItemIntoSlot(generalInfo["chestDirTranslator"][generalInfo["sidesReverse"]["turtle"][generalInfo["sides"]["turtle"][settings["extInput"]]]], 1, 64)
  494.     end end end
  495.     return result
  496. end
  497.    
  498.  
  499. function scan(param_functionNum)
  500.     local result, functionNum = {true}, param_functionNum.."/007"
  501.     local chest tempListA, tempListB, qty = wrapper(generalInfo["sides"]["turtle"][settings["observe"]]), nil, {}, nil
  502.     for a,b in pairs(craftingData) do
  503.         chest.condenseItems()
  504.         tempListA, tempListB = chest.getAllStacks(), {}
  505.         for c,d in pairs(tempListA) do tempListB[tempListA[a]["id"]..":"..tempListA[c]["rawName"]] = (tempListB[tempListA[c]["id"]..":"..tempListA[c]["rawName"]] or 0) + tempListA[c]["qty"] end
  506.         if craftingData[a]["min"] ~= false then
  507.             if tostring(tempListB[a]) == "nil" or tempListB[a] < craftingData[a]["min"] then
  508.                 qty = 1
  509.                 if craftingData[a]["craftMin"]["multiple"] then qty = craftingData[a]["min"] - (tempListB[a] or 0) end
  510.                 if settings["role"] == 1 then crafting(functionNum, a, "min", "craftMin", qty)
  511.                 elseif settings["role"] == 2 then stockUnload(functionNum, a, qty)
  512.                 end
  513.             end
  514.             if tostring(tempListB[a]) ~= "nil" and tempListB[a] > craftingData[a]["max"] then
  515.                 qty = 1
  516.                 if craftingData[a]["craftMax"]["multiple"] then qty = craftingData[a]["max"] - (tempListB[a] or 0) end
  517.                 if settings["role"] == 1 then crafting(functionNum, a, "max", "craftMax", qty)
  518.                 elseif settings["role"] == 2 then stockLoad(functionNum, a, qty)
  519.                 end
  520.             end
  521.         end
  522.     end
  523.     return result
  524. end
  525.                
  526. buttonmanip.generateWindow(functionNum, "terminal")
  527.                
  528. coroutinemanip.coroutineControl["function"]["autoCrafter_buttons"] = function()
  529.     local result, functionNum = {true}, param_functionNum.."/007"
  530.     event = eventmanip.filter(functionNum, {"mouse_click"})[2]
  531.     buttonmanip.scan(functionNum, "terminal", event[3], event[4])
  532.     generateWindow(functionNum, "terminal")
  533. end
  534.  
  535. coroutinemanip.coroutineControl["function"]["autoCrafter_craft"] = function()
  536.     local result, functionNum = {true}, param_functionNum.."/007"
  537.     coroutine.yield()
  538.     if not setting["operation"] then
  539.         setting["operation"] = true
  540.         scan(functionNum)
  541.         setting["operation"] = false
  542.     end
  543. end
Add Comment
Please, Sign In to add comment