Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local r = 0
- currSlot = 2 --reserve slot #1 for fuel all time!
- mfid = 0 --monitor computer's id
- osid = os.getComputerID() --turtle's computer id
- isSent = false --send all messages just once
- fReserve = 10 --fuel can't go below this
- print("What radius of circle would you like me to create?")
- r = tonumber(io.read())
- if r == 0 then
- print("Radius 0 circle? Done!")
- end
- --send message to monitor computer(if any) and write it out locally
- function sendM(message)
- if peripheral.isPresent("right") and peripheral.getType("right") == "modem" then
- rednet.open("right")
- rednet.send(mfid, "Turtle("..osid.."):"..message, false)
- rednet.close("right")
- end
- print(message)
- end
- --return gps location if it has a modem and can retrive turtles's location
- --if not then return x,y based on turtle's startup location
- function gpsLoc(fx,fy)
- if peripheral.isPresent("right") and peripheral.getType("right") == "modem" then
- rednet.open("right")
- local x, y, z = gps.locate(5)
- rednet.close("right")
- if x == nil then
- return "x:"..tostring(fx)..",y:"..tostring(fy).."(rel)"
- else
- return "x:"..tostring(x)..",y:"..tostring(y)..",z:"..tostring(z)
- end
- else
- return "x:"..tostring(fx)..",y:"..tostring(fy).."(rel)"
- end
- end
- function findBlock ()
- if turtle.getItemCount(currSlot) ~= 0 then
- return true
- end
- local tmp = 2
- turtle.select(tmp)
- while (turtle.getItemCount(tmp) == 0 and tmp <= 16) do
- if tmp == 16 then
- if isSent == false then --only print once
- sendM("Out of blocks! Turtle at "..gpsLoc(x,y))
- isSent = true
- end
- sleep(5)
- tmp = 2
- turtle.select(tmp)
- else
- tmp = tmp + 1
- turtle.select(tmp)
- end
- end
- isSent = false
- currSlot = tmp
- tmp = 2
- return true
- end
- function tryPlaceDown (x,y)
- if turtle.detectDown() == true then
- if turtle.compareDown() == true then
- return true
- else
- sendM("Can't place block("..gpsLoc(x,y)..")!")
- return false
- end
- else
- if turtle.placeDown() == true then
- return true
- else
- sendM("Can't place block("..gpsLoc(x,y)..")!")
- return false
- end
- end
- end
- round = function (inputN)
- if inputN % 2 ~= 0.5 then
- return math.floor(inputN + 0.5)
- end
- return inputN - 0.5
- end
- turtle.select(currSlot)
- local coords = {}
- local coordsCount = 0
- local f = 1 - r
- local ddF_x = 1
- local ddF_y = -2 * r
- x = 0
- y = r
- coords[0 .. "," .. round(0+r)] = true
- coords[0 .. "," .. round(0-r)] = true
- coords[0+r .. "," .. 0] = true
- coords[0-r .. "," .. 0] = true
- coordsCount = 4
- while (x < y) do
- if (f >= 0) then
- y = y - 1
- ddF_y = ddF_y + 2
- f = f + ddF_y
- end
- x = x + 1
- ddF_x = ddF_x + 2
- f = f + ddF_x
- coords[round(0+x) .. "," .. round(0+y)] = true
- coords[round(0-x) .. "," .. round(0+y)] = true
- coords[round(0+x) .. "," .. round(0-y)] = true
- coords[round(0-x) .. "," .. round(0-y)] = true
- coords[round(0+y) .. "," .. round(0+x)] = true
- coords[round(0-y) .. "," .. round(0+x)] = true
- coords[round(0+y) .. "," .. round(0-x)] = true
- coords[round(0-y) .. "," .. round(0-x)] = true
- coordsCount = coordsCount + 8
- end
- checkCoords = function (x0,y0)
- if coords[x0 .. "," .. y0] == true then
- return true
- else
- return false
- end
- end
- --watch fuel level and if smaller than the reserve level refuel from slot #1
- function fuelProc()
- local flvl = turtle.getFuelLevel()
- if flvl == "unlimited" then
- return true
- elseif flvl > fReserve then
- return true
- else
- turtle.select(1)
- while turtle.refuel(1) == false do
- if isSent == false then
- sendM("Out of fuel! turtle at "..gpsLoc(x,y))
- print("Please insert fuel to slot #1 to resume!")
- isSent = true
- end
- sleep(5)
- end
- isSent = false
- turtle.select(currSlot)
- end
- end
- -- Move from the center to the first position it can find.
- local x = 0
- local y = 0
- while checkCoords(x,y) ~= true do
- fuelProc()
- turtle.forward()
- x = x + 1
- end
- -- Place a block in the first position.
- --findBlock()
- --tryPlaceDown() <-block will be placed last so won't be any route blocking at multi lvl structures
- -- Keep track of which way the turtle is facing.
- facingX = 1
- facingY = 0
- -- Look clockwise from each block and find the next block in the space.
- spinsDone = 0
- while (coordsCount > 0 and spinsDone < 5) do
- fuelProc()
- cX = x + facingX
- cY = y + facingY
- if checkCoords(cX, cY) then
- turtle.forward()
- findBlock()
- tryPlaceDown(x,y)
- x = cX
- y = cY
- coords[x .. "," .. y] = nil
- coordsCount = coordsCount - 1
- spinsDone = 0
- else
- -- Check diagnals
- if facingX == 1 then
- cY = y + 1
- newFacingX = 0
- newFacingY = 1
- elseif facingX == -1 then
- cY = y - 1
- newFacingX = 0
- newFacingY = -1
- elseif facingY == 1 then
- cX = x - 1
- newFacingX = -1
- newFacingY = 0
- elseif facingY == -1 then
- cX = x + 1
- newFacingX = 1
- newFacingY = 0
- end
- if checkCoords(cX,cY) then
- turtle.forward()
- turtle.turnRight()
- turtle.forward()
- turtle.turnLeft()
- findBlock()
- tryPlaceDown(x,y)
- x = cX
- y = cY
- coords[x .. "," .. y] = nil
- coordsCount = coordsCount - 1
- spinsDone = 0
- else
- turtle.turnRight()
- facingX = newFacingX
- facingY = newFacingY
- spinsDone = spinsDone + 1
- end
- end
- end
- --return to starting point
- repeat
- fuelProc()
- turtle.forward()
- x = x - 1
- until x == 0
- turtle.turnRight()
- turtle.turnRight()
- sendM("Work done!")
- x = nil
- y = nil
- r = nil
- coords = nil
- coordsCount = nil
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement