bindre12

Custom Command Turtles (Digger)

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