View difference between Paste ID: BWDdELUc and zXm6BWqR
SHOW: | | - or go back to the newest paste.
1
MiningTurtle = { 
2
	position = { 
3
		x = 0, -- WEST/EAST
4
		y = 0, -- UP/DOWN
5
		z = 0  -- SOUTH/NORTH
6
	},
7
	direction = 0
8
	-- 0 = SOUTH -> Z++
9
	-- 1 = WEST -> X--
10
	-- 2 = NORTH -> Z--
11
	-- 3 = EAST -> X++
12
}
13
14
-- Constructor
15
16
function MiningTurtle:new()
17
18
	local object = { }
19
	
20
	setmetatable(object, { __index = MiningTurtle }) 
21
	return object
22
end
23
24
-- Check if the Turtle needs to be refueled ( <= refuelLevel )
25
-- if yes, try to refuel it taking the contents of the inventory
26
-- if this is not possible or not enough, go back to base
27
function MiningTurtle:requiredRefuel( refuelLevel, requiredFuelLevel )
28
	local slot
29
30
	if refuelLevel == nil then
31
		refuelLevel 		= 25
32
	end
33
	
34
	if requiredFuelLevel == nil then
35
		requiredFuelLevel 	= 500
36
	end
37
	
38
	-- should we refuel?
39
	if turtle.getFuelLevel() <= refuelLevel then
40
	
41
		print("Turtle needs refuel!!!")
42
		
43
		-- iterate through our inventory
44
		for slot = 1,16 do
45
			
46
			-- select slot
47
			turtle.select(slot)
48
			
49
			-- refuel from active slot...
50
			if turtle.refuel( turtle.getItemCount( slot ) ) then
51
				
52
			end
53
			
54
			-- ...and check again
55
			if turtle.getFuelLevel() >= requiredFuelLevel then
56
				return true
57
			end
58
			
59
		end
60
		
61
		-- check if we did not refueled enough alreay
62
		if not (turtle.getFuelLevel() >= requiredFuelLevel) then
63
			-- if yes, go back to base
64
			
65
			MiningTurtle:toBase()
66
			-- refuel: to be implemented!!!!
67
		end
68
		
69
		return false
70
	end
71
	
72
	return true
73
end
74
75
-- Go back to the base of the MiningTurtle
76
function MiningTurtle:toBase( )
77
78
end
79
	
80
-- Go to ground
81
function MiningTurtle:toGround( )
82
83
	while not turtle.detectDown() do
84
		MiningTurtle:down()
85
	end
86
	
87
end
88
89
-- Go the our "base" Ground (z = 0)
90
function MiningTurtle:toBaseLevel( )
91
92
	while self.position.y > 0 do
93
		MiningTurtle:saveDown()
94
	end
95
96
end
97
98
-- forward
99
function MiningTurtle:forward()
100
	local ret
101
	
102
	ret = turtle.forward()
103
	
104
	if ret then
105
		
106
		
107
		if self.direction == 0 then
108
			-- 0 = SOUTH -> Z++
109
			self.position.z = self.position.z + 1
110
			
111
		elseif self.direction == 1 then
112
			-- 1 = WEST -> X--
113
			self.position.x = self.position.x - 1
114
		
115
		elseif self.direction == 2 then
116
			-- 2 = NORTH -> Z--
117
			self.position.z = self.position.z -  1
118
		
119
		elseif self.direction == 3 then
120
			-- 3 = EAST -> X++
121
			self.position.x = self.position.x + 1
122
		
123
		end
124
		
125
	end
126
	
127
	MiningTurtle:tick()
128
	
129
	return ret
130
end
131
132
-- back
133
function MiningTurtle:back()
134
	local ret
135
	
136
	ret = turtle.back()
137
	
138
	if ret then
139
		
140
		-- all directions reverse!!! (moving back)
141
142
		if self.direction == 0 then
143
			-- 0 = SOUTH -> Z++
144
			self.position.z = self.position.z - 1
145
			
146
		elseif self.direction == 1 then
147
			-- 1 = WEST -> X--
148
			self.position.x = self.position.x + 1
149
		
150
		elseif self.direction == 2 then
151
			-- 2 = NORTH -> Z--
152
			self.position.z = self.position.z +  1
153
		
154
		elseif self.direction == 3 then
155
			-- 3 = EAST -> X++
156
			self.position.x = self.position.x - 1
157
		
158
		end
159
		
160
	end
161
	
162
	MiningTurtle:tick()
163
	
164
	return ret
165
end
166
167
-- up
168
function MiningTurtle:up()
169
	local ret
170
	
171
	ret = turtle.up()
172
	
173
	if ret then
174
		self.position.y = self.position.y + 1
175
	end
176
	
177
	MiningTurtle:tick()
178
	
179
	return ret
180
end
181
182
-- down
183
function MiningTurtle:down()
184
	local ret
185
	
186
	ret = turtle.down()
187
	
188
	if ret then
189
		self.position.y = self.position.y - 1
190
	end
191
	
192
				
193
	MiningTurtle:tick()
194
	
195
	return ret
196
end
197
198
-- turn Left
199
function MiningTurtle:turnLeft()
200
	local ret
201
	
202
	ret = turtle.turnLeft()
203
	
204
	if ret then
205
		self.direction = self.direction + 1
206
		
207
		while self.direction >= 4 do
208
			self.direction = self.direction - 4
209
		end
210
	end
211
	
212
	MiningTurtle:outPos()
213
	
214
	return ret
215
end
216
217
-- turn Right
218
function MiningTurtle:turnRight()
219
	local ret
220
	
221
	ret = turtle.turnRight()
222
	
223
	if ret then
224
		self.direction = self.direction - 1
225
		
226
		while self.direction < 0 do
227
			self.direction = self.direction - 4
228
		end
229
	end
230
	
231
	MiningTurtle:outPos()
232
	
233
	return ret
234
end
235
236
-- Save forward
237
function MiningTurtle:saveForward()
238
239
	while not MiningTurtle:forward() do
240
		turtle.dig()
241
	end
242
end
243
244
-- Save up
245
function MiningTurtle:saveUp()
246
247
	while not MiningTurtle:up() do
248
		turtle.digUp()
249
	end
250
end
251
252
-- Save down
253
function MiningTurtle:saveDown()
254
255
	while not MiningTurtle:down() do
256
		turtle.digDown()
257
	end
258
end
259
260
-- 180 degree turn
261
function MiningTurtle:turn()
262
263
	MiningTurtle:turnRight()
264
	MiningTurtle:turnRight()
265
end
266
267
-- output pos data
268
function MiningTurtle:outPos()
269
270
	print("Pos: " .. self.position.x .. "|" .. self.position.z .. "|" .. self.position.y .. " o: " .. self.direction .. " f: " .. turtle.getFuelLevel() )
271
	
272
end
273
274
-- Turn to direction
275
function MiningTurtle:turnTo( newOrientation )
276
	while self.direction ~= newOrientation do
277
		if math.abs(self.direction - newOrientation) < 180 then
278
			MiningTurtle:turnRight()
279
		else
280
			MiningTurtle:turnLeft()
281
		end
282
	end
283
end
284
285
-- Go to
286
function MiningTurtle:goTo( newPosition )
287
	-- 0 = SOUTH -> Z++
288
	-- 1 = WEST -> X--
289
	-- 2 = NORTH -> Z--
290
	-- 3 = EAST -> X++
291
292
	while not ( (newPosition.x - self.position.x) == 0 and (newPosition.z - self.position.z) == 0 and (newPosition.y - self.position.y) == 0 ) do
293
		print("Was: " .. self.position.x .. "|" .. self.position.z .. "|" .. self.position.y)
294
		
295-
		if (newPosition.x - self.position.x) < 0 then
295+
		if math.ceil(newPosition.x - self.position.x) < 0 then
296
			MiningTurtle:turnTo(1)
297
			MiningTurtle:saveForward()
298-
		elseif (newPosition.x - self.position.x) > 0 then
298+
		elseif math.floor(newPosition.x - self.position.x) > 0 then
299
			MiningTurtle:turnTo(3)
300
			MiningTurtle:saveForward()
301
		end
302
303-
		if (newPosition.z - self.position.z) < 0 then
303+
		if math.ceil(newPosition.z - self.position.z) < 0 then
304
			MiningTurtle:turnTo(2)
305
			MiningTurtle:saveForward()
306-
		elseif (newPosition.z - self.position.z) > 0 then
306+
		elseif math.floor(newPosition.z - self.position.z) > 0 then
307
			MiningTurtle:turnTo(0)
308
			MiningTurtle:saveForward()
309
		end
310
311-
		if (newPosition.y - self.position.y) < 0 then
311+
		if math.ceil(newPosition.y - self.position.y) < 0 then
312
			MiningTurtle:saveDown()
313-
		elseif (newPosition.y - self.position.y) > 0 then
313+
		elseif math.floor(newPosition.y - self.position.y) > 0 then
314
			MiningTurtle:saveUp()
315
		end
316
		print("Is: " .. self.position.x .. "|" .. self.position.z .. "|" .. self.position.y)
317
		
318
	end
319
320
end
321
322
-- Make a tunnel
323
function MiningTurtle:tunnel( length, height, width, ret )
324
325
	-- default values for parameters, only length is required (!)
326
	if height == nil then
327
		height 	= 2
328
	end
329
	
330
	if width == nil then
331
		width 	= 1
332
	end
333
	
334
	if ret == nil then
335
		ret 	= false
336
	end
337
338
	-- Save our current positon back for later return
339
	
340
	returnPos = {}
341
	returnPos.x = self.position.x
342
	returnPos.z = self.position.z
343
	returnPos.y = self.position.y
344
	returnDirection = self.direction
345
346
	-- Place the turtle at the lower left corner of the new tunnel (so that we were starting from the middle of the new tunnel)
347
	-- We only need this, if we have a tonnel with a width > 2 (<=2 means we are already on the right position)
348
	
349
	if width > 2 then
350
351
		MiningTurtle:turnLeft()
352
353
		for i = 0,math.floor( width / 2 ) do
354
			MiningTurtle:saveForward()
355
		end
356
357
		MiningTurtle:turnRight()
358
	end
359
	
360
	-- Length loop
361
	
362
	for i = 0,length-1 do
363
364
		MiningTurtle:saveForward()
365
	
366
		if i % 2 == 0 then
367
			-- even
368
			
369
			-- only change direction if we mine a tunnel wider than 1 block
370
			if width > 1 then
371
				MiningTurtle:turnRight()
372
			end
373
374
			for x = 0,width-1 do
375
376
				for y = 0,height-3 do
377
				
378
					if x % 2 == 0 then
379
						MiningTurtle:saveUp()						
380
					else
381
						MiningTurtle:saveDown()			
382
					end
383
					
384
				end
385
386
				if height > 1 then
387
					turtle.digUp()
388
				end
389
				
390
				if x < width-1 then
391
					MiningTurtle:saveForward()
392
				end
393
			end
394
			
395
			-- same as above
396
			if width > 1 then
397
				MiningTurtle:turnLeft()
398
			end	
399
		
400
		else
401
			-- odd
402
			
403
			if width > 1 then
404
				MiningTurtle:turnLeft()
405
			end
406
407
			for x = 0,width-1 do
408
				
409
				for y = 0,height-3 do
410
				
411
					if x % 2 == 1 or width % 2 == 0 then
412
						MiningTurtle:saveUp()						
413
					else
414
						MiningTurtle:saveDown()			
415
					end
416
					
417
				end
418
419
				if height > 1 then
420
					turtle.digUp()
421
				end
422
				
423
				if x < width-1 then
424
					MiningTurtle:saveForward()
425
				end
426
			end
427
			
428
			if width > 1 then
429
				MiningTurtle:turnRight()
430
			end
431
		end
432
	
433
	end
434
	
435
	if ret then
436
437
		-- Go up to not remove torches on the floow
438
		MiningTurtle:saveUp()
439
	
440
		MiningTurtle:goTo( returnPos )
441
442
		MiningTurtle:turnTo( returnDirection )
443
444
	end
445
	
446
end
447
448
function MiningTurtle:tick()
449
	MiningTurtle:outPos()
450
451
	-- refuel loop
452
	if not MiningTurtle:requiredRefuel( 20, 50 ) then
453
		write(".")
454
		sleep(1)
455
	end
456
end
457
458
-- 
459
function MiningTurtle:matrix( rows, cols )
460
461
	MiningTurtle:tick()
462
463
	--MiningTurtle:toBaseLevel()
464
	MiningTurtle:toGround()
465
466
	--MiningTurtle:tunnel(5, 2, 2, true)
467
	MiningTurtle:goTo( { x=0, y=-5, z=-5 } )
468
469
end
470
471
472
-- main program
473
474
baby = MiningTurtle:new()
475
476
baby:matrix( 10, 10 )