Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- tube
- -- Creates a 2x2 tunnel of the length specified by the user
- -- All sides are sealed for protection
- -- Torches, if supplied, will be placed on the right-hand wall at 10 block intervals
- -- Written by HarvDad, March 2014
- args = {...}
- nArgs = #args
- print("tube: Rev 3.1")
- x = 0
- y = 0
- z = 0
- face = 0
- minimumFuel = 100
- missionMessage = "Mission complete."
- abort = false
- patchSlot = 1
- torchSlot = 16
- local currentFuelLevel = turtle.getFuelLevel()
- zipTube = false
- usage = "Usage: tube <length> [zip]"
- if nArgs == 0 or (nArgs == 1 and args[1]== "help") then
- print("Creates a tunnel with sealed sides, top, and bottom.")
- print("If zip tube, tunnel is 1x2, else 2x2")
- print("This programs assumes the turtle is pre-fueled.")
- print("Place patch material (like cobblestone) in slot ", patchSlot)
- print("If torches are desired, place torches in slot ", torchSlot)
- print(usage)
- return
- end
- if nArgs ~= 1 and nArgs ~= 2 then
- print("Usage: tube <length>")
- return
- end
- if nArgs == 2 then
- if args[2] == "zip" then
- zipTube = true
- else
- print("Usage: tube <length>")
- end
- end
- length = tonumber(args[1])
- if length == nil then
- print("\"", args[1], "\" is not a valid length")
- return
- end
- if length < 1 then
- print("length must be a positive number greater than zero")
- end
- targetArea = length
- areaCovered = 1;
- -- The following 'face' directions are relative to the starting position of the turtle in this program
- north = 0
- west = 1
- south = 2
- east = 3
- function left()
- if face == 0 then face = 1 turtle.turnLeft() return end
- if face == 1 then face = 2 turtle.turnLeft() return end
- if face == 2 then face = 3 turtle.turnLeft() return end
- if face == 3 then face = 0 turtle.turnLeft() return end
- print("function left\(\): Bad face value: ", face)
- end
- function right()
- if face == 0 then face = 3 turtle.turnRight() return end
- if face == 1 then face = 0 turtle.turnRight() return end
- if face == 2 then face = 1 turtle.turnRight() return end
- if face == 3 then face = 2 turtle.turnRight() return end
- print("function right\(\): Bad face value: ", face)
- end
- function up()
- local success = false
- repeat
- while turtle.detectUp() do -- This loop added in case of falling sand or whatever
- turtle.digUp()
- end
- success = turtle.up()
- until success
- y = y+1
- end
- function rise(nBlocks)
- local i
- for i=1,nBlocks do
- up()
- end
- end
- function descend(nBlocks)
- local i
- for i=1,nBlocks do
- down()
- end
- end
- function down()
- if turtle.detectDown() then
- turtle.digDown()
- end
- turtle.down()
- y = y-1
- end
- function forward(keepTrackOfArea)
- while turtle.detect() do -- This loop added in case of falling sand or whatever
- turtle.dig()
- end
- for i=1,10 do -- This loop trys to handle pests (mob) that might be in the way
- if not turtle.forward() then
- if turtle.detect() then
- dig()
- else
- turtle.attack()
- sleep(2)
- end
- else
- break
- end
- end
- if keepTrackOfArea then
- areaCovered = areaCovered + 1
- end
- if face == 0 then z = z+1 return end
- if face == 1 then x = x-1 return end
- if face == 2 then z = z-1 return end
- if face == 3 then x = x+1 return end
- end
- function gatherPatchMaterial()
- local i
- patchCount = turtle.getItemCount(patchSlot)
- if patchCount < 3 then
- -- print("Attempting to refill slot ", patchSlot)
- for i=2,14 do
- turtle.select(i)
- if turtle.compareTo(patchSlot) then
- turtle.transferTo(patchSlot, 64-patchCount)
- -- print("Transferred ", 64 - patchCount, " cobble to slot ", patchSlot)
- end
- end
- end
- turtle.select(patchSlot)
- end
- function patch()
- gatherPatchMaterial()
- turtle.select(patchSlot)
- turtle.place()
- end
- function patchUp()
- gatherPatchMaterial()
- turtle.select(patchSlot)
- turtle.placeUp()
- end
- function patchDown()
- gatherPatchMaterial()
- turtle.select(patchSlot)
- turtle.placeDown()
- end
- function patchUpper()
- patchUp()
- left()
- patch()
- right()
- right()
- patch()
- left()
- end
- function patchLower()
- patchDown()
- left()
- patch()
- right()
- right()
- patch()
- left()
- end
- function patchTube()
- patchUp()
- patchDown()
- left()
- patch()
- right()
- right()
- patch()
- left()
- end
- addTorch = false
- torchSpacing = 6
- function mineForward()
- forward()
- if not turtle.detectDown() then
- patchDown()
- end
- right()
- if not turtle.detect() then
- patch()
- end
- up()
- if not turtle.detect() then
- patch()
- end
- left()
- if not turtle.detectUp() then
- patchUp()
- end
- if addTorch then
- if (torchSpot % torchSpacing) == 0 then
- left()
- turtle.select(torchSlot)
- turtle.place()
- right()
- end
- torchSpot = torchSpot + 1
- end
- turtle.down()
- end
- function setFace(f)
- if f == 0 then
- if face == 0 then return end
- if face == 1 then right() return end
- if face == 2 then right() right() return end
- if face == 3 then left() return end
- end
- if f == 1 then
- if face == 0 then left() return end
- if face == 1 then return end
- if face == 2 then right() return end
- if face == 3 then right() right() return end
- end
- if f == 2 then
- if face == 0 then left() left() return end
- if face == 1 then left() return end
- if face == 2 then return end
- if face == 3 then right() return end
- end
- if f == 3 then
- if face == 0 then right() return end
- if face == 1 then left() left() return end
- if face == 2 then left() return end
- if face == 3 then return end
- end
- end
- function checkFuel()
- if currentFuelLevel == "unlimited" then
- return true
- end
- if currentFuelLevel < minimumFuel then
- if not turtle.refuel(200) then
- areaCovered = targetArea
- missionMessage = "Mission aborted due to low fuel."
- abort = true
- return false
- end
- end
- return true
- end
- function home(targetY)
- -- print("home:face ", face, ", x = ", x, ", z = ", z)
- if x < 0 then
- setFace(east)
- while x < 0 do
- forward()
- end
- else
- if x > 0 then
- setFace(west)
- while x > 0 do
- forward()
- end
- end
- end
- if z < 0 then
- setFace(north)
- while z < 0 do
- forward()
- end
- else
- if z > 0 then
- setFace(south)
- while z > 0 do
- forward()
- end
- end
- end
- end
- function poopTorch()
- left()
- left()
- turtle.select(torchSlot)
- turtle.place()
- right()
- right()
- turtle.select(patchSlot)
- end
- -- MAIN PROGRAM
- turtle.select(patchSlot)
- print("Current Fuel Level: ", currentFuelLevel)
- if currentFuelLevel ~= "unlimited" then
- if currentFuelLevel < minimumFuel then
- if not turtle.refuel() then
- print("No fuel")
- return
- end
- end
- end
- if zipTube then
- print("Starting 1x2 zip tube...")
- for i=1,length do
- forward()
- patchLower()
- end
- patch()
- up()
- patch()
- left()
- left()
- patchUpper()
- for i=1,length-1 do
- forward()
- patchUpper()
- if (i % torchSpacing) == 0 then
- poopTorch()
- end
- end
- down()
- else
- print("Starting 2x2 double-wide tube...")
- for i=1,length do
- mineForward()
- end
- setFace(north)
- if not turtle.detect() then
- patch()
- end
- rise(1)
- if not turtle.detect() then
- patch()
- end
- descend(1)
- if not turtle.detect() then
- patch()
- end
- setFace(west)
- mineForward()
- if not turtle.detect() then
- patch()
- end
- rise(1)
- if not turtle.detect() then
- patch()
- end
- descend(1)
- setFace(south)
- addTorch = true
- torchSpot = 7
- for i=1,length-1 do
- mineForward()
- checkFuel()
- if abort then
- break
- end
- end
- end
- home(0)
- setFace(north)
- print(missionMessage, " Current fuel level is ", turtle.getFuelLevel())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement