Lion4ever

safe triple exca

Sep 3rd, 2013
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.74 KB | None | 0 0
  1.  
  2. local tArgs = { ... }
  3. if #tArgs ~= 1 and not fs.exists("isExcavating") then
  4.     print( "Usage: excavate <diameter>" )
  5.     return
  6. end
  7. local size
  8. -- Mine in a quarry pattern until we hit something we can't dig
  9. if fs.exists("isExcavating") then
  10.     size = 100
  11. else
  12.     size = tonumber( tArgs[1] )
  13. end
  14. if size < 1 then
  15.     print( "Excavate diameter must be positive" )
  16.     return
  17. end
  18.    
  19. local depth = 0
  20. local unloaded = 0
  21. local collected = 0
  22.  
  23. local xPos,zPos = 0,0
  24. local xDir,zDir = 0,1
  25. local alternate = 0
  26. local p=1
  27. local o=1
  28. local isReturning = false
  29. local function load()
  30.     if not fs.exists("isExcavating") then
  31.         return false
  32.     end
  33.     local f=fs.open("isExcavating","r")
  34.     depth,xPos,zPos,xDir,zDir,size,alternate,isReturning,o,p=unpack(textutils.unserialize(f.readAll()))
  35.     if isReturning then
  36.         error("Not supported yet!")
  37.     end
  38.     f.close()
  39.     return true
  40. end
  41. local function save()
  42.     local f=fs.open("isExcavating","w")
  43.     f.write(textutils.serialize({depth,xPos,zPos,xDir,zDir,size,alternate,isReturning,so,sp}))
  44.     f.close()
  45. end
  46.    
  47. local goTo -- Filled in further down
  48. local refuel -- Filled in further down
  49.  
  50. local function unload( _bKeepOneFuelStack )
  51.     print( "Unloading items..." )
  52.     for n=1,16 do
  53.         local nCount = turtle.getItemCount(n)
  54.         if nCount > 0 then
  55.             turtle.select(n)           
  56.             local bDrop = true
  57.             if _bKeepOneFuelStack and turtle.refuel(0) then
  58.                 bDrop = false
  59.                 _bKeepOneFuelStack = false
  60.             end        
  61.             if bDrop then
  62.                 turtle.dropUp()
  63.                 unloaded = unloaded + nCount
  64.             end
  65.         end
  66.     end
  67.     collected = 0
  68.     turtle.select(1)
  69. end
  70.  
  71. local function returnSupplies()
  72. local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  73.     isReturning = true
  74.     print( "Returning to surface..." )
  75.     goTo( 0,0,0,0,-1 )
  76.    
  77.     local fuelNeeded = 2*(x+y+z) + 1
  78.     if not refuel( fuelNeeded ) then
  79.         unload( true )
  80.         print( "Waiting for fuel" )
  81.         while not refuel( fuelNeeded ) do
  82.             sleep(1)
  83.         end
  84.     else
  85.         unload( true ) 
  86.     end
  87.    
  88.     print( "Resuming mining..." )
  89.     goTo( x,y,z,xd,zd )
  90.     isReturning = false
  91. end
  92.  
  93. local function collect()   
  94.     local bFull = true
  95.     local nTotalItems = 0
  96.     for n=1,16 do
  97.         local nCount = turtle.getItemCount(n)
  98.         if nCount == 0 then
  99.             bFull = false
  100.         end
  101.         nTotalItems = nTotalItems + nCount
  102.     end
  103.    
  104.     if nTotalItems > collected then
  105.         collected = nTotalItems
  106.         if math.fmod(collected + unloaded, 50) == 0 then
  107.             print( "Mined "..(collected + unloaded).." items." )
  108.         end
  109.     end
  110.    
  111.     if bFull then
  112.         print( "No empty slots left." )
  113.         return false
  114.     end
  115.     return true
  116. end
  117.  
  118. function refuel( ammount )
  119.     local fuelLevel = turtle.getFuelLevel()
  120.     if fuelLevel == "unlimited" then
  121.         return true
  122.     end
  123.    
  124.     local needed = ammount or (xPos + zPos + depth + 2)
  125.     if turtle.getFuelLevel() < needed then
  126.         local fueled = false
  127.         for n=1,16 do
  128.             if turtle.getItemCount(n) > 0 then
  129.                 turtle.select(n)
  130.                 if turtle.refuel(1) then
  131.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  132.                         turtle.refuel(1)
  133.                     end
  134.                     if turtle.getFuelLevel() >= needed then
  135.                         turtle.select(1)
  136.                         return true
  137.                     end
  138.                 end
  139.             end
  140.         end
  141.         turtle.select(1)
  142.         return false
  143.     end
  144.    
  145.     return true
  146. end
  147.  
  148. local function tryForwards()
  149.     if not refuel() then
  150.         print( "Not enough Fuel" )
  151.         returnSupplies()
  152.     end
  153.     xPos = xPos + xDir
  154.     zPos = zPos + zDir
  155.     if turtle.detectUp() then
  156.         turtle.digUp()
  157.         if not collect() then
  158.                 returnSupplies()
  159.         end
  160.     end
  161.     if turtle.detectDown() then
  162.         if turtle.digDown() then
  163.             if not collect() then
  164.                 returnSupplies()
  165.             end
  166.         else
  167.             return false
  168.         end
  169.     end
  170.     while turtle.detectUp() do
  171.         turtle.digUp()
  172.         if not collect() then
  173.                 returnSupplies()
  174.         end
  175.         sleep(0.5) --just gravel fall time
  176.     end
  177.     save()
  178.     while not turtle.forward() do
  179.         if turtle.detect() then
  180.             if turtle.dig() then
  181.                 if not collect() then
  182.                     returnSupplies()
  183.                 end
  184.             else
  185.                 return false
  186.             end
  187.         elseif turtle.attack() then
  188.             if not collect() then
  189.                 returnSupplies()
  190.             end
  191.         else
  192.             sleep( 0.5 )
  193.         end
  194.     end
  195.     return true
  196. end
  197.  
  198. local function tryDown()
  199.     if not refuel() then
  200.         print( "Not enough Fuel" )
  201.         returnSupplies()
  202.     end
  203.     depth = depth + 1
  204.     save()
  205.     while not turtle.down() do
  206.         if turtle.detectDown() then
  207.             if turtle.digDown() then
  208.                 if not collect() then
  209.                     returnSupplies()
  210.                 end
  211.             else
  212.                 return false
  213.             end
  214.         elseif turtle.attackDown() then
  215.             if not collect() then
  216.                 returnSupplies()
  217.             end
  218.         else
  219.             sleep( 0.5 )
  220.         end
  221.     end
  222.  
  223.    
  224.     if math.fmod( depth, 10 ) == 0 then
  225.         print( "Descended "..depth.." metres." )
  226.     end
  227.  
  228.     return true
  229. end
  230.  
  231. local function turnLeft()
  232.     save()
  233.     turtle.turnLeft()
  234.     xDir, zDir = -zDir, xDir
  235. end
  236.  
  237. local function turnRight()
  238.     save()
  239.     turtle.turnRight()
  240.     xDir, zDir = zDir, -xDir
  241. end
  242.  
  243. function goTo( x, y, z, xd, zd )
  244.     while depth > y do
  245.         if turtle.up() then
  246.             depth = depth - 1
  247.         elseif turtle.digUp() or turtle.attackUp() then
  248.             collect()
  249.         else
  250.             sleep( 0.5 )
  251.         end
  252.     end
  253.  
  254.     if xPos > x then
  255.         while xDir ~= -1 do
  256.             turnLeft()
  257.         end
  258.         while xPos > x do
  259.             if turtle.forward() then
  260.                 xPos = xPos - 1
  261.             elseif turtle.dig() or turtle.attack() then
  262.                 collect()
  263.             else
  264.                 sleep( 0.5 )
  265.             end
  266.         end
  267.     elseif xPos < x then
  268.         while xDir ~= 1 do
  269.             turnLeft()
  270.         end
  271.         while xPos < x do
  272.             if turtle.forward() then
  273.                 xPos = xPos + 1
  274.             elseif turtle.dig() or turtle.attack() then
  275.                 collect()
  276.             else
  277.                 sleep( 0.5 )
  278.             end
  279.         end
  280.     end
  281.    
  282.     if zPos > z then
  283.         while zDir ~= -1 do
  284.             turnLeft()
  285.         end
  286.         while zPos > z do
  287.             if turtle.forward() then
  288.                 zPos = zPos - 1
  289.             elseif turtle.dig() or turtle.attack() then
  290.                 collect()
  291.             else
  292.                 sleep( 0.5 )
  293.             end
  294.         end
  295.     elseif zPos < z then
  296.         while zDir ~= 1 do
  297.             turnLeft()
  298.         end
  299.         while zPos < z do
  300.             if turtle.forward() then
  301.                 zPos = zPos + 1
  302.             elseif turtle.dig() or turtle.attack() then
  303.                 collect()
  304.             else
  305.                 sleep( 0.5 )
  306.             end
  307.         end
  308.     end
  309.    
  310.     while depth < y do
  311.         if turtle.down() then
  312.             depth = depth + 1
  313.         elseif turtle.digDown() or turtle.attackDown() then
  314.             collect()
  315.         else
  316.             sleep( 0.5 )
  317.         end
  318.     end
  319.    
  320.     while zDir ~= zd or xDir ~= xd do
  321.         turnLeft()
  322.     end
  323. end
  324.  
  325. if not refuel() then
  326.     print( "Out of Fuel" )
  327.     return
  328. end
  329.  
  330. print( "Excavating..." )
  331.  
  332. local reseal = false
  333. turtle.select(1)
  334. if turtle.digDown() then
  335.     reseal = true
  336. end
  337. local loaded = load()
  338. if not loaded then
  339.     if fs.exists("startup") then
  340.         fs.move("startup","notExcaStartup")
  341.     end
  342.     local f = fs.open("startup","w")
  343.     f.write("shell.run('"..shell.getRunningProgram().."')")
  344.     f.close()
  345. end
  346.  
  347. local done = false
  348. if not loaded then
  349.     tryDown()
  350. end
  351. while not done do
  352.     for n = o or 1,size do
  353.         so=n
  354.         for m = p or 1,size-1 do
  355.             sp=m
  356.             if not tryForwards() then
  357.                 done = true
  358.                 break
  359.             end
  360.         end
  361.         p=1
  362.         if done then
  363.             break
  364.         end
  365.         if n<size then
  366.             if math.fmod(n + alternate,2) == 0 then
  367.                 turnLeft()
  368.                 if not tryForwards() then
  369.                     done = true
  370.                     break
  371.                 end
  372.                 turnLeft()
  373.             else
  374.                 turnRight()
  375.                 if not tryForwards() then
  376.                     done = true
  377.                     break
  378.                 end
  379.                 turnRight()
  380.             end
  381.         end
  382.     end
  383.     o=1
  384.     if done then
  385.         break
  386.     end
  387.    
  388.     if size > 1 then
  389.         if math.fmod(size,2) == 0 then
  390.             turnRight()
  391.         else
  392.             if alternate == 0 then
  393.                 turnLeft()
  394.             else
  395.                 turnRight()
  396.             end
  397.             alternate = 1 - alternate
  398.         end
  399.     end
  400.     tryDown()
  401.     tryDown()
  402.     if not tryDown() then
  403.         done = true
  404.         break
  405.     end
  406. end
  407.  
  408. print( "Returning to surface..." )
  409.  
  410. -- Return to where we started
  411. goTo( 0,0,0,0,-1 )
  412. unload( false )
  413. goTo( 0,0,0,0,1 )
  414.  
  415. -- Seal the hole
  416. if reseal then
  417.     turtle.placeDown()
  418. end
  419.  
  420. fs.delete("startup")
  421. fs.delete("isExcavating")
  422. if fs.exists("notExcaStartup") then
  423.     fs.move("notExcaStartup","startup")
  424. end
  425. print( "Mined "..(collected + unloaded).." items total." )
Advertisement
Add Comment
Please, Sign In to add comment