Advertisement
Punio

farming_turtle_crops

Oct 30th, 2015
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.42 KB | None | 0 0
  1. local tArgs = { ... }
  2.  
  3. local size_x         = 0
  4. local size_y         = 0
  5.  
  6. local done          = false;
  7.  
  8. local firstStart     = 1
  9.  
  10. local depth          = 0
  11. local unloaded       = 0
  12. local collected      = 0
  13. local timer          = 0
  14. local tmpTimer       = 0
  15.  
  16. local xPos,zPos      = 0,0
  17. local xDir,zDir      = 0,1
  18.  
  19. local goTo   -- Filled in further down
  20. local refuel -- Filled in further down
  21.  
  22.  
  23. local function checkSeeds()
  24.    local need = 2
  25.    
  26.    if turtle.getItemCount(1) < need then
  27.       return false;
  28.    end
  29.    
  30.    return true
  31. end
  32.  
  33. function refillSeeds()
  34.    for n = 2,16 do
  35.       local count1 = turtle.getItemCount(n);
  36.       local count2 = turtle.getItemCount(1);
  37.      
  38.       if count1 > 0 then
  39.          turtle.select(n)
  40.          if turtle.compareTo(1) then
  41.             turtle.transferTo(1,64)
  42.             if count2 >= 64 then
  43.                break
  44.             end
  45.          end
  46.       end
  47.    end
  48. end
  49.  
  50. local function plant()
  51.    local counter = turtle.getItemCount(1)
  52.    if counter < 2 then
  53.       refillSeeds()
  54.    end
  55.    
  56.    if  counter > 1 then
  57.       turtle.select(1)
  58.       turtle.placeDown()
  59.    end
  60. end
  61.  
  62.  
  63. local function unload( _bKeepOneFuelStack )
  64.       print( "Unloading items..." )
  65.       for n=2,16 do
  66.          local nCount = turtle.getItemCount(n)
  67.          if nCount > 0 then
  68.             turtle.select(n)            
  69.             local bDrop = true
  70.             if _bKeepOneFuelStack and turtle.refuel(0) then
  71.                bDrop = false
  72.                _bKeepOneFuelStack = false
  73.             end            
  74.             if bDrop then
  75.                while not turtle.dropDown() do
  76.                   term.clear()
  77.                   print("no empty space in chest!")
  78.                   sleep(6)
  79.                end
  80.                unloaded = unloaded + nCount
  81.             end
  82.          end
  83.       end
  84.       collected = 0
  85.       turtle.select(1)
  86. end
  87.  
  88. local function returnSupplies()
  89.       local x,y,z,xd,zd = xPos,depth,zPos,xDir,zDir
  90.       print( "Returning to Chest ..." )
  91.       goTo( 0,0,0,0,-1 )
  92.        
  93.       local fuelNeeded = 2*(x+y+z) + 1
  94.       if not refuel( fuelNeeded ) then
  95.          unload( true )
  96.          print( "Waiting for fuel" )
  97.          while not refuel( fuelNeeded ) do
  98.             sleep(1)
  99.          end
  100.       else
  101.          unload( true )
  102.       end
  103.        
  104.       print( "Resuming Farming..." )
  105.       goTo( x,y,z,xd,zd )
  106. end
  107.  
  108. function split( pString, pPattern )
  109.       local Table = {}  -- NOTE: use {n = 0} in Lua-5.0
  110.       local fpat = "(.-)" .. pPattern
  111.       local last_end = 1
  112.       local s, e, cap = pString:find( fpat, 1 )
  113.       while s do
  114.        if s ~= 1 or cap ~= "" then
  115.          table.insert( Table,cap )
  116.        end
  117.        last_end = e+1
  118.        s, e, cap = pString:find( fpat, last_end )
  119.       end
  120.       if last_end <= #pString then
  121.        cap = pString:sub( last_end )
  122.        table.insert(Table, cap)
  123.       end
  124.       return Table
  125.    end
  126.  
  127. function removeData()
  128.    if fs.exists("FarmiPos.data") then
  129.       fs.delete("FarmiPos.data")
  130.    end
  131.    
  132.    if fs.exists("startup") then
  133.       fs.delete("startup")
  134.    end
  135. end  
  136.  
  137. function saveData()
  138.    file = fs.open("FarmiPos.data", "w")
  139.    file.write(depth .. "|" .. unloaded .. "|" .. collected .. "|" .. xPos .. "|" .. zPos .. "|" .. xDir .. "|" .. zDir .. "|" .. size_x .."|".. size_y .."|".. timer .. "|" .. tmpTimer .. "|" .. firstStart)
  140.    file.close()
  141. end
  142.  
  143. function loadData()
  144.    if fs.exists("FarmiPos.data") then
  145.       file = fs.open("FarmiPos.data", "r")
  146.       tmp = file.readAll()
  147.       file.close()
  148.    
  149.       tmp = split(tmp, "|")
  150.       depth       = tonumber(tmp[1])
  151.       unloaded    = tonumber(tmp[2])
  152.       collected   = tonumber(tmp[3])
  153.       xPos        = tonumber(tmp[4])
  154.       zPos        = tonumber(tmp[5])
  155.       xDir        = tonumber(tmp[6])
  156.       zDir        = tonumber(tmp[7])
  157.       size_x      = tonumber(tmp[8])
  158.       size_y      = tonumber(tmp[9])
  159.       timer       = tonumber(tmp[10])
  160.       tmpTimer    = tonumber(tmp[11])
  161.       firstStart  = tonumber(tmp[12])
  162.      
  163.       goTo(0,0,0,0,1)
  164.       unload(true)
  165.    else
  166.       if #tArgs < 1 or #tArgs > 3 then
  167.          print( "Usage: farmi <size_x> [<size_y> <timer>]" )
  168.          return
  169.       end
  170.  
  171.       size_x    = tonumber( tArgs[1] )
  172.       size_y    = size_x
  173.       timer     = 300
  174.      
  175.       if #tArgs >= 2 then
  176.          size_y  = tonumber( tArgs[2] )
  177.       end
  178.      
  179.       if #tArgs == 3 then
  180.          timer = tonumber( tArgs[3] )
  181.       end
  182.      
  183.       if size_x < 1 then
  184.          print( "farmi size_x must be positive" )
  185.          done = true
  186.       end
  187.      
  188.       if size_y < 1 then
  189.          print( "farmi size_y must be positive" )
  190.          done = true
  191.       end
  192.      
  193.       if timer < 1 then
  194.          print( "farmi timer must be positive" )
  195.          done = true
  196.       end
  197.      
  198.       return
  199.    end
  200. end
  201.  
  202. -- ------------------------------------------------------------------------ --
  203.  
  204. local function collect()      
  205.       local bFull = true
  206.       local nTotalItems = 0
  207.       for n=1,16 do
  208.          local nCount = turtle.getItemCount(n)
  209.          if nCount == 0 then
  210.             bFull = false
  211.          end
  212.          nTotalItems = nTotalItems + nCount
  213.       end
  214.        
  215.       if nTotalItems > collected then
  216.          collected = nTotalItems
  217.          if math.fmod(collected + unloaded, 50) == 0 then
  218.             print( "Farmed "..(collected + unloaded).." items." )
  219.          end
  220.       end
  221.        
  222.       if bFull then
  223.          print( "No empty slots left." )
  224.          return false
  225.       end
  226.       return true
  227. end
  228.  
  229. function refuel( ammount )
  230.       local fuelLevel = turtle.getFuelLevel()
  231.       if fuelLevel == "unlimited" then
  232.          return true
  233.       end
  234.        
  235.       local needed = ammount or (xPos + zPos + depth + 2)
  236.       if turtle.getFuelLevel() < needed then
  237.          local fueled = false
  238.          for n=1,16 do
  239.             if turtle.getItemCount(n) > 0 then
  240.           turtle.select(n)
  241.           if turtle.refuel(1) then
  242.              while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
  243.                 turtle.refuel(1)
  244.              end
  245.              if turtle.getFuelLevel() >= needed then
  246.                 turtle.select(1)
  247.                 return true
  248.              end
  249.           end
  250.             end
  251.          end
  252.          turtle.select(1)
  253.          return false
  254.       end
  255.        
  256.       return true
  257. end
  258.  
  259. -- ------------------- MOVEMENT -------------
  260. local function tryForward()
  261.    if not refuel() then
  262.       print( "Not enough Fuel" )
  263.       returnSupplies()
  264.    end
  265.      
  266.    while not turtle.forward() do
  267.       if turtle.detect() then
  268.          if turtle.dig() then
  269.             if not collect() then
  270.                returnSupplies()
  271.             end
  272.          end
  273.       elseif turtle.attack() then
  274.          if not collect() then
  275.             returnSupplies()
  276.          end
  277.       else
  278.          sleep( 0.5 )
  279.       end
  280.    end
  281.  
  282.    xPos = xPos + xDir
  283.    zPos = zPos + zDir
  284.    
  285.    saveData()
  286.    return true
  287. end
  288.  
  289. local function tryUp()
  290.    if not refuel() then
  291.       print( "Not enough Fuel" )
  292.       returnSupplies()
  293.    end
  294.      
  295.    while not turtle.up() do
  296.       if turtle.detectUp() then
  297.          if turtle.digUp() then
  298.             if not collect() then
  299.                returnSupplies()
  300.             end
  301.          end
  302.       elseif turtle.attackUp() then
  303.          if not collect() then
  304.             returnSupplies()
  305.          end
  306.       else
  307.          sleep( 0.5 )
  308.       end
  309.    end
  310.  
  311.    depth = depth - 1
  312.    
  313.    saveData()
  314.    return true
  315. end
  316.  
  317. local function turnLeft()
  318.       turtle.turnLeft()
  319.       xDir, zDir = -zDir, xDir
  320.       saveData()
  321. end
  322.  
  323. local function turnRight()
  324.       turtle.turnRight()
  325.       xDir, zDir = zDir, -xDir
  326.       saveData()
  327. end
  328.  
  329. ------------------------------------------------------------------------------
  330.  
  331. function goTo( x, y, z, xd, zd )
  332.       while depth > y do
  333.          if turtle.up() then
  334.             depth = depth - 1
  335.          elseif turtle.digUp() or turtle.attackUp() then
  336.             collect()
  337.          else
  338.             sleep( 0.5 )
  339.          end
  340.      
  341.       saveData()
  342.       end
  343.  
  344.       if xPos > x then
  345.          while xDir ~= -1 do
  346.             turnLeft()
  347.          end
  348.          while xPos > x do
  349.             if turtle.forward() then
  350.           xPos = xPos - 1
  351.             elseif turtle.dig() or turtle.attack() then
  352.           collect()
  353.             else
  354.           sleep( 0.5 )
  355.             end
  356.        
  357.        saveData()
  358.          end
  359.       elseif xPos < x then
  360.          while xDir ~= 1 do
  361.             turnLeft()
  362.        saveData()
  363.          end
  364.          while xPos < x do
  365.             if turtle.forward() then
  366.           xPos = xPos + 1
  367.             elseif turtle.dig() or turtle.attack() then
  368.           collect()
  369.             else
  370.           sleep( 0.5 )
  371.             end
  372.        saveData()
  373.          end
  374.       end
  375.        
  376.       if zPos > z then
  377.          while zDir ~= -1 do
  378.             turnLeft()
  379.        saveData()
  380.          end
  381.          while zPos > z do
  382.             if turtle.forward() then
  383.           zPos = zPos - 1
  384.             elseif turtle.dig() or turtle.attack() then
  385.           collect()
  386.             else
  387.           sleep( 0.5 )
  388.             end
  389.        saveData()
  390.          end
  391.       elseif zPos < z then
  392.          while zDir ~= 1 do
  393.             turnLeft()
  394.        saveData()
  395.          end
  396.          while zPos < z do
  397.             if turtle.forward() then
  398.           zPos = zPos + 1
  399.             elseif turtle.dig() or turtle.attack() then
  400.           collect()
  401.             else
  402.           sleep( 0.5 )
  403.             end
  404.        saveData()
  405.          end    
  406.       end
  407.        
  408.       while depth < y do
  409.          if turtle.down() then
  410.             depth = depth + 1
  411.          elseif turtle.digDown() or turtle.attackDown() then
  412.             collect()
  413.          else
  414.             sleep( 0.5 )
  415.          end
  416.       saveData()
  417.       end
  418.      
  419.       while depth > y do
  420.          if turtle.up() then
  421.             depth = depth - 1
  422.          elseif turtle.digUp() or turtle.attackUp() then
  423.             collect()
  424.          else
  425.             sleep( 0.5 )
  426.          end
  427.       saveData()
  428.       end
  429.        
  430.       while zDir ~= zd or xDir ~= xd do
  431.          turnLeft()
  432.       saveData()
  433.       end
  434. end
  435.  
  436. function createStartup()
  437.    local file = fs.open("startup","w")
  438.    file.writeLine('if fs.exists("FarmiPos.data") then')
  439.    file.writeLine('shell.run("farmi")')
  440.    file.writeLine('else')
  441.    file.writeLine('shell.run("rm startup")')
  442.    file.writeLine('end')
  443.    file.close()
  444. end
  445.  
  446. local alternate = 0
  447.  
  448. loadData()
  449. createStartup()
  450.  
  451. while not done do
  452.    alternate = 0  
  453.  
  454.    if firstStart == 0 then
  455.       while tmpTimer < timer do      
  456.          local wait    = timer - tmpTimer
  457.          local hours   = math.floor(wait / 3600)
  458.          local minutes = math.floor((wait / 60) % 60)
  459.          local seconds = wait % 60
  460.          
  461.          if hours < 10 then
  462.             hours = tostring("0"..hours)
  463.          else
  464.             hours = tostring(hours)
  465.          end
  466.          
  467.          if minutes < 10 then
  468.             minutes = tostring("0"..minutes)
  469.          else
  470.             minutes = tostring(minutes)
  471.          end
  472.          
  473.          if seconds < 10 then
  474.             seconds = tostring("0"..seconds)
  475.          else
  476.             seconds = tostring(seconds)
  477.          end
  478.          
  479.          term.clear()
  480.          print( "Collected : "..(collected + unloaded).." items total." )
  481.          print("Waiting: " .. hours .. " Hou " .. minutes .. " Min " .. seconds .." Sec")
  482.          
  483.          tmpTimer = tmpTimer + 1
  484.          sleep(1)
  485.          saveData()
  486.       end
  487.    end
  488.    
  489.    firstStart = 0
  490.    tmpTimer   = 0
  491.    saveData()
  492.    
  493.    term.clear()
  494.    print("Farming ...")
  495.  
  496.    tryUp()
  497.    tryForward()
  498.    
  499.    -- harvesting
  500.    for n = 1, size_y do
  501.       for m = 2, size_x do
  502.          if collect() then
  503.             turtle.digDown()
  504.             tryForward()
  505.             turtle.digDown()
  506.          else
  507.             returnSupplies()
  508.          end
  509.       end
  510.      
  511.       if n < size_y then
  512.          if alternate == 1 then
  513.             turnLeft()
  514.             tryForward()
  515.             turnLeft()
  516.          else
  517.             turnRight()
  518.             tryForward()
  519.             turnRight()
  520.          end
  521.          
  522.          alternate = 1 - alternate
  523.       end
  524.       saveData()
  525.    end
  526.    
  527.    term.clear()
  528.    print("Planting ...")
  529.    
  530.    -- planting
  531.    goTo(0,0,0,0,1)
  532.    refillSeeds()
  533.    alternate = 0
  534.    
  535.    if checkSeeds() then
  536.       tryUp()
  537.       tryForward()
  538.      
  539.       local loop = true
  540.      
  541.       for n = 1, size_y do
  542.          for m = 2, size_x do
  543.             plant()
  544.             tryForward()
  545.             plant()
  546.             if not checkSeeds() then
  547.                loop = false
  548.                break
  549.             end
  550.          end
  551.          
  552.          if not loop then
  553.             break
  554.          end
  555.          
  556.          if n < size_y then
  557.             if alternate == 1 then
  558.                turnLeft()
  559.                tryForward()
  560.                turnLeft()
  561.             else
  562.                turnRight()
  563.                tryForward()
  564.                turnRight()
  565.             end
  566.            
  567.             alternate = 1 - alternate
  568.          end
  569.       end
  570.    else
  571.       while not checkSeeds() do
  572.          term.clear()
  573.          print("need minimum 2 seeds in slot 1")
  574.          sleep(1)
  575.       end
  576.    end
  577.    
  578.    goTo(0,0,0,0,1)
  579.    refillSeeds()
  580.    unload(true)
  581. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement