mirror of
https://github.com/kepler155c/opus
synced 2024-12-29 10:00:26 +00:00
73 lines
1.7 KiB
Plaintext
73 lines
1.7 KiB
Plaintext
|
local function summon(id)
|
||
|
|
||
|
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)
|