Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- print("Autocraft v1")
- -- Configuration
- maxTasks=2 -- overridden in rules.cfg
- maxTaskSize=20 -- overridden in rules.cfg
- screenSize=40 -- overridden in rules.cfg
- function buildRules()
- -- readConfig()
- rules = {}
- table.insert(rules, {count=20, name="opencomputers:material", dmg=4, label="Circuit Board", limit=100})
- table.insert(rules, {count=200, name="opencomputers:material", dmg=4, label="PCB", limit=100})
- table.insert(rules, {count=200, name="opencomputers:material", dmg=7, label="Chip1", limit=100})
- table.insert(rules, {count=20, name="opencomputers:material", dmg=8, label="Chip2", limit=20})
- table.insert(rules, {count=10, name="opencomputers:material", dmg=9, label="Chip3", limit=10})
- table.insert(rules, {count=1024, name="projectred-core:ressource_item", dmg=0, label="Circuit Plate", limit=300})
- table.insert(rules, {count=500, name="mekanism:controlcircuit", dmg=0, label="Basic Control Circuit", limit=200})
- table.insert(rules, {count=100, name="mekanism:controlcircuit", dmg=1, label="Adv Control Circuit", limit=50})
- table.insert(rules, {count=20, name="mekanism:controlcircuit", dmg=2, label="Elite Control Circuit", limit=10})
- table.insert(rules, {count=2, name="mekanism:controlcircuit", dmg=3, label="Ultim Control Circuit", limit=2})
- -- table.insert(rules, {count=10, name="thermalfoundation:material", dmg=324})
- addRulesWiggle("Plate", 10, 10)
- addRulesWiggle("Ingot", 20, 20)
- saveConfig()
- end
- -- Imports
- local component = require("component")
- local sides = require("sides")
- local term = require("term")
- local event = require("event")
- local meController = component.me_controller
- local invController = component.inventory_controller
- local RSController = component.redstone
- -- Utilities
- function mysplit (inputstr, sep)
- if sep == nil then
- sep = "%s"
- end
- local t={}
- for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
- table.insert(t, str)
- end
- return t
- end
- -- Actual code
- term.clear()
- tasks = {}
- function readChest()
- print("Reading chest...")
- b = false
- for side= 0, 5 do
- n = invController.getInventorySize(side)
- print(sides[side].." : "..(n or "nil"))
- if n then
- for i = 1, n do
- it=invController.getStackInSlot(side, i)
- if it then print(it.name.."/"..it.damage) b = true end
- end
- end
- end
- if b then os.sleep(2) end
- end
- function checkAvailableCPUs()
- meCpus = meController.getCpus()
- local occupiedCpus = 0
- acpus = 0
- for cpuIndex = 1, #meCpus do
- -- if not meCpus[cpuIndex].busy then table.insert(acpus, meCpus[cpuIndex]) end
- if not meCpus[cpuIndex].busy then acpus = acpus+1 end
- end
- return acpus
- end
- function checkIfTasksEnded()
- for i, t in pairs(tasks) do
- tt = t.task
- if tt.isDone() then
- table.remove(tasks, i)
- print("Task finished: "..t.label)
- elseif tt.isCanceled() then
- table.remove(tasks, i)
- print("!! Task canceled: "..t.label.." !!")
- else
- print("Task running: "..t.label)
- end
- end
- end
- function printStock(verbose)
- l = 0
- for _, rule in pairs(rules) do
- if rule["dmg"] then
- meItems = meController.getItemsInNetwork({ name = rule["name"], damage = rule["dmg"]})
- else
- meItems = meController.getItemsInNetwork({ name = rule["name"]})
- end
- if meItems.n == 0 then
- print("Could not find "..rule["name"].."/"..(rule["dmg"] or "*"))
- l = l + 1
- if l > screenSize then os.sleep(2) l = 0 end
- goto nextRule
- end
- if meItems.n == 1 then
- if (verbose == "all") then print(rule["name"].."/"..(rule["dmg"] or "*").. " -> "..meItems[1].label.. " " .. meItems[1].size.."/"..rule["count"]) l = l + 1 if l > screenSize then os.sleep(2) l = 0 end end
- if (verbose == "missing") and (meItems[1].size < rule["count"]) then print(rule["name"].."/"..(rule["dmg"] or "*").. " -> "..meItems[1].label.. " " .. meItems[1].size.."/"..rule["count"]) l = l + 1 if l > screenSize then os.sleep(2) l = 0 end end
- else
- if (verbose == "all") then print(rule["name"].."/"..(rule["dmg"] or "*")) end
- for i=1, meItems.n do
- it = meItems[i]
- if (verbose == "all") then print(it.label .. " " .. it.size.."/"..rule["count"]) l = l + 1 if l > screenSize then os.sleep(2) l = 0 end end
- if (verbose == "missing") and (it.size < rule["count"]) then print(it.label .. " " .. it.size.."/"..rule["count"]) l = l + 1 if l > screenSize then os.sleep(2) l = 0 end end
- end
- end
- ::nextRule::
- end
- end
- function checkItemsAndCraft(cpus)
- l = 0
- for _, rule in pairs(rules) do
- if rule["dmg"] then
- meItems = meController.getItemsInNetwork({ name = rule["name"], damage = rule["dmg"]})
- else
- meItems = meController.getItemsInNetwork({ name = rule["name"]})
- end
- if meItems.n == 0 then
- print("Could not find "..rule["name"].."/"..(rule["dmg"] or "*"))
- l = l + 1
- if l > screenSize then os.sleep(2) l = 0 end
- else
- for i=1, meItems.n do
- it = meItems[i]
- result = orderMissingItem(cpus, it, rule["count"], rule["limit"])
- if (result == 3) or (result == 4) then return end -- no need to continue.
- end
- end
- end
- end
- -- return values:
- -- -1 Nothing to do
- -- 0 success
- -- 1 already running
- -- 2 missing ingredients
- -- 3 max tasks reached
- -- 4 max CPUs reached
- -- 5 No recipe
- function orderMissingItem(cpus, item, target, limit)
- -- checks --
- for _, t in pairs(tasks) do
- if (t.name == item.name) and (t.dmg == item.damage) then
- print("Already crafting ".. item.label)
- return 1
- end
- end
- if #tasks >= maxTasks then print("Max concurent tasks reached.") return 3 end
- if cpus <= 1 then print("No CPU available.") return 4 end
- if item.size >= target then return -1 end
- -- Order the craft
- needed = math.min(limit, target - item.size)
- craftables = meController.getCraftables({ name = item.name, damage = item.damage})
- if craftables.n == 0 then print("No recipe for ".. item.label) return 5 end
- for i=1, craftables.n do
- craftable = craftables[i]
- task = craftable.request(needed)
- if task.isCanceled() then
- print("Missing ingredients for "..item.label.." recipe "..i)
- else
- print("Ordered "..needed.." "..item.label.." (recipe "..i..")")
- table.insert(tasks, {name=item.name, dmg=item.damage, task=task, label=item.label})
- cpus = cpus - 1
- return 0
- end
- end
- end
- function readConfig()
- local file,err = io.open("rules.cfg", "r")
- if err == nil then
- version = tonumber(file:read("*line"))
- if version == 1 then
- maxTasks = tonumber(file:read("*line"))
- maxTaskSize = tonumber(file:read("*line"))
- screenSize = tonumber(file:read("*line"))
- l = file:read("*line")
- -- rules={}
- while l ~= 1 do
- s = mysplit(l, "\t")
- -- print(tonumber(s[1]).." "..s[2].."/"..tonumber(s[3]))
- table.insert(rules, {count=tonumber(s[1]), name=s[2], dmg=tonumber(s[3]), limit=maxTaskSize})
- l = file:read("*line")
- end
- end
- if version == 2 then
- maxTasks = tonumber(file:read("*line"))
- maxTaskSize = tonumber(file:read("*line"))
- screenSize = tonumber(file:read("*line"))
- l = file:read("*line")
- -- rules={}
- while l ~= 1 do
- s = mysplit(l, "\t")
- -- print(tonumber(s[1]).." "..s[2].."/"..tonumber(s[3]))
- table.insert(rules, {count=tonumber(s[1]), name=s[2], dmg=tonumber(s[3]), limit=tonumber(s[4])})
- l = file:read("*line")
- end
- end
- file:close()
- end
- end
- function saveConfig()
- local file,err = io.open("rules.cfg", "w")
- file:write("2\n")
- file:write(maxTasks.."\n")
- file:write(maxTaskSize.."\n")
- file:write(screenSize.."\n")
- for _, i in pairs(rules) do
- file:write(i.count.."\t"..i.name.."\t"..i.dmg.."\t"..(i.label or "-").."\t"..(i.limit or "-").."\n")
- end
- file:close()
- end
- function addRulesWiggle(name, qty, limit)
- print("Adding wiggle rule ; this is quite long!")
- craftables = meController.getCraftables()
- print(craftables.n)
- for i=1, craftables.n do
- if ((i % 100) == 0) then print(i) end
- if string.find(craftables[i].getItemStack().label, name) then
- print(craftables[i].getItemStack().label)
- table.insert(rules, {count=qty, name=craftables[i].getItemStack().name, dmg=craftables[i].getItemStack().damage, label=craftables[i].getItemStack().label, limit=limit})
- end
- end
- end
- -- Main loop
- -- readChest()
- buildRules()
- iter=1
- -- craftables = meController.getCraftables()
- -- print(craftables.n)
- -- for i=1, craftables.n do
- -- if string.find(craftables[i].getItemStack().label, "Ingot") then print(craftables[i].getItemStack().label) end
- -- end
- while (RSController.getInput(sides.left) == 0) do
- -- term.clear()
- print("Iteration "..iter.. ". Flip the switch to the right to exit.\n")
- cpus = checkAvailableCPUs()
- checkIfTasksEnded()
- print(cpus.." CPUs available. "..#tasks.." Tasks running.\n")
- printStock("missing")
- if ((cpus > 1) and (#tasks < maxTasks))then
- checkItemsAndCraft(cpus)
- end
- os.sleep(5)
- iter = iter +1
- end
Add Comment
Please, Sign In to add comment