SHOW:
|
|
- or go back to the newest paste.
1 | local tArgs = { ... } | |
2 | if #tArgs ~= 1 then | |
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 depth = 0 | |
15 | local unloaded = 0 | |
16 | local collected = 0 | |
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 | sleep(1) | |
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 + 1) | |
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 function tryForwards() | |
121 | if not refuel() then | |
122 | print( "Not enough Fuel" ) | |
123 | returnSupplies() | |
124 | end | |
125 | ||
126 | while not turtle.forward() do | |
127 | if turtle.detect() then | |
128 | if turtle.dig() then | |
129 | if not collect() then | |
130 | returnSupplies() | |
131 | end | |
132 | else | |
133 | return false | |
134 | end | |
135 | elseif turtle.attack() then | |
136 | if not collect() then | |
137 | returnSupplies() | |
138 | end | |
139 | else | |
140 | sleep( 0.5 ) | |
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() 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.up() then | |
194 | depth = depth - 1 | |
195 | elseif turtle.digUp() or turtle.attackUp() 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.down() then | |
260 | depth = depth + 1 | |
261 | elseif turtle.digDown() or turtle.attackDown() 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() then | |
274 | print( "Out of Fuel" ) | |
275 | return | |
276 | end | |
277 | ||
278 | print( "Excavating..." ) | |
279 | ||
280 | local reseal = false | |
281 | turtle.select(1) | |
282 | if turtle.digDown() then | |
283 | reseal = true | |
284 | end | |
285 | ||
286 | local alternate = 0 | |
287 | local done = false | |
288 | while not done do | |
289 | for n=1,size do | |
290 | for m=1,size-1 do | |
291 | if not tryForwards() then | |
292 | done = true | |
293 | break | |
294 | end | |
295 | end | |
296 | if done then | |
297 | break | |
298 | end | |
299 | if n<size then | |
300 | if math.fmod(n + alternate,2) == 0 then | |
301 | turnLeft() | |
302 | if not tryForwards() then | |
303 | done = true | |
304 | break | |
305 | end | |
306 | turnLeft() | |
307 | else | |
308 | turnRight() | |
309 | if not tryForwards() then | |
310 | done = true | |
311 | break | |
312 | end | |
313 | turnRight() | |
314 | end | |
315 | end | |
316 | end | |
317 | if done then | |
318 | break | |
319 | end | |
320 | ||
321 | if size > 1 then | |
322 | if math.fmod(size,2) == 0 then | |
323 | turnRight() | |
324 | else | |
325 | if alternate == 0 then | |
326 | turnLeft() | |
327 | else | |
328 | turnRight() | |
329 | end | |
330 | alternate = 1 - alternate | |
331 | end | |
332 | end | |
333 | ||
334 | if not tryDown() then | |
335 | done = true | |
336 | break | |
337 | end | |
338 | end | |
339 | ||
340 | print( "Returning to surface..." ) | |
341 | ||
342 | -- Return to where we started | |
343 | goTo( 0,0,0,0,-1 ) | |
344 | unload( false ) | |
345 | goTo( 0,0,0,0,1 ) | |
346 | ||
347 | -- Seal the hole | |
348 | if reseal then | |
349 | turtle.placeDown() | |
350 | end | |
351 | ||
352 | print( "Mined "..(collected + unloaded).." items total." ) |