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