• API
• FAQ
• Tools
• Archive
SHARE
TWEET # Untitled debman  Aug 20th, 2019 71 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. local tArgs = { ... }
2. if #tArgs ~= 2 then
3.     print( "Usage: excavate <diameter> <height>" )
4.     return
5. end
6.
7. -- Mine in a quarry pattern until we hit something we can't dig
8. local base_size = tonumber( tArgs )
9. local height = tonumber(tArgs)
10. if base_size < 1 then
11.     print( "Excavate diameter must be positive" )
12.     return
13. end
14.
15. local depth = 0
16. local unloaded = 0
17. local collected = 0
18.
19. local xPos,zPos = 0,0
20. local xDir,zDir = 0,1
21. local p = 44 / math.log(40)
22.
23. local goTo -- Filled in further down
24. local refuel -- Filled in further down
25.
26. local function unload( _bKeepOneFuelStack )
28.     for n=1,16 do
29.         local nCount = turtle.getItemCount(n)
30.         if nCount > 0 then
31.             turtle.select(n)
32.             local bDrop = true
33.             if turtle.refuel(0) then
34.                 bDrop = false
35.                 _bKeepOneFuelStack = false
36.             elseif bDrop then
37.                 turtle.drop()
39.             end
40.         end
41.     end
42.     collected = 0
43.     turtle.select(1)
44. end
45.
46. local function returnSupplies()
47.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
48.     print( "Returning to surface..." )
49.
50.     local fuelNeeded = 1
51.     if not refuel(1) then
52.         unload( true )
53.         print( "Waiting for fuel" )
54.         while not refuel(1) do
55.             os.pullEvent( "turtle_inventory" )
56.         end
57.     else
58.         unload( true )
59.     end
60.
61.     print( "Resuming mining..." )
62. end
63.
64. local function collect()
65.     local bFull = true
66.     local nTotalItems = 0
67.     for n=1,16 do
68.         local nCount = turtle.getItemCount(n)
69.         if nCount == 0 then
70.             bFull = false
71.         end
72.         nTotalItems = nTotalItems + nCount
73.     end
74.
75.     if nTotalItems > collected then
76.         collected = nTotalItems
77.         if math.fmod(collected + unloaded, 50) == 0 then
78.             print( "Mined "..(collected + unloaded).." items." )
79.         end
80.     end
81.
82.     if bFull then
83.         print( "No empty slots left." )
84.         return false
85.     end
86.     return true
87. end
88.
89. function refuel( ammount )
90.     local fuelLevel = turtle.getFuelLevel()
91.     if fuelLevel == "unlimited" then
92.         return true
93.     end
94.
95.     local needed = ammount
96.     if turtle.getFuelLevel() < needed then
97.         local fueled = false
98.         for n=1,16 do
99.             if turtle.getItemCount(n) > 0 then
100.                 turtle.select(n)
101.                 if turtle.refuel(1) then
102.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
103.                         turtle.refuel(1)
104.                     end
105.                     if turtle.getFuelLevel() >= needed then
106.                         turtle.select(1)
107.                         return true
108.                     end
109.                 end
110.             end
111.         end
112.         turtle.select(1)
113.         return false
114.     end
115.
116.     return true
117. end
118.
119. local function tryForwards()
120.     if turtle.getFuelLevel() == 0 then
121.         if not refuel(1) then
122.             returnSupplies()
123.         end
124.     end
125.     while not turtle.forward() do
126.         if turtle.detect() then
127.             if turtle.dig() then
128.             else
129.                 return false
130.             end
131.         elseif turtle.attack() then
132.             do
133.             end
134.         else
135.             sleep( 0.1 )
136.         end
137.         if turtle.getFuelLevel() == 0 then
138.             if not refuel(1) then
139.                 returnSupplies()
140.             end
141.         end
142.     end
143.
144.     xPos = xPos + xDir
145.     zPos = zPos + zDir
146.     return true
147. end
148.
149. local function tryDown()
150.     if not refuel(1) then
151.         print( "Not enough Fuel" )
152.         returnSupplies()
153.     end
154.
155.     while not turtle.down() do
156.         if turtle.detectDown() then
157.             if turtle.digDown() then
158.                 if not collect() then
159.                     returnSupplies()
160.                 end
161.             else
162.                 return false
163.             end
164.         elseif turtle.attackDown() then
165.             if not collect() then
166.                 returnSupplies()
167.             end
168.         else
169.             sleep( 0.5 )
170.         end
171.     end
172.
173.     depth = depth + 1
174.     if math.fmod( depth, 10 ) == 0 then
175.         print( "Descended "..depth.." metres." )
176.     end
177.
178.     return true
179. end
180.
181. local function turnLeft()
182.     turtle.turnLeft()
183.     xDir, zDir = -zDir, xDir
184. end
185.
186. local function turnRight()
187.     turtle.turnRight()
188.     xDir, zDir = zDir, -xDir
189. end
190.
191. function goTo( x, y, z, xd, zd )
192.     while depth < y do
193.         if turtle.down() then
194.             depth = depth + 1
195.         elseif turtle.digDown() or turtle.attackDown() then
196.             collect()
197.         else
198.             sleep( 0.5 )
199.         end
200.     end
201.
202.     if xPos > x then
203.         while xDir ~= -1 do
204.             turnLeft()
205.         end
206.         while xPos > x do
207.             if turtle.forward() then
208.                 xPos = xPos - 1
209.             elseif turtle.dig() or turtle.attack() then
210.                 collect()
211.             else
212.                 sleep( 0.5 )
213.             end
214.         end
215.     elseif xPos < x then
216.         while xDir ~= 1 do
217.             turnLeft()
218.         end
219.         while xPos < x do
220.             if turtle.forward() then
221.                 xPos = xPos + 1
222.             elseif turtle.dig() or turtle.attack() then
223.                 collect()
224.             else
225.                 sleep( 0.5 )
226.             end
227.         end
228.     end
229.
230.     if zPos > z then
231.         while zDir ~= -1 do
232.             turnLeft()
233.         end
234.         while zPos > z do
235.             if turtle.forward() then
236.                 zPos = zPos - 1
237.             elseif turtle.dig() or turtle.attack() then
238.                 collect()
239.             else
240.                 sleep( 0.5 )
241.             end
242.         end
243.     elseif zPos < z then
244.         while zDir ~= 1 do
245.             turnLeft()
246.         end
247.         while zPos < z do
248.             if turtle.forward() then
249.                 zPos = zPos + 1
250.             elseif turtle.dig() or turtle.attack() then
251.                 collect()
252.             else
253.                 sleep( 0.5 )
254.             end
255.         end
256.     end
257.
258.     while depth > y do
259.         if turtle.up() then
260.             depth = depth - 1
261.         elseif turtle.digUp() or turtle.attackUp() then
262.             collect()
263.         else
264.             sleep( 0.5 )
265.         end
266.     end
267.
268.     while zDir ~= zd or xDir ~= xd do
269.         turnLeft()
270.     end
271. end
272.
273. if not refuel(1) then
274.     print( "Out of Fuel" )
275.     return
276. end
277.
278.
279. local function excavate_area(size, alternate)
280.     for n=1,size do
281.         for m=1,size-1 do
282.             if not tryForwards() then
283.                 return true
284.             end
285.         end
286.         if n<size then
287.             if math.fmod(n + alternate,2) == 0 then
288.                 turnLeft()
289.                 if not tryForwards() then
290.                     return true
291.                 end
292.                 turnLeft()
293.             else
294.                 turnRight()
295.                 if not tryForwards() then
296.                     return true
297.                 end
298.                 turnRight()
299.             end
300.         end
301.     end
302.     return false
303. end
304.
305. local function f(h, base_size)
306.     return base_size + p * math.log(h + 1)
307. end
308.
309. print( "Excavating..." )
310.
311. local reseal = false
312. turtle.select(1)
313. if turtle.digDown() then
314.     reseal = true
315. end
316.
317. local alternate = 0
318. local done = false
319. local size = base_size
320. while not done do
321.     done = excavate_area(size, alternate)
322.     if done then
323.         break
324.     end
325.
326.     if not tryDown() then
327.         done = true
328.         break
329.     else
330.         height = height + 1
331.         if height >= 36 then
332.             done = true
333.             break
334.         end
335.         prev_size = size
336.         size = math.floor(f(height, base_size))
337.         if math.fmod(size, 2) == 1 then
338.             size = size + 1
339.         end
340.         local dx = math.floor((size - prev_size) / 2)
341.         for i=1,dx do
342.             tryForwards()
343.         end
344.         turnLeft()
345.         for i=1,dx do
346.             tryForwards()
347.         end
348.         turnRight()
349.     end
350.
351.     if size > 1 then
352.         if math.fmod(size,2) == 0 then
353.             turnRight()
354.         else
355.             if alternate == 0 then
356.                 turnLeft()
357.             else
358.                 turnRight()
359.             end
360.             alternate = 1 - alternate
361.         end
362.     end
363. end
364.
365. print( "Returning to surface..." )
366.
367. -- Return to where we started
368. goTo( 0,0,0,0,-1 )
369. unload( false )
370. goTo( 0,0,0,0,1 )
371.
372. -- Seal the hole
373. if reseal then
374.     turtle.placeDown()
375. end
376.
377. print( "Mined "..(collected + unloaded).." items total." )
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy.
Not a member of Pastebin yet?
Sign Up, it unlocks many cool features!

Top