SHOW:
|
|
- or go back to the newest paste.
| 1 | local wRequire = require("wRequire")
| |
| 2 | local tableFile = wRequire("tableFile")
| |
| 3 | local invClient = wRequire("invClient")
| |
| 4 | ||
| 5 | rednet.open("right")
| |
| 6 | ||
| 7 | invClient.storageComputerID = 12 | |
| 8 | ||
| 9 | local width = 6 | |
| 10 | local depth = 11 | |
| 11 | ||
| 12 | local botChestName = "enderstorage:ender_chest_14" | |
| 13 | local toSmeltChestName = "enderstorage:ender_chest_13" | |
| 14 | local smeltedChestName = "storagedrawers:standard_drawers_1_0" | |
| 15 | ||
| 16 | local xpFor30levels = 1395 | |
| 17 | local checkFurnaceEach = 1 | |
| 18 | local checkFurnaceCount = 10000 | |
| 19 | ||
| 20 | local furnaces = tableFile.load("#furnaces.lua", {})
| |
| 21 | ||
| 22 | local function refuel() | |
| 23 | if turtle.getFuelLevel() > 2000 then | |
| 24 | return | |
| 25 | end | |
| 26 | ||
| 27 | local networkName = peripheral.wrap("top").getNameLocal()
| |
| 28 | local botChest = peripheral.wrap(botChestName) | |
| 29 | ||
| 30 | turtle.select(1) | |
| 31 | turtle.dropDown(turtle.getItemCount()) | |
| 32 | ||
| 33 | while turtle.getFuelLevel() < 5000 do | |
| 34 | print("Fuel: " .. tostring(turtle.getFuelLevel()) .. "/5000")
| |
| 35 | local botChestList = botChest.list() | |
| 36 | if botChestList[1] ~= nil and botChestList[1].count > 32 then | |
| 37 | print("Refueling")
| |
| 38 | botChest.pushItems(networkName, 1, 10, 1) | |
| 39 | turtle.refuel(turtle.getItemCount()) | |
| 40 | else | |
| 41 | print("Fetching fuel from storage network")
| |
| 42 | invClient.get("minecraft:charcoal.0.", 16, "enderstorage:ender_chest_2", 1)
| |
| 43 | end | |
| 44 | end | |
| 45 | end | |
| 46 | ||
| 47 | local function goto(x, y, action) | |
| 48 | turtle.turnRight() | |
| 49 | for x2 = 1, x do | |
| 50 | turtle.forward() | |
| 51 | end | |
| 52 | turtle.turnLeft() | |
| 53 | ||
| 54 | for y2 = 1, y do | |
| 55 | turtle.forward() | |
| 56 | end | |
| 57 | ||
| 58 | action() | |
| 59 | ||
| 60 | for y2 = 1, y do | |
| 61 | turtle.back() | |
| 62 | end | |
| 63 | ||
| 64 | turtle.turnRight() | |
| 65 | for x2 = 1, x do | |
| 66 | turtle.back() | |
| 67 | end | |
| 68 | turtle.turnLeft() | |
| 69 | end | |
| 70 | ||
| 71 | local function mapFurnaces() | |
| 72 | refuel() | |
| 73 | local toSmeltChest = peripheral.wrap(toSmeltChestName) | |
| 74 | ||
| 75 | turtle.select(1) | |
| 76 | turtle.dropDown(turtle.getItemCount()) | |
| 77 | ||
| 78 | local furnacePeripherals = { peripheral.find("minecraft:furnace") }
| |
| 79 | ||
| 80 | for _, furnacePeripheral in pairs(furnacePeripherals) do | |
| 81 | furnacePeripheral.pushItems(peripheral.wrap("top").getNameLocal(), 1, 64)
| |
| 82 | end | |
| 83 | ||
| 84 | while turtle.getItemCount() < 1 do | |
| 85 | print("Fetching filler items")
| |
| 86 | toSmeltChest.pushItems(peripheral.wrap("top").getNameLocal(), 1, 1)
| |
| 87 | end | |
| 88 | ||
| 89 | for _, furnacePeripheral in pairs(furnacePeripherals) do | |
| 90 | local furnaceName = peripheral.getName(furnacePeripheral) | |
| 91 | if furnaces[furnaceName] == nil then | |
| 92 | furnacePeripheral.pullItems(peripheral.wrap("top").getNameLocal(), 1, 1)
| |
| 93 | print("Searching for position of furnace: " .. furnaceName)
| |
| 94 | local found = false | |
| 95 | ||
| 96 | local function positionAlreadyFound(x, y) | |
| 97 | for _, furnace in pairs(furnaces) do | |
| 98 | if furnace.x == x and furnace.y == y then | |
| 99 | return true | |
| 100 | end | |
| 101 | end | |
| 102 | return false | |
| 103 | end | |
| 104 | ||
| 105 | local function find() | |
| 106 | for x = 0, (width - 1) do | |
| 107 | for y = 0, (depth - 1) do | |
| 108 | if (x == 0 and y == 0) or positionAlreadyFound(x, y) then | |
| 109 | else | |
| 110 | goto(x, y, function() | |
| 111 | local above = peripheral.wrap("top")
| |
| 112 | if above ~= nil then | |
| 113 | local aboveList = above.list() | |
| 114 | if aboveList[1] ~= nil and aboveList[1].count == 1 then | |
| 115 | found = true | |
| 116 | end | |
| 117 | end | |
| 118 | end) | |
| 119 | ||
| 120 | if found then | |
| 121 | print("Found position of furnace: " .. furnaceName .. " " .. tostring(x) .. ", " .. tostring(y))
| |
| 122 | furnaces[furnaceName] = {
| |
| 123 | ["name"] = furnaceName, | |
| 124 | ["x"] = x, | |
| 125 | ["y"] = y, | |
| 126 | ["xp"] = 0 | |
| 127 | } | |
| 128 | tableFile.save(furnaces, "#furnaces.lua") | |
| 129 | rednet.broadcast(furnaces, "bbXpShop-r2s") | |
| 130 | furnacePeripheral.pushItems(peripheral.wrap("top").getNameLocal(), 1, 64)
| |
| 131 | return | |
| 132 | end | |
| 133 | end | |
| 134 | end | |
| 135 | end | |
| 136 | end | |
| 137 | ||
| 138 | find() | |
| 139 | ||
| 140 | if found == false then | |
| 141 | error("Not found")
| |
| 142 | end | |
| 143 | end | |
| 144 | end | |
| 145 | ||
| 146 | turtle.dropDown(64) | |
| 147 | end | |
| 148 | ||
| 149 | mapFurnaces() | |
| 150 | ||
| 151 | local xpRequested = 0 | |
| 152 | ||
| 153 | local function networkLoop() | |
| 154 | --rednet.broadcast("ready", "bbXpShop-r2s")
| |
| 155 | while true do | |
| 156 | local id, message = rednet.receive("bbXpShop-s2r", 10)
| |
| 157 | if message ~= nil then | |
| 158 | xpRequested = xpRequested + message | |
| 159 | print(xpRequested) | |
| 160 | end | |
| 161 | end | |
| 162 | end | |
| 163 | ||
| 164 | local function getXp() | |
| 165 | if xpRequested > 0 then | |
| 166 | for _, furnace in pairs(furnaces) do | |
| 167 | os.sleep() | |
| 168 | if furnace.xp >= xpRequested then | |
| 169 | refuel() | |
| 170 | goto(furnace.x, furnace.y, function() | |
| 171 | turtle.digUp() | |
| 172 | if furnace.y > 1 then | |
| 173 | turtle.back() | |
| 174 | sleep(0.5) | |
| 175 | turtle.forward() | |
| 176 | else | |
| 177 | turtle.forward() | |
| 178 | sleep(0.5) | |
| 179 | turtle.back() | |
| 180 | end | |
| 181 | for i = 1, 16 do | |
| 182 | turtle.select(i) | |
| 183 | local itemDetail = turtle.getItemDetail() | |
| 184 | if itemDetail ~= nil and itemDetail.name == "minecraft:furnace" then | |
| 185 | turtle.placeUp() | |
| 186 | break | |
| 187 | else | |
| 188 | turtle.dropDown(turtle.getItemCount()) | |
| 189 | end | |
| 190 | end | |
| 191 | end) | |
| 192 | ||
| 193 | xpRequested = xpRequested - furnace.xp | |
| 194 | furnaces[furnace.name].xp = 0 | |
| 195 | tableFile.save(furnaces, "#furnaces.lua") | |
| 196 | rednet.broadcast(furnaces, "bbXpShop-r2s") | |
| 197 | ||
| 198 | if xpRequested <= 0 then | |
| 199 | xpRequested = 0 | |
| 200 | break | |
| 201 | end | |
| 202 | end | |
| 203 | end | |
| 204 | end | |
| 205 | end | |
| 206 | ||
| 207 | local function checkFurnaces() | |
| 208 | local checked = 0 | |
| 209 | for _, furnace in pairs(furnaces) do | |
| 210 | os.sleep() | |
| 211 | if furnace.timesSinceLastCheck == nil then | |
| 212 | furnace.timesSinceLastCheck = 0 | |
| 213 | end | |
| 214 | if furnace.timesSinceLastCheck >= checkFurnaceEach and checked < checkFurnaceCount and furnaces[furnace.name].xp < xpFor30levels then | |
| 215 | furnace.timesSinceLastCheck = 0 | |
| 216 | checked = checked + 1 | |
| 217 | local f = peripheral.wrap(furnace.name) | |
| 218 | if f == nil then | |
| 219 | local furnacePeripherals = { peripheral.find("minecraft:furnace") }
| |
| 220 | for _, furnacePeripheral in pairs(furnacePeripherals) do | |
| 221 | local fName = peripheral.getName(furnacePeripheral) | |
| 222 | local inList = false | |
| 223 | for _, furnace2 in pairs(furnaces) do | |
| 224 | if furnace2.name == fName then | |
| 225 | inList = true | |
| 226 | end | |
| 227 | end | |
| 228 | if inList == false then | |
| 229 | furnace.name = fName | |
| 230 | f = peripheral.wrap(furnace.name) | |
| 231 | break | |
| 232 | end | |
| 233 | end | |
| 234 | end | |
| 235 | ||
| 236 | if f == nil then | |
| 237 | error("Furnace not found")
| |
| 238 | end | |
| 239 | ||
| 240 | local fList = f.list() | |
| 241 | ||
| 242 | --take items out | |
| 243 | if fList[3] ~= nil and fList[3].count >= 8 then | |
| 244 | f.pushItems(smeltedChestName, 3, fList[3].count) | |
| 245 | furnaces[furnace.name].xp = furnaces[furnace.name].xp + fList[3].count | |
| 246 | tableFile.save(furnaces, "#furnaces.lua") | |
| 247 | rednet.broadcast(furnaces, "bbXpShop-r2s") | |
| 248 | end | |
| 249 | ||
| 250 | --restock | |
| 251 | if fList[1] == nil or fList[1].count == 0 and furnaces[furnace.name].xp < xpFor30levels then | |
| 252 | local toSmeltPulled = 0 | |
| 253 | for i = 1, 27 do | |
| 254 | if toSmeltPulled < 8 then | |
| 255 | toSmeltPulled = toSmeltPulled + f.pullItems(toSmeltChestName, i, 8 - toSmeltPulled, 1) | |
| 256 | end | |
| 257 | end | |
| 258 | ||
| 259 | local botChest = peripheral.wrap(botChestName) | |
| 260 | while f.list()[2] == nil or f.list()[2].count == 0 do | |
| 261 | local botChestList = botChest.list() | |
| 262 | if botChestList[1] ~= nil and botChestList[1].count > 32 then | |
| 263 | if f.pullItems(botChestName, 1, 1, 2) > 0 then | |
| 264 | break | |
| 265 | end | |
| 266 | else | |
| 267 | invClient.get("minecraft:charcoal.0.", 16, "enderstorage:ender_chest_2", 1)
| |
| 268 | end | |
| 269 | end | |
| 270 | end | |
| 271 | ||
| 272 | getXp() | |
| 273 | else | |
| 274 | furnace.timesSinceLastCheck = furnace.timesSinceLastCheck + 1 | |
| 275 | end | |
| 276 | end | |
| 277 | end | |
| 278 | ||
| 279 | local function actionLoop() | |
| 280 | while true do | |
| 281 | checkFurnaces() | |
| 282 | getXp() | |
| 283 | end | |
| 284 | end | |
| 285 | ||
| 286 | parallel.waitForAny(networkLoop, actionLoop) |