View difference between Paste ID: L5c3MGas and mePGxstT
SHOW: | | - or go back to the newest paste.
1
local tArgs = { ... }
2
if #tArgs < 1 then
3
	print( "Usage: diggit <diameter> <0 or 1 for blacklist enabled>" )
4
	return
5
end
6
7
-- Mine in a quarry pattern until we hit something we can't dig
8
local size = tonumber( tArgs[1] )
9
if size < 1 then
10
	print( "Excavate diameter must be positive" )
11
	return
12
end
13
14
local black = false
15
16
if (#tArgs >= 2) then
17
	black = (tArgs[2] == "1")
18
else
19
	tArgs[2] = "0"
20-
local depth = 0
20+
21
22
23
local uhand = fs.open("update", "w")
24-
local xPos,zPos = 0,0
24+
local ustr = "shell.run(\"rm posdata\")\n" .. "shell.run(\"rm diggit\")\n" .. "shell.run(\"pastebin get L5c3MGas diggit\")"
25-
local xDir,zDir = 0,1
25+
uhand.write(ustr)
26
uhand.close()
27
28
local shand = fs.open("startup", "w")
29
shand.write("shell.run(\"diggit " .. tArgs[1] .. " " .. tArgs[2] .. "\")")
30
shand.close()
31
32
local posinfo = {
33
  ["xPos"] = 0,
34
  ["zPos"] = 0,
35
  ["xDir"] = 0,
36
  ["zDir"] = 1,
37
  ["depth"] = 0,
38
  ["done"] = false,
39
  ["maxdepth"] = 0,
40
  ["dxPos"] = 0,
41
  ["dzPos"] = 0,
42
  ["dxDir"] = 0,
43
  ["dzDir"] = 1,
44
  ["ddepth"] = 0
45
}
46
47
--local depth = 0
48
local unloaded = 0
49
local collected = 0
50
51
--local xPos,zPos = 0,0
52-
	local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
52+
--local xDir,zDir = 0,1
53
54
local hRead
55
local hWrite
56
57
local goTo -- Filled in further down
58
local refuel -- Filled in further down
59
60
local function printPos()
61
	print(posinfo.xPos .. "," .. posinfo.depth .. "," .. posinfo.zPos .. " : " .. posinfo.xDir .. "," .. posinfo.zDir)
62
end
63
64
local function wasDestroyed()
65
	count = 0
66
	for i = 1,16 do
67
		count = count + turtle.getItemCount(i)
68
	end
69
	return (count == 0)
70
end
71
72
local function savePos()
73
	hWrite = fs.open("posdata", "w")
74
	hWrite.write(textutils.serialize(posinfo))
75
	hWrite.close()
76
	--printPos()
77
end
78
79
local function loadPos()
80
	hRead = fs.open("posdata", "r")
81
	posinfo = textutils.unserialize(hRead.readAll())
82
	hRead.close()
83
end
84
 
85
local function turnLeft()
86
	xd,zd = posinfo.xDir, posinfo.zDir
87
	posinfo.dxDir = -zd
88
	posinfo.dzDir = xd
89
	savePos()
90
	turtle.turnLeft()
91
	posinfo.xDir = -zd
92
	posinfo.zDir = xd
93
	savePos()
94
end
95
96
local function turnRight()
97
	xd,zd = posinfo.xDir, posinfo.zDir
98
	posinfo.dxDir = zd
99
	posinfo.dzDir = -xd
100
	savePos()
101
	turtle.turnRight()
102-
	local needed = ammount or (xPos + zPos + depth + 2)
102+
	posinfo.xDir = zd
103
	posinfo.zDir = -xd
104
	savePos()
105
end
106
 
107
local function trackForward()
108
	if turtle.forward() then
109
		posinfo.xPos = posinfo.xPos + posinfo.xDir
110
		posinfo.zPos = posinfo.zPos + posinfo.zDir
111
		savePos()
112
		return true
113
	else
114
		return false
115
	end
116
end
117
118
local function trackDown()
119
	if turtle.down() then
120
		posinfo.depth = posinfo.depth + 1
121
		savePos()
122
		if (posinfo.maxdepth < posinfo.depth) then
123
			posinfo.maxdepth = posinfo.depth
124
			savePos()
125
		end
126
		return true
127
	else
128
		return false
129
	end
130
end
131
 
132
local function trackUp()
133
	if turtle.up() then
134
		posinfo.depth = posinfo.depth - 1
135
		savePos()
136
		return true
137
	else
138
		return false
139
	end
140
end
141
 
142
local function unload( _bKeepOneFuelStack )
143
	print( "Unloading items..." )
144
	for n=1,16 do
145
		local nCount = turtle.getItemCount(n)
146
		if nCount > 0 then
147
			turtle.select(n)			
148
			local bDrop = true
149
			if _bKeepOneFuelStack and turtle.refuel(0) then
150
				bDrop = false
151
				_bKeepOneFuelStack = false
152
			end			
153
			if bDrop then
154
				turtle.drop()
155
				unloaded = unloaded + nCount
156
			end
157
		end
158
	end
159
	collected = 0
160-
	while not turtle.forward() do
160+
161
end
162
163
local function lookingAtChest()
164
	s,d = turtle.inspect()
165
	if (s) then
166
		return string.find(d.name, "chest")
167
	end
168
	return false
169
end
170
171
local function chestUp()
172
	s,d = turtle.inspectUp()
173
	if (s) then
174
		return string.find(d.name, "chest")
175
	end
176
	return false
177
end
178
179-
	xPos = xPos + xDir
179+
local function chestDown()
180-
	zPos = zPos + zDir
180+
	s,d = turtle.inspectDown()
181
	if (s) then
182
		return string.find(d.name, "chest")
183
	end
184
	return false
185
end
186
187
local function panic()
188
	local x,y,z,xd,zd = posinfo.xPos,posinfo.depth,posinfo.zPos,posinfo.xDir,posinfo.zDir
189
	print( "Panic to surface..." )
190
	if goCareTo( 0,0,0,0,-1) then
191
	
192
	else
193
		return false
194
	end
195
	if lookingAtChest() then
196
		print("Alignment seems correct...")
197
	else
198
		return false
199
	end
200
	local fuelNeeded = 2*(x+y+z) + 1
201
	if not refuel( fuelNeeded ) then
202
		unload( true )
203
		print( "Waiting for fuel" )
204
		while not refuel( fuelNeeded ) do
205
			os.pullEvent( "turtle_inventory" )
206
		end
207
	else
208
		unload( true )	
209
	end
210
	goTo( 0,0,0,0,1)
211
	print( "I think I'm home..." )
212
	return true
213
end
214-
	while not turtle.down() do
214+
215
local function returnSupplies()
216
	local x,y,z,xd,zd = posinfo.xPos,posinfo.depth,posinfo.zPos,posinfo.xDir,posinfo.zDir
217
	print( "Returning to surface..." )
218
	goTo( 0,0,0,0,-1 )
219
	
220
	local fuelNeeded = 2*(x+y+z) + 1
221
	if not refuel( fuelNeeded ) then
222
		unload( true )
223
		print( "Waiting for fuel" )
224
		while not refuel( fuelNeeded ) do
225
			os.pullEvent( "turtle_inventory" )
226
		end
227
	else
228
		unload( true )	
229
	end
230
	
231
	print( "Resuming mining..." )
232-
	depth = depth + 1
232+
233-
	if math.fmod( depth, 10 ) == 0 then
233+
234-
		print( "Descended "..depth.." metres." )
234+
235
local function collect()	
236
	local bFull = true
237
	local nTotalItems = 0
238
	for n=1,16 do
239
		local nCount = turtle.getItemCount(n)
240
		if nCount == 0 then
241
			bFull = false
242-
	xDir, zDir = -zDir, xDir
242+
243
		nTotalItems = nTotalItems + nCount
244
	end
245
	
246
	if nTotalItems > collected then
247-
	xDir, zDir = zDir, -xDir
247+
248
		if math.fmod(collected + unloaded, 50) == 0 then
249
			print( "Mined "..(collected + unloaded).." items." )
250
		end
251-
	while depth > y do
251+
252-
		if turtle.up() then
252+
253-
			depth = depth - 1
253+
254
		print( "No empty slots left." )
255
		return false
256
	end
257
	return true
258
end
259
260
function refuel( ammount )
261-
	if xPos > x then
261+
262-
		while xDir ~= -1 do
262+
263
		return true
264
	end
265-
		while xPos > x do
265+
266-
			if turtle.forward() then
266+
	local needed = ammount or (posinfo.xPos + posinfo.zPos + posinfo.depth + 2)
267-
				xPos = xPos - 1
267+
268
		local fueled = false
269
		for n=1,16 do
270
			if turtle.getItemCount(n) > 0 then
271
				turtle.select(n)
272
				if turtle.refuel(1) then
273
					while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
274-
	elseif xPos < x then
274+
275-
		while xDir ~= 1 do
275+
276
					if turtle.getFuelLevel() >= needed then
277
						turtle.select(1)
278-
		while xPos < x do
278+
279-
			if turtle.forward() then
279+
280-
				xPos = xPos + 1
280+
281
			end
282
		end
283
		turtle.select(1)
284
		return false
285
	end
286
	
287
	return true
288
end
289-
	if zPos > z then
289+
290-
		while zDir ~= -1 do
290+
291
local idown
292
local dup
293-
		while zPos > z do
293+
294-
			if turtle.forward() then
294+
295-
				zPos = zPos - 1
295+
296
	if not black then 
297
		return false
298
	end
299
	if (name == "minecraft:stone") then
300
		return true
301
	end
302-
	elseif zPos < z then
302+
	if (name == "minecraft:netherrack") then
303-
		while zDir ~= 1 do
303+
304
	end
305
	if (name == "minecraft:dirt") then
306-
		while zPos < z do
306+
307-
			if turtle.forward() then
307+
308-
				zPos = zPos + 1
308+
309
		return true
310
	end
311
	if (name == "minecraft:lava") then
312
		return true
313
	end
314
	if (name == "minecraft:flowing_water") then
315
		return true
316
	end
317-
	while depth < y do
317+
318-
		if turtle.down() then
318+
319-
			depth = depth + 1
319+
320
321
local function tryForwards()
322
	if not refuel() then
323
		print( "Not enough Fuel" )
324
		returnSupplies()
325
	end
326
327-
	while zDir ~= zd or xDir ~= xd do
327+
	while not trackForward() do
328
		if turtle.detect() then
329
			if turtle.dig() then
330
				if not collect() then
331
					returnSupplies()
332
				end
333
			else
334
				return false
335
			end
336
		elseif turtle.attack() then
337-
print("Finding Excavation Floor...")
337+
338-
while not turtle.detectDown() do
338+
339
			end
340
		else
341
			sleep( 0.5 )
342
		end
343
	end
344-
local reseal = false
344+
345-
turtle.select(1)
345+
	--xPos = xPos + xDir
346-
if turtle.digDown() then
346+
	--zPos = zPos + zDir
347-
	reseal = true
347+
348
	iup, dup = turtle.inspectUp()
349
	idown, ddown = turtle.inspectDown()
350
351
	if iup then
352
		if not (isBlacklist(dup.name)) then
353
			if turtle.digUp() then
354
				if not collect() then
355
					returnSupplies()
356
				end
357
			end
358
		end
359
	end
360
361
	if idown then
362
		if not (isBlacklist(ddown.name)) then
363
			if turtle.digDown() then
364
				if not collect() then
365
					returnSupplies()
366
				end
367
			end
368
		end
369
	end
370
371
	return true
372
end
373
374
local function tryDown()
375
	if not refuel() then
376
		print( "Not enough Fuel" )
377
		returnSupplies()
378
	end
379
	
380
	while not trackDown() do
381
		if turtle.detectDown() then
382
			if turtle.digDown() then
383
				if not collect() then
384
					returnSupplies()
385
				end
386
			else
387
				return false
388
			end
389
		elseif turtle.attackDown() then
390
			if not collect() then
391
				returnSupplies()
392
			end
393
		else
394
			sleep( 0.5 )
395
		end
396
	end
397
398
	--depth = depth + 1
399
	--if math.fmod( depth, 10 ) == 0 then
400
	--	print( "Descended "..depth.." metres." )
401
	--end
402
403
	return true
404
end
405
406
local function careForward()
407
	if trackForward() then
408
	elseif lookingAtChest() then
409
		print("I think I found my chest. I almost tried to break it!")
410
		turnLeft()
411
		turnLeft()
412
		return false
413
	elseif turtle.dig() or turtle.attack() then
414
		collect()
415
	else
416
		sleep( 0.5 )
417
	end
418
	return true
419
end
420-
-- Seal the hole
420+
421-
if reseal then
421+
function goCareTo( x, y, z, xd, zd )
422-
	turtle.placeDown()
422+
	while posinfo.depth > y do
423
		if trackUp() then
424
		elseif chestUp() then
425
			print("I think I found my chest.")
426
			return false
427
		elseif turtle.digUp() or turtle.attackUp() then
428
			collect()
429
		else
430
			sleep( 0.5 )
431
		end
432
	end
433
434
	if posinfo.xPos > x then
435
		while posinfo.xDir ~= -1 do
436
			turnLeft()
437
		end
438
		while posinfo.xPos > x do
439
			if careForward() then
440
				sleep( 0.5 )
441
			else
442
				return false
443
			end
444
		end
445
	elseif posinfo.xPos < x then
446
		while posinfo.xDir ~= 1 do
447
			turnLeft()
448
		end
449
		while posinfo.xPos < x do
450
			if careForward() then
451
				sleep( 0.5 )
452
			else
453
				return false
454
			end
455
		end
456
	end
457
	
458
	if posinfo.zPos > z then
459
		while posinfo.zDir ~= -1 do
460
			turnLeft()
461
		end
462
		while posinfo.zPos > z do
463
			if careForward() then
464
				sleep( 0.5 )
465
			else
466
				return false
467
			end
468
		end
469
	elseif posinfo.zPos < z then
470
		while posinfo.zDir ~= 1 do
471
			turnLeft()
472
		end
473
		while posinfo.zPos < z do
474
			if careForward() then
475
				sleep( 0.5 )
476
			else
477
				return false
478
			end
479
		end	
480
	end
481
	
482
	while posinfo.depth < y do
483
		if trackDown() then
484
			--depth = depth + 1
485
		elseif turtle.digDown() or turtle.attackDown() then
486
			collect()
487
		else
488
			sleep( 0.5 )
489
		end
490
	end
491
	
492
	while posinfo.zDir ~= zd or posinfo.xDir ~= xd do
493
		turnLeft()
494
	end
495
	return true
496
end
497
498
499
function goTo( x, y, z, xd, zd )
500
	while posinfo.depth > y do
501
		if trackUp() then
502
			--depth = depth - 1
503
		elseif turtle.digUp() or turtle.attackUp() then
504
			collect()
505
		else
506
			sleep( 0.5 )
507
		end
508
	end
509
510
	if posinfo.xPos > x then
511
		while posinfo.xDir ~= -1 do
512
			turnLeft()
513
		end
514
		while posinfo.xPos > x do
515
			if trackForward() then
516
				--xPos = xPos - 1
517
			--elseif turtle.suck() then
518
			elseif turtle.dig() or turtle.attack() then
519
				collect()
520
			else
521
				sleep( 0.5 )
522
			end
523
		end
524
	elseif posinfo.xPos < x then
525
		while posinfo.xDir ~= 1 do
526
			turnLeft()
527
		end
528
		while posinfo.xPos < x do
529
			if trackForward() then
530
				--xPos = xPos + 1
531
			elseif turtle.dig() or turtle.attack() then
532
				collect()
533
			else
534
				sleep( 0.5 )
535
			end
536
		end
537
	end
538
	
539
	if posinfo.zPos > z then
540
		while posinfo.zDir ~= -1 do
541
			turnLeft()
542
		end
543
		while posinfo.zPos > z do
544
			if trackForward() then
545
				--zPos = zPos - 1
546
			elseif turtle.dig() or turtle.attack() then
547
				collect()
548
			else
549
				sleep( 0.5 )
550
			end
551
		end
552
	elseif posinfo.zPos < z then
553
		while posinfo.zDir ~= 1 do
554
			turnLeft()
555
		end
556
		while posinfo.zPos < z do
557
			if trackForward() then
558
				--zPos = zPos + 1
559
			elseif turtle.dig() or turtle.attack() then
560
				collect()
561
			else
562
				sleep( 0.5 )
563
			end
564
		end	
565
	end
566
	
567
	while posinfo.depth < y do
568
		if trackDown() then
569
			--depth = depth + 1
570
		elseif turtle.digDown() or turtle.attackDown() then
571
			collect()
572
		else
573
			sleep( 0.5 )
574
		end
575
	end
576
	
577
	while posinfo.zDir ~= zd or posinfo.xDir ~= xd do
578
		turnLeft()
579
	end
580
end
581
582
if not refuel() then
583
	print( "Out of Fuel" )
584
	return
585
end
586
587
print("Booting up...")
588
if (fs.exists("posdata")) then
589
	loadPos()
590
	if (posinfo.done == true) then
591
		print("Turtle is done.")
592
		return
593
	else
594
		print("Turtle was interrupted...")
595
		if wasDestroyed() then
596
			print("I think I was picked up.")
597
			return
598
		end
599
		if panic() then
600
			goTo(0,posinfo.maxdepth,0,0,1)
601
		else
602
			bsuc,bdat = turtle.inspectUp()
603
			if (string.find(bdat.name, "cobble")) then
604
				if (lookingAtChest()) then
605
					turnLeft()
606
					turnLeft()
607
					print("Aligned!")
608
				else
609
					turnLeft()
610
					turnLeft()
611
					if (lookingAtChest()) then
612
						turnLeft()
613
						turnLeft()
614
						print("Aligned!")
615
					else
616
						turnLeft()
617
						turnLeft()
618
						print("I'm close as home as possible, couldn't find chest.")
619
						return
620
					end
621
				end 
622
			else 
623
				print("I'm close as home as possible, alignment failed.")			
624
				return
625
			end
626
		end
627
	end
628
else
629
	print("Turtle is ready to work...")
630
	savePos()
631
	print("Finding Excavation Floor...")
632
	while not turtle.detectDown() do
633
		tryDown()
634
	end
635
end
636
637
print( "Excavating..." )
638
639
local alternate = 0
640
local done = false
641
while not done do
642
	for n=1,size do
643
		for m=1,size-1 do
644
			if not tryForwards() then
645
				done = true
646
				break
647
			end
648
		end
649
		if done then
650
			break
651
		end
652
		if n<size then
653
			if math.fmod(n + alternate,2) == 0 then
654
				turnLeft()
655
				if not tryForwards() then
656
					done = true
657
					break
658
				end
659
				turnLeft()
660
			else
661
				turnRight()
662
				if not tryForwards() then
663
					done = true
664
					break
665
				end
666
				turnRight()
667
			end
668
		end
669
	end
670
	if done then
671
		break
672
	end
673
	
674
	if size > 1 then
675
		if math.fmod(size,2) == 0 then
676
			turnRight()
677
		else
678
			if alternate == 0 then
679
				turnLeft()
680
			else
681
				turnRight()
682
			end
683
			alternate = 1 - alternate
684
		end
685
	end
686
	
687
	if not tryDown() then
688
		done = true
689
		break
690
	end
691
	tryDown()
692
	tryDown()
693
	if turtle.detectDown() then
694
		if turtle.digDown() then
695
			if not collect() then
696
				returnSupplies()
697
			end
698
		end
699
	end
700
end
701
702
print( "Returning to surface..." )
703
704
-- Return to where we started
705
goTo( 0,0,0,0,-1 )
706
unload( false )
707
goTo( 0,0,0,0,1 )
708
709
posinfo.done = true
710
savePos()
711
712
print( "Mined "..(collected + unloaded).." items total." )