mirror of
				https://github.com/kepler155c/opus
				synced 2025-10-30 23:23:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| local function summon(id)
 | |
| 
 | |
|   require = requireInjector(getfenv(1))
 | |
|   local GPS = require('gps')
 | |
|   local Socket = require('socket')
 | |
|   local Point = require('point')
 | |
| 
 | |
|   turtle.status = 'GPSing'
 | |
|   turtle.setPoint({ x = 0, y = 0, z = 0, heading = 0 })
 | |
| 
 | |
|   local pts = {
 | |
|     [ 1 ] = { x = 0, z = 0, y = 0 },
 | |
|     [ 2 ] = { x = 4, z = 0, y = 0 },
 | |
|     [ 3 ] = { x = 2, z = -2, y = 2 },
 | |
|     [ 4 ] = { x = 2, z = 2, y = 2 },
 | |
|   }
 | |
|   local tFixes = { }
 | |
| 
 | |
|   local socket = Socket.connect(id, 161)
 | |
| 
 | |
|   if not socket then
 | |
|     error('turtle: Unable to connect to ' .. id)
 | |
|   end
 | |
| 
 | |
|   local function getDistance()
 | |
|     socket:write({ type = 'ping' })
 | |
|     local _, d = socket:read(5)
 | |
|     return d
 | |
|   end
 | |
| 
 | |
|   local function doGPS()
 | |
|     tFixes = { }
 | |
|     for i = 1, 4 do
 | |
|       if not turtle.gotoPoint(pts[i]) then
 | |
|         error('turtle: Unable to perform GPS maneuver')
 | |
|       end
 | |
|       local distance = getDistance()
 | |
|       if not distance then
 | |
|         error('turtle: No response from ' .. id)
 | |
|       end
 | |
|       table.insert(tFixes, {
 | |
|         position = vector.new(turtle.point.x, turtle.point.y, turtle.point.z),
 | |
|         distance = distance
 | |
|       })
 | |
|     end
 | |
|     return true
 | |
|   end
 | |
| 
 | |
|   if not doGPS() then
 | |
|     turtle.turnAround()
 | |
|     turtle.setPoint({ x = 0, y = 0, z = 0, heading = 0})
 | |
|     if not doGPS() then
 | |
|       socket:close()
 | |
|       return false
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   socket:close()
 | |
| 
 | |
|   local pos = GPS.trilaterate(tFixes)
 | |
| 
 | |
|   if pos then
 | |
|     local pt = { x = pos.x, y = pos.y, z = pos.z }
 | |
|     local _, h = Point.calculateMoves(turtle.getPoint(), pt)
 | |
|     local hi = turtle.getHeadingInfo(h)
 | |
|     turtle.status = 'recalling'
 | |
|     turtle.pathfind({ x = pt.x - hi.xd, z = pt.z - hi.zd, y = pt.y - hi.yd, heading = h })
 | |
|   else
 | |
|     error("turtle: Could not determine position")
 | |
|   end
 | |
| end
 | |
| 
 | |
| turtle.run(function() summon({COMPUTER_ID}) end)
 | 
