SHOW:
|
|
- or go back to the newest paste.
1 | - | -- walls |
1 | + | -- structure |
2 | - | -- Puts up walls to the length, width, height specified |
2 | + | -- Puts up walls and roof to the length, width, height specified |
3 | -- Turtle returns to its starting point when mission is completed or fuel runs low | |
4 | - | -- Written by HarvDad, March 2014 |
4 | + | -- Written by HarvDad, November 2019 |
5 | ||
6 | args = {...} | |
7 | nArgs = #args | |
8 | ||
9 | - | version = "walls: Rev 1.0" |
9 | + | version = "structure: Rev 1.0" |
10 | - | mission = "Put walls to the length, width, height specified" |
10 | + | mission = "Put walls and roof to the length, width, height specified" |
11 | - | instructions = "Place stack(s) of material starting in first slot." |
11 | + | instructions = "Place stack(s) of wall material starting in first slot, roof material slot 9." |
12 | ||
13 | - | usage = "walls <length> <width> <height>" |
13 | + | usage = "structure <length> <width> <height>" |
14 | ||
15 | x = 0 | |
16 | y = 0 | |
17 | z = 0 | |
18 | face = 0 | |
19 | minimumFuel = 100 | |
20 | missionMessage = "Mission complete." | |
21 | abort = false | |
22 | startLevel = 0 | |
23 | local currentFuelLevel = turtle.getFuelLevel() | |
24 | areaCovered = 0 | |
25 | ||
26 | if nArgs == 0 or (nArgs == 1 and args[1]== "help") then | |
27 | print(version) | |
28 | print(mission) | |
29 | print(instructions) | |
30 | print(usage) | |
31 | return | |
32 | end | |
33 | ||
34 | if nArgs ~= 3 then | |
35 | print(usage) | |
36 | return | |
37 | end | |
38 | ||
39 | length = tonumber(args[1]) | |
40 | if length == nil then | |
41 | print("\"", args[1], "\" is not a valid length") | |
42 | return | |
43 | end | |
44 | if length < 1 then | |
45 | print("length must be a positive number greater than zero") | |
46 | end | |
47 | ||
48 | width = tonumber(args[2]) | |
49 | if width == nil then | |
50 | print("\"", args[2], "\" is not a valid width") | |
51 | return | |
52 | end | |
53 | if width < 1 then | |
54 | print("width must be a positive number greater than zero") | |
55 | end | |
56 | ||
57 | height = tonumber(args[3]) | |
58 | if startLevel == nil then | |
59 | print("\"", args[3], "\" is not a valid height") | |
60 | return | |
61 | end | |
62 | ||
63 | currentSlot = 2 | |
64 | - | materialSlot = 1 |
64 | + | wallSlot = 1 |
65 | roofSlot = 9 | |
66 | maxSlot = 16 | |
67 | ||
68 | nextTurn = "left" | |
69 | ||
70 | local clock = os.clock | |
71 | function sleep(n) -- seconds | |
72 | local t0 = clock() | |
73 | while clock() - t0 <= n do end | |
74 | end | |
75 | ||
76 | function left() | |
77 | if face == 0 then face = 1 turtle.turnLeft() return end | |
78 | if face == 1 then face = 2 turtle.turnLeft() return end | |
79 | if face == 2 then face = 3 turtle.turnLeft() return end | |
80 | if face == 3 then face = 0 turtle.turnLeft() return end | |
81 | print("function left\(\): Bad face value: ", face) | |
82 | end | |
83 | ||
84 | function right() | |
85 | if face == 0 then face = 3 turtle.turnRight() return end | |
86 | if face == 1 then face = 0 turtle.turnRight() return end | |
87 | if face == 2 then face = 1 turtle.turnRight() return end | |
88 | if face == 3 then face = 2 turtle.turnRight() return end | |
89 | print("function right\(\): Bad face value: ", face) | |
90 | end | |
91 | ||
92 | function up() | |
93 | turtle.up() | |
94 | y = y+1 | |
95 | end | |
96 | ||
97 | function rise(nBlocks) | |
98 | local i | |
99 | for i=1,nBlocks do | |
100 | up() | |
101 | end | |
102 | end | |
103 | ||
104 | function down() | |
105 | if turtle.detectDown() then | |
106 | turtle.digDown() | |
107 | end | |
108 | turtle.down() | |
109 | y = y-1 | |
110 | end | |
111 | ||
112 | function turn() | |
113 | if nextTurn == "left" then | |
114 | left() | |
115 | else | |
116 | right() | |
117 | end | |
118 | chomp() | |
119 | forward() | |
120 | if nextTurn == "left" then | |
121 | left() | |
122 | nextTurn = "right" | |
123 | else | |
124 | right() | |
125 | nextTurn = "left" | |
126 | end | |
127 | areaCovered = areaCovered + 1 | |
128 | end | |
129 | ||
130 | function forward() | |
131 | while turtle.detect() do -- This loop added in case of falling sand or whatever | |
132 | turtle.dig() | |
133 | end | |
134 | for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way | |
135 | if turtle.forward() then | |
136 | break | |
137 | end | |
138 | turtle.attack() | |
139 | sleep(2) | |
140 | end | |
141 | areaCovered = areaCovered + 1 | |
142 | ||
143 | if face == 0 then z = z+1 return end | |
144 | if face == 1 then x = x-1 return end | |
145 | if face == 2 then z = z-1 return end | |
146 | if face == 3 then x = x+1 return end | |
147 | end | |
148 | ||
149 | function setFace(f) | |
150 | if f == 0 then | |
151 | if face == 0 then return end | |
152 | if face == 1 then right() return end | |
153 | if face == 2 then right() right() return end | |
154 | if face == 3 then left() return end | |
155 | end | |
156 | ||
157 | if f == 1 then | |
158 | if face == 0 then left() return end | |
159 | if face == 1 then return end | |
160 | if face == 2 then right() return end | |
161 | if face == 3 then right() right() return end | |
162 | end | |
163 | ||
164 | if f == 2 then | |
165 | if face == 0 then left() left() return end | |
166 | if face == 1 then left() return end | |
167 | if face == 2 then return end | |
168 | if face == 3 then right() return end | |
169 | end | |
170 | ||
171 | if f == 3 then | |
172 | if face == 0 then right() return end | |
173 | if face == 1 then left() left() return end | |
174 | if face == 2 then left() return end | |
175 | if face == 3 then return end | |
176 | end | |
177 | end | |
178 | ||
179 | function home(targetY) | |
180 | -- print("home:face ", face, ", x = ", x, ", z = ", z) | |
181 | if x < 0 then | |
182 | setFace(3) | |
183 | while x < 0 do | |
184 | forward() | |
185 | end | |
186 | else | |
187 | if x > 0 then | |
188 | setFace(1) | |
189 | while x > 0 do | |
190 | forward() | |
191 | end | |
192 | end | |
193 | end | |
194 | ||
195 | if z < 0 then | |
196 | setFace(0) | |
197 | while z < 0 do | |
198 | forward() | |
199 | end | |
200 | else | |
201 | if z > 0 then | |
202 | setFace(2) | |
203 | while z > 0 do | |
204 | forward() | |
205 | end | |
206 | end | |
207 | end | |
208 | ||
209 | if y > 0 then | |
210 | while y > 0 do | |
211 | down() | |
212 | end | |
213 | end | |
214 | ||
215 | setFace(0) | |
216 | end | |
217 | ||
218 | - | if turtle.getItemCount(materialSlot) < 3 then |
218 | + | |
219 | if turtle.getItemCount(wallSlot) < 3 then | |
220 | organizeMaterial() | |
221 | - | if turtle.getItemCount(materialSlot) < 3 then |
221 | + | |
222 | if turtle.getItemCount(wallSlot) < 3 then | |
223 | print("No more material") | |
224 | return false | |
225 | end | |
226 | return true | |
227 | end | |
228 | ||
229 | function organizeMaterial() | |
230 | - | materialCount = turtle.getItemCount(materialSlot) |
230 | + | |
231 | materialCount = turtle.getItemCount(wallSlot) | |
232 | ||
233 | - | -- print("Attempting to refill slot ", materialSlot) |
233 | + | |
234 | -- print("Attempting to refill slot ", wallSlot) | |
235 | for i=2,16 do | |
236 | - | if turtle.compareTo(materialSlot) then |
236 | + | |
237 | - | turtle.transferTo(materialSlot) |
237 | + | if turtle.compareTo(wallSlot) then |
238 | turtle.transferTo(wallSlot) | |
239 | end | |
240 | end | |
241 | - | turtle.select(materialSlot) |
241 | + | |
242 | turtle.select(wallSlot) | |
243 | end | |
244 | ||
245 | - | turtle.select(materialSlot) |
245 | + | |
246 | turtle.select(wallSlot) | |
247 | ||
248 | if startLevel > 2 then | |
249 | if turtle.detectUp() then | |
250 | if turtle.compareUp() then | |
251 | return | |
252 | else | |
253 | turtle.digUp() | |
254 | end | |
255 | end | |
256 | if ensureMaterial() then | |
257 | turtle.placeUp() | |
258 | end | |
259 | else | |
260 | if turtle.detectDown() then | |
261 | if turtle.compareDown() then | |
262 | return | |
263 | else | |
264 | turtle.digDown() | |
265 | end | |
266 | end | |
267 | if ensureMaterial() then | |
268 | turtle.placeDown() | |
269 | end | |
270 | end | |
271 | end | |
272 | ||
273 | function checkFuel() | |
274 | if currentFuelLevel == "unlimited" then | |
275 | return true | |
276 | end | |
277 | ||
278 | if currentFuelLevel < minimumFuel then | |
279 | if not turtle.refuel() then | |
280 | areaCovered = targetArea | |
281 | missionMessage = "Mission aborted due to low fuel." | |
282 | abort = true | |
283 | return false | |
284 | end | |
285 | end | |
286 | return true | |
287 | end | |
288 | ||
289 | currentSlot = 1 | |
290 | ||
291 | --[[ | |
292 | function layRow(nBlocks) | |
293 | turtle.select(currentSlot) | |
294 | ||
295 | for i=1,nBlocks do | |
296 | if turtle.getItemCount(currentSlot) > 0 then | |
297 | turtle.placeDown() | |
298 | turtle.forward() | |
299 | else | |
300 | currentSlot = currentSlot + 1 | |
301 | if turtle.getItemCount(currentSlot) > 0 then | |
302 | turtle.select(currentSlot) | |
303 | turtle.placeDown() | |
304 | turtle.forward() | |
305 | else | |
306 | print("Can't find more material") | |
307 | return | |
308 | end | |
309 | end | |
310 | end | |
311 | end | |
312 | --]] | |
313 | ||
314 | - | turtle.select(materialSlot) |
314 | + | |
315 | turtle.select(wallSlot) | |
316 | for i=1,nBlocks do | |
317 | if ensureMaterial() then | |
318 | turtle.placeDown() | |
319 | turtle.forward() | |
320 | else | |
321 | if ensureMaterial() then | |
322 | turtle.placeDown() | |
323 | turtle.forward() | |
324 | else | |
325 | print("Can't find more material") | |
326 | return | |
327 | end | |
328 | end | |
329 | end | |
330 | end | |
331 | ||
332 | -- MAIN PROGRAM | |
333 | ||
334 | turtle.select(1) | |
335 | ||
336 | print("fuelLevel = ", currentFuelLevel) | |
337 | print("length = ", length) | |
338 | print("width = ", width) | |
339 | print("face = ", face) | |
340 | ||
341 | print("Current Fuel Level: ", currentFuelLevel) | |
342 | ||
343 | if currentFuelLevel ~= "unlimited" then | |
344 | if currentFuelLevel < minimumFuel then | |
345 | if not turtle.refuel() then | |
346 | print("No fuel") | |
347 | return | |
348 | end | |
349 | end | |
350 | end | |
351 | ||
352 | notFinished = true | |
353 | ||
354 | while notFinished do | |
355 | if y == height then | |
356 | notFinished = false | |
357 | break | |
358 | end | |
359 | up() | |
360 | ||
361 | setFace(0) | |
362 | layRow(length - 1) | |
363 | ||
364 | setFace(1) | |
365 | layRow(width - 1) | |
366 | ||
367 | setFace(2) | |
368 | layRow(length - 1) | |
369 | ||
370 | setFace(3) | |
371 | layRow(width - 1) | |
372 | end | |
373 | ||
374 | setFace(0) | |
375 | turtle.back() | |
376 | z = z - 1 | |
377 | while y > 0 do | |
378 | turtle.down() | |
379 | y = y - 1 | |
380 | end | |
381 | print(missionMessage) | |
382 | print(" Current fuel level is ", turtle.getFuelLevel()) |