SHOW:
|
|
- or go back to the newest paste.
| 1 | - | local channel = 11 |
| 1 | + | local args = {...}
|
| 2 | local recipes = {}
| |
| 3 | ||
| 4 | local lp = #args > 0 and peripheral.wrap(args[1]) or peripheral.wrap("right")
| |
| 5 | - | local lp = peripheral.wrap("right")
|
| 5 | + | |
| 6 | ||
| 7 | local ae = peripheral.wrap("bottom")
| |
| 8 | - | local wifi = peripheral.find("modem")
|
| 8 | + | local pipe = peripheral.wrap("top")
|
| 9 | - | if not wifi.isWireless() then wifi = nil end |
| 9 | + | local furnace = peripheral.wrap("back")
|
| 10 | - | wifi.open(channel) |
| 10 | + | local crucible = peripheral.wrap("front")
|
| 11 | local signalSide = #args > 1 and args[2] or "left" | |
| 12 | - | local ae = peripheral.wrap("top")
|
| 12 | + | local furnaceDir = #args > 2 and args[3] or "south" |
| 13 | ||
| 14 | ||
| 15 | -- http://lua-users.org/wiki/SplitJoin | |
| 16 | local function split(str, pat) | |
| 17 | local t = {}
| |
| 18 | local fpat = "(.-)" .. pat | |
| 19 | local last_end = 1 | |
| 20 | local s, e, cap = str:find(fpat, 1) | |
| 21 | while s do | |
| 22 | if s ~= 1 or cap ~= "" then | |
| 23 | table.insert(t,cap) | |
| 24 | end | |
| 25 | last_end = e+1 | |
| 26 | s, e, cap = str:find(fpat, last_end) | |
| 27 | end | |
| 28 | if last_end <= #str then | |
| 29 | cap = str:sub(last_end) | |
| 30 | table.insert(t, cap) | |
| 31 | end | |
| 32 | return t | |
| 33 | end | |
| 34 | ||
| 35 | local beans = {}
| |
| 36 | ||
| 37 | local function scanBeans() | |
| 38 | local allItems = lp.getAvailableItems() | |
| 39 | --print(#allItems, " items in lp system") | |
| 40 | local foundABean = false | |
| 41 | for i,item in pairs(allItems) do | |
| 42 | if lp.getItemID(item[1]) == 25366 then | |
| 43 | foundABean = true | |
| 44 | local nbt = lp.getNBTTagCompound(item[1]) | |
| 45 | if nbt then | |
| 46 | local name = nbt.value.Aspects.value[1].value.key.value | |
| 47 | if not beans[name] then beans[name] = {lpID=item[1], qty=item[2]}
| |
| 48 | else print("duplicate bean: ",name) end
| |
| 49 | end | |
| 50 | end | |
| 51 | end | |
| 52 | if not foundABean then | |
| 53 | sleep(5) | |
| 54 | os.reboot() | |
| 55 | end | |
| 56 | end | |
| 57 | - | if #recipe % 2 ~= 1 then break end |
| 57 | + | |
| 58 | - | recipes[recipe[1]] = {}
|
| 58 | + | |
| 59 | - | for i=2,#recipe,2 do |
| 59 | + | |
| 60 | - | table.insert(recipes[recipe[1]],{type=recipe[i],qty=recipe[i+1]})
|
| 60 | + | |
| 61 | local line = recipeFile.readLine() | |
| 62 | while line do | |
| 63 | local recipe = split(line,",") | |
| 64 | if #recipe % 2 ~= 0 then break end | |
| 65 | recipes[recipe[2]] = {}
| |
| 66 | for i=3,#recipe,2 do | |
| 67 | table.insert(recipes[recipe[2]],{type=recipe[i],qty=recipe[i+1]})
| |
| 68 | end | |
| 69 | - | --for i,k in pairs(recipes) do print(i); for n=1,#k do for j,l in pairs(k[n]) do print(j," ",l) end end end |
| 69 | + | |
| 70 | - | --for i,k in pairs(recipes) do print(i," ",k) end |
| 70 | + | |
| 71 | recipeFile.close() | |
| 72 | end | |
| 73 | ||
| 74 | scanBeans() | |
| 75 | - | if ae.pullItem("down",i,n) - n ~= 0 then i = i - 1 end
|
| 75 | + | |
| 76 | ||
| 77 | local function clearInventory() | |
| 78 | for i=1,16 do | |
| 79 | local n = turtle.getItemCount(i) | |
| 80 | if ae.pullItem("up",i,n) - n ~= 0 then i = i - 1 end
| |
| 81 | end | |
| 82 | - | os.pullEvent("turtle_inventory")
|
| 82 | + | |
| 83 | - | --print("inventory's changed")
|
| 83 | + | |
| 84 | - | wifi.transmit(channel,channel,"getJobList") |
| 84 | + | local function itemInSlot(slot) |
| 85 | - | local event, modemSide, senderChannel, replyChannel, message, senderDistance = os.pullEvent("modem_message")
|
| 85 | + | return turtle.getItemCount(slot) |
| 86 | - | --for i,k in pairs(message[1]) do print(i," ",k) end |
| 86 | + | |
| 87 | - | --if message and message[1] and message[1].name then print(message[1].name) end |
| 87 | + | |
| 88 | - | if message then |
| 88 | + | local function requestBean(name, amount) |
| 89 | - | for i=1,#message do |
| 89 | + | if amount > 64 then return 0 end |
| 90 | - | if message[i] and message[i].name and message[i].qty and recipes[message[i].name] then print(message[i].name," ",message[i].qty) end |
| 90 | + | local slot = 1 |
| 91 | while slot < 17 and itemInSlot(slot) > 0 do slot = slot + 1 end | |
| 92 | if itemInSlot(slot) > 0 then print("turtle inventory full while trying to request ", name); return 0 end
| |
| 93 | local result = lp.makeRequest(beans[name].lpID, amount) | |
| 94 | if result ~= "DONE" then | |
| 95 | print("Failed to get ", amount, "name: ", result)
| |
| 96 | return 0 | |
| 97 | else | |
| 98 | return slot | |
| 99 | end | |
| 100 | end | |
| 101 | ||
| 102 | local function loadFurnace(amount,slot) | |
| 103 | local movedAmount = 0 | |
| 104 | local toMove = amount | |
| 105 | repeat | |
| 106 | movedAmount = movedAmount + furnace.pullItem(furnaceDir,slot,toMove) | |
| 107 | if movedAmount then toMove = amount - movedAmount end | |
| 108 | if not movedAmount or toMove > 0 then sleep(0.5) end | |
| 109 | until movedAmount and toMove <= 0 | |
| 110 | return movedAmount | |
| 111 | end | |
| 112 | ||
| 113 | local function loadBean(name, amount) | |
| 114 | local beanInSlot = requestBean(name,amount) | |
| 115 | local movedBeans = 0 | |
| 116 | if beanInSlot > 0 then movedBeans = loadFurnace(amount,beanInSlot) end | |
| 117 | --if itemInSlot(beanInSlot) == 0 then | |
| 118 | --wifi.transmit(channel,channel,textutils.serialize(movedBeans)) | |
| 119 | --end | |
| 120 | return movedBeans | |
| 121 | end | |
| 122 | ||
| 123 | ||
| 124 | local signal = false | |
| 125 | clearInventory() | |
| 126 | ||
| 127 | sleep(2) | |
| 128 | ||
| 129 | while true do | |
| 130 | signal = rs.getInput(signalSide) | |
| 131 | if signal then | |
| 132 | os.pullEvent("redstone")
| |
| 133 | signal = rs.getInput(signalSide) | |
| 134 | --print("new item in crucible")
| |
| 135 | end | |
| 136 | while not signal do | |
| 137 | local item = crucible.getStackInSlot(1) | |
| 138 | if not item then item = {name="nil"} end
| |
| 139 | if not recipes[item.name] then | |
| 140 | print("no suitable recipe found for item ",item.name)
| |
| 141 | sleep(5) | |
| 142 | else | |
| 143 | --print(item.name," ",#recipes[item.name]) | |
| 144 | local nBean = 0 | |
| 145 | for i=1,#recipes[item.name] do | |
| 146 | local bean = recipes[item.name][i].type | |
| 147 | local qty = tonumber(recipes[item.name][i].qty) | |
| 148 | local aspects = crucible.getAspects() | |
| 149 | for j=1,#aspects do | |
| 150 | if bean == string.lower(aspects[j].name) then | |
| 151 | qty = qty - aspects[j].quantity | |
| 152 | break | |
| 153 | end | |
| 154 | end | |
| 155 | while qty > 0 and pipe.getSuctionType("in") ~= bean do
| |
| 156 | sleep(0.2) | |
| 157 | end | |
| 158 | if qty > 0 and pipe.getSuctionType("in") == bean then
| |
| 159 | --print("loading ",qty," ",bean)
| |
| 160 | nBean = loadBean(bean,qty) | |
| 161 | if nBean ~= qty then print(nBean," of ",recipes[item.name][i].qty," moved to furnace") end | |
| 162 | if #recipes[item.name] == 1 then | |
| 163 | while #crucible.getAspects() == 0 do | |
| 164 | sleep(0.2) | |
| 165 | end | |
| 166 | while #crucible.getAspects() > 0 do | |
| 167 | sleep(0.2) | |
| 168 | end | |
| 169 | end | |
| 170 | while pipe.getSuctionType("in") == bean do
| |
| 171 | if #crucible.getAspects() == 0 then break end | |
| 172 | sleep(0.2) | |
| 173 | end | |
| 174 | sleep(0.2) | |
| 175 | end | |
| 176 | end | |
| 177 | end | |
| 178 | while #crucible.getAspects() > 0 do | |
| 179 | sleep(0.5) | |
| 180 | end | |
| 181 | signal = rs.getInput(signalSide) | |
| 182 | end | |
| 183 | clearInventory() | |
| 184 | end |