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 }) turtle.getState().coordSystem = 'relative' 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)