demchrome

FeatherMiner 1.0

Jan 24th, 2014
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.69 KB | None | 0 0
  1. local Args = {...}
  2. local Branches = 0
  3. local Trunks = 0
  4. local PlaceTorches = true
  5. local Channel = nil
  6. local TurtleID = os.getComputerLabel()
  7. local TorchesSlot = 15
  8. local FuelSlot = 16
  9.  
  10. local tBranchesMined = 0
  11. local tTrunksMined = 0
  12. local tSide = "Left"
  13. local tMovements = {}
  14. local tBackMovements = {}
  15.  
  16. if turtle == nil then
  17.     print("Error: This is a turtle program and cannot be used by a computer")
  18. end
  19.  
  20. if TurtleID == nil then
  21.     TurtleID = "#" .. os.getComputerID()
  22. end
  23.  
  24. if #Args < 2 then
  25.     print("Syntax: featherminer <Trunks> <Branches> {Torches=True} {Channel=nil}")
  26.     print("<Trunks>: Amount of Trunks to make (Required)")
  27.     print("<Branches>: Amount of Branches to make per Trunk (Required)")
  28.     print("{Torches}: Place Torches along the way. Slots should be in slot " .. TorchesSlot .. ". (Default: True) (Optional)")
  29.     print("{Channel}: Channel name (Used by zReceiver) (Default:None/No Broadcast) (Optional)")
  30.     return false
  31. end
  32.  
  33. Trunks = tonumber(Args[1])
  34. Branches = tonumber(Args[2])
  35.  
  36. if #Args >= 4 then
  37.     Channel = Args[4]
  38. end
  39.  
  40. if #Args >= 3 then
  41.     PlaceTorches = (Args[3] == "True" or Args[3] == "true")
  42. end
  43.  
  44. local function SendMessage(Msg)
  45.     if peripheral.getType("right") == "modem" and Channel ~= nil then
  46.         rednet.open("right")
  47.         rednet.broadcast(Channel .. "|" .. TurtleID .. ": " .. Msg)
  48.         rednet.close("right")
  49.     end
  50.     print(Msg)
  51. end
  52.  
  53. local function CalcMovementsRequired(lTrunks, lBranches)
  54.       return (13 * lTrunks) - 6 + ((28 * lBranches * 2) * lTrunks)
  55. end
  56.  
  57. local function Refuel(Needed)
  58.     if turtle.getFuelLevel() >= Needed then
  59.         return true
  60.     end
  61.     for I=1, 16 do
  62.         turtle.select(I)
  63.         while turtle.getFuelLevel() < Needed do
  64.             if not turtle.refuel(1) then
  65.                 break
  66.             end
  67.         end
  68.        
  69.         if turtle.getFuelLevel() >= Needed then
  70.             return true
  71.         end
  72.     end
  73.    
  74.     return false
  75. end
  76.  
  77. local function HasInventoryLeft()
  78.     for I=1, 16 do
  79.         if turtle.getItemCount(I) == 0 then
  80.             return true
  81.         end
  82.     end
  83.     return false
  84. end
  85.  
  86. local function TryForward()
  87.     while not turtle.forward() do
  88.         if turtle.detect() then
  89.             while turtle.detect() do
  90.                 if not turtle.dig() then
  91.                     return false
  92.                 end
  93.                 if not turtle.detect() then
  94.                     break
  95.                 end
  96.                 os.sleep(0.5)
  97.             end
  98.         elseif turtle.getFuelLevel() <= 0 then
  99.             turtle.select(FuelSlot)
  100.             if not turtle.refuel(1) then
  101.                 SendMessage("Out of fuel on Trunk " .. tTrunksMined .. ", Branch " .. tBranchesMined .. ", Side: " .. tSide)
  102.                 while not turtle.refuel(1) do
  103.                     os.sleep(1)
  104.                 end
  105.                 SendMessage("Waiting 5 Seconds...")
  106.                 os.sleep(5)
  107.                 SendMessage("Resuming Operation")
  108.             end
  109.         else
  110.             turtle.attack()
  111.             os.sleep(0.5)
  112.         end
  113.    
  114.         --[[if turtle.getFuelLevel() <= 0 then
  115.             turtle.select(FuelSlot)
  116.             if not turtle.refuel(1) then
  117.                 SendMessage("Out of fuel on Trunk " .. tTrunksMined .. ", Branch " .. tBranchesMined)
  118.                 while not turtle.refuel(1) do
  119.                     os.sleep(1)
  120.                 end
  121.                 SendMessage("Waiting 5 Seconds...")
  122.                 os.sleep(5)
  123.                 SendMessage("Resuming Operation")
  124.             end
  125.         elseif not turtle.detect() then
  126.             turtle.attack()
  127.             os.sleep(0.5)
  128.         end
  129.    
  130.         while turtle.detect() do
  131.             if not turtle.dig() then
  132.                 return false
  133.             end
  134.             os.sleep(0.5)
  135.         end]]--
  136.     end
  137.     return true
  138. end
  139.  
  140. local function TryUp()
  141.     if not turtle.up() then
  142.         if turtle.detectUp() then
  143.             if not turtle.digUp() then
  144.                 return false
  145.             end
  146.         else
  147.             while not turtle.up() do
  148.                 turtle.attackUp()
  149.                 os.sleep(0.5)
  150.             end
  151.         end
  152.     end
  153.     return true
  154. end
  155.  
  156. local function TryDown()
  157.     if not turtle.down() then
  158.         if turtle.detectDown() then
  159.             if not turtle.digDown() then
  160.                 return false
  161.             end
  162.         else
  163.             while not turtle.down() do
  164.                 turtle.attackDown()
  165.                 os.sleep(0.5)
  166.             end
  167.         end
  168.     end
  169.     return true
  170. end
  171.  
  172. local function TurnLeft()
  173.     return turtle.turnLeft()
  174. end
  175.  
  176. local function TurnRight()
  177.     return turtle.turnRight()
  178. end
  179.  
  180. local function RetrackBack(ReturnToLocation)
  181.     SendMessage("Returning to start position")
  182.     tBackMovements = {}
  183.     for I=1, #tMovements do
  184.         if tMovements[I] == "Forward" then
  185.             TryForward()
  186.             table.insert(tBackMovements, #tBackMovements + 1, "Forward")
  187.         elseif tMovements[I] == "Back" then
  188.             turtle.back()
  189.             table.insert(tBackMovements, #tBackMovements + 1, "Back")
  190.         elseif tMovements[I] == "Left" then
  191.             TurnLeft()
  192.             table.insert(tBackMovements, #tBackMovements + 1, "Right")
  193.         elseif tMovements[I] == "Right" then
  194.             TurnRight()
  195.             table.insert(tBackMovements, #tBackMovements + 1, "Left")
  196.         end
  197.     end
  198.    
  199.     for I=1, ((tTrunksMined + 1) * 13 - 6) do
  200.         TryForward()
  201.         table.insert(tBackMovements, #tBackMovements + 1, "Forward")
  202.     end
  203.    
  204.     SendMessage("Unloading Items")
  205.     for I=1, 16 do
  206.         if I ~= TorchesSlot and I ~= FuelSlot then
  207.             turtle.select(I)
  208.             turtle.dropDown()
  209.         end
  210.     end
  211.    
  212.    
  213.     SendMessage("Returning to last mined position")
  214.     if ReturnToLocation then
  215.         TurnLeft()
  216.         TurnLeft()
  217.         for I=#tBackMovements, 1, -1 do
  218.             if tBackMovements[I] == "Forward" then
  219.                 TryForward()
  220.             elseif tBackMovements[I] == "Back" then
  221.                 turtle.back()
  222.             elseif tBackMovements[I] == "Left" then
  223.                 TurnLeft()
  224.             elseif tBackMovements[I] == "Right" then
  225.                 TurnRight()
  226.             end
  227.             turtle.suckDown() --Pick up and overflowing items from before
  228.         end
  229.         TurnRight()
  230.         TurnRight()
  231.     end
  232.     return true
  233. end
  234.  
  235.  
  236. local function MineBranch(lPlaceTorch, Times)
  237.     local Turn = "Right"
  238.     tSide = "Left"
  239.     if Times == 2 then
  240.         Turn = "Left"
  241.         tSide = "Right"
  242.     end
  243.    
  244.     tMovements = {}
  245.     for I=1, 4 do
  246.         if not TryForward() then
  247.             return false
  248.         end
  249.        
  250.         if turtle.detectDown() then
  251.             if not turtle.digDown() then
  252.                 return false
  253.             end
  254.         end
  255.     end
  256.     tMovements = {"Right","Right","Forward","Forward","Forward","Forward", Turn}
  257.     if not HasInventoryLeft() then
  258.         RetrackBack(true)
  259.     end
  260.     TurnLeft()
  261.     for I=1, 5 do
  262.         if not TryForward() then
  263.             return false
  264.         end
  265.     end
  266.     TurnLeft()
  267.     TurnLeft()
  268.    
  269.     tMovements = {"Forward","Forward","Forward","Forward","Forward","Right","Forward","Forward","Forward","Forward", Turn}
  270.     if not HasInventoryLeft() then
  271.         RetrackBack(true)
  272.     end
  273.    
  274.     for I=1, 5 do
  275.         if not TryForward() then
  276.             return false
  277.         end
  278.     end
  279.    
  280.     tMovements = {"Right","Forward","Forward","Forward","Forward", Turn}
  281.     if not HasInventoryLeft() then
  282.         RetrackBack(true)
  283.     end
  284.    
  285.     for I=1, 5 do
  286.         if not TryForward() then
  287.             return false
  288.         end
  289.     end
  290.     TurnLeft()
  291.     TurnLeft()
  292.    
  293.     tMovements = {"Forward","Forward","Forward","Forward","Forward","Left","Forward","Forward","Forward","Forward", Turn}
  294.     if not HasInventoryLeft() then
  295.         RetrackBack(true)
  296.     end
  297.    
  298.     for I=1, 5 do
  299.         if not TryForward() then
  300.             return false
  301.         end
  302.     end
  303.    
  304.     if lPlaceTorch and PlaceTorches and turtle.getItemCount(TorchesSlot) > 0 then
  305.         turtle.select(TorchesSlot)
  306.         turtle.placeDown()
  307.     end
  308.     return true
  309. end
  310.  
  311. local function MineTrunk(lBranches)
  312.     for I=1,7 do
  313.         if not TryForward() then
  314.             return false
  315.         end
  316.        
  317.         if turtle.detectDown() then
  318.             if not turtle.digDown() then
  319.                 return false
  320.             end
  321.         end
  322.     end
  323.    
  324.     TurnLeft()
  325.     for B=1, 2 do
  326.         tBranchesMined = 0
  327.         local lPlaceTorch = true
  328.         for I=1, lBranches do
  329.             if not MineBranch(lPlaceTorch, B) then
  330.                 return false
  331.             end
  332.             tBranchesMined = tBranchesMined + 1
  333.            
  334.             if not HasInventoryLeft() then
  335.                 local WhichTurn = "Right"
  336.                 if B == 2 then
  337.                     WhichTurn = "Left"
  338.                 end
  339.                 tMovements = {"Left"}
  340.                 for M=1, tBranchesMined * 4 do
  341.                     table.insert(tMovements, #tMovements + 1, "Forward")
  342.                 end
  343.                 table.insert(tMovements, #tMovements + 1, WhichTurn)
  344.                 os.sleep(1)
  345.                 RetrackBack(true)
  346.             end
  347.            
  348.             if I < lBranches then
  349.                 TurnRight()
  350.             else
  351.                 TurnLeft()
  352.             end
  353.             if lPlaceTorch then
  354.                 lPlaceTorch = false
  355.             else
  356.                 lPlaceTorch = true
  357.             end
  358.         end
  359.         for I=1, lBranches * 4 do
  360.             if not TryForward() then
  361.                 return false
  362.             end
  363.         end
  364.     end
  365.     return true
  366. end
  367.  
  368.  
  369. local MovementsRequired = CalcMovementsRequired(Trunks, Branches)
  370. if not Refuel(MovementsRequired) then
  371.     print("Not enough fuel. Required Fuel Level: " .. MovementsRequired .. ". Please put enough fuel in Slot " .. FuelSlot)
  372.     turtle.select(FuelSlot)
  373.     while turtle.getFuelLevel() < MovementsRequired do
  374.         if not turtle.refuel(1) then
  375.             os.sleep(0.5)
  376.         end
  377.     end
  378. end
  379.  
  380. if PlaceTorches then
  381.     local TorchesNeeded = (Trunks * math.floor(Branches / 2) * 2)
  382.     if turtle.getItemCount(TorchesSlot) < TorchesNeeded then
  383.         print("Please put atleast " .. TorchesNeeded .. " torches in Slot " .. TorchesSlot)
  384.         while turtle.getItemCount(TorchesSlot) < TorchesNeeded do
  385.             os.sleep(1)
  386.         end
  387.     end
  388. end
  389.  
  390. turtle.select(1)
  391. for T=1, Trunks do
  392.     if not MineTrunk(Branches) then
  393.         if turtle.getFuelLevel() <= 0 then
  394.             SendMessage("Not enough fuel?! Exiting Operation!")
  395.             return false
  396.         elseif turtle.detect() then
  397.             if not turtle.dig() then
  398.                 SendMessage("We have hit bedrock here.. Unloading Items and quitting")
  399.                 RetrackBack(false)
  400.                 for I=1, 16 do
  401.                     turtle.select(I)
  402.                     turtle.drop()
  403.                 end
  404.                 return false
  405.             end
  406.         else
  407.             SendMessage("Something went wrong.. Unloading Items and quitting")
  408.             RetrackBack(false)
  409.             for I=1, 16 do
  410.                 turtle.select(I)
  411.                 turtle.drop()
  412.             end
  413.             return false
  414.         end
  415.     end
  416.     tTrunksMined = tTrunksMined + 1
  417.     SendMessage("Trunk " .. tTrunksMined .. " of " .. Trunks .. " Mined")
  418.    
  419.     if T == Trunks then
  420.         TurnLeft()
  421.     else
  422.         if not HasInventoryLeft then
  423.             tMovements = {"Left"}
  424.             RetrackBack(true)
  425.         end
  426.        
  427.         TurnRight()
  428.         for I=1, 6 do
  429.             TryForward()
  430.             if turtle.detectDown() then
  431.                 if not turtle.digDown() then
  432.                     return false
  433.                 end
  434.             end
  435.         end
  436.     end
  437. end
  438.  
  439. for T=1, (Trunks * 13) - 6 do
  440.     TryForward()
  441. end
  442. for I=1, 16 do
  443.     turtle.select(I)
  444.     turtle.dropDown()
  445. end
  446. TurnLeft()
  447. TurnLeft()
  448. SendMessage("Finished Operation")
  449. return true
Add Comment
Please, Sign In to add comment