Advertisement
chibudesu

Turtle Excavate Script with refueling and start position

Sep 8th, 2013
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.38 KB | None | 0 0
  1. local tArgs = { ... }
  2. if #tArgs < 1 then
  3.     print( "Usage: excavate <diameter> [skipX skipY skipZ]" )
  4.     return
  5. end
  6.  
  7. -- Mine in a quarry pattern until we hit something we can't dig
  8. local size = tonumber( tArgs[1] )
  9. if size < 1 then
  10.     print( "Excavate diameter must be positive" )
  11.     return
  12. end
  13.  
  14.  
  15.  
  16. local depth = 0
  17. local unloaded = 0
  18. local collected = 0
  19.  
  20. local xPos,zPos = 0,0
  21. local xDir,zDir = 0,1
  22.  
  23. local goTo -- Filled in further down
  24. local refuel -- Filled in further down
  25.  
  26. local function unload()
  27.     print( "Unloading items..." )
  28.     -- don't unload the first slot so that we keep our fuel.
  29.     for n=1,16 do
  30.         unloaded = unloaded + turtle.getItemCount(n)
  31.         turtle.select(n)
  32.         turtle.drop()
  33.     end
  34.     collected = 0
  35.     turtle.select(1)
  36.     -- try to get more coal from a chest above us.
  37.     turtle.suckUp()
  38. end
  39.  
  40. local function returnSupplies()
  41.     local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  42.     print( "Returning to surface..." )
  43.     goTo( 0,0,0,0,-1 )
  44.    
  45.     local fuelNeeded = x+y+z + x+y+z + 1
  46.     if not refuel( fuelNeeded ) then
  47.         unload()
  48.         print( "Waiting for fuel" )
  49.         while not refuel( fuelNeeded ) do
  50.             sleep(1)
  51.         end
  52.     else
  53.         unload()   
  54.     end
  55.    
  56.     print( "Resuming mining..." )
  57.     goTo( x,y,z,xd,zd )
  58. end
  59.  
  60. local function collect()   
  61.     local bFull = true
  62.     local nTotalItems = 0
  63.     for n=1,16 do
  64.         local nCount = turtle.getItemCount(n)
  65.         if nCount == 0 then
  66.             bFull = false
  67.         end
  68.         nTotalItems = nTotalItems + nCount
  69.     end
  70.    
  71.     if nTotalItems > collected then
  72.         collected = nTotalItems
  73.         if math.fmod(collected + unloaded, 50) == 0 then
  74.             print( "Mined "..(collected + unloaded).." items." )
  75.         end
  76.     end
  77.    
  78.     if bFull then
  79.         print( "No empty slots left." )
  80.         return false
  81.     end
  82.     return true
  83. end
  84.  
  85. function refuel( ammount )
  86.     local fuelLevel = turtle.getFuelLevel()
  87.     if fuelLevel == "unlimited" then
  88.         return true
  89.     end
  90.    
  91.     local needed = ammount or (xPos + zPos + depth + 1)
  92.     if turtle.getFuelLevel() < needed then
  93.         local fueled = false
  94.         -- Start at the last space and go to the first, so we use up any extra coal before retuning it.
  95.         for n=16,1,-1 do
  96.             if turtle.getItemCount(n) > 0 then
  97.                 turtle.select(n)
  98.                 if turtle.refuel(1) then
  99.                     while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  100.                         turtle.refuel(1)
  101.                     end
  102.                     if turtle.getFuelLevel() >= needed then
  103.                         turtle.select(1)
  104.                         return true
  105.                     end
  106.                 end
  107.             end
  108.         end
  109.         turtle.select(1)
  110.         return false
  111.     end
  112.    
  113.     return true
  114. end
  115.  
  116. local function tryForwards()
  117.     if not refuel() then
  118.         print( "Not enough Fuel" )
  119.         returnSupplies()
  120.     end
  121.    
  122.     while not turtle.forward() do
  123.         if turtle.detect() then
  124.             if turtle.dig() then
  125.                 if not collect() then
  126.                     returnSupplies()
  127.                 end
  128.             else
  129.                 return false
  130.             end
  131.         elseif turtle.attack() then
  132.             if not collect() then
  133.                 returnSupplies()
  134.             end
  135.         else
  136.             refuel(1)
  137.             sleep(1)
  138.         end
  139.     end
  140.    
  141.     xPos = xPos + xDir
  142.     zPos = zPos + zDir
  143.     return true
  144. end
  145.  
  146. local function tryDown()
  147.     if not refuel() then
  148.         print( "Not enough Fuel" )
  149.         returnSupplies()
  150.     end
  151.    
  152.     while not turtle.down() do
  153.         if turtle.detectDown() then
  154.             if turtle.digDown() then
  155.                 if not collect() then
  156.                     returnSupplies()
  157.                 end
  158.             else
  159.                 return false
  160.             end
  161.         elseif turtle.attackDown() then
  162.             if not collect() then
  163.                 returnSupplies()
  164.             end
  165.         else
  166.             refuel(1)
  167.             sleep(1)
  168.         end
  169.     end
  170.  
  171.     depth = depth + 1
  172.     if math.fmod( depth, 10 ) == 0 then
  173.         print( "Descended "..depth.." metres." )
  174.     end
  175.  
  176.     return true
  177. end
  178.  
  179. local function turnLeft()
  180.     turtle.turnLeft()
  181.     xDir, zDir = -zDir, xDir
  182. end
  183.  
  184. local function turnRight()
  185.     turtle.turnRight()
  186.     xDir, zDir = zDir, -xDir
  187. end
  188.  
  189. function goTo( x, y, z, xd, zd )
  190.     while depth > y do
  191.         if turtle.up() then
  192.             depth = depth - 1
  193.         elseif turtle.digUp() or turtle.attackUp() then
  194.             collect()
  195.         else
  196.             refuel(1)
  197.             sleep(1)
  198.         end
  199.     end
  200.  
  201.     if xPos > x then
  202.         while xDir ~= -1 do
  203.             turnLeft()
  204.         end
  205.         while xPos > x do
  206.             if turtle.forward() then
  207.                 xPos = xPos - 1
  208.             elseif turtle.dig() or turtle.attack() then
  209.                 collect()
  210.             else
  211.                 refuel(1)
  212.                 sleep(1)
  213.             end
  214.         end
  215.     elseif xPos < x then
  216.         while xDir ~= 1 do
  217.             turnLeft()
  218.         end
  219.         while xPos < x do
  220.             if turtle.forward() then
  221.                 xPos = xPos + 1
  222.             elseif turtle.dig() or turtle.attack() then
  223.                 collect()
  224.             else
  225.                 refuel(1)
  226.                 sleep(1)
  227.             end
  228.         end
  229.     end
  230.    
  231.     if zPos > z then
  232.         while zDir ~= -1 do
  233.             turnLeft()
  234.         end
  235.         while zPos > z do
  236.             if turtle.forward() then
  237.                 zPos = zPos - 1
  238.             elseif turtle.dig() or turtle.attack() then
  239.                 collect()
  240.             else
  241.                 refuel(1)
  242.                 sleep(1)
  243.             end
  244.         end
  245.     elseif zPos < z then
  246.         while zDir ~= 1 do
  247.             turnLeft()
  248.         end
  249.         while zPos < z do
  250.             if turtle.forward() then
  251.                 zPos = zPos + 1
  252.             elseif turtle.dig() or turtle.attack() then
  253.                 collect()
  254.             else
  255.                 refuel(1)
  256.                 sleep(1)
  257.             end
  258.         end
  259.     end
  260.    
  261.     while depth < y do
  262.         if turtle.down() then
  263.             depth = depth + 1
  264.         elseif turtle.digDown() or turtle.attackDown() then
  265.             collect()
  266.         else
  267.             refuel(1)
  268.             sleep(1)
  269.         end
  270.     end
  271.    
  272.     while zDir ~= zd or xDir ~= xd do
  273.         turnLeft()
  274.     end
  275. end
  276.  
  277. if not refuel() then
  278.     print( "Out of Fuel" )
  279.     return
  280. end
  281.  
  282. print( "Excavating..." )
  283.  
  284. local reseal = false
  285. turtle.select(1)
  286. if turtle.digDown() then
  287.     reseal = true
  288. end
  289.  
  290. if #tArgs > 1 then
  291.     goTo(tonumber(tArgs[2]), tonumber(tArgs[3]), tonumber(tArgs[4]), 0, 1);
  292. end
  293.  
  294.  
  295.  
  296. local alternate = 0
  297. local done = false
  298. while not done do
  299.     for n=1,size do
  300.         for m=1,size-1 do
  301.             if not tryForwards() then
  302.                 done = true
  303.                 break
  304.             end
  305.         end
  306.         if done then
  307.             break
  308.         end
  309.         if n<size then
  310.             if math.fmod(n + alternate,2) == 0 then
  311.                 turnLeft()
  312.                 if not tryForwards() then
  313.                     done = true
  314.                     break
  315.                 end
  316.                 turnLeft()
  317.             else
  318.                 turnRight()
  319.                 if not tryForwards() then
  320.                     done = true
  321.                     break
  322.                 end
  323.                 turnRight()
  324.             end
  325.         end
  326.     end
  327.     if done then
  328.         break
  329.     end
  330.    
  331.     if size > 1 then
  332.         if math.fmod(size,2) == 0 then
  333.             turnRight()
  334.         else
  335.             if alternate == 0 then
  336.                 turnLeft()
  337.             else
  338.                 turnRight()
  339.             end
  340.             alternate = 1 - alternate
  341.         end
  342.     end
  343.    
  344.     if not tryDown() then
  345.         done = true
  346.         break
  347.     end
  348. end
  349.  
  350. print( "Returning to surface..." )
  351.  
  352. -- Return to where we started
  353. goTo( 0,0,0,0,-1 )
  354. unload()
  355. goTo( 0,0,0,0,1 )
  356.  
  357. -- Seal the hole
  358. if reseal then
  359.     turtle.placeDown()
  360. end
  361.  
  362. print( "Mined "..(collected + unloaded).." items total." )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement