Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Turtle API(Self-tracking System&Navigation) created by Latias1290 and edited by martijnenco.
- local xPos, yPos, zPos = nil
- cal = false
- function saveMetaData( ... ) --[1] = event, [2] = true or false, [3] = howfar it was on it.
- MetaData.MetaData.coords.x = xPos
- MetaData.MetaData.coords.y = yPos
- MetaData.MetaData.coords.z = zPos
- MetaData.MetaData.coords.orientation = face
- if arg[1] ~= nil and arg[2] ~= nil and arg[3] ~= nil then
- MetaData.MetaData.lastKnown.event = arg[1]
- MetaData.MetaData.lastKnown.bool = arg[2]
- MetaData.MetaData.lastKnown.howfar = arg[3]
- end
- local file = fs.open("MetaData",'w')
- file.write("MetaData = ")
- file.write(textutils.serialize(MetaData.MetaData))
- file.close()
- end
- function setLocation(t)
- local x,y,z = gps.locate(t)
- if x ~= nil then
- xPos, yPos, zPos = x,y,z
- cal = true
- return true
- else
- return false
- end
- end
- function getLocation()
- if xPos ~= nil then
- return xPos, yPos, zPos
- elseif xPos == nil then
- return nil
- end
- end
- function turnRight()
- turtle.turnRight()
- if face == 0 then
- face = 1
- elseif face == 1 then
- face = 2
- elseif face == 2 then
- face = 3
- elseif face == 3 then
- face = 0
- end
- saveMetaData()
- return true
- end
- function turnLeft()
- turtle.turnLeft()
- if face == 0 then
- face = 3
- elseif face == 1 then
- face = 0
- elseif face == 2 then
- face = 1
- elseif face == 3 then
- face = 2
- end
- saveMetaData()
- return true
- end
- function forward()
- if cal == true then
- if turtle.forward() then
- if face == 0 then
- zPos = zPos + 1
- elseif face == 1 then
- xPos = xPos - 1
- elseif face == 2 then
- zPos = zPos - 1
- elseif face == 3 then
- xPos = xPos + 1
- end
- saveMetaData()
- return true
- else
- return false
- end
- else
- print("Not Calibrated.")
- return false
- end
- end
- function back()
- if cal == true then
- if turtle.back() then
- if face == 0 then
- zPos = zPos - 1
- elseif face == 1 then
- xPos = xPos + 1
- elseif face == 2 then
- zPos = zPos + 1
- elseif face == 3 then
- xPos = xPos - 1
- end
- saveMetaData()
- return true
- else
- return false
- end
- else
- print("Not Calibrated.")
- return false
- end
- end
- function up()
- if cal == true then
- if turtle.up() then
- yPos = yPos + 1
- saveMetaData()
- return true
- else
- print("Obstructed")
- return false
- end
- else print("Not Calibrated") return false end
- end
- function down()
- if cal == true then
- if turtle.down() then
- yPos = yPos - 1
- saveMetaData()
- return true
- else
- print("Obstructed")
- return false
- end
- else print("Not Calibrated") return false end
- end
- function compass()
- i = nil
- turtle.up()
- setLocation(2)
- local x1, y1, z1 = getLocation()
- while turtle.forward() == false do turtle.dig() turtle.attack() os.sleep(0.5) end
- setLocation(2)
- local x2, y2, z2 = getLocation()
- if x1 == nil or y1 == nil or z1 == nil or x2 == nil or y2 == nil or z2 == nil then print("No Gps..") i = false
- elseif x1 - x2 == 0 and z1 - z2 == 0 then
- elseif x1 - x2 < 0 then face = 3 i = true w = 'east'
- elseif x1 - x2 > 0 then face = 1 i = true w = 'west'
- elseif z1 - z2 < 0 then face = 0 i = true w = 'south'
- elseif z1 - z2 > 0 then face = 2 i = true w = 'north'
- end
- while turtle.back() == false do os.sleep(0.5) end
- x1, x2, y1, y2, z1, z2 = nil
- turtle.down()
- setLocation(2)
- if i == false then
- return false
- else
- return face, w
- end
- end
- function refuel()
- turtle.select(1)
- if turtle.getFuelLevel() <= 500 then
- if turtle.getItemCount(1) <= 15 then
- if turtle.getItemCount(1) <= 1 then
- return false
- else
- print("(Nearly) out of fuel/coal..")
- turtle.refuel(turtle.getItemCount(1) - 1)
- return true
- end
- else
- turtle.refuel(10)
- return true
- end
- else return true
- end
- end
- function decrypt(x)
- teller = 0
- vard = {}
- for i in string.gmatch(tostring(x.message),"[^.]+") do
- if teller == 0 then
- idd = tonumber(i)
- elseif teller == 1 then
- eventd = tostring(i)
- else
- vard[teller] = tostring(i)
- end
- teller = teller + 1
- end
- return idd, eventd, vard[2], vard[3], vard[4], vard[5], vard[6]
- end
- function pullEvent_Modem_Message()
- bevent, bvar1, bvar2, bvar3, bvar4, bvar5 = os.pullEvent('modem_message')
- end
- function pullEvent_Keys()
- bevent, bvar1 = os.pullEvent('key')
- end
- function pullEvent_Time_Out()
- os.sleep(0.05)
- bTimer = os.startTimer(0.05)
- bevent, bvar1 = os.pullEvent("timer")
- end
- function pullEvent2()
- parallel.waitForAny(pullEvent_Modem_Message, pullEvent_Keys)
- return bevent, bvar1, bvar2, bvar3, bvar4, bvar5
- end
- function turn(side)
- while face ~= side do
- turnLeft()
- end
- end
- local function move(fud, care)
- if fud == 'forward' then
- if forward() then
- else
- if turtle.attack() then
- else
- a, b = turtle.inspect()
- if b.name == "ComputerCraft:CC-Turtle" then
- print("blocked by a turtle...")
- os.sleep(2)
- else
- if turtle.dig() then else refuel() end
- end
- end
- end
- elseif fud == 'down' then
- if down() then
- else
- if turtle.attackDown() then
- else
- a, b = turtle.inspectDown()
- if b.name == "ComputerCraft:CC-Turtle" then
- print("blocked by a turtle...")
- os.sleep(2)
- else
- if turtle.dig() then else refuel() end
- end
- end
- end
- elseif fud == 'up' then
- if up() then
- else
- a, b = turtle.inspectUp()
- if b.name == "ComputerCraft:CC-Turtle" then
- print("blocked by a turtle...")
- os.sleep(2)
- else
- if turtle.dig() then else refuel() end
- end
- end
- end
- end
- function toLocation(x, y, z, height, care)
- if y <= 0 then print("Unvalid Y coordinate") return false end
- print('To: '..x..' '..y..' '..z..' @Height: '..height)
- print('From: '..xPos..' '..yPos..' '..zPos)
- if (height - yPos) > 0 then -- go up
- while yPos ~= height do
- move('up', care)
- end
- elseif (height - yPos) < 0 then
- while yPos ~= height do
- move('down', care)
- end
- end
- if height == 100 then
- if (x - xPos) < 0 then
- turn(1)
- while x - xPos ~= 0 do
- move('forward', care)
- end
- elseif (x - xPos) > 0 then
- turn(3)
- while x - xPos ~= 0 do
- move('forward', care)
- end
- end
- if (z - zPos) < 0 then
- turn(2)
- while z - zPos ~= 0 do
- move('forward', care)
- end
- elseif (z - zPos) > 0 then
- turn(0)
- while z - zPos ~= 0 do
- move('forward', care)
- end
- end
- else
- if (z - zPos) < 0 then
- turn(2)
- while z - zPos ~= 0 do
- move('forward', care)
- end
- elseif (z - zPos) > 0 then
- turn(0)
- while z - zPos ~= 0 do
- move('forward', care)
- end
- end
- if (x - xPos) < 0 then
- turn(1)
- while x - xPos ~= 0 do
- move('forward', care)
- end
- elseif (x - xPos) > 0 then
- turn(3)
- while x - xPos ~= 0 do
- move('forward', care)
- end
- end
- end
- if (y - yPos) > 0 then --go down again
- while yPos ~= y do
- move('up', care)
- end
- elseif (y - yPos) < 0 then
- while yPos ~= y do
- move('down', care)
- end
- end
- end
- if fs.exists("MetaData") then else
- local file = fs.open("MetaData", "w")
- file.write("MetaData = {coords = {x = 0, y = 0, z = 0, orientation = 0,}, lastKnown = {event = '', bool = false, howfar = 0,}}")
- file.close()
- end
- if setLocation(2) then if compass() then end end
- os.loadAPI("MetaData")
Advertisement
Add Comment
Please, Sign In to add comment