Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- SylMiner
- local tunnelPairCount
- local tunnelLength
- local fuelRequired
- local totalItems = 0
- local torchSpacing = 7
- local function calculateFuelRequired()
- local mainFuel = 20 * tunnelPairCount + 4
- local fuelPerPair = 10 * tunnelLength + 8
- return mainFuel + (tunnelPairCount * fuelPerPair)
- end
- local function fuelBotForDig()
- if fuelRequired > turtle.getFuelLimit() then
- print("Job requires more fuel than the limit (20000)")
- return false
- end
- local currentFuel = turtle.getFuelLevel()
- if currentFuel > fuelRequired then
- return true
- end
- local startFuel = turtle.getFuelLevel()
- -- select the fuel slot
- turtle.select(1)
- local fuelInSlot = turtle.getItemCount()
- if fuelInSlot == 0 then
- -- There's nothing in the fuel slot
- print("Nothing in fuel slot")
- return false
- end
- if not turtle.refuel(1) then
- -- The slot didn't have a fuel item
- print("Non-fuel item in fuel slot")
- return false
- end
- local fuelDifference = currentFuel - startFuel
- local fuelItemsRequired = math.ceil(fuelRequired / fuelDifference)
- local fuelToUse = math.min(fuelItemsRequired, fuelInSlot - 1)
- turtle.refuel(fuelToUse)
- -- At this point, the fuel slot should be empty
- return true
- end
- local function unload()
- -- assumes the turtle is over a chest
- for n=4,16 do
- local nCount = turtle.getItemCount(n)
- if nCount > 0 then
- turtle.select(n)
- turtle.dropDown()
- end
- end
- totalItems = 0
- end
- local function checkCollected()
- local newTotalItems = 0
- for n=1,16 do
- newTotalItems = newTotalItems + turtle.getItemCount(n)
- end
- if newTotalItems > totalItems then
- totalItems = newTotalItems
- return true
- end
- return false
- end
- local function digAndMoveForward()
- while not turtle.forward() do
- if turtle.detect() then
- if not turtle.dig() then
- return false
- end
- else
- turtle.attack()
- sleep(0.5)
- end
- end
- return true
- end
- local function digUp()
- if turtle.detectUp() then
- if not turtle.digUp() then
- return false
- end
- else
- turtle.attackUp()
- end
- return true
- end
- local function digDown()
- if turtle.detectDown() then
- if not turtle.digDown() then
- return false
- end
- else
- turtle.attackDown()
- end
- return true
- end
- local function placeTorchBelow()
- turtle.select(3)
- turtle.placeDown()
- end
- local function digSlice(sliceNumber)
- -- This function assumes that for an odd slice, we start left
- -- for an even slice, we start right
- if sliceNumber % 2 == 0 then
- digAndMoveForward()
- digUp()
- digDown()
- turtle.turnLeft()
- digAndMoveForward()
- digUp()
- digDown()
- digAndMoveForward()
- digUp()
- digDown()
- turtle.turnRight()
- else
- digAndMoveForward()
- digUp()
- digDown()
- turtle.turnRight()
- digAndMoveForward()
- digUp()
- digDown()
- digAndMoveForward()
- digUp()
- digDown()
- turtle.turnLeft()
- end
- -- the problem with checking after the whole slice is done
- -- is that we might miss some stuff
- if not checkCollected() then
- -- return to pair chest
- if sliceNumber % 2 == 0 then
- turtle.turnRight()
- turtle.forward()
- turtle.turnRight()
- else
- turtle.turnLeft()
- turtle.forward()
- turtle.turnLeft()
- end
- -- now facing pair chest
- for i=1,sliceNumber+1 do
- turtle.forward()
- end
- unload()
- turtle.turnRight()
- turtle.turnRight()
- for i=1,sliceNumber+1 do
- turtle.forward()
- end
- -- return to spot
- if sliceNumber % 2 == 0 then
- turtle.turnLeft()
- turtle.forward()
- turtle.turnRight()
- else
- turtle.turnRight()
- turtle.forward()
- turtle.turnLeft()
- end
- end
- if sliceNumber % 7 == 0 then
- placeTorchBelow()
- end
- end
- local function digTunnel(isLeft)
- -- assumes you're positioned at left center of tunnel face
- placeTorchBelow()
- for slice = 1,tunnelLength do
- digSlice(slice)
- end
- -- center turtle in tunnel
- turtle.turnRight()
- if turtle.detect() then
- turtle.turnRight()
- turtle.turnRight()
- turtle.forward()
- turtle.turnLeft()
- else
- turtle.forward()
- turtle.turnRight()
- end
- --return to center
- for i=1,tunnelLength+1 do
- turtle.forward()
- end
- if isLeft then
- turtle.turnLeft()
- else
- turtle.turnRight()
- end
- unload()
- end
- local function placePairChest()
- -- This function assumes you're in the exact center of the pair
- turtle.select(2)
- turtle.placeDown()
- end
- local function digPair()
- -- assumes you're in pair center
- -- go to left start
- turtle.turnLeft()
- turtle.forward()
- turtle.turnLeft()
- turtle.forward()
- turtle.turnRight()
- digTunnel(true)
- -- go to right start
- turtle.turnRight()
- turtle.forward()
- turtle.turnLeft()
- turtle.forward()
- turtle.turnRight()
- digTunnel(false)
- end
- local function runDig()
- -- dig main tunnel
- local mainTunnelLength = 4 * tunnelPairCount
- for slice = 1,mainTunnelLength do
- digSlice(slice)
- end
- -- return to first pair center
- turtle.turnRight()
- if turtle.detect() then
- turtle.turnRight()
- turtle.turnRight()
- turtle.forward()
- turtle.turnLeft()
- else
- turtle.forward()
- turtle.turnRight()
- end
- for i=1,mainTunnelLength-3 do
- turtle.forward()
- end
- turtle.turnRight()
- turtle.turnRight()
- --place first chest
- placePairChest()
- --dig first pair
- digPair()
- --dig the remaining pairs
- for pair = 1,tunnelPairCount-1 do
- for i=1,4 do
- turtle.forward()
- end
- placePairChest()
- digPair()
- end
- --return to the tunnel start
- turtle.turnRight()
- turtle.turnRight()
- for i=1,mainTunnelLength-3 do
- turtle.forward()
- end
- end
- term.clear()
- textutils.slowPrint("SylMiner v0.1")
- print("Enter number of tunnel pairs to dig: ")
- local input = read()
- tunnelPairCount = tonumber(input)
- print("Enter length of each tunnel: ")
- input = read()
- tunnelLength = tonumber(input)
- fuelRequired = calculateFuelRequired()
- torchesRequired = tunnelPairCount * 2 * (math.ceil(tunnelLength / torchSpacing) + 1)
- print(string.format("This job requires %d units of fuel.", fuelRequired))
- print(string.format("This job requires %d chests", tunnelPairCount))
- print(string.format("This job requires %d torches", torchesRequired))
- print("Slot 1: Fuel | Slot 2: Chests | Slot 3: Torches")
- print("Press any key to start...")
- read()
- if fuelBotForDig() then
- runDig()
- end
Add Comment
Please, Sign In to add comment