gps-deploy.lua

444 lines · 11.6 KB

Open raw

added logic to check if the server is set to no fuel mode

Copy & run

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