• API
• FAQ
• Tools
• Archive
daily pastebin goal
44%
SHARE
TWEET

# Untitled

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

Top