View difference between Paste ID: nT8hP3jM and THpPzFPb
SHOW: | | - or go back to the newest paste.
1-
-- Function to set the heading of the turtle --
1+
--[[
2
	Feel free to use any code or functions in the following paste under the condition
3
	that credit is given where credit is due.
4
	All code has been made by minecraft:montana_1
5
	For comments or concerns, please email [email protected]
6
	
7
	Thanks!
8
]]--
9-
		local heading = ""
9+
10-
                if(turtle.detect()) then
10+
--[[
11
	Code to-do list:
12
		*Auto chest deposit
13
		*Auto torch placement
14
		*Rednet flags
15
		*Main tunnel function
16
		*Finish branch function (located in another paste "CMining Rev 2" currently)
17
		*Various others
18
	Newest Features:
19
		*Ore priorities
20
]]--
21
22
-- Function to split string values into tables --
23
function split(inputstr, sep)
24
	if(inputstr == nil or inputstr == "") then
25
            return nil
26
        end
27
        if sep == nil then
28
            sep = ","
29
        end
30
        local t={} ; i=1
31
        for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
32
            t[i] = str
33
            i = i + 1
34
        end
35
        return t
36
end
37
38
-- Function to add elements to priorities list --
39
function addList(name,mine,flag,drop,vein)
40
	if(fs.exists("listed")) then
41
		xlist = fs.open("listed","r")
42
		local x = split(xlist.readLine())
43
		
44
		while(x[1] ~= nil) do
45
			if(name == x[1]) then
46
				return false
47
			end
48
			s = xlist.readLine()
49
			if(s ~= nil) then
50
				x = split(s)
51
			else
52
				break
53
			end
54
		end
55
		
56
		xlist.close()
57
		xlist = fs.open("listed","a")
58
	else
59
		xlist = fs.open("listed","w")
60
	end
61
	xlist.writeLine(name..","..mine..","..flag..","..drop..","..vein)
62
	xlist.close()
63
	return true
64
end
65
66
-- Function to get priorities list in file format as a list --
67
function lstToTable()
68
	if(fs.exists("listed")) then
69
		ifile = fs.open("listed","r")
70
		xlist = {}
71
		x = split(ifile.readLine())
72
		while(x ~= nil and x ~= "") do
73
			table.insert(xlist, x)
74
			x = split(ifile.readLine())
75
		end
76
	else
77
		--      name,mine,flag,drop,vein
78
		xlist = {
79
			{'iron_ore','1','0','0','1'},
80
			{'coal_ore','1','0','0','1'},
81-
-- Function to get the heading of the turtle --
81+
			{'gold_ore','1','0','0','1'},
82
			{'lapis_ore','1','0','0','1'},
83
			{'redstone_ore','1','0','0','1'},
84
			{'lit_redstone_ore','1','0','0','1'},
85-
		error("Insufficient fuel")
85+
			{'diamond_ore','1','0','0','1'},
86
			{'quartz_ore','1','0','0','1'},
87
			{'emerald_ore','1','0','0','1'}
88-
	local heading = ""
88+
			}
89-
	if(turtle.detect()) then
89+
		for k,v in pairs(xlist) do
90
			addList(v[1],v[2],v[3],v[4],v[5])
91
		end
92
	end
93
	return xlist
94
end
95
96
-- Function to clear turtle inventory according to priorities list --
97
function clrInv(xtable)
98
	for i = 1, 16 do -- loop through the slots
99
		turtle.select(i)
100
		local x = turtle.getItemDetail(i)
101
		if(x ~= nil) then
102
			local istr = string.sub(x.name,string.find(x.name,":",0)+1)
103
			for key,value in pairs(xtable) do
104
				if(istr == value[1] and value[4] == "1") then
105
					turtle.drop()
106
				end
107
			end
108
		end
109
	end
110
	turtle.select(1)
111
end
112
113-
		local heading = getHeading()
113+
-- Function to sort turtle inventory --
114
function sortInv()
115
	for i = 1, 16 do -- loop through the slots
116
		turtle.select(i)
117
		if(turtle.getItemDetail(i) ~= nil) then
118
			for c = i, 16 do
119
				if(turtle.getItemDetail(c) ~= nil) then
120
					if(turtle.compareTo(c)) then
121
						turtle.select(c)
122
						turtle.transferTo(i)
123
						turtle.select(i)
124-
			if(turtle.detectUp()) then
124+
125
				end
126
			end
127
		end
128
	end
129-
			if(turtle.detectDown()) then
129+
130
end
131
132
-- Function to check for turtle inventory space --
133
function invSpace()
134
	for i = 1, 16 do
135
		turtle.select(i)
136
		local x = turtle.getItemDetail(i)
137
		if(x == nil or turtle.compare()) then
138
			turtle.select(1)
139
			return true
140
		end
141
	end
142
	turtle.select(1)
143
	return false
144
end
145-
		if(turtle.detect()) then
145+
146
-- Function to check for sufficient turtle fuel --
147
function sufficientFuel(vector1,vector2,fuel,remainder)
148
	
149
	local distance = math.abs(vector1.x - vector2.x) + math.abs(vector1.y - vector2.y) + math.abs(vector1.z - vector2.z)
150
	if(fuel <= distance + remainder) then
151
		return false
152
	else
153
		return true
154
	end
155
end
156
157
-- Function to consume turtle fuel --
158
function consumeFuel(maxFuel) -- Optionally add more fuel types and prioritise fuel types
159
	local refuel = false
160-
		if(turtle.detect()) then
160+
161
		turtle.select(i) -- change to the slot
162
		local x = turtle.getItemDetail(i)
163
		if(x ~= nil) then
164
			local istr = string.sub(x.name,string.find(x.name,":",0)+1)
165
			if(istr == "planks" or istr == "stick" or istr == "log") then
166
				turtle.refuel()
167
				refuel = true
168
			end
169
			if(turtle.getFuelLevel() < maxFuel and istr == "coal") then
170-
-- Function to check if turtle has sufficient fuel --
170+
171
				refuel = true
172
			end
173
		end
174
	end
175
	turtle.select(1)
176
	--print(turtle.getFuelLevel())
177
	return refuel
178
end
179
180
-- Function to place torch --
181
function placeTorch(direction) -- Optionally add functionality to place torch when no torch can be placed
182-
-- Function to refuel turtle appropriately --
182+
	local torch = false
183
	for i = 1, 16 do -- loop through the slots
184-
function consumeFuel(maxFuel)
184+
		turtle.select(i) -- change to the slot
185
		local x = turtle.getItemDetail(i)
186
		if(x ~= nil) then
187
			local istr = string.sub(x.name,string.find(x.name,":",0)+1)
188
			if(istr == "torch") then
189
				if(direction == "up") then
190
					if(turtle.placeUp()) then
191-
			print(istr,"    t")
191+
						torch = true
192
						turtle.select(1)
193
					end
194
				elseif(direction == "down")then
195
					if(turtle.placeDown()) then
196
						torch = true
197
						turtle.select(1)
198
					end
199
				else
200
					if(turtle.place()) then
201
						torch = true
202
						turtle.select(1)
203-
	print(turtle.getFuelLevel())
203+
204
				end
205
			end
206
		end
207
	end
208-
-- Function to check for inv space --
208+
209
	return torch
210
end
211
212
-- Function to get turtle heading --
213
function getHeading()
214
	if(turtle.getFuelLevel() < 2) then
215
		if(not consumeFuel(400)) then
216
			error("Insufficient fuel")
217
		end
218
	end
219
	local start = vector.new(gps.locate())
220
	while(turtle.detect()) do
221
		turtle.dig()
222
	end
223
	turtle.forward()
224-
-- Function to sort inventory --
224+
225
	turtle.back()
226
	if(start.z - current.z > 0) then
227
		heading = 'N'
228
	elseif (start.z - current.z < 0) then
229
		heading = 'S'
230
	end
231
	if(start.x - current.x > 0) then
232
		heading = 'W'
233
	elseif (start.x - current.x < 0) then
234
		heading = 'E'
235
	end
236
		return heading
237
end
238
239
-- Function to set turtle heading --
240
function setHeading(heading,newHeading)
241
	 if(heading ~= 'N' and heading ~= 'n' and heading ~= 'E' and heading ~= 'e' and heading ~= 'S' and heading ~= 's' and heading ~= 'W' and heading ~= 'w') then
242
		if(turtle.getFuelLevel() < 2) then
243
			error("Insufficient fuel")
244
		end
245-
-- Function to mine entire ore veins --
245+
246
                while(turtle.detect()) do
247-
function mineVein(start,moves,back)
247+
248
                end
249
                turtle.forward()
250
                local current = vector.new(gps.locate())
251-
			return false
251+
252
                if(start.z - current.z > 0) then
253
                        heading = 'N'
254
                elseif (start.z - current.z < 0) then
255
                        heading = 'S'
256
                end
257-
			return false
257+
258
                        heading = 'W'
259
                elseif (start.x - current.x < 0) then
260
                        heading = 'E'
261
                end
262
        end
263
264
	if(heading ~= newHeading) then
265-
		print(istr)
265+
266-
		if(istr == "iron_ore") then
266+
267
				turtle.turnLeft()
268
				turtle.turnLeft()
269-
			mineVein(start,moves+1,false)
269+
270
			if(heading == 'E' or heading == 'e') then
271
				turtle.turnLeft()
272
			end
273
			if(heading == 'W' or heading == 'w') then
274
				turtle.turnRight()
275
			end
276
		end
277
		if(newHeading == 'E' or newHeading == 'e') then
278
			if(heading == 'S' or heading == 's') then
279
				turtle.turnLeft()
280-
		print(istr)
280+
281-
		if(istr == "iron_ore") then
281+
282
				turtle.turnRight()
283
			end
284-
			mineVein(start,moves+1,false)
284+
285
				turtle.turnRight()
286
				turtle.turnRight()
287
			end
288
		end
289
		if(newHeading == 'S' or newHeading == 's') then
290
			if(heading == 'N' or heading == 'n') then
291
				turtle.turnLeft()
292
				turtle.turnLeft()
293-
			print(istr)
293+
294-
			if(istr == "iron_ore") then
294+
295
				turtle.turnRight()
296
			end
297-
				mineVein(start,moves+1,false)
297+
298
				turtle.turnLeft()
299
			end
300
		end
301
		if(newHeading == 'W' or newHeading == 'w') then
302
			if(heading == 'S' or heading == 's') then
303
				turtle.turnRight()
304
			end
305-
			print(istr)
305+
306-
			if(istr == "iron_ore") then
306+
307
				turtle.turnLeft()
308
			end
309-
				mineVein(start,moves+1,false)
309+
310
				turtle.turnLeft()
311
			end
312
		end
313
	end
314
end
315
316
-- Function to go to a specific location --
317-
			print(istr)
317+
318-
			if(istr == "iron_ore") then
318+
319
		heading = getHeading()
320
	end
321-
				mineVein(start,moves+1,true)
321+
322
	local current = vector.new(gps.locate())
323
	if(location.x ~= current.x or location.y ~= current.y or location.z ~= current.z) then
324
		if(turtle.getFuelLevel() < 2) then
325-
		--
325+
326
		end
327
	end
328
	while(location.y ~= current.y) do
329-
			print(istr)
329+
330-
			if(istr == "iron_ore") then
330+
			while(turtle.detectUp()) do
331
				turtle.digUp()
332
			end
333-
				mineVein(start,moves+1,true)
333+
334
		else
335
			while(turtle.detectDown()) do
336
				turtle.digDown()
337-
		--
337+
338
			turtle.down()
339
		end
340
		current = vector.new(gps.locate())
341
	end
342
	
343
	while(location.z ~= current.z) do
344-
			print(istr)
344+
345-
			if(istr == "iron_ore") then
345+
346
			heading = 'S'
347
		elseif(location.z < current.z) then
348-
				mineVein(start,moves+1,false)
348+
349
			heading = 'N'
350
		end
351
		while(turtle.detect()) do
352
			turtle.dig()
353
		end
354
		turtle.forward()
355
		current = vector.new(gps.locate())
356-
			print(istr)
356+
357-
			if(istr == "iron_ore") then
357+
358
	while(location.x ~= current.x) do
359
		if(location.x > current.x) then
360-
				mineVein(start,moves+1,true)
360+
361
			heading = 'E'
362
		elseif(location.x < current.x) then
363
			setHeading(heading,'W')
364-
		--
364+
365
		end
366
		while(turtle.detect()) do
367
			turtle.dig()
368-
			print(istr)
368+
369-
			if(istr == "iron_ore") then
369+
370
		current = vector.new(gps.locate())
371
	end
372-
				mineVein(start,moves+1,true)
372+
373
end
374
375
-- Function to decide whether to mine whole ore vein based on priorities list --
376-
		--
376+
function shouldMineWhole(istr,xlist) -- must add functionality for flagging ores
377
	for key,value in pairs(xlist) do
378
		if(istr == value[1] and value[5] == "1") then
379
			return true
380
		end
381
	end
382-
-- Starting variables --
382+
383-
-- (These are only temporary) --
383+
384
385-
level = 12
385+
-- Function to mine entire ore pocket --
386
function mineVein(start,moves,back,xtable) -- This function needs work on flagging ore, also could be significantly more efficient
387-
limit = 16
387+
	--Establish current GPS location--
388
	local current = vector.new(gps.locate())
389
	--Check for sufficient fuel, if not, try to refuel, if refuel fails, function return false and 
390-
--|-----------------------|--
390+
	--recursion tree will collapse with turtle returning to where it started--
391-
--| **  Main function  ** |--
391+
392-
--V-----------------------V--
392+
393
			return -2
394-
--      Check if GPS_DATA file exists   --
394+
395-
if(fs.exists("GPS_DATA")) then
395+
396-
	--      GPS_DATA exists                 --
396+
	--Check for inventory space, if no inventory space, try to create some. if no space can be created, 
397-
        --      Check validity of GPS_DATA      --
397+
	--function return false and recursion tree will collapse, with turtle returning to where it started.
398-
	gpsData = fs.open("GPS_DATA","r")
398+
399-
	local start = vector.new(tonumber(gpsData.readLine()),tonumber(gpsData.readLine()),tonumber(gpsData.readLine()))
399+
400-
	sHeading = gpsData.readLine()
400+
		clrInv(xtable)
401-
	if(start.x == nil or start.y == nil or start.z == nil) then
401+
402-
		--      GPS_DATA Invalid                --
402+
			return -1
403-
                term.clear()
403+
404-
                term.setCursorPos(1,1)
404+
405-
                error("Invalid GPS information")
405+
406
	--Check above turtle for ores--
407-
		--      GPS_DATA Valid          --
407+
408-
                term.clear()
408+
409-
                term.setCursorPos(1,1)
409+
410-
                print("GPS_DATA exists, start: (",start.x,",",start.y,",",start.z,")")
410+
		--print(istr)
411-
                print("Heading: ", sHeading)
411+
		if(shouldMineWhole(istr,xtable)) then
412-
		--      Search for GPS signal   --
412+
413
			turtle.forward()
414-
                if(current.x == nil or current.y == nil or current.z == nil) then
414+
			mineVein(start,moves+1,false,xtable)
415-
                        --      GPS signal could not be established     --
415+
416-
                        error("Could not establish GPS signal, please ensure GPS servers are running and try again")
416+
417-
                else
417+
418-
			--      GPS signal established          --
418+
	if(moves == 0) then
419-
                        print("GPS locate, current: (",current.x,",",current.y,",",current.z,")")
419+
		if(current.y == start.y + 1) then
420-
			--      Ensure y level is the same as starting y level  --
420+
			local success,data = turtle.inspectUp()
421-
			if(not sufficientFuel(current,start,turtle.getFuelLevel(),5)) then
421+
			if(success) then
422-
				if(not consumeFuel(400)) then
422+
				local istr = string.sub(data.name,string.find(data.name,":",0)+1)
423-
					error("Insufficient fuel!")
423+
				--print(istr)
424
				if(shouldMineWhole(istr,xtable)) then
425
					turtle.digUp()
426-
                        local cHeading = getHeading()
426+
					turtle.up()
427-
			print("Heading: ", cHeading)
427+
					mineVein(start,moves+1,true,xtable)
428-
                        if(start.y ~= current.y) then
428+
					turtle.down()
429-
                                --      if y level is not the same      --
429+
430-
                                cHeading = goToLocation(vector.new(current.x,start.y,current.z), cHeading)
430+
431-
				current = vector.new(gps.locate())
431+
432
		if(current.y == start.y) then
433-
                        end
433+
			local success,data = turtle.inspectDown()
434-
                        --      Ensure z level is the same as starting y level  --
434+
			if(success) then
435-
                        if(sHeading == 'N' or sHeading == 'n' or sHeading == 'S' or sHeading == 's') then
435+
				local istr = string.sub(data.name,string.find(data.name,":",0)+1)
436-
                                if(start.z ~= current.z) then
436+
				--print(istr)
437-
                                        --      if z level is not the same      --
437+
				if(shouldMineWhole(istr,xtable)) then
438-
                                        cHeading = goToLocation(vector.new(start.x,current.y,current.z), cHeading)
438+
					turtle.digDown()
439-
					current = vector.new(gps.locate())
439+
					turtle.down()
440-
                                end
440+
					mineVein(start,moves+1,true,xtable)
441-
                        end
441+
					turtle.up()
442-
                        --      Ensure x level is the same as starting y level  --
442+
443-
                        if(sHeading == 'E' or sHeading == 'e' or sHeading == 'W' or sHeading == 'w') then
443+
444-
                                if(start.x ~= current.x) then
444+
445-
                                        --      if x level is not the same      --
445+
446-
                                        cHeading = goToLocation(vector.new(current.x,current.y,start.z), cHeading)
446+
447-
					current = vector.new(gps.locate())
447+
	--will ensure turtle does not check sides on start.
448-
                                end
448+
449-
                        end
449+
		return 1
450-
                        setHeading(cHeading,sHeading)
450+
451-
			cHeading = sHeading
451+
452-
			done = false
452+
453-
			while(done == false) do
453+
454-
				current = vector.new(gps.locate())
454+
455-
				if(current.x == nil or current.y == nil or current.z == nil) then
455+
		--print(istr)
456-
                        		--      GPS signal could not be established     --
456+
		if(shouldMineWhole(istr,xtable)) then
457-
                        		print("Could not establish GPS signal, please ensure GPS servers are running and try again")
457+
458-
                        		error()
458+
459-
                		else
459+
			mineVein(start,moves+1,false,xtable)
460-
					--      Ensure distance from start is less than limit   --
460+
461-
                        		--      Along the North/South line      --
461+
462-
                        		if(sHeading == 'N' or sHeading == 'n' or sHeading == 'S' or sHeading == 's')then
462+
463-
                               			--      Check if distance from start is within limit    --
463+
464-
                                		if(math.abs(start.z - current.z)>limit) then
464+
465-
							--      Distance from start is not within limit         --
465+
466-
							cHeading = goToLocation(vector.new(start.x,start.y,current.z),cHeading)
466+
467-
							cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
467+
468-
							done = true
468+
			--print(istr)
469-
                                		else
469+
			if(shouldMineWhole(istr,xtable)) then
470-
							--      Distance from start is within limit     --
470+
471-
							--	Check for sufficient fuel	--
471+
472-
							if(sufficientFuel(current,start,turtle.getFuelLevel(),5)) then
472+
				mineVein(start,moves+1,false,xtable)
473-
								if(invSpace()) then
473+
474-
									if(current.y == start.y) then
474+
475-
										--checkSides()
475+
476-
										if(turtle.detect()) then
476+
477-
											turtle.dig()
477+
478-
										end
478+
479-
										turtle.forward()
479+
480-
										--checkSides()
480+
			--print(istr)
481-
										if(turtle.detectUp()) then
481+
			if(shouldMineWhole(istr,xtable)) then
482-
											turtle.digUp()
482+
483-
										end
483+
484-
										turtle.up()
484+
				mineVein(start,moves+1,false,xtable)
485-
									elseif(current.y - 1 == start.y) then
485+
486-
										--checkSides()
486+
487-
										if(turtle.detect()) then
487+
488-
											turtle.dig()
488+
489-
										end
489+
490-
										turtle.forward()
490+
491-
										--checkSides()
491+
492-
										if(turtle.detectDown()) then
492+
			--print(istr)
493-
											turtle.digDown()
493+
			if(shouldMineWhole(istr,xtable)) then
494-
										end
494+
495-
										turtle.down()
495+
496-
									else
496+
				mineVein(start,moves+1,true,xtable)
497-
										cHeading = goToLocation(vector.new(current.x,start.y,current.z),cHeading)
497+
498-
									end
498+
499-
								else
499+
500-
									sortInv()
500+
501-
									if(not invSpace()) then
501+
502-
										cHeading = goToLocation(vector.new(start.x,start.y,current.z),cHeading)
502+
503-
										cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
503+
			--print(istr)
504-
										done = true
504+
			if(shouldMineWhole(istr,xtable)) then
505-
									end
505+
506
				turtle.down()
507
				mineVein(start,moves+1,true,xtable)
508-
								if(not consumeFuel(400)) then
508+
509-
									cHeading = goToLocation(vector.new(start.x,start.y,current.z),cHeading)
509+
510-
									cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
510+
511-
									done = true
511+
512
		turtle.turnRight()
513
		turtle.turnRight()
514-
                                		end
514+
515-
                        		--      Along the East/West line                --
515+
516-
                        		elseif(sHeading == 'E' or sHeading == 'e' or sHeading == 'W' or sHeading == 'w') then
516+
517-
                                		--      Check if distance from start is within limit    --
517+
			--print(istr)
518-
                                		if(math.abs(start.x - current.x)>limit) then
518+
			if(shouldMineWhole(istr,xtable)) then
519-
							--      Distance from start is not within limit         --
519+
520-
							cHeading = goToLocation(vector.new(current.x,start.y,start.z),cHeading)
520+
521-
							cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
521+
				mineVein(start,moves+1,false,xtable)
522-
							done = true
522+
523-
                                		else
523+
524-
							--      Distance from start is within limit     --
524+
525-
							--	Check for sufficient fuel	--
525+
526-
							if(sufficientFuel(current,start,turtle.getFuelLevel(),5)) then
526+
527-
								if(invSpace()) then
527+
528-
									if(current.y == start.y) then
528+
529-
										--checkSides()
529+
			--print(istr)
530-
										if(turtle.detect()) then
530+
			if(shouldMineWhole(istr,xtable)) then
531-
											turtle.dig()
531+
532-
										end
532+
533-
										turtle.forward()
533+
				mineVein(start,moves+1,true,xtable)
534-
										--checkSides()
534+
535-
										if(turtle.detectUp()) then
535+
536-
											turtle.digUp()
536+
537-
										end
537+
538-
										turtle.up()
538+
539-
									elseif(current.y - 1 == start.y) then
539+
540-
										--checkSides()
540+
			--print(istr)
541-
										if(turtle.detect()) then
541+
			if(shouldMineWhole(istr,xtable)) then
542-
											turtle.dig()
542+
543-
										end
543+
544-
										turtle.forward()
544+
				mineVein(start,moves+1,true,xtable)
545-
										--checkSides()
545+
546-
										if(turtle.detectDown()) then
546+
547-
											turtle.digDown()
547+
548-
										end
548+
549-
										turtle.down()
549+
	return 1
550-
									else
550+
551-
										cHeading = goToLocation(vector.new(current.x,start.y,current.z),cHeading)
551+
552-
									end
552+
-- Function to mine branch --
553-
								else
553+
function mineBranch(branchStart,branchHeading,currentHeading,branchLimit,fuelRemainder,plist,torchLength) -- Still needs optimization and functions to replace repeated blocks
554-
									sortInv()
554+
	-- Search for GPS signal --
555-
									if(not invSpace()) then
555+
556-
										cHeading = goToLocation(vector.new(current.x,start.y,start.z),cHeading)
556+
	if(current.x == nil or current.y == nil or current.z == nil) then
557-
										cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
557+
		-- GPS signal could not be established --
558-
										done = true
558+
		error("Could not establish GPS signal, please ensure GPS servers are running and try again")
559-
									end
559+
560
	-- GPS signal established --
561
	if(not sufficientFuel(current,branchStart,turtle.getFuelLevel(),fuelRemainder + 5)) then
562-
								if(not consumeFuel(400)) then
562+
		if(not consumeFuel(4000)) then
563-
									cHeading = goToLocation(vector.new(current.x,start.y,start.z),cHeading)
563+
			error("Insufficient fuel!")
564-
									cHeading = goToLocation(vector.new(start.x,start.y,start.z),cHeading)
564+
565-
									done = true
565+
566
	if(currentHeading ~= 'N' and currentHeading ~= 'n' and currentHeading ~= 'E' and currentHeading ~= 'e' and currentHeading ~= 'S' and currentHeading ~= 's' and currentHeading ~= 'W' and currentHeading ~= 'w') then
567
		currentHeading = getHeading()
568-
                                		end
568+
569-
                        		end
569+
570
	--print("Heading: ", currentHeading)
571
	
572-
			print("Mining complete")
572+
	if(branchStart.y ~= current.y) then
573
		-- If y level is not the same --
574
		currentHeading = goToLocation(vector.new(current.x,branchStart.y,current.z), currentHeading)
575-
else
575+
576-
	--      GPS_DATA not found      --
576+
577-
        term.clear()
577+
	-- Ensure z level is the same as starting y level --
578-
        term.setCursorPos(1,1)
578+
	if(branchHeading == 'N' or branchHeading == 'n' or branchHeading == 'S' or branchHeading == 's') then
579-
        print("File 'GPS_DATA' does not exist, please run program to initiate mining.")
579+
		if(branchStart.z ~= current.z) then
580-
        error()
580+
			-- If z level is not the same --
581-
end
581+
			currentHeading = goToLocation(vector.new(branchStart.x,current.y,current.z), currentHeading)
582
			current = vector.new(gps.locate())
583
		end
584
	end
585
	-- Ensure x level is the same as starting y level --
586
	if(branchHeading == 'E' or branchHeading == 'e' or branchHeading == 'W' or branchHeading == 'w') then
587
		if(branchStart.x ~= current.x) then
588
			-- If x level is not the same --
589
			currentHeading = goToLocation(vector.new(current.x,current.y,branchStart.z), currentHeading)
590
			current = vector.new(gps.locate())
591
		end
592
	end
593
    setHeading(currentHeading,branchHeading)
594
	currentHeading = branchHeading
595
	--[[
596
		Done
597
		0	: Not done, still mining
598
		1	: Is done, mining was successful
599
		-1	: Inventory full
600
		-2	: Insufficient fuel
601
	]]--
602
	done = 0
603
	while(done == 0) do
604
		current = vector.new(gps.locate())
605
		if(current.x == nil or current.y == nil or current.z == nil) then
606
			-- GPS signal could not be established --
607
			error("Could not establish GPS signal, please ensure GPS servers are running and try again")
608
		else
609
			-- Ensure distance from branchStart is less than branchLimit --
610
			-- Along the North/South line --
611
			if(branchHeading == 'N' or branchHeading == 'n' or branchHeading == 'S' or branchHeading == 's')then
612
				-- Check if distance from branchStart is within branchLimit --
613
				if(math.abs(branchStart.z - current.z)>=branchLimit) then
614
					-- Distance from branchStart is not within branchLimit --
615
					currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,current.z),currentHeading)
616
					currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
617
					done = 1
618
				else
619
					-- Distance from branchStart is within branchLimit --
620
					-- Check for sufficient fuel --
621
					if(sufficientFuel(current,branchStart,turtle.getFuelLevel(),fuelRemainder + 5)) then
622
						if(invSpace()) then
623
							if(current.y == branchStart.y) then
624
								turtle.turnLeft()
625
								if(done == 1) then
626
									done = mineVein(branchStart,0,false,plist)
627
								end
628
								turtle.turnRight()
629
								turtle.turnRight()
630
								if(done == 1) then
631
									done = mineVein(branchStart,0,false,plist)
632
								end
633
								turtle.turnLeft()
634
								while(turtle.detect()) do
635
									turtle.dig()
636
								end
637
								turtle.forward()
638
								turtle.turnLeft()
639
								if(done == 1) then
640
									done = mineVein(branchStart,0,false,plist)
641
								end
642
								turtle.turnRight()
643
								turtle.turnRight()
644
								if(done == 1) then
645
									done = mineVein(branchStart,0,false,plist)
646
								end
647
								turtle.turnLeft()
648
								while(turtle.detectUp()) do
649
									turtle.digUp()
650
								end
651
								turtle.up()
652
							elseif(current.y - 1 == branchStart.y) then
653
								turtle.turnLeft()
654
								if(done == 1) then
655
									done = mineVein(branchStart,0,false,plist)
656
								end
657
								turtle.turnRight()
658
								turtle.turnRight()
659
								if(done == 1) then
660
									done = mineVein(branchStart,0,false,plist)
661
								end
662
								turtle.turnLeft()
663
								while(turtle.detect()) do
664
									turtle.dig()
665
								end
666
								turtle.forward()
667
								turtle.turnLeft()
668
								if(done == 1) then
669
									done = mineVein(branchStart,0,false,plist)
670
								end
671
								turtle.turnRight()
672
								turtle.turnRight()
673
								if(done == 1) then
674
									done = mineVein(branchStart,0,false,plist)
675
								end
676
								turtle.turnLeft()
677
								while(turtle.detectDown()) do
678
									turtle.digDown()
679
								end
680
								turtle.down()
681
							else
682
								currentHeading = goToLocation(vector.new(current.x,branchStart.y,current.z),currentHeading)
683
							end
684
						else
685
							sortInv()
686
							clrInv(plist)
687
							if(not invSpace()) then
688
								currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,current.z),currentHeading)
689
								currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
690
								done = -1
691
							end
692
						end
693
					else
694
						if(not consumeFuel(4000)) then
695
							currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,current.z),currentHeading)
696
							currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
697
							done = -2
698
						end
699
					end
700
				end
701
			-- Along the East/West line --
702
			elseif(branchHeading == 'E' or branchHeading == 'e' or branchHeading == 'W' or branchHeading == 'w') then
703
				-- Check if distance from branchStart is within branchLimit --
704
				if(math.abs(branchStart.x - current.x)>=branchLimit) then
705
					-- Distance from branchStart is not within branchLimit --
706
					currentHeading = goToLocation(vector.new(current.x,branchStart.y,branchStart.z),currentHeading)
707
					currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
708
					done = 1
709
				else
710
					-- Distance from branchStart is within branchLimit --
711
					-- Check for sufficient fuel --
712
					if(sufficientFuel(current,branchStart,turtle.getFuelLevel(),fuelRemainder + 5)) then
713
						if(invSpace()) then
714
							if(current.y == branchStart.y) then
715
								turtle.turnLeft()
716
								if(done == 1) then
717
									done = mineVein(branchStart,0,false,plist)
718
								end
719
								turtle.turnRight()
720
								turtle.turnRight()
721
								if(done == 1) then
722
									done = mineVein(branchStart,0,false,plist)
723
								end
724
								turtle.turnLeft()
725
								while(turtle.detect()) do
726
									turtle.dig()
727
								end
728
								turtle.forward()
729
								turtle.turnLeft()
730
								if(done == 1) then
731
									done = mineVein(branchStart,0,false,plist)
732
								end
733
								turtle.turnRight()
734
								turtle.turnRight()
735
								if(done == 1) then
736
									done = mineVein(branchStart,0,false,plist)
737
								end
738
								turtle.turnLeft()
739
								while(turtle.detectUp()) do
740
									turtle.digUp()
741
								end
742
								turtle.up()
743
							elseif(current.y - 1 == branchStart.y) then
744
								turtle.turnLeft()
745
								if(done == 1) then
746
									done = mineVein(branchStart,0,false,plist)
747
								end
748
								turtle.turnRight()
749
								turtle.turnRight()
750
								if(done == 1) then
751
									done = mineVein(branchStart,0,false,plist)
752
								end
753
								turtle.turnLeft()
754
								while(turtle.detect()) do
755
									turtle.dig()
756
								end
757
								turtle.forward()
758
								turtle.turnLeft()
759
								if(done == 1) then
760
									done = mineVein(branchStart,0,false,plist)
761
								end
762
								turtle.turnRight()
763
								turtle.turnRight()
764
								if(done == 1) then
765
									done = mineVein(branchStart,0,false,plist)
766
								end
767
								turtle.turnLeft()
768
								while(turtle.detectDown()) do
769
									turtle.digDown()
770
								end
771
								turtle.down()
772
							else
773
								currentHeading = goToLocation(vector.new(current.x,branchStart.y,current.z),currentHeading)
774
							end
775
						else
776
							sortInv()
777
							clrInv(plist)
778
							if(not invSpace()) then
779
								currentHeading = goToLocation(vector.new(current.x,branchStart.y,branchStart.z),currentHeading)
780
								currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
781
								done = -1
782
							end
783
						end
784
					else
785
						if(not consumeFuel(4000)) then
786
							currentHeading = goToLocation(vector.new(current.x,branchStart.y,branchStart.z),currentHeading)
787
							currentHeading = goToLocation(vector.new(branchStart.x,branchStart.y,branchStart.z),currentHeading)
788
							done = -2
789
						end
790
					end
791
				end
792
			end
793
		end
794
	end
795
	return done
796
end
797
x = lstToTable()
798
print(mineBranch(vector.new(gps.locate()),getHeading(),"",5,10,x,0))