View difference between Paste ID: dCgDqSND and mePGxstT
SHOW: | | - or go back to the newest paste.
1
local tArgs = { ... }
2-
if #tArgs < 1 then
2+
if #tArgs ~= 1 then
3-
	print( "Usage: diggit <diameter> <0 or 1 for blacklist enabled>" )
3+
	print( "Usage: excavate <diameter>" )
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
14+
15
local unloaded = 0
16-
if (#tArgs >= 2) then
16+
17-
	black = (tArgs[2] == "1")
17+
18
local xPos,zPos = 0,0
19
local xDir,zDir = 0,1
20
21
local goTo -- Filled in further down
22
local refuel -- Filled in further down
23
 
24
local function unload( _bKeepOneFuelStack )
25
	print( "Unloading items..." )
26
	for n=1,16 do
27
		local nCount = turtle.getItemCount(n)
28
		if nCount > 0 then
29
			turtle.select(n)			
30
			local bDrop = true
31
			if _bKeepOneFuelStack and turtle.refuel(0) then
32
				bDrop = false
33
				_bKeepOneFuelStack = false
34
			end			
35
			if bDrop then
36
				turtle.drop()
37
				unloaded = unloaded + nCount
38
			end
39
		end
40
	end
41
	collected = 0
42
	turtle.select(1)
43
end
44
45
local function returnSupplies()
46
	local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
47
	print( "Returning to surface..." )
48
	goTo( 0,0,0,0,-1 )
49
	
50
	local fuelNeeded = 2*(x+y+z) + 1
51
	if not refuel( fuelNeeded ) then
52
		unload( true )
53
		print( "Waiting for fuel" )
54
		while not refuel( fuelNeeded ) do
55
			os.pullEvent( "turtle_inventory" )
56
		end
57
	else
58
		unload( true )	
59
	end
60
	
61
	print( "Resuming mining..." )
62
	goTo( x,y,z,xd,zd )
63
end
64
65
local function collect()	
66
	local bFull = true
67
	local nTotalItems = 0
68
	for n=1,16 do
69
		local nCount = turtle.getItemCount(n)
70
		if nCount == 0 then
71
			bFull = false
72
		end
73
		nTotalItems = nTotalItems + nCount
74
	end
75
	
76
	if nTotalItems > collected then
77
		collected = nTotalItems
78
		if math.fmod(collected + unloaded, 50) == 0 then
79
			print( "Mined "..(collected + unloaded).." items." )
80
		end
81
	end
82
	
83
	if bFull then
84
		print( "No empty slots left." )
85
		return false
86
	end
87
	return true
88
end
89
90
function refuel( ammount )
91
	local fuelLevel = turtle.getFuelLevel()
92
	if fuelLevel == "unlimited" then
93
		return true
94
	end
95
	
96
	local needed = ammount or (xPos + zPos + depth + 2)
97
	if turtle.getFuelLevel() < needed then
98
		local fueled = false
99
		for n=1,16 do
100
			if turtle.getItemCount(n) > 0 then
101
				turtle.select(n)
102
				if turtle.refuel(1) then
103
					while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
104
						turtle.refuel(1)
105
					end
106
					if turtle.getFuelLevel() >= needed then
107
						turtle.select(1)
108
						return true
109
					end
110
				end
111
			end
112
		end
113
		turtle.select(1)
114
		return false
115
	end
116
	
117
	return true
118
end
119
120
local iup
121
local idown
122
local ifront
123
local dup
124
local ddown
125
local dfront
126
127
local function isBlacklist(name)
128
	if (name == "minecraft:stone") then
129
		return true
130
	end
131
	if (name == "minecraft:water") then
132-
	if not black then 
132+
133
	end
134
	if (name == "minecraft:lava") then
135
		return true
136
	end
137
	if (name == "minecraft:flowing_water") then
138-
	if (name == "minecraft:dirt") then
138+
139
	end
140
	return false
141
end
142
143
local function pick()
144
	ifront, dfront = turtle.inspect()
145
	if ifront then
146
		if not (isBlacklist(dfront.name)) then
147
			if turtle.dig() then
148
				if not collect() then
149
					returnSupplies()
150-
	print ("Ooo piece of candy: " .. name)
150+
151
			end
152
		end
153
	end
154
end
155
156
local function hitBedrock()
157
	idown, ddown = turtle.inspectDown()
158
	if idown then 
159
		return (ddown.name == "minecraft:bedrock")
160
	end
161
end
162
163
local function tryUp()
164
	if turtle.up() then
165
			depth = depth - 1
166
	elseif turtle.digUp() or turtle.attackUp() then
167
			collect()
168
	else
169
		sleep( 0.5 )
170
	end
171
end
172
173
local function boreUp()
174
	while depth > 0 do
175
		pick()
176
		tryUp()
177
	end
178
end
179
180
local function tryForwards()
181
	if not refuel() then
182
		print( "Not enough Fuel" )
183
		returnSupplies()
184
	end
185
186-
		if not (isBlacklist(dup.name)) then
186+
187
		if turtle.detect() then
188
			if turtle.dig() then
189
				if not collect() then
190
					returnSupplies()
191
				end
192
			else
193
				return false
194
			end
195
		elseif turtle.attack() then
196
			if not collect() then
197
				returnSupplies()
198
			end
199
		else
200
			sleep( 0.5 )
201
		end
202
	end
203
	
204
	
205
	xPos = xPos + xDir
206
	zPos = zPos + zDir
207
208
	iup, dup = turtle.inspectUp()
209
	idown, ddown = turtle.inspectDown()
210
211
	if iup then
212
		-- if not (isBlacklist(dup.name)) then
213
			-- print ("Ooo piece of candy.")
214
			if turtle.digUp() then
215
				if not collect() then
216
					returnSupplies()
217
				end
218
			end
219
		-- end
220
	end
221
222
	if idown then
223
		if not (isBlacklist(ddown.name)) then
224
			print ("Ooo piece of candy.")
225
			if turtle.digDown() then
226
				if not collect() then
227
					returnSupplies()
228
				end
229
			end
230
		end
231
	end
232
233
	return true
234
end
235
236
local function tryDown()
237
	if not refuel() then
238
		print( "Not enough Fuel" )
239
		returnSupplies()
240
	end
241
	
242
	while not turtle.down() do
243
		if turtle.detectDown() then
244
			if turtle.digDown() then
245
				if not collect() then
246
					returnSupplies()
247
				end
248
			else
249
				return false
250
			end
251
		elseif turtle.attackDown() then
252
			if not collect() then
253
				returnSupplies()
254
			end
255
		else
256
			sleep( 0.5 )
257
		end
258
	end
259
260
	depth = depth + 1
261
	if math.fmod( depth, 10 ) == 0 then
262
		print( "Descended "..depth.." metres." )
263
	end
264
265
	return true
266
end
267
268
local function boreDown()
269
	while not hitBedrock() do
270
		tryDown()
271
		pick()
272
	end
273
end
274
275
local function turnLeft()
276
	turtle.turnLeft()
277
	xDir, zDir = -zDir, xDir
278
end
279
280
local function turnRight()
281
	turtle.turnRight()
282
	xDir, zDir = zDir, -xDir
283
end
284
285
286
local function bore()
287
	boreDown()
288
	turnLeft()
289
	boreUp()
290
	turnLeft()
291
	boreDown()
292
	turnLeft()
293
	boreUp()
294
	turnLeft()
295
end
296
297
function goTo( x, y, z, xd, zd )
298
	while depth > y do
299
		if turtle.up() then
300
			depth = depth - 1
301
		elseif turtle.digUp() or turtle.attackUp() then
302
			collect()
303
		else
304
			sleep( 0.5 )
305
		end
306
	end
307
308
	if xPos > x then
309
		while xDir ~= -1 do
310
			turnLeft()
311
		end
312
		while xPos > x do
313
			if turtle.forward() then
314
				xPos = xPos - 1
315
			elseif turtle.dig() or turtle.attack() then
316
				collect()
317
			else
318
				sleep( 0.5 )
319
			end
320
		end
321
	elseif xPos < x then
322
		while xDir ~= 1 do
323
			turnLeft()
324
		end
325
		while xPos < x do
326
			if turtle.forward() then
327
				xPos = xPos + 1
328
			elseif turtle.dig() or turtle.attack() then
329
				collect()
330
			else
331
				sleep( 0.5 )
332
			end
333
		end
334
	end
335
	
336
	if zPos > z then
337-
print("Finding Excavation Floor...")
337+
338-
while not turtle.detectDown() do
338+
339-
	tryDown()
339+
340
		while zPos > z do
341
			if turtle.forward() then
342
				zPos = zPos - 1
343
			elseif turtle.dig() or turtle.attack() then
344
				collect()
345
			else
346
				sleep( 0.5 )
347
			end
348
		end
349
	elseif zPos < z then
350
		while zDir ~= 1 do
351
			turnLeft()
352
		end
353
		while zPos < z do
354-
		for m=1,size-1 do
354+
355
				zPos = zPos + 1
356
			elseif turtle.dig() or turtle.attack() then
357
				collect()
358
			else
359
				sleep( 0.5 )
360
			end
361
		end	
362
	end
363
	
364
	while depth < y do
365
		if turtle.down() then
366
			depth = depth + 1
367
		elseif turtle.digDown() or turtle.attackDown() then
368
			collect()
369
		else
370
			sleep( 0.5 )
371
		end
372
	end
373
	
374
	while zDir ~= zd or xDir ~= xd do
375
		turnLeft()
376
	end
377
end
378
379
if not refuel() then
380
	print( "Out of Fuel" )
381-
	if done then
381+
382-
		break
382+
383
384
-- print("Finding Excavation Floor...")
385-
	if size > 1 then
385+
-- while not turtle.detectDown() do
386-
		if math.fmod(size,2) == 0 then
386+
--	tryDown()
387-
			turnRight()
387+
-- end
388
389-
			if alternate == 0 then
389+
390
391
local reseal = false
392
turtle.select(1)
393
if turtle.digDown() then
394-
			alternate = 1 - alternate
394+
395
end
396
397
local alternate = 0
398-
	if not tryDown() then
398+
399-
		done = true
399+
400-
		break
400+
401
	for n=1,size do
402-
	tryDown()
402+
		while true do
403-
	tryDown()
403+
			if ((xPos+(5*xDir)) > size) or ((xPos+(5*xDir)) < 0) then
404-
	if turtle.detectDown() then
404+
			 	break
405-
		if turtle.digDown() then
405+
406
			if ((zPos+(5*zDir)) > size) or ((zPos+(5*zDir)) < 0) then
407
				break
408
			end
409
			bore()
410
			if not tryForwards() then
411
				done = true
412
				break
413
			end
414
			if not tryForwards() then
415
				done = true
416
				break
417
			end
418
			if not tryForwards() then
419
				done = true
420
				break
421
			end
422
			if not tryForwards() then
423
				done = true
424
				break
425
			end
426
			if not tryForwards() then
427
				done = true
428
				break
429
			end
430
		end
431
		if done then
432
			break
433
		end
434
		if n<size then
435
			if math.fmod(n + alternate,2) == 0 then
436
				bore()
437
				turnLeft()
438
				if not tryForwards() then
439
					done = true
440
					break
441
				end
442
				turnLeft()
443
				if not tryForwards() then
444
					done = true
445
					break
446
				end
447
				if not tryForwards() then
448
					done = true
449
					break
450
				end
451
			else
452
				bore()
453
				turnRight()
454
				if not tryForwards() then
455
					done = true
456
					break
457
				end
458
				turnRight()
459
				if not tryForwards() then
460
					done = true
461
					break
462
				end
463
				if not tryForwards() then
464
					done = true
465
					break
466
				end
467
				if not tryForwards() then
468
					done = true
469
					break
470
				end
471
			end
472
		end
473
	end
474
	done = true
475
end
476
477
print( "Returning to surface..." )
478
479
-- Return to where we started
480
goTo( 0,0,0,0,-1 )
481
unload( false )
482
goTo( 0,0,0,0,1 )
483
484
-- Seal the hole
485
if reseal then
486
	turtle.placeDown()
487
end
488
489
print( "Mined "..(collected + unloaded).." items total." )