SHOW:
|
|
- or go back to the newest paste.
| 1 | -- == Movement Constants == | |
| 2 | - | local d = "north" |
| 2 | + | local FORWARD = 1 |
| 3 | local BACK = 2 | |
| 4 | local UP = 4 | |
| 5 | - | if (#arg == 3) then |
| 5 | + | local DOWN = 8 |
| 6 | - | width = tonumber(arg[1]) |
| 6 | + | local TURN_RIGHT = 16 |
| 7 | - | depth = tonumber(arg[2]) |
| 7 | + | local TURN_LEFT = 32 |
| 8 | -- == Data == | |
| 9 | -- Constants | |
| 10 | - | print('None or Malformed Size Given, Defaulting to 10x10x2 up')
|
| 10 | + | |
| 11 | local LABEL = os.getComputerLabel() | |
| 12 | local WIRELESS = false | |
| 13 | local SERVER_CHANNEL = 65534 | |
| 14 | local ERROR_SERVER_CHANNEL = 65535 | |
| 15 | local CHANNEL = nil | |
| 16 | -- Mutable Data | |
| 17 | local moves = {}
| |
| 18 | local dt = "right" -- Direction Tangent (right, left) | |
| 19 | local dv = "up" -- Direction Vertical (up, down) | |
| 20 | local refill_lava = false -- Consume picked up lava | |
| 21 | local width, depth, height = 10, 10, 2 | |
| 22 | -- == Peripherals == | |
| 23 | local modem = nil | |
| 24 | - | "minecraft:dye", |
| 24 | + | local peripherals = peripheral.getNames() |
| 25 | for name = 1, #peripherals, 1 do | |
| 26 | if(peripheral.getType(peripherals[name]) == "modem") then | |
| 27 | modem = peripheral.wrap(peripherals[name]) | |
| 28 | WIRELESS = true | |
| 29 | break | |
| 30 | end | |
| 31 | end | |
| 32 | ||
| 33 | if(WIRELESS) then | |
| 34 | if(LABEL == "white") then CHANNEL = 0 | |
| 35 | elseif(LABEL == "orange") then CHANNEL = 1 | |
| 36 | elseif(LABEL == "magenta") then CHANNEL = 2 | |
| 37 | elseif(LABEL == "light_blue") then CHANNEL = 3 | |
| 38 | elseif(LABEL == "yellow") then CHANNEL = 4 | |
| 39 | elseif(LABEL == "lime") then CHANNEL = 5 | |
| 40 | elseif(LABEL == "pink") then CHANNEL = 6 | |
| 41 | elseif(LABEL == "gray" or LABEL == "grey") then CHANNEL = 7 | |
| 42 | elseif(LABEL == "light_gray" or LABEL == "light_grey") then CHANNEL = 8 | |
| 43 | elseif(LABEL == "cyan") then CHANNEL = 9 | |
| 44 | elseif(LABEL == "purple") then CHANNEL = 10 | |
| 45 | elseif(LABEL == "blue") then CHANNEL = 11 | |
| 46 | elseif(LABEL == "brown") then CHANNEL = 12 | |
| 47 | elseif(LABEL == "green") then CHANNEL = 13 | |
| 48 | elseif(LABEL == "red") then CHANNEL = 14 | |
| 49 | elseif(LABEL == "black") then CHANNEL = 15 | |
| 50 | - | function getEnderIndex() |
| 50 | + | |
| 51 | ||
| 52 | if(CHANNEL == nil) then | |
| 53 | c = term.getTextColor() | |
| 54 | - | if(item["name"] == "enderstorage:ender_storage") then |
| 54 | + | term.setTextColor(colors.red) |
| 55 | print("Modem without a label. This robot has no channel!")
| |
| 56 | term.setTextColor(c) | |
| 57 | WIRELESS = false | |
| 58 | else | |
| 59 | modem.open(CHANNEL) | |
| 60 | end | |
| 61 | end | |
| 62 | - | function manageInventory() |
| 62 | + | |
| 63 | - | dropItems() |
| 63 | + | -- Stolen From: http://lua-users.org/wiki/SimpleRound |
| 64 | - | index = getEnderIndex() |
| 64 | + | function round(num, numDecimalPlaces) |
| 65 | - | if(index ~= nil) then |
| 65 | + | local mult = 10^(numDecimalPlaces or 0) |
| 66 | return math.floor(num * mult + 0.5) / mult | |
| 67 | - | turtle.digUp() |
| 67 | + | |
| 68 | - | turtle.placeUp() |
| 68 | + | |
| 69 | function transmit(message) | |
| 70 | if(WIRELESS) then | |
| 71 | modem.transmit(SERVER_CHANNEL, CHANNEL, message) | |
| 72 | end | |
| 73 | end | |
| 74 | - | if(item["name"] ~= "minecraft:coal_block" and item["name"] ~= "minecraft:coal") then |
| 74 | + | |
| 75 | function transmitError(message, forward) | |
| 76 | if(WIRELESS) then | |
| 77 | modem.transmit(ERROR_SERVER_CHANNEL, CHANNEL, message) | |
| 78 | if(forward) then | |
| 79 | transmit(message) | |
| 80 | end | |
| 81 | end | |
| 82 | - | turtle.digUp() |
| 82 | + | |
| 83 | ||
| 84 | function get_file_name(file) | |
| 85 | file = file or debug.getinfo(1,'S').source | |
| 86 | return file:match("^@(.+)$")
| |
| 87 | - | |
| 87 | + | |
| 88 | - | if(turtle.getFuelLevel() < 50) then |
| 88 | + | |
| 89 | HOLD_ITEMS = {
| |
| 90 | "minecraft:coal", | |
| 91 | "minecraft:coal_block", | |
| 92 | "minecraft:bucket" | |
| 93 | } | |
| 94 | ||
| 95 | DROPPED_ITEMS = {
| |
| 96 | "minecraft:stone", | |
| 97 | "minecraft:dirt", | |
| 98 | "minecraft:cobblestone", | |
| 99 | "minecraft:sand", | |
| 100 | "minecraft:gravel", | |
| 101 | "minecraft:redstone", | |
| 102 | "minecraft:flint", | |
| 103 | "minecraft:clay_ball", | |
| 104 | "railcraft:ore_metal", | |
| 105 | "railcraft:ore_metal_poor", | |
| 106 | "extrautils2:ingredients", | |
| 107 | - | turtle.digUp() |
| 107 | + | "chisel:marble2", |
| 108 | "chisel:limestone2", | |
| 109 | "chisel:basalt2", | |
| 110 | -- "minecraft:dye", -- Lapis Lazuli | |
| 111 | "thaumcraft:nugget", | |
| 112 | - | function forward() |
| 112 | + | |
| 113 | "thermalfoundation:material", | |
| 114 | - | turtle.forward() |
| 114 | + | |
| 115 | "thaumcraft:ore_cinnabar", | |
| 116 | "deepresonance:resonating_ore", | |
| 117 | "forestry:apatite" | |
| 118 | - | turtle.turnLeft() |
| 118 | + | |
| 119 | ||
| 120 | - | turtle.forward() |
| 120 | + | |
| 121 | - | turtle.turnLeft() |
| 121 | + | |
| 122 | for slot = 1, SLOT_COUNT, 1 do | |
| 123 | local item = turtle.getItemDetail(slot) | |
| 124 | if(item ~= nil) then | |
| 125 | for filterIndex = 1, #DROPPED_ITEMS, 1 do | |
| 126 | if(item["name"] == DROPPED_ITEMS[filterIndex]) then | |
| 127 | - | turtle.turnRight() |
| 127 | + | |
| 128 | turtle.select(slot) | |
| 129 | - | turtle.forward() |
| 129 | + | |
| 130 | - | turtle.turnRight() |
| 130 | + | |
| 131 | end | |
| 132 | end | |
| 133 | end | |
| 134 | - | function flipDirection() |
| 134 | + | |
| 135 | - | if(d == "north") then |
| 135 | + | |
| 136 | - | d = "south" |
| 136 | + | function getItemIndex(find_item) |
| 137 | - | elseif(d == "south") then |
| 137 | + | if(type(find_item) ~= "string") then |
| 138 | - | d = "north" |
| 138 | + | error("Expected string but got " .. type(find_item))
|
| 139 | - | elseif(d == "west") then |
| 139 | + | |
| 140 | - | d = "east" |
| 140 | + | |
| 141 | - | elseif(d == "east") then |
| 141 | + | |
| 142 | - | d = "west" |
| 142 | + | |
| 143 | if(item["name"] == find_item) then | |
| 144 | - | |
| 144 | + | |
| 145 | end | |
| 146 | end | |
| 147 | - | function turnAround(tier) |
| 147 | + | |
| 148 | - | if(tier % 2 == 1) then |
| 148 | + | |
| 149 | - | if(d == "north" or d == "east") then |
| 149 | + | |
| 150 | - | rightTurn() |
| 150 | + | |
| 151 | - | elseif(d == "south" or d == "west") then |
| 151 | + | function countAllOf(search_item) |
| 152 | - | leftTurn() |
| 152 | + | if(type(search_item) ~= "string") then |
| 153 | error("Expected string but got " .. type(search_item))
| |
| 154 | end | |
| 155 | - | if(d == "north" or d == "east") then |
| 155 | + | count = 0 |
| 156 | - | leftTurn() |
| 156 | + | |
| 157 | - | elseif(d == "south" or d == "west") then |
| 157 | + | |
| 158 | - | rightTurn() |
| 158 | + | |
| 159 | if(item["name"] == search_item) then | |
| 160 | count = count + turtle.getItemCount() | |
| 161 | end | |
| 162 | end | |
| 163 | end | |
| 164 | return count | |
| 165 | - | function riseTier() |
| 165 | + | |
| 166 | - | turtle.turnRight() |
| 166 | + | |
| 167 | - | turtle.turnRight() |
| 167 | + | function countStoredFuel() |
| 168 | return countAllOf("minecraft:coal") * 80 + countAllOf("minecraft:coal_block") * 720 + countAllOf("minecraft:lava_bucket") * 1000
| |
| 169 | - | turtle.digUp() |
| 169 | + | |
| 170 | - | turtle.up() |
| 170 | + | |
| 171 | function coalesce() | |
| 172 | for slot = 1, SLOT_COUNT - 1, 1 do | |
| 173 | local base_item = turtle.getItemDetail(slot) | |
| 174 | if(base_item ~= nil) then | |
| 175 | - | for tier = 1, height, 1 do |
| 175 | + | for i = slot + 1, SLOT_COUNT, 1 do |
| 176 | local item = turtle.getItemDetail(slot) | |
| 177 | if(item ~= nil and base_item["name"] == item["name"]) then | |
| 178 | turtle.select(i) | |
| 179 | - | print("Turtle is out of fuel, Powering Down...")
|
| 179 | + | turtle.transferTo(slot) |
| 180 | end | |
| 181 | end | |
| 182 | - | forward() |
| 182 | + | |
| 183 | - | print(string.format("Row: %d Col: %d", row, col))
|
| 183 | + | |
| 184 | end | |
| 185 | ||
| 186 | - | turnAround(tier) |
| 186 | + | function getNumberFreeSlots() |
| 187 | local freeSlots = 0 | |
| 188 | - | manageInventory() |
| 188 | + | |
| 189 | local item = turtle.getItemDetail(slot) | |
| 190 | - | riseTier() |
| 190 | + | if(item == nil) then |
| 191 | freeSlots = freeSlots + 1 | |
| 192 | end | |
| 193 | end | |
| 194 | - | start() |
| 194 | + | return freeSlots |
| 195 | end | |
| 196 | ||
| 197 | function shouldReturnItem(item) | |
| 198 | - | |
| 198 | + | if(refill_lava and item["name"] == "minecraft:lava_bucket") then |
| 199 | return false | |
| 200 | end | |
| 201 | for filterIndex = 1, #HOLD_ITEMS, 1 do | |
| 202 | if(item["name"] == HOLD_ITEMS[filterIndex]) then | |
| 203 | return false | |
| 204 | end | |
| 205 | end | |
| 206 | return true | |
| 207 | end | |
| 208 | ||
| 209 | function manageInventory(dumpAll) | |
| 210 | transmit("Managing Inventory")
| |
| 211 | index = turtle.getSelectedSlot() | |
| 212 | while(index ~= nil) do | |
| 213 | index = getItemIndex("enderstorage:ender_storage")
| |
| 214 | if(index == nil) then break end | |
| 215 | digUp() | |
| 216 | dropItems() | |
| 217 | turtle.select(index) | |
| 218 | if(turtle.placeUp()) then | |
| 219 | break | |
| 220 | else | |
| 221 | print("Chest not placed correctly... Trying again")
| |
| 222 | end | |
| 223 | end | |
| 224 | local success, data = turtle.inspectUp() | |
| 225 | if(index == nil or (success and data.name ~= "enderstorage:ender_storage")) then | |
| 226 | transmitError("Ender Storage Missing")
| |
| 227 | return false | |
| 228 | end | |
| 229 | -- Chest is now deployed | |
| 230 | coalesce() | |
| 231 | for slot = 1, SLOT_COUNT, 1 do | |
| 232 | local item = turtle.getItemDetail(slot) | |
| 233 | if(item ~= nil) then | |
| 234 | if(dumpAll or shouldReturnItem(item)) then | |
| 235 | turtle.select(slot) | |
| 236 | turtle.dropUp() | |
| 237 | elseif not shouldReturnItem(item) and turtle.getItemSpace(slot) <= 0 then | |
| 238 | for i = slot + 1, SLOT_COUNT, 1 do | |
| 239 | local dump = turtle.getItemDetail(i) | |
| 240 | if(dump ~= nil and item["name"] == dump["name"]) then | |
| 241 | turtle.select(i) | |
| 242 | turtle.dropUp() | |
| 243 | end | |
| 244 | end | |
| 245 | end | |
| 246 | end | |
| 247 | end | |
| 248 | -- Items are now stored | |
| 249 | turtle.select(1) | |
| 250 | if(getNumberFreeSlots() >= 1) then | |
| 251 | digUp() | |
| 252 | else | |
| 253 | transmitError("Cannot Pick Up Ender Storage, Full Inventory")
| |
| 254 | print("Cannot pick up Ender Storage, full inventory")
| |
| 255 | return false | |
| 256 | end | |
| 257 | return true | |
| 258 | end | |
| 259 | ||
| 260 | function checkFuel() | |
| 261 | if(turtle.getFuelLevel() < 25) then | |
| 262 | -- transmit("Attempting Refuel...")
| |
| 263 | print("Attempting Refuel...")
| |
| 264 | for slot = 1, SLOT_COUNT, 1 do | |
| 265 | turtle.select(slot) | |
| 266 | if(turtle.refuel(1)) then | |
| 267 | -- transmit("Refuel Success! Fuel: " .. turtle.getFuelLevel())
| |
| 268 | return true | |
| 269 | end | |
| 270 | end | |
| 271 | return false | |
| 272 | else | |
| 273 | return true | |
| 274 | end | |
| 275 | end | |
| 276 | ||
| 277 | function digUp() | |
| 278 | local success, data = turtle.inspectUp() | |
| 279 | if(success and data.name == "minecraft:lava" and bucket_index ~= nil and getNumberFreeSlots() > 1) then | |
| 280 | -- transmit("Bucketing Lava Up...")
| |
| 281 | turtle.select(bucket_index) | |
| 282 | turtle.placeUp() | |
| 283 | lava_index = getItemIndex("minecraft:lava_bucket")
| |
| 284 | if(refill_lava and lava_index and turtle.getFuelLevel() + 1000 < turtle.getFuelLimit()) then | |
| 285 | -- transmit("Consumed newly bucketed lava. Fuel: " .. turtle.getFuelLevel())
| |
| 286 | turtle.select(getItemIndex("minecraft:lava_bucket"))
| |
| 287 | turtle.refuel() | |
| 288 | turtle.transferTo(bucket_index) | |
| 289 | end | |
| 290 | bucket_index = getItemIndex("minecraft:bucket")
| |
| 291 | end | |
| 292 | local block_above = data.name | |
| 293 | while(turtle.detectUp()) do | |
| 294 | local success, data = turtle.inspectUp() | |
| 295 | if(success) then | |
| 296 | block_above = data.name | |
| 297 | end | |
| 298 | if(block_above == "minecraft:gravel" or block_above == "minecraft:sand") then | |
| 299 | turtle.digUp() | |
| 300 | os.sleep(0.75) | |
| 301 | else | |
| 302 | turtle.digUp() | |
| 303 | end | |
| 304 | end | |
| 305 | end | |
| 306 | ||
| 307 | function detectAndDig() | |
| 308 | slot = turtle.getSelectedSlot() | |
| 309 | bucket_index = getItemIndex("minecraft:bucket")
| |
| 310 | local success, data = turtle.inspect() | |
| 311 | if(success and data.name == "minecraft:lava" and bucket_index ~= nil and getNumberFreeSlots() > 1) then | |
| 312 | -- transmit("Bucketing Lava...")
| |
| 313 | turtle.select(bucket_index) | |
| 314 | turtle.place() | |
| 315 | lava_index = getItemIndex("minecraft:lava_bucket")
| |
| 316 | if(refill_lava and lava_index and turtle.getFuelLevel() + 1000 < turtle.getFuelLimit()) then | |
| 317 | -- transmit("Consumed newly bucketed lava. Fuel: " .. turtle.getFuelLevel())
| |
| 318 | turtle.select(lava_index) | |
| 319 | turtle.refuel() | |
| 320 | turtle.transferTo(bucket_index) | |
| 321 | end | |
| 322 | bucket_index = getItemIndex("minecraft:bucket")
| |
| 323 | end | |
| 324 | while(turtle.detect()) do | |
| 325 | turtle.dig() | |
| 326 | end | |
| 327 | digUp() | |
| 328 | local success, data = turtle.inspectDown() | |
| 329 | if(success and data.name == "minecraft:lava" and bucket_index ~= nil and getNumberFreeSlots() > 1) then | |
| 330 | -- transmit("Bucketing Lava Down...")
| |
| 331 | turtle.select(bucket_index) | |
| 332 | turtle.placeDown() | |
| 333 | lava_index = getItemIndex("minecraft:lava_bucket")
| |
| 334 | if(refill_lava and lava_index and turtle.getFuelLevel() + 1000 < turtle.getFuelLimit()) then | |
| 335 | -- transmit("Consumed newly bucketed lava. Fuel: " .. turtle.getFuelLevel())
| |
| 336 | turtle.select(getItemIndex("minecraft:lava_bucket"))
| |
| 337 | turtle.refuel() | |
| 338 | turtle.transferTo(bucket_index) | |
| 339 | end | |
| 340 | bucket_index = getItemIndex("minecraft:bucket")
| |
| 341 | end | |
| 342 | if(turtle.detectDown()) then | |
| 343 | turtle.digDown() | |
| 344 | end | |
| 345 | turtle.select(slot) | |
| 346 | end | |
| 347 | ||
| 348 | function invertMove(move) | |
| 349 | if move == FORWARD or move == UP or move == TURN_RIGHT then | |
| 350 | return move * 2 | |
| 351 | elseif move == BACK or move == DOWN or move == TURN_LEFT then | |
| 352 | return move / 2 | |
| 353 | end | |
| 354 | return move | |
| 355 | end | |
| 356 | ||
| 357 | function stackSmash() | |
| 358 | local i = 1 | |
| 359 | while i <= #moves do | |
| 360 | if(moves[i] == invertMove(moves[i + 1])) then | |
| 361 | for j = 1, 2, 1 do | |
| 362 | table.remove(moves, i) | |
| 363 | end | |
| 364 | i = i - (2 - 1) | |
| 365 | end | |
| 366 | if(moves[i] == moves[i+1] and moves[i] == moves[i+2] and moves[i] == moves[i+3] and (moves[i] == TURN_LEFT or moves[i] == TURN_RIGHT)) then | |
| 367 | for j = 1, 4, 1 do | |
| 368 | table.remove(moves, i) | |
| 369 | end | |
| 370 | i = i - (4 - 1) | |
| 371 | end | |
| 372 | i = i + 1 | |
| 373 | end | |
| 374 | end | |
| 375 | ||
| 376 | function forward(times) | |
| 377 | times = times or 1 | |
| 378 | for i = 1, times, 1 do | |
| 379 | if(not checkFuel()) then | |
| 380 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 381 | error("Turtle is out of fuel, Powering Down...")
| |
| 382 | end | |
| 383 | if(turtle.forward()) then | |
| 384 | table.insert(moves, FORWARD) | |
| 385 | stackSmash() | |
| 386 | else | |
| 387 | return false | |
| 388 | end | |
| 389 | end | |
| 390 | return true | |
| 391 | end | |
| 392 | ||
| 393 | function back(times) | |
| 394 | times = times or 1 | |
| 395 | for i = 1, times, 1 do | |
| 396 | if(not checkFuel()) then | |
| 397 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 398 | error("Turtle is out of fuel, Powering Down...")
| |
| 399 | end | |
| 400 | if(turtle.back()) then | |
| 401 | table.insert(moves, BACK) | |
| 402 | stackSmash() | |
| 403 | else | |
| 404 | return false | |
| 405 | end | |
| 406 | end | |
| 407 | return true | |
| 408 | end | |
| 409 | ||
| 410 | function up(times) | |
| 411 | times = times or 1 | |
| 412 | for i = 1, times, 1 do | |
| 413 | if(not checkFuel()) then | |
| 414 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 415 | error("Turtle is out of fuel, Powering Down...")
| |
| 416 | end | |
| 417 | if(turtle.up()) then | |
| 418 | table.insert(moves, UP) | |
| 419 | stackSmash() | |
| 420 | else | |
| 421 | return false | |
| 422 | end | |
| 423 | end | |
| 424 | return true | |
| 425 | end | |
| 426 | ||
| 427 | function down(times) | |
| 428 | times = times or 1 | |
| 429 | for i = 1, times, 1 do | |
| 430 | if(not checkFuel()) then | |
| 431 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 432 | error("Turtle is out of fuel, Powering Down...")
| |
| 433 | end | |
| 434 | if(turtle.down()) then | |
| 435 | table.insert(moves, DOWN) | |
| 436 | stackSmash() | |
| 437 | else | |
| 438 | return false | |
| 439 | end | |
| 440 | end | |
| 441 | return true | |
| 442 | end | |
| 443 | ||
| 444 | function turnLeft(times) | |
| 445 | times = times or 1 | |
| 446 | for i = 1, times, 1 do | |
| 447 | if(not checkFuel()) then | |
| 448 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 449 | error("Turtle is out of fuel, Powering Down...")
| |
| 450 | end | |
| 451 | if(turtle.turnLeft()) then | |
| 452 | table.insert(moves, TURN_LEFT) | |
| 453 | stackSmash() | |
| 454 | else | |
| 455 | return false | |
| 456 | end | |
| 457 | end | |
| 458 | return true | |
| 459 | end | |
| 460 | ||
| 461 | function turnRight(times) | |
| 462 | times = times or 1 | |
| 463 | for i = 1, times, 1 do | |
| 464 | if(not checkFuel()) then | |
| 465 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 466 | error("Turtle is out of fuel, Powering Down...")
| |
| 467 | end | |
| 468 | if(turtle.turnRight()) then | |
| 469 | table.insert(moves, TURN_RIGHT) | |
| 470 | stackSmash() | |
| 471 | else | |
| 472 | return false | |
| 473 | end | |
| 474 | end | |
| 475 | return true | |
| 476 | end | |
| 477 | ||
| 478 | function leftTurn() | |
| 479 | turnLeft() | |
| 480 | detectAndDig() | |
| 481 | forward() | |
| 482 | turnLeft() | |
| 483 | detectAndDig() | |
| 484 | end | |
| 485 | ||
| 486 | ||
| 487 | function rightTurn() | |
| 488 | turnRight() | |
| 489 | detectAndDig() | |
| 490 | forward() | |
| 491 | turnRight() | |
| 492 | detectAndDig() | |
| 493 | end | |
| 494 | ||
| 495 | function flipDirection(logging) | |
| 496 | if(logging == nil) then logging = true end | |
| 497 | if(logging) then | |
| 498 | turnLeft(2) | |
| 499 | else | |
| 500 | turtle.turnLeft() | |
| 501 | turtle.turnLeft() | |
| 502 | end | |
| 503 | end | |
| 504 | ||
| 505 | function flipDirectionTangent() | |
| 506 | if(dt == "right") then | |
| 507 | dt = "left" | |
| 508 | elseif(dt == "left") then | |
| 509 | dt = "right" | |
| 510 | end | |
| 511 | end | |
| 512 | ||
| 513 | function flipDirectionVertical() | |
| 514 | if(dv == "up") then | |
| 515 | dv = "down" | |
| 516 | elseif(dv == "down") then | |
| 517 | dv = "up" | |
| 518 | end | |
| 519 | end | |
| 520 | ||
| 521 | function turnAround() | |
| 522 | if(dt == "right") then | |
| 523 | rightTurn() | |
| 524 | elseif(dt == "left") then | |
| 525 | leftTurn() | |
| 526 | end | |
| 527 | flipDirectionTangent() | |
| 528 | end | |
| 529 | ||
| 530 | function riseTier(delta) | |
| 531 | flipDirection() | |
| 532 | delta = delta or 1 -- Default delta is 1 | |
| 533 | for step = 1, delta, 1 do | |
| 534 | digUp() | |
| 535 | turtle.digDown() | |
| 536 | if(dv == "up") then | |
| 537 | up() | |
| 538 | elseif(dv == "down") then | |
| 539 | down() | |
| 540 | end | |
| 541 | end | |
| 542 | end | |
| 543 | ||
| 544 | function returnToStart() | |
| 545 | flipDirection(false) | |
| 546 | for i = #moves, 1, -1 do | |
| 547 | move = moves[i] | |
| 548 | if move == UP or move == DOWN or move == TURN_LEFT or move == TURN_RIGHT then | |
| 549 | move = invertMove(move) | |
| 550 | end | |
| 551 | if move == FORWARD then | |
| 552 | detectAndDig() | |
| 553 | forward() | |
| 554 | elseif move == BACK then back() | |
| 555 | elseif move == UP then up() | |
| 556 | elseif move == DOWN then down() | |
| 557 | elseif move == TURN_LEFT then turnLeft() | |
| 558 | elseif move == TURN_RIGHT then turnRight() | |
| 559 | end | |
| 560 | end | |
| 561 | flipDirection(false) | |
| 562 | end | |
| 563 | ||
| 564 | function start() | |
| 565 | transmit("Begin " .. depth .. "x" .. width .. "x" .. height .. " " .. dv .. " and " .. dt)
| |
| 566 | print("Volume: D x W x H = " .. depth .. " x " .. width .. " x " .. height)
| |
| 567 | print("Direction: " .. dv .. " and to the " .. dt)
| |
| 568 | if(WIRELESS) then | |
| 569 | print("Wireless is Enabled")
| |
| 570 | end | |
| 571 | count = 0 | |
| 572 | delta = 3 | |
| 573 | total = depth * width * height | |
| 574 | height = math.max(height - 1, 1) | |
| 575 | tier = math.min(height, 2) | |
| 576 | while tier <= height do | |
| 577 | for col = 1, width, 1 do | |
| 578 | for row = 1, depth - 1, 1 do | |
| 579 | if(not checkFuel()) then | |
| 580 | transmitError("Turtle is out of fuel, Powering Down...")
| |
| 581 | error("Turtle is out of fuel, Powering Down...")
| |
| 582 | return | |
| 583 | end | |
| 584 | if(getNumberFreeSlots() < 1) then | |
| 585 | -- transmit("Inventory Full, Dropping Items...")
| |
| 586 | coalesce() | |
| 587 | dropItems() | |
| 588 | if(getNumberFreeSlots() < 1) then | |
| 589 | if(not manageInventory()) then | |
| 590 | transmitError("Turtle cannot find ender chest... Returning to Start")
| |
| 591 | print("Turtle cannot find ender chest...")
| |
| 592 | returnToStart() | |
| 593 | return | |
| 594 | end | |
| 595 | end | |
| 596 | end | |
| 597 | detectAndDig() | |
| 598 | count = count + delta | |
| 599 | while not forward() do | |
| 600 | checkFuel() | |
| 601 | if turtle.detect() then | |
| 602 | turtle.dig() | |
| 603 | else | |
| 604 | turtle.attack() | |
| 605 | end | |
| 606 | end | |
| 607 | print(string.format("Row: %d Col: %d Tier: %d Fuel: %d", row, col, tier, turtle.getFuelLevel()))
| |
| 608 | end | |
| 609 | if(col ~= width) then | |
| 610 | turnAround() | |
| 611 | end | |
| 612 | transmit("Completed Column #" .. col .. " Fuel: " .. turtle.getFuelLevel() .. " Completion: " .. count .. "/" .. total .. " (" .. round(100*count/total, 3) .. "%)")
| |
| 613 | end | |
| 614 | transmit("Completed Layer #" .. tier .. " Fuel: " .. turtle.getFuelLevel() .. " Completion: " .. count .. "/" .. total .. " (" .. round(100*count/total) .. "%)")
| |
| 615 | if(tier < height) then | |
| 616 | if(tier + 2 < height) then | |
| 617 | delta = 3 | |
| 618 | tier = tier + 2 | |
| 619 | riseTier(3) | |
| 620 | elseif(tier + 1 < height) then | |
| 621 | delta = 2 | |
| 622 | tier = tier + 1 | |
| 623 | riseTier(2) | |
| 624 | else | |
| 625 | delta = 1 | |
| 626 | riseTier() | |
| 627 | end | |
| 628 | end | |
| 629 | tier = tier + 1 | |
| 630 | end | |
| 631 | transmit("Completed All Layers, Returning to Start" .. " Fuel: " .. turtle.getFuelLevel())
| |
| 632 | returnToStart() | |
| 633 | transmit("At Start" .. " Fuel: " .. turtle.getFuelLevel())
| |
| 634 | if(not manageInventory(true)) then | |
| 635 | transmit("Turtle cannot find ender chest, This is a serious issue...")
| |
| 636 | print("Turtle cannot find ender chest, This is a serious issue...")
| |
| 637 | end | |
| 638 | transmit("End " .. depth .. "x" .. width .. "x" .. height .. " " .. dv .. " and " .. dt)
| |
| 639 | end | |
| 640 | ||
| 641 | if (#arg >= 3) then | |
| 642 | depth = tonumber(arg[1]) | |
| 643 | width = tonumber(arg[2]) | |
| 644 | height = tonumber(arg[3]) | |
| 645 | for i = 4, #arg, 1 do | |
| 646 | if arg[i] == "flip" then flipDirection() | |
| 647 | elseif arg[i] == "up" or arg[i] == "down" then dv = arg[i] | |
| 648 | elseif arg[i] == "left" or arg[i] == "right" then dt = arg[i] | |
| 649 | elseif arg[i] == "refill" then refill_lava = true | |
| 650 | else error("Unkown Argument #" .. i .. ": " .. arg[i])
| |
| 651 | end | |
| 652 | end | |
| 653 | else | |
| 654 | error("Usage: " .. get_file_name() .. " depth width height [left] [right] [up] [down] [flip]\n - left -- robot goes left (overrides right)\n - right -- robot goes right [default] (overrides left)\n - up -- robot goes up [default] (overrides down)\n - down -- robot goes down (overrides up)\n - flip -- robot immediately rotates 180 degrees\n - refill -- robot consumes lava buckets [disabled by default]")
| |
| 655 | end | |
| 656 | ||
| 657 | start() |