View difference between Paste ID: GcqTWZLE and yjmmJUhn
SHOW: | | - or go back to the newest paste.
1
--[[TO DO:
2
Version 3.0.4
3
Recent Changes:
4
   Everything has been drastically updated. Now mines three at a time.
5
   -Try quarry -help ! Its pretty awesome
6
   -doCheckFuel argument changed to a true or false after
7
   -rednet argument changed to a true or false after
8
   -Now will go back to start when it hits bedrock
9
   -Renamed "openSlots" to "keepOpen" in arguments
10
   -Changed "-DEFAULT-" to "-DEFAULT" to match others
11
]]
12
--[[ToDo:
13
1. Session Persistence (do for 3.0.5, see idea below)
14
2. Fuel Usage Check. Make a more advanced algorithm (Evan is working on it)
15
3. Maybe send basic commands from receiver program e.g. Stop
16
]]
17
--Defining things
18
19
-------Defaults for Arguments----------
20
--Arguments assignable by text
21
local x,y,z = 3,3,3 --These are just in case tonumber fails
22
local inverted = false --False goes from top down, true goes from bottom up [Default false] 
23
local rednetEnabled = false --Default rednet on or off  [Default false]
24
--Arguments assignable by tArgs
25
local dropSide = "front" --Side it will eject to when full or done [Default "front"]
26
local careAboutResources = true --Will not stop mining once inventory full if false [Default true]
27
local doCheckFuel = true --Perform fuel check [Default true]
28
local doRefuel = false --Whenever it comes to start location will attempt to refuel from inventory [Default false]
29
local invCheckFreq = 10 --Will check for inventory full every <-- moved spaces [Default 10]
30
local keepOpen = 1 --How many inventory slots it will attempt to keep open at all times [Default 1]
31
--Standard rednet channels
32
local channels = {
33
send = os.getComputerID()  ,
34
receive = 10 ,
35
confirm = "Confirm"
36
}
37
38
local help_paragraph = [[
39
-DEFAULT: This will ignore all arguments and prompts and use defaults
40
-vanilla: This will ignore all arguments except for dimensions
41
-dim: [num] [num] [num] This sets the dimensions of the quarry
42
-invert: [t/f] This sets whether invert is true or false
43
-rednet: [t/f] This sets whether it will attempt to make a rednet connection
44
-sendChannel: [num] This sets the channel the turtle will attempt to send on
45
-receiveChannel: [num] This sets the channel the turtle will attempt to receive on
46
-doRefuel: Changes whether or not the turtle will refuel itself with coal when it finishes (opposite of written config)
47
-doCheckFuel: Changes whether or not the turtle will check its fuel level before running (opposite of written config)
48
-chest: [chest side] Changes what side turtle will output to
49
-keepOpen: [num] How many slots of the inventory turtle will try to keep open (Will then auto-empty)
50
-invCheckFreq: [num] How many blocks before full inventory checks
51
Examples [1]:
52
 The minimum amount necessary to start a turtle automatically would be one of these two
53
 ---------
54
 quarry -dim 3 3 3 -invert false -rednet false
55
 ---------
56
 quarry -dim 3 3 3 -vanilla
57
 ---------
58
Examples [2]: 
59
 If you wanted start a quarry that has 
60
 rednet on channels 500 and 501, outputs 
61
 to a chest below itself, is inverted,
62
 and has the dimesions 5x5x21, then here
63
 is what you would type: (Remember that
64
 order does not matter)
65
 ----------
66
 quarry -recieveChannel 501 -sendChannel 500 -invert true -dim 5 5 21 -chest bottom -rednet true
67
Examples [2] (cont.):
68
 Now, this may be very long, but it is meant for people who want to make automated quarries with
69
 the same settings every time (or with variable setting)
70
Examples [3]:
71
 If you are playing softcore then you
72
 can do
73
 ---------
74
 quarry -doCheckFuel false
75
 ---------
76
 Followed by any other arguments
77
Tips:
78
 You don't actually have to type out "false" or "true" if you don't want. It actaully just checks if the first
79
 letter is "t", so you (usually) don't have to put anything at all. Putting the whole word just helps with clarity
80
Internal Config: 
81
 At the top of the program, right below the changelog is a written config. Anything not specified by arguments
82
 will be taken from here. If you have a quarry setup you use a lot, you could just edit the config and then
83
 type in the following:
84
 ----------
85
 quarry -DEFAULT
86
]]
87
88
--[[Idea for session persistence:
89
If there is an argument "-restore" then check for the restart file. The restart file will be
90
called e.g. CivilQuarryRestore..turtle.getComputerID() or something It will contain all the pos data
91
as well as relxpos, and all the arguments that were changed in the first. Also, it will automatically
92
set doCheckFuel to false ]]
93
94
--Parsing help for display
95
--[[The way the help table works:
96
All help indexes are numbered. There is a help[i].title that contains the title,
97
and the other lines are in help[i][1] - help[i][#help[i] ]
98
Different lines (e.g. other than first) start with a space.
99
As of now, the words are not wrapped, fix that later]]
100
local help = {}
101
local i = 0
102
local titlePattern = ".-%:" --Find the beginning of the line, then characters, then a ":"
103
local textPattern = "%:.+" --Find a ":", then characters until the end of the line
104
for a in help_paragraph:gmatch("\n?.-\n") do --Matches in between newlines
105
local current = string.sub(a,1,-2).."" --Concatenate Trick
106
if string.sub(current,1,1) ~= " " then
107
i = i + 1
108
help[i] = {}
109
help[i].title = string.sub(string.match(current, titlePattern),1,-2)..""
110
help[i][1] = string.sub(string.match(current,textPattern) or " ",3,-1)
111
elseif string.sub(current,1,1) == " " then
112
table.insert(help[i], string.sub(current,2, -1).."")
113
end
114
end
115
116
117
local supportsRednet = (peripheral.wrap("right") ~= nil)
118
119
local tArgs = {...}
120
--You don't care about these
121
local xPos,yPos,zPos,facing,percent,mined,moved,relxPos, rowCheck, connected, isInPath
122
    = 0,   1,   1,   0,     0,      0,    0,    1,       "right",  false,     true
123
124
local totals = {cobble = 0, fuel = 0, other = 0} -- Total for display (cannot go inside function)
125
function count() --Done any time inventory dropped and at end
126
slot = {}        --1: Cobble 2: Fuel 3:Other
127
for i=1, 16 do   --[1] is type, [2] is number
128
slot[i] = {}
129
slot[i][2] = turtle.getItemCount(i)
130
end
131
slot[1][1] = 1   -- = Assumes Cobble/Main
132
for i=1, 16 do   --Cobble Check
133
turtle.select(i)
134
if turtle.compareTo(1)  then
135
slot[i][1] = 1
136
totals.cobble = totals.cobble + slot[i][2]
137
elseif turtle.refuel(0) then
138
slot[i][1] = 2
139
totals.fuel = totals.fuel + slot[i][2]
140
else
141
slot[i][1] = 3
142
totals.other = totals.other + slot[i][2]
143
end
144
end
145
turtle.select(1)
146
end
147
local function checkFuel()
148
return turtle.getFuelLevel()
149
end
150
local function isFull(slots)
151
slots = slots or 16
152
local numUsed = 0
153
sleep(0.5)
154
for i=1, slots do
155
if turtle.getItemCount(i) > 0 then numUsed = numUsed + 1 end
156
end
157
if numUsed >= slots then return true end
158
return false
159
end
160
161
 -----------------------------------------------------------------
162
--Input Phase
163
local function screen(xPos,yPos)
164
xPos, yPos = xPos or 1, yPos or 1
165
term.setCursorPos(xPos,yPos); term.clear(); end
166
local function screenLine(xPos,yPos)
167
term.setCursorPos(xPos,yPos); term.clearLine(); end
168
169
screen(1,1)
170
print("----- Welcome to Quarry! -----")
171
print("")
172
173
local sides = {top = "top", right = "right", left = "left", bottom = "bottom", front = "front"} --Used to whitelist sides
174
local errorT = {num = "Numbers not recognized", zero = "Variable is out of range" }
175
local changedT = {}
176
changedT.new = function(key, value) changedT[#changedT+1] = {[key] = value} end
177
changedT.getPair = function(i) for a, b in pairs(changedT[i]) do return a, b end end
178
local function capitalize(text) return (string.upper(string.sub(text,1,1))..string.sub(text,2,-1)) end
179
local function assert(condition, message, section) section = section or "[Blank]"; if condition then return condition else error("Error: "..message.."\nin section "..section, 0) end end
180
local function checkNum(number, section) return assert(tonumber(number),errorT.num, section) end
181
tArgs.checkStart = function(num) tArgs[tArgs[num]] = num end
182
--tArgs.checkStart = function(num) tArgs.t[tArgs[num]] = {num, tArgs.t[num]} end --If you think this is needed
183
for i=1, #tArgs do tArgs.checkStart(i) end
184
185-
if tArgs["help"] or tArgs["-help"] or tArgs["-?"]
185+
if tArgs["help"] or tArgs["-help"] or tArgs["-?"] then
186
print("You have selected help, press any key to continue"); print("Use arrow keys to naviate, q to quit"); os.pullEvent("key")
187
local pos = 1
188
local key = 0
189
while pos <= #help and key ~= keys.q do
190
if pos < 1 then pos = 1 end
191
screen(1,1) 
192
print(help[pos].title)
193
for a=1, #help[pos] do print(help[pos][a]) end
194
repeat
195
_, key = os.pullEvent("key")
196
until key == 200 or key == 208 or key == keys.q
197
if key == 200 then pos = pos - 1 end
198
if key == 208 then pos = pos + 1 end
199
end
200
error("",0)
201
end
202
203
if not tArgs["-DEFAULT"] then
204
local section = "Dimensions"
205
--Dimesnions
206
if tArgs["-dim"] then local num = tArgs["-dim"];
207
x = checkNum(tArgs[num + 1],section); z = checkNum(tArgs[num + 2],section); y = checkNum(tArgs[num + 3],section)
208
else
209
print("What dimensions?")
210
print("")
211
--This will protect from negatives, letters, and decimals
212
term.write("Length: ")
213
x = math.floor(math.abs(tonumber(io.read()) or x))
214
term.write("Width: ")
215
z = math.floor(math.abs(tonumber(io.read()) or z))
216
term.write("Height: ")
217
y = math.floor(math.abs(tonumber(io.read()) or y))
218
end
219
changedT.new("x",x); changedT.new("z",z); changedT.new("y",y)
220
assert(x~=0, errorT.zero, section); assert(z~=0, errorT.zero, section); assert(y~=0, errorT.zero, section)
221
assert(not(x == 1 and y == 1 and z == 1) ,"1, 1, 1 dosen't work well at all, try again", section)
222
if not tArgs["-vanilla"] then
223
--Invert
224
if tArgs["-invert"] then
225
inverted = (string.lower(string.sub(tArgs[tArgs["-invert"]+1] or "",1,1)) == "t") else
226
term.write("Inverted? ")
227
inverted = (string.lower(string.sub(io.read(),1,1)) == "y")
228
end
229
changedT.new("Inverted", inverted)
230
--Rednet
231
if supportsRednet then
232
if tArgs["-rednet"] then 
233
rednetEnabled = (string.lower(string.sub(tArgs[tArgs["-rednet"]+1] or "",1,1)) == "t")
234
else term.write("Rednet? "); rednetEnabled = (string.lower(string.sub(io.read(),1,1)) == "y")
235
end
236
changedT.new("Rednet Enabled", rednetEnabled)
237
if tArgs["-sendChannel"] then
238
channels.send = assert(tonumber(tArgs[tArgs["-sendChannel"]+1]), errorT.num)
239
assert(channels.send > 0 and channels.send < 65535, errorT.zero)
240
changedT.new("Send Channel",channels.send) end
241
if tArgs["-receiveChannel"] then
242
channels.receive = assert(tonumber(tArgs[tArgs["-receiveChannel"]+1]), errorT.num)
243
assert(channels.receive > 0 and channels.receive < 65535 and channels.receive ~= channels.send, errorT.zero)
244
changedT.new("Receive Channel",channels.receive) end
245
end
246
--Fuel
247
if tArgs["-doRefuel"] then doRefuel = not doRefuel; changedT.new("Do Refuel",doRefuel) end
248
if tArgs["-doCheckFuel"] then
249
doCheckFuel = (string.lower(string.sub(tArgs[tArgs["-doCheckFuel"]+1] or "",1,1)) == "t"); changedT.new("Do Check Fuel", doCheckFuel) end
250
if tArgs["-chest"] then
251
dropSide = sides[tArgs[tArgs["-chest"]+1]] or dropSide; changedT.new("Chest Side",dropSide) end
252
--Misc
253
if tArgs["-invCheckFreq"] then
254
invCheckFreq = math.abs(math.floor(checkNum(tArgs[tArgs["-invCheckFreq"]+1],"Inventory Check Frequency")))
255
changedT.new("Inventory Check Frequency",invCheckFreq) end
256
assert(invCheckFreq ~= 0, errorT.zero, "Inventory Check Frequency")
257
if tArgs["-keepOpen"] then
258
keepOpen = math.abs(math.floor(checkNum(tArgs[tArgs["-keepOpen"]+1],"Open Slots")))
259
changedT.new("Slots to keep open", keepOpen) end
260
assert(keepOpen ~= 0 and keepOpen < 16, errorT.zero, "Open Slots")if tArgs["-ignoreResources"] then careAboutResources = false end
261
end; end
262
263
local area = x*z
264
local volume = x*y*z
265
local lastHeight = y%3
266
local dispY = y
267
y = math.floor(y/3)*3
268
local moveVolume = (area*(y/3 + math.ceil(lastHeight/2)))
269
270
--Getting Fuel
271
if doCheckFuel then --Calculating Needed Fuel
272
local neededFuel = moveVolume
273
if neededFuel < 100 then
274
neededFuel = 100 else neededFuel = neededFuel * 2 --Placeholder algorithm until Evan is done
275
end
276
if checkFuel() < neededFuel then
277
screen(1,1)
278
print("More Fuel Needed")
279
print("Current Fuel: ",checkFuel()," Needed: ",neededFuel)
280
print("Place fuel in Bottom Right, press any key")
281
os.pullEvent("char")
282
turtle.select(16)
283
while checkFuel() < neededFuel do
284
if not turtle.refuel(1) then
285
term.clearLine()
286
print("Still too little fuel")
287
term.clearLine()
288
print("Press a key to resume fueling")
289
os.pullEvent("char")
290
end
291
local x,y = term.getCursorPos()
292
print(checkFuel().." Fuel")
293
term.setCursorPos(x,y)
294
end
295
print(checkFuel().." Units of Fuel")
296
sleep(3)
297
turtle.select(1)
298
end
299
end
300
--Initial Rednet Handshake
301
if rednetEnabled then
302
screen(1,1)
303
print("Rednet is Enabled")
304
print("The Channel to open is "..channels.send)
305
modem = peripheral.wrap("right")
306
modem.open(channels.receive)
307
local i = 0
308
repeat
309
local id = os.startTimer(3)
310
i=i+1
311
print("Sending Initial Message "..i)
312
modem.transmit(channels.send, channels.receive, "{ 'Initial' }")
313
local message
314
repeat
315
local event, idCheck, channel,_,locMessage, distance = os.pullEvent()
316
message = locMessage
317
until (event == "timer" and idCheck == id) or (event == "modem_message" and channel == channels.receive and message == channels.confirm)
318
until message == channels.confirm
319
connected = true
320
print("Connection Confirmed!")
321
sleep(1.5)
322
end
323
local function biometrics(sendChannel)
324
local commands = { Confirm = "Confirm" }
325
local toSend = { ["x"] = x, ["y"] = (y/3 + math.ceil(lastHeight/2)),
326
     ["z"] = z,                     --The y calc is weird...
327
    ["xPos"] = xPos, ["yPos"] = yPos, ["zPos"] = zPos, 
328
    ["percent"] = percent, ["mined" ]= mined, 
329
    ["fuel"] = checkFuel(), ["moved"] = moved, 
330
    ["remainingBlocks"] = (volume-mined), ["ID"] = os.getComputerID(),
331
    ["isInPath"] = isInPath, --Whether it is going back to start
332
    ["volume"] = volume, ["area"] = area}
333
modem.transmit(channels.send, channels.receive, textutils.serialize(toSend))
334
id = os.startTimer(0.1)
335
local event, message
336
repeat
337
local locEvent, idCheck, confirm, _, locMessage, distance = os.pullEvent()
338
event, message = locEvent, locMessage
339
until (event == "timer" and idCheck == id) or (event == "modem_message" and confirm == channels.receive)
340
if event == "modem_message" then connected = true else connected = false end
341
--Stuff to do for different commands
342
end
343
344
--Showing changes to settings
345
screen(1,1)
346
print("Your selected settings:")
347
if #changedT == 0 then
348
print("Completely Default")
349
else
350
for i=1, #changedT do
351
local title, value = changedT.getPair(i)
352
print(capitalize(title)..": ",value)
353
end
354
end
355
print("\nStarting in 3"); sleep(1); print("2"); sleep(1); print("1"); sleep(1.5)
356
357
----------------------------------------------------------------
358
--Mining Phase
359
local function display()
360
screen(1,1)
361
print("Total Blocks Mined: "..mined)
362
print("Current Fuel Level: "..turtle.getFuelLevel())
363
print("Cobble: "..totals.cobble)
364
print("Usable Fuel: "..totals.fuel)
365
print("Other: "..totals.other)
366
if rednetEnabled then
367
print("")
368
print("Sent Stop Message")
369
finalTable = {{["Mined: "] = mined}, {["Cobble: "] = totals.cobble}, {["Fuel: "] = totals.fuel},
370
    {["Other: "] = totals.other}, {["Fuel: "] = checkFuel()} }
371
modem.transmit(channels.send,channels.receive,"stop")
372
modem.transmit(channels.send,channels.receive,textutils.serialize(finalTable))
373
modem.close(channels.receive)
374
end
375
end
376
local function updateDisplay() --Runs in Mine(), display information to the screen in a certain place
377
screen(1,1)
378
print("Blocks Mined")
379
print(mined)
380
print("Percent Complete")
381
print(percent.."%")
382
if rednetEnabled then
383
screenLine(1,6)
384
print("Connected: "..tostring(connected))
385
end
386
end
387
local function mine(digDown, digUp, outOfPath,doCheckInv) -- Basic Move Forward
388
if doCheckInv == nil then doCheckInv = true end
389
if digDown == nil then digDown = true end
390
if digUp == nil then digUp = true end
391
392
local count = 0
393
while not turtle.forward() do count = count + 1
394
if turtle.dig() then mined = mined + 1; else turtle.attack(); end
395
if count > 20 then if 
396
turtle.getFuelLevel() > 0 then 
397
bedrock() else
398
 error("No Fuel",0) end end
399
end
400
if facing == 0 then xPos = xPos +1
401
elseif facing == 2 then xPos = xPos-1
402
elseif facing == 1 then zPos = zPos+1
403
elseif facing == 3 then zPos = zPos-1; end
404
if digUp then
405
local count = 0
406
while turtle.detectUp() do count = count + 1
407
if turtle.digUp() then mined = mined + 1; end
408
if count > 20 then bedrock() end; end
409
end
410
if digDown then
411
if turtle.digDown() then mined = mined + 1; end
412
end
413
if outOfPath then isInPath = false; else isInPath = true; moved = moved + 1; end
414
if rowCheck == "right" then relxPos = xPos else relxPos = (x-xPos)+1 end --Maybe adjust this for out of path
415
percent = math.ceil(moved/moveVolume*100)
416
updateDisplay()
417
local whereGoing
418
if doCheckInv and careAboutResources then
419
if moved%invCheckFreq == 0 then
420
 if isFull(16-keepOpen) then dropOff() end
421
end; end
422
if rednetEnabled then biometrics() end
423
end
424
--Direction: Front = 0, Right = 1, Back = 2, Left = 3
425
local function facingF(num)
426
facing = facing + num
427
if facing > 3 then facing = 0 end
428
if facing < 0 then facing = 3 end
429
end
430
431
if up then local temp1 = up end --Just in case another program uses this
432
if down then local temp2 = down end
433
function up(num, sneak)
434
num = num or 1
435
sneak = sneak or 1
436
if inverted and sneak == 1 then
437
    down(num, -1)
438
else
439
    for i=1, num do while not turtle.up() do
440
        while not turtle.digUp() do
441
        turtle.attackUp(); sleep(0.5); end
442
        mined = mined + 1
443
    end; yPos = yPos - sneak; end
444
end
445
end
446
function down(num, sneak)
447
num = num or 1
448
sneak = sneak or 1
449
if inverted and sneak == 1 then
450
    up(num, -1)
451
else
452
    for i=1, num do local count = 0 
453
        while not turtle.down() do
454
        count = count + 1
455
        if not turtle.digDown() then
456
        turtle.attackDown(); sleep(0.2); end
457
        mined = mined+1
458
        if count > 20 then bedrock() end
459
    end; yPos = yPos + sneak; end
460
end
461
end
462
local function right(num)
463
num = num or 1
464
for i=1, num do turtle.turnRight(); facingF(1); end
465
end
466
local function left(num)
467
num = num or 1
468
for i=1, num do turtle.turnLeft(); facingF(-1) end
469
end
470
local function goto(x,z,y, toFace)
471
x = x or 1; y = y or 1; z = z or 1; toFace = toFace or facing
472
if yPos > y then while yPos~=y do up() end end
473
 if zPos > z then
474
 while facing ~= 3 do left() end
475
 elseif zPos < z then while facing ~= 1 do left() end
476
 end
477
 while zPos ~= z do mine(false,false,true,false) end
478
  if xPos> x then
479
  while facing ~= 2 do left() end
480
  elseif xPos < x then while facing ~= 0 do left() end
481
  end
482
  while xPos ~= x do mine(false,false,true,false) end
483
if yPos < y then while yPos~=y do down() end end
484
while facing ~= toFace do right() end
485
end
486
local function turnTo(num)
487
num = num or 1; goto(xPos,zPos,yPos,num)
488
end
489
local function drop(side, final, allowSkip)
490
side = sides[side] or "front"    --The final number means that it will
491
if final then final = 0 else final = 1 end --drop a whole stack at the end
492
local allowSkip = allowSkip or (final == 0) --This will allow drop(side,t/f, rednetConnected)
493
  count()
494
  if doRefuel then
495
  for i=1, 16 do
496
  if slot[i][1] == 2 then
497
  turtle.select(i); turtle.refuel()
498
  end; end; end
499
if side == "right" then turnTo(1) end
500
if side == "left" then turnTo(3) end
501
local whereDetect, whereDrop
502
local _1 = tostring(slot[1][2] - final)
503
if side == "top" then
504
whereDetect = "turtle.detectUp()" ; whereDrop1 = "turtle.dropUp(".._1..")"; whereDropAll = "turtle.dropUp()"
505
elseif side == "bottom" then
506
whereDetect = "turtle.detectDown()" ; whereDrop1 = "turtle.dropDown(".._1..")"; whereDropAll = "turtle.dropDown()"
507
else
508
whereDetect = "turtle.detect()" ; whereDrop1 = "turtle.drop(".._1..")"; whereDropAll = "turtle.drop()" end
509
repeat
510
local detected = loadstring("return "..whereDetect)()
511
if detected then
512
assert(loadstring("if "..whereDetect.." then "
513
..whereDrop1..[[ 
514
for i=2, 16 do
515
if turtle.getItemCount(i) > 0 then turtle.select(i); ]]..whereDropAll.." end end end"))()
516
elseif not allowSkip then
517
print("Waiting for chest placement, press a key to continue")
518
os.pullEvent("char")
519
end
520
until detected or allowSkip
521
if not allowSkip then totals.cobble = totals.cobble - 1 end
522
turtle.select(1)
523
turnTo(0)
524
end
525
function dropOff() --Not local because called in mine()
526
local currX,currZ,currY,currFacing = xPos, zPos, yPos, facing
527
goto(0,1,1,2)
528
drop(dropSide,false)
529
mine(false,false,true, false)
530
goto(1,1,1, 0)
531
goto(currX,currZ,currY,currFacing)
532
end
533
function bedrock()
534
local origin = {x = xPos, y = yPos, z = zPos}
535
print("Bedrock Detected")
536
if turtle.detectUp() then
537
print("Block Above")
538
local var
539
if facing == 0 then var = 2 elseif facing == 2 then var = 0 else error("Was facing left or right on bedrock") end
540
goto(xPos,zPos,yPos,var)
541
for i=1, relxPos do mine(true,true); end
542
end
543
goto(0,1,1,2)
544
drop(dropSide, true)
545
display()
546
print("\nFound bedrock at these coordinates: ")
547
print(origin.x," Was position in row\n",origin.z," Was row in layer\n",origin.y," Blocks down from start")
548
error("",0)
549
end
550
-------------------------------------------------------------------------------------
551
local doDigDown, doDigUp
552
if not inverted then doDigDown , doDigUp = (lastHeight ~= 1), false
553
else doDigUp, doDigDown = (lastHeight ~= 1) , false; end --Used in lastHeight
554
a=1
555
mine(false,false, true)
556
if y ~= 0 then down() end
557
--Mining Loops
558
turtle.select(1)
559
while a <= y do -------------Height---------
560
moved = moved + 1
561
rowCheck = "right" --At the end of this row it will turn right
562
if rowCheck == "right" then relxPos = xPos else relxPos = (x-xPos)+1 end
563
while zPos <= z do -------------Width----------
564
while relxPos < x do ------------Length---------
565
mine()
566
567
end ---------------Length End-------
568
if zPos ~= z then
569
if rowCheck == "right" and zPos ~= z then --Swithcing to next row
570
rowCheck = "left"; right(); mine(); right()
571
else
572
rowCheck = "right"; left(); mine(); left()
573
end
574
else break
575
end
576
end ---------------Width End--------
577
goto(1,1,yPos,0)
578
if yPos+1 ~= y then down(3) end
579
a=a+3; end ---------------Height End-------
580
if lastHeight ~= 0 then ---------LAST ROW--------- (copied from above)
581
moved = moved + 1
582
if y ~= 0 then down(2) end
583
rowCheck = "right"
584
if rowCheck == "right" then relxPos = xPos else relxPos = (x-xPos)+1 end
585
while zPos <= z do -------------Width----------
586
while relxPos < x do ------------Length---------
587
mine(doDigDown, doDigUp)
588
end ---------------Length End-------
589
if zPos ~= z then
590
if rowCheck == "right" and zPos ~= z then --Swithcing to next row
591
rowCheck = "left"; right(); mine(doDigDown, doDigUp); right()
592
else
593
rowCheck = "right"; left(); mine(doDigDown, doDigUp); left()
594
end
595
else break
596
end
597
end ---------------Width End--------
598
goto(1,1,yPos,0)
599
end
600
if not inverted then
601
    if doDigDown then if turtle.digDown() then mined = mined + 1 end end
602
  else
603
    if doDigUp then if turtle.digUp() then mined = mined + 1 end end
604
end
605
goto(0,1,1,2)
606
607
--Output to a chest or sit there
608
drop(dropSide, true)
609
--Display was moved above to be used in bedrock function
610
display()
611
612
--The only global variables I had to use
613
if temp1 then up = temp1 end
614
if temp2 then down = temp2 end