--This program is a modification of the original excavate program in Computercraft. --It will run just like the original except will put items in an enderchest in slot 16 --and pull fuel from another enderchest in slot 15. local tArgs = { ... } if #tArgs ~= 1 then print( "Usage: excavate " ) return end -- Mine in a quarry pattern until we hit something we can't dig local size = tonumber( tArgs[1] ) if size < 1 then print( "Excavate diameter must be positive" ) return end local depth = 0 local unloaded = 0 local collected = 0 local xPos,zPos = 0,0 local xDir,zDir = 0,1 local goTo -- Filled in further down local refuel -- Filled in further down function chronnoRefuel() turtle.select(15) turtle.placeUp() turtle.suckUp() turtle.refuel() turtle.digUp() turtle.select(1) end local function unload( _bKeepOneFuelStack ) print( "Unloading items..." ) for n=1,14 do local nCount = turtle.getItemCount(n) if nCount > 0 then turtle.select(n) turtle.dropUp() end end collected = 0 turtle.select(1) end local function returnSupplies() print( "Dumping inventory..." ) turtle.select(16) turtle.placeUp() unload(false) print( "Resuming mining..." ) turtle.select(16) turtle.digUp() turtle.select(1) end local function collect() local bFull = true local nTotalItems = 0 for n=1,16 do local nCount = turtle.getItemCount(n) if nCount == 0 then bFull = false end nTotalItems = nTotalItems + nCount end if nTotalItems > collected then collected = nTotalItems if math.fmod(collected + unloaded, 50) == 0 then print( "Mined "..(collected + unloaded).." items." ) end end if bFull then print( "No empty slots left." ) return false end return true end function refuel( ammount ) local fuelLevel = turtle.getFuelLevel() if fuelLevel == "unlimited" then return true end local needed = ammount or (xPos + zPos + depth + 1) if turtle.getFuelLevel() < needed then local fueled = false chronnoRefuel() turtle.select(1) return false end return true end local function tryForwards() if not refuel() then print( "Not enough Fuel" ) returnSupplies() end while not turtle.forward() do if turtle.detect() then if turtle.dig() then if not collect() then returnSupplies() end else return false end elseif turtle.attack() then if not collect() then returnSupplies() end else sleep( 0.5 ) end end xPos = xPos + xDir zPos = zPos + zDir return true end local function tryDown() if not refuel() then print( "Not enough Fuel" ) returnSupplies() end while not turtle.down() do if turtle.detectDown() then if turtle.digDown() then if not collect() then returnSupplies() end else return false end elseif turtle.attackDown() then if not collect() then returnSupplies() end else sleep( 0.5 ) end end depth = depth + 1 if math.fmod( depth, 10 ) == 0 then print( "Descended "..depth.." metres." ) end return true end local function turnLeft() turtle.turnLeft() xDir, zDir = -zDir, xDir end local function turnRight() turtle.turnRight() xDir, zDir = zDir, -xDir end function goTo( x, y, z, xd, zd ) while depth > y do if turtle.up() then depth = depth - 1 elseif turtle.digUp() or turtle.attackUp() then collect() else sleep( 0.5 ) end end if xPos > x then while xDir ~= -1 do turnLeft() end while xPos > x do if turtle.forward() then xPos = xPos - 1 elseif turtle.dig() or turtle.attack() then collect() else sleep( 0.5 ) end end elseif xPos < x then while xDir ~= 1 do turnLeft() end while xPos < x do if turtle.forward() then xPos = xPos + 1 elseif turtle.dig() or turtle.attack() then collect() else sleep( 0.5 ) end end end if zPos > z then while zDir ~= -1 do turnLeft() end while zPos > z do if turtle.forward() then zPos = zPos - 1 elseif turtle.dig() or turtle.attack() then collect() else sleep( 0.5 ) end end elseif zPos < z then while zDir ~= 1 do turnLeft() end while zPos < z do if turtle.forward() then zPos = zPos + 1 elseif turtle.dig() or turtle.attack() then collect() else sleep( 0.5 ) end end end while depth < y do if turtle.down() then depth = depth + 1 elseif turtle.digDown() or turtle.attackDown() then collect() else sleep( 0.5 ) end end while zDir ~= zd or xDir ~= xd do turnLeft() end end if not refuel() then print( "Out of Fuel" ) return end print( "Excavating..." ) local reseal = false turtle.select(1) if turtle.digDown() then reseal = true end local alternate = 0 local done = false while not done do for n=1,size do for m=1,size-1 do if not tryForwards() then done = true break end end if done then break end if n 1 then if math.fmod(size,2) == 0 then turnRight() else if alternate == 0 then turnLeft() else turnRight() end alternate = 1 - alternate end end if not tryDown() then done = true break end end print( "Returning to surface..." ) -- Return to where we started goTo( 0,0,0,0,-1 ) turtle.select(16) turtle.placeUp() unload( false ) turtle.select(16) turtle.digUp() turtle.select(1) goTo( 0,0,0,0,1 ) -- Seal the hole if reseal then turtle.placeDown() end print( "Mined "..(collected + unloaded).." items total." )