View difference between Paste ID: PsH9RvKV and qLthLak5
SHOW: | | - or go back to the newest paste.
1
--
2-
--GPS Deploy by neonerZ v1.1
2+
--GPS Deploy by neonerZ v1.0
3
--http://youtube.com/neonerz
4
--
5
--This script is originally from BigSHinyToys from ComputerCraft.info
6
--Original link can be found here:
7
--http://www.computercraft.info/forums2/index.php?/topic/3088-how-to-guide-gps-global-position-system/page__p__28333#entry28333
8
--Edited by neonerZ
9
--
10-
-- Modifications included:
10+
11
-- either a mining turtle, or a standard turtle
12-
-- happydude11209: Line 209 - added logic to check if the server is set to no fuel mode
12+
13-
-- http://www.computercraft.info/forums2/index.php?/topic/9528-gps-deploy-10/page__view__findpost__p__123411
13+
14
--				  Slot 3 - At least 4 modems
15-
-- kittykiller: Line 110 - Bug in the locate code if you were using an existing GPS system to deploy a new one
15+
16-
-- http://www.computercraft.info/forums2/index.php?/topic/9528-gps-deploy-10/page__view__findpost__p__80323
16+
17
-- Standard Turtle: Slot 1 - Fuel
18-
-- Mad_Professor: Line 296 - Bug calling computers, monitors. Making people think they needed to load 4 monitors
18+
19-
-- http://www.computercraft.info/forums2/index.php?/topic/9528-gps-deploy-10/page__view__findpost__p__150291
19+
20
--				  	Slot 4 - At lease 4 disk drives
21
--				 	Slot 5 - 1 Disk		
22
--
23
-- (mining turtles will be able to reuse the same
24
--	disk drive, where-as a standard turtle will leave
25
--  them and deploy a separate disk drive for each
26
--	GPS host)
27
--
28
-- Default Usage: Place the turtle where you want it
29
--		deployed facing the SOUTH or 0 direction.
30
--		Fill the turtle with the required materials
31
--		above. Then use the command
32
--
33
--		gps-deploy x y z
34
--
35
--		Where x, y, z is the *absolute* positions of the deploment
36
--		turtle. By default the turtle will deploy the
37
--		the GPS array at around y = 254. Add a fourth
38
--		value to specify the height offset.
39
--		IMPORTANT: It's crucial you use your absolute coordinates,
40
--		 (the ones inside the parentheses next to your realitive coordinates)
41
--		 For Example: If F3 shows X = -6.43534 (-7) or Z = -15.542 (-16)
42
--		 you'd use -7 and -16 respectively. If you use -6 and -15 all coordinates
43
--		 that go past 0 in the opposite direction will be off by 1.)
44
--
45
--		Example: gps-deploy 1 1 1 20
46
--
47
--		Would assume the turtle's start position is 
48
--		x=1, y=1, z=1 and will deploy the satelite 
49
--		array at y= 21
50
--
51
--neonerZ added features
52
--	Smart Refilling: Fuel should go in slot 1.
53
--		If not enough fuel is available script
54
--		will prompt user for more fuel and wait 30. 
55
--		Script will estimate how much fuel is needed
56
--		and try to take only that much (in coal)
57
--	Item Detection: Script will check slots 2-5
58
--		for the correct quantity of items. It does
59
--		*not* check if items are valid
60
--	GPS Host Coordinates: The script now requires
61
--		you to enter in the coordinates of the 
62
--		turtle before launching. This will set
63
--		the GPS host computers to the correct
64
--		coordinates.
65
--	Satelite Array Location: The script allows
66
--		the user to set an offset for the placement
67
--		of the four satelites 
68
69
-- How heigh up should the satellite be deployed?
70
-- This is the default value if you don't pass a
71
-- value to the script. There is a check down below
72
-- to make sure the user entered values isn't > 254
73
height = 254
74
75
-- need to enable rednet first incase using locate
76
rednet.open( "right" )
77
78
local function printUsage()
79
	print("")
80
	print( "Usages:" )
81
	print( "gps-deploy <x> <y> <z> [height]" )
82
	print( "Example: gps-deploy 1 1 1 20")
83
	print( "would deploy the satelite to y=21")
84
	print( "gps-deploy locate [height]")
85
	print( "if you have working GPS use this")
86-
height = 255
86+
87
end
88
89
-- confirm default height isn't set above 254
90
-- Check to see if a minimum of 3 values were
91
-- passed to the script
92
local tArgs = { ... }
93
94
if tArgs[1] == "locate" then
95
	print ("")
96
	print ("Locating GPS signal...")
97
	xcord, ycord, zcord = gps.locate(5, false)
98
	if xcord==nil then
99
		print("")
100
		print ("No GPS signal detected, please rerun manually")
101
		return
102
	end
103
	if tArgs[2] == nil then
104
		height = tonumber(height)
105
	else
106
		height = tonumber(tArgs[2])
107
	end
108
	print ("gps-deploy ",xcord," ",ycord," ",zcord," height: ",height)
109
	xcord = tonumber(xcord)
110
	ycord = tonumber(ycord)
111
	zcord = tonumber(zcord)
112
else
113
	if #tArgs <= 2 then
114
		printUsage()
115
		return
116
	else
117
		xcord = tonumber(tArgs[1])
118
		ycord = tonumber(tArgs[2])
119
		zcord = tonumber(tArgs[3])	
120
		if tArgs[4] == nil then
121
			height = tonumber(height)
122
		else
123
			if tonumber(tArgs[4]) > 254 then
124
				height = tonumber(height)
125
			else
126
				height = tonumber(tArgs[4])
127
			end
128
		end
129
	end
130
131
end
132
133
if height > ycord and height < 255 then
134
	height = height-ycord
135
end
136
137
if height > 254 then
138
	height = 254
139
end
140
141
-- check if the script is running on a turtle
142
-- (original code)
143
if not turtle then
144
	print("")
145
	print("Error: not a turtle")
146-
if height > ycord and height < 256 then
146+
147
end
148
149
-- move functions
150-
if height > 255 then
150+
151-
	height = 255
151+
152
153
mov.forward = function ()
154
	while not turtle.forward() do
155
		sleep(1)
156
	end
157
	return true
158
end
159
mov.back = function ()
160
	while not turtle.back() do
161
		sleep(1)
162
	end
163
	return true
164
end
165
mov.up = function ()
166
	while not turtle.up() do
167
		sleep(1)
168
	end
169
	return true
170
end
171
mov.down = function ()
172
	while not turtle.down() do
173
		sleep(1)
174
	end
175
	return true
176
end
177
mov.place = function ()
178
	while not turtle.place() do
179
		sleep(1)
180
	end
181
end
182
183
local base = nil
184
185
-- Check if we have enough fuel
186
-- we estimate the fuel usage ((height*2)+70) needed to
187
-- complete the deoployment and then see if we have enough
188
-- fuel loaded. If we don't, it checks the first slot for
189
-- available fuel and tries to fill up on it. If it doesn't
190
-- have enough fuel in there, it prompts the user for more 
191
-- fuel. It allows 30 seconds for the user to add  fuel
192
-- (trying to refuel and verify fuel level every second) 
193
-- and if it doesn't get it's fill within 30 seconds
194
-- it exits with a message to the user
195
-- neonerZ
196
if turtle.getFuelLevel() < (tonumber(height)*2)+70 then
197
	while turtle.getFuelLevel() < (tonumber(height)*2)+70 do
198
		turtle.select(1)
199
		realcoal=(((tonumber(height)*2)+70)-turtle.getFuelLevel())/80
200
		if realcoal>=64 then
201
			coal=64
202
		else
203
			coal=math.ceil(realcoal)
204
		end
205
		if turtle.refuel(tonumber(coal)) == false then
206
			fuel=((tonumber(height)*2)+70)-turtle.getFuelLevel()
207
			print("")
208
			print("You ran out of fuel in slot 1")
209-
if type(turtle.getFuelLevel()) == "string" then
209+
			print("Please insert "..fuel.." fuel or "..realcoal.." coal to continue")
210-
        print("No-fuel mode")
210+
			print("Waiting 30 seconds for fuel or exiting")
211
			i=0
212-
	if turtle.getFuelLevel() < (tonumber(height)*2)+70 then
212+
			while i<=30 do
213-
		while turtle.getFuelLevel() < (tonumber(height)*2)+70 do
213+
				sleep(1)
214-
			turtle.select(1)
214+
				realcoal=(((tonumber(height)*2)+70)-turtle.getFuelLevel())/80
215-
			realcoal=(((tonumber(height)*2)+70)-turtle.getFuelLevel())/80
215+
				if realcoal>=64 then
216-
			if realcoal>=64 then
216+
					coal=64
217-
				coal=64
217+
				else
218
					coal=math.ceil(realcoal)
219-
				coal=math.ceil(realcoal)
219+
220
				turtle.refuel(tonumber(coal))
221-
			if turtle.refuel(tonumber(coal)) == false then
221+
				if turtle.getFuelLevel() >= (tonumber(height)*2)+70 then
222-
				fuel=((tonumber(height)*2)+70)-turtle.getFuelLevel()
222+
					print("")
223-
				print("")
223+
					print("Turtle Fueled")
224-
				print("You ran out of fuel in slot 1")
224+
					i=31
225-
				print("Please insert "..fuel.." fuel or "..realcoal.." coal to continue")
225+
226-
				print("Waiting 30 seconds for fuel or exiting")
226+
				if i==30 then
227-
				i=0
227+
					fuel=((tonumber(height)*2)+70)-turtle.getFuelLevel()
228-
				while i<=30 do
228+
					print("")
229-
					sleep(1)
229+
					print("Not enough fuel provided")
230-
					realcoal=(((tonumber(height)*2)+70)-turtle.getFuelLevel())/80
230+
					print("Please provide "..fuel.." fuel or "..realcoal.." coal and try again")
231-
					if realcoal>=64 then
231+
					return
232-
						coal=64
232+
233-
					else
233+
				i=i+1
234-
						coal=math.ceil(realcoal)
234+
235-
					end
235+
236-
					turtle.refuel(tonumber(coal))
236+
237-
					if turtle.getFuelLevel() >= (tonumber(height)*2)+70 then
237+
238-
						print("")
238+
239-
						print("Turtle Fueled")
239+
240-
						i=31
240+
241-
					end
241+
242-
					if i==30 then
242+
243-
						fuel=((tonumber(height)*2)+70)-turtle.getFuelLevel()
243+
244-
						print("")
244+
245-
						print("Not enough fuel provided")
245+
246-
						print("Please provide "..fuel.." fuel or "..realcoal.." coal and try again")
246+
247-
						return
247+
248-
					end
248+
249-
					i=i+1
249+
250
--		until type(base) == "number"
251
--	end
252
--	print("Please Place 4 computers in slot two")
253
--	print("4 modems in slot three")
254
--	print("if mineing turtle then")
255
--	print("1 disk drive in slot four")
256
--	print("if not mineing then")
257
--	print("4 disk drive in slot four")
258
--	print("blank floopy disk in slot five")
259
--	print("press Enter key to continue")
260
--	while true do
261
--		local event , key = os.pullEvent("key")
262
--		if key == 28 then break end
263
--	end
264
--	print("Launching")
265
--end
266
267
-- check if the required quantity of items
268
-- are in the appropriate spots. I'm sure
269
-- there's a more elegant way of doing this.
270
-- I don't believe there's a way to check if
271
-- the items are correct without using compare
272
monitor=0
273
modem=0
274
diskdrive=0
275
disk=0
276
print("")
277
turtle.select(2)
278
if turtle.getItemCount(2) < 4 then
279
	print("Please place at least 4 monitors into slot two")
280
	monitor=1
281
end
282
turtle.select(3)
283
if turtle.getItemCount(2) < 4 then
284
	print("Please place at least 4 modems into slot three")
285
	modem=1
286
end
287
turtle.select(4)
288
if turtle.getItemCount(2) < 1 then
289
	print("Please place 1 disk drive into slot four if a -mining turtle-")
290
	print("Please place 4 disk drives into slot four if a -standard turtle-")
291
	diskdrive=1
292
end
293
turtle.select(5)
294
if turtle.getItemCount(2) < 1 then
295
	print("Please place 1 disk into slot five")
296-
	print("Please place at least 4 computers into slot two")
296+
297
end
298
299
if monitor == 1 or modem == 1 or diskdrive == 1 or disk == 1 then
300
	print("Please fix above issues to continue")
301
	return
302
end
303
304
-- calculate the coordinates of the 4 satelite arrays
305
306
newycord=tonumber(ycord)+tonumber(height)
307
308
if newycord > 254 then newycord = 254 end
309
310
toycordns=newycord
311
toycordwe=newycord-3
312
313
if toycordns >= 255 or toycordwe >= 255 then
314
	toycordns=254
315
	toycordwe=251
316
end
317
318
local set = {}
319
set[1] = {x = tonumber(xcord),z = tonumber(zcord)+9,y = tonumber(toycordns)}
320
set[2] = {x = tonumber(xcord)-9,z = tonumber(zcord),y = tonumber(toycordwe)}
321
set[3] = {x = tonumber(xcord),z = tonumber(zcord)-9,y = tonumber(toycordns)}
322
set[4] = {x = tonumber(xcord)+9,z = tonumber(zcord),y = tonumber(toycordwe)}
323
324
-- start the climb up to the correct ycord
325-
if newycord > 255 then newycord = 255 end
325+
if ycord+tonumber(height) >= 254 then
326
	while turtle.up() do -- sends it up till it hits max hight
327
	end
328
else
329
	for i = 1,tonumber(height) do
330
	turtle.up()
331-
	toycordns=255
331+
332-
	toycordwe=252
332+
333
334
-- once at the correct height, deploy GPS array
335
-- this is a mixture of my own code and the
336-
set[1] = {x = tonumber(xcord),z = tonumber(zcord)+3,y = tonumber(toycordns)}
336+
337-
set[2] = {x = tonumber(xcord)-3,z = tonumber(zcord),y = tonumber(toycordwe)}
337+
338-
set[3] = {x = tonumber(xcord),z = tonumber(zcord)-3,y = tonumber(toycordns)}
338+
339-
set[4] = {x = tonumber(xcord)+3,z = tonumber(zcord),y = tonumber(toycordwe)}
339+
	for i = 1,8 do
340
		mov.forward()
341
	end
342-
while not turtle.up() do
342+
343-
	term.clear()
343+
344-
	term.setCursorPos(1,1)
344+
345-
	term.write("Please get off me")
345+
346
	mov.place()
347-
if ycord+tonumber(height) >= 255 then
347+
348
	mov.forward()
349
	turtle.select(4)
350
	mov.place()
351-
	for i = 3,tonumber(height) do
351+
352
	turtle.drop()
353
	-- make a custom disk that starts up the gps host application
354
	-- with the correct coordinates and copy it over. also makes 
355
	-- makes it a startup script so the computers will
356
	-- start back up properly after chunk unloading
357
	fs.delete("disk/startup")
358
	file = fs.open("disk/startup","w")
359
	file.write([[
360
fs.copy("disk/install","startup")
361-
	for i = 1,2 do
361+
362
if fs.exists("disk/custom") then
363
	fs.copy("disk/custom","custom")
364
	fs.delete("disk/custom")
365
end
366
print("sleep in 10")
367
sleep(10)
368
os.reboot()
369
]])
370
	file.close()
371
	if fs.exists("custom") then
372
		fs.copy("custom","disk/custom")
373
	end
374
		file = fs.open("disk/install","w")
375
		file.write([[
376
if fs.exists("custom") then
377
	shell.run("custom","host",]]..set[a]["x"]..","..set[a]["y"]..","..set[a]["z"]..","..(base or "nil")..[[)
378
else
379
	shell.run("gps","host",]]..set[a]["x"]..","..set[a]["y"]..","..set[a]["z"]..[[)
380
end
381
]])
382
		file.close()
383
	turtle.turnLeft()
384
	mov.forward()
385
	mov.up()
386
	turtle.turnRight()
387
	mov.forward()
388
	turtle.turnRight()
389
	peripheral.call("front","turnOn")
390
	mov.down()
391
	turtle.suck()
392
	turtle.select(3)
393
	turtle.dig()
394
	mov.up()
395
	-- reboot would be here
396
	turtle.turnRight()
397
	--back 3
398
	for i = 1,9 do
399
		mov.forward()
400
	end
401
	turtle.turnLeft()
402
	mov.forward()
403
	if a == 1 or a == 3 then
404
		for i = 1,3 do
405
		mov.down()
406
		end
407
	elseif a == 2 or a == 4 then
408
		for i = 1,3 do
409
		mov.up()
410
		end
411
	end
412
end
413
414
-- goes back down. this is the original code
415
-- might be worth editing to come down the same
416
-- amount of spaces it went up, but this should
417
-- do the job
418
while turtle.down() do 
419
end
420-
	for i = 1,3 do
420+
421
print("")
422
print("Finished")