Advertisement
Guest User

startup

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