Advertisement
Guest User

myexcavate

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