View difference between Paste ID: 3UxnQf57 and fEZSwJja
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())