Advertisement
vacnoa

FarmTree-1

Apr 25th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 31.64 KB | None | 0 0
  1. --Logger V1.0 program made by Anonomit
  2. -- Original en http://www.computercraft.info/forums2/index.php?/topic/6221-logger-program/page__p__51832#entry51832
  3.  
  4.  
  5. local bNoBroadcast = true --set to true to suppress option to use broadcast console
  6. local bUseFuel = true --whether turtles consume fuel
  7. local bDebugDefault = false
  8.  
  9. local tArgs = { ... }
  10. local bDebug = tArgs[1] == "debug" and true or ( tArgs[1] == "noDebug" and false or bDebugDefault )
  11. local nLoggerSettingsLines = 9
  12. local foo
  13. local bar
  14. local baz
  15. local nTreesremaining
  16. local sHarvestMode
  17. local bUseBroadcast
  18. local nRows
  19. local nTrees
  20. local bEmptyLogs
  21. local bRefillSaplings
  22. local bOutput
  23. local tSides = {}
  24. local bLowSaplings
  25. local bNoSaplings
  26. local bKeyLog
  27. tPeripheralType = {}
  28.  
  29. local xTerm, yTerm = term.getSize()
  30.  
  31. term.clear()
  32.  
  33.  
  34. local function getPeripherals()
  35.     for _, side in pairs( rs.getSides() ) do
  36.         if peripheral.isPresent( side ) then
  37.             tPeripheralType[side] = peripheral.getType( side )
  38.         end --if peripheral.isPresent( side )
  39.     end --for _, side in pairs( rs.getSides() )
  40. end --local function getPeripherals()
  41.  
  42. getPeripherals()
  43.  
  44. local function round( _number, _dp)
  45.     local nMultiple = 10^( _dp or 0 )
  46.     return math.floor( _number * nMultiple + 0.5 ) / nMultiple
  47. end --local function round( _number, _dp )
  48.  
  49.  
  50.  
  51. function clearAll( _xPos, _yPos, _text, ... )
  52.     local xDefault = 1
  53.     local yDefault = 3
  54.    
  55.     foo = false
  56.    
  57.     if not arg[1] then
  58.         term.clear()
  59.     else --arg[1]
  60.         for i = 1, yTerm do
  61.             for _, value in ipairs( arg ) do
  62.                 if i == value then
  63.                     foo = true
  64.                 end --if i == value
  65.             end --for _, value in ipairs( arg )
  66.             if not foo then
  67.                 term.setCursorPos( 1, i )
  68.                 term.clearLine()
  69.             end --if not foo
  70.             foo = false
  71.         end --for i = 1, yTerm
  72.     end --if not arg[1]
  73.    
  74.     foo = nil
  75.    
  76.     term.setCursorPos( 1, 1 )
  77.     if _text then
  78.         write( _text )
  79.     else --_text
  80.         write( "Anonomit Tree Farmer #" .. os.computerID() )
  81.     end --if _text
  82.     term.setCursorPos( 1, 2 )
  83.     for i = 1, xTerm - 1 do
  84.         write( "~" )
  85.     end --for i = 1, xTerm - 1
  86.    
  87.     if type( tonumber( _xPos ) ) == "number" and type( tonumber( _yPos ) ) == "number" then
  88.         if _xPos <= xTerm and _xPos > 0 and _yPos <= yTerm and _yPos > 0 then
  89.             term.setCursorPos( _xPos, _yPos )
  90.         else --_xPos <= xTerm and _xPos > 0 and _yPos <= yTerm and _yPos > 0
  91.             term.setCursorPos( xDefault, yDefault )
  92.         end --if _xPos <= xTerm and _xPos > 0 and _yPos <= yTerm and _yPos > 0
  93.     else --type( tonumber( _xPos ) ) == "number" and type( tonumber( _yPos ) ) == "number"
  94.         term.setCursorPos( xDefault, yDefault )
  95.     end --if _xPos == nil or _yPos == nil
  96.    
  97. end --function clearAll( _xPos, _yPos, _text )
  98.  
  99.  
  100.  
  101. local function header( _text )
  102.     local xCursorPos, yCursorPos = term.getCursorPos()
  103.     term.setCursorPos( 1, 1 )
  104.     term.clearLine()
  105.     if _text then
  106.         print( _text )
  107.     else --_text
  108.         print( "Anonomit Tree Farmer #" .. os.computerID() )
  109.     end --if _text
  110.     term.clearLine()
  111.     for i = 1, xTerm - 1 do
  112.         write( "~" )
  113.     end --for i = 1, xTerm - 1
  114.     term.setCursorPos( xCursorPos, yCursorPos )
  115. end --local function header( _text )
  116.  
  117.  
  118.  
  119. local function rednetSend( _message )
  120.    
  121.     if bUseBroadcast then
  122.         rednet.send( nBroadcastID, _message )
  123.     end --if bUseBroadcast
  124.    
  125. end --local function rednetSend( _message )
  126.  
  127.  
  128.  
  129. local function keyLog()
  130.    
  131.     bKeyLog = false
  132.    
  133.     while true do
  134.        
  135.         event, key = os.pullEvent( "char" )
  136.         if key ~= 1 then
  137.             print( "Stopping..." )
  138.             bKeyLog = true
  139.             break --while true
  140.         end --if key ~= 1
  141.        
  142.     end --while true
  143.    
  144.     while true do
  145.        
  146.         sleep( 0.01 )
  147.        
  148.     end --while true
  149.    
  150. end --local function keyLog()
  151.  
  152.  
  153.  
  154. local function select( _selectSlot )
  155.    
  156.     if tonumber( _selectSlot ) == nil then
  157.         for i = 3, 15 do
  158.             if turtle.getItemSpace( i ) > 0 then
  159.                 select( i )
  160.                 return i
  161.             end --if turtle.getItemSpace( i ) > 0
  162.         end --for i = 3, 15
  163.     else --tonumber( _selectSlot ) == nil
  164.         turtle.select( tonumber( _selectSlot ) )
  165.         return _selectSlot
  166.     end --if tonumber( _selectSlot ) == nil
  167.    
  168.     return 3
  169.    
  170. end --local function select( _selectSlot )
  171.  
  172.  
  173.  
  174. local function dig( _digDirection )
  175.    
  176.     if _digDirection == nil then
  177.         _digDirection = "forward"
  178.     elseif _digDirection == "right" or _digDirection == "r" then
  179.         move( "right" )
  180.         _digDirection = "forward"
  181.     elseif _digDirection == "left" or _digDirection == "l" then
  182.         move( "left" )
  183.         _digDirection = "forward"
  184.     elseif _digDirection == "back" or _digDirection == "b" then
  185.         move( "right" )
  186.         move( "right" )
  187.         _digDirection = "forward"
  188.     end
  189.    
  190.     if _digDirection == "forward" or _digDirection == "f" and turtle.detect() then
  191.         turtle.dig()
  192.     elseif _digDirection == "up" or _digDirection == "u" and turtle.detectUp() then
  193.         turtle.digUp()
  194.     elseif _digDirection == "down" or _digDirection == "d" and turtle.detectDown() then
  195.         turtle.digDown()
  196.     end --if _digDirection == "forward" or _digDirection == "f" and turtle.detect()
  197.    
  198. end --local function dig( _digDirection )
  199.  
  200.  
  201.  
  202. local function move( _moveDirection, _moveDistance, _moveSlot )
  203.    
  204.     local hasSpun = false
  205.    
  206.     if type( tonumber( _moveDirection ) ) == "number" and _moveDistance == nil then
  207.         _moveDirection = "forward"
  208.         _moveDistance = _moveDirection
  209.     elseif type( tonumber( _moveDirection ) ) == "number" and type( tonumber( _moveDistance ) ) == "nil" then
  210.         _moveDirection = _moveDistance
  211.         _moveDistance = _moveDirection
  212.     end --if type( tonumber( _moveDirection ) ) == "number" and _moveDistance == nil
  213.    
  214.     local function selection()
  215.         if tonumber( _moveSlot ) then
  216.             if tonumber( _moveSlot ) > 2 then
  217.                 select()
  218.             else --tonumber( _moveSlot ) > 2
  219.                 select( _moveSlot )
  220.             end --if tonumber( _moveSlot ) > 2
  221.         else --tonumber( _moveSlot )
  222.             _moveSlot = select()
  223.         end --if tonumber( _moveSlot )
  224.     end --local function selection()
  225.    
  226.     local function checkFuel()
  227.         if bUseFuel then
  228.             if turtle.getFuelLevel() == 0 then
  229.                 if turtle.getItemSpace( 16 ) ~= 64 then
  230.                     select( 16 )
  231.                 else --turtle.getItemSpace( 16 ) ~= 64
  232.                     for i = 3, 15 do
  233.                         if turtle.getItemSpace( i ) ~= 64 then
  234.                             turtle.select( i )
  235.                             break --for i = 3, 15
  236.                         end --if turtle.getItemSpace( i ) ~= 64
  237.                     end --for i = 3, 15
  238.                 end --if turtle.getItemSpace( 16 ) ~= 64
  239.                 turtle.refuel( 1 )
  240.             end --if turtle.getFuelLevel() == 0
  241.             selection()
  242.         end --if bUseFuel
  243.     end --local function checkFuel()
  244.    
  245.     if _moveDirection == "right" or _moveDirection == "r" then
  246.         turtle.turnRight()
  247.         _moveDirection = "forward"
  248.     elseif _moveDirection == "left" or _moveDirection == "l" then
  249.         turtle.turnLeft()
  250.         _moveDirection = "forward"
  251.     end --if _moveDirection == "right" or _moveDirection == "r"
  252.    
  253.     local function movement()
  254.        
  255.         if _moveDirection == "forward" or _moveDirection == "f" then
  256.             if turtle.forward() then
  257.                 return true
  258.             else --turtle.forward()
  259.                 return false
  260.             end --if turtle.forward()
  261.         elseif _moveDirection == "up" or _moveDirection == "u" then
  262.             if turtle.up() then
  263.                 return true
  264.             else --turtle.up()
  265.                 return false
  266.             end --if turtle.up()
  267.         elseif _moveDirection == "down" or _moveDirection == "d" then
  268.             if turtle.down() then
  269.                 return true
  270.             else --turtle.down()
  271.                 return false
  272.             end --if turtle.down()
  273.         elseif _moveDirection == "back" or _moveDirection == "b" then
  274.             if hasSpun then
  275.                 if turtle.forward() then
  276.                     return true
  277.                 else --turtle.forward()
  278.                     return false
  279.                 end --if turtle.forward()
  280.             else --hasSpun
  281.                 if turtle.back() then
  282.                     return true
  283.                 else --turtle.back()
  284.                     return false
  285.                 end --if turtle.back()
  286.             end --if hasSpun
  287.         end --if _moveDirection == "forward" or _moveDirection == "f"
  288.        
  289.     end --local function movement()
  290.    
  291.     local function digger()
  292.    
  293.         if _moveDirection == "forward" or _moveDirection == "f" then
  294.             dig( "forward" )
  295.         elseif _moveDirection == "up" or _moveDirection == "u" then
  296.             dig( "up" )
  297.         elseif _moveDirection == "down" or _moveDirection == "d" then
  298.             dig( "down" )
  299.         elseif _moveDirection == "back" or _moveDirection == "b" then
  300.             if hasSpun then
  301.                 dig( "forward" )
  302.             else --hasSpun then
  303.                 turtle.turnRight()
  304.                 turtle.turnRight()
  305.                 dig( "forward" )
  306.             end --if hasSpun
  307.         end --if _moveDirection == "forward" or _moveDirection == "f"
  308.        
  309.     end --local function digger()
  310.    
  311.     local slotCount = {}
  312.     local function vacuum()
  313.         for i = 1, 16 do
  314.             slotCount[i] = turtle.getItemSpace( i )
  315.         end --for i = 3, 16
  316.         turtle.suckDown()
  317.         for i = 3, 15 do
  318.             if turtle.getItemSpace( i ) < slotCount[i] and slotCount[i] == 64 then
  319.                 turtle.select( i )
  320.                 turtle.dropUp()
  321.             end --if turtle.getItemSpace[i] < slotCount[i]
  322.         end --for i = 3, 15
  323.        
  324.         selection()
  325.        
  326.     end --local function vacuum()
  327.    
  328.     if _moveDistance ~= nil and _moveDistance ~= 0 then
  329.         for i = 1, _moveDistance do
  330.             if not turtle.detectDown() then
  331.                 --vacuum()
  332.             end --if not turtle.detectDown()
  333.             selection()
  334.             while not movement() do
  335.                 checkFuel()
  336.                 digger()
  337.             end --while not movement()
  338.         end --for i = 1, _moveDistance
  339.         if hasSpun then
  340.             turtle.turnRight()
  341.             turtle.turnRight()
  342.         end --if hasSpun
  343.     end --if _moveDistance ~= nil and _moveDistance ~= 0
  344.    
  345. end --local function move( _moveDirection, _moveDistance, _moveSlot )
  346.  
  347.  
  348.  
  349. local function loadSettings()
  350.    
  351.     sHarvestMode, nRows, nTrees, bEmptyLogs, bRefillSaplings = nil, nil, nil, nil, nil
  352.     bOutput = false
  353.     tSides = {}
  354.    
  355.     if fs.exists( "loggerSettings" ) then
  356.        
  357.         local tLine = {}
  358.         local file = fs.open( "loggerSettings", "r" )
  359.        
  360.         for i = 1, nLoggerSettingsLines do
  361.             tLine[ #tLine + 1 ] = file.readLine()
  362.         end --for i = 1, nLoggerSettingsLines
  363.        
  364.         file.close()
  365.        
  366.         sHarvestMode = tLine[1]
  367.         bUseBroadcast = tLine[2] == "true" and true or ( tLine[2] == "false" and false or false )
  368.         if bUseBroadcast then
  369.            
  370.             nBroadcastID = tonumber( tLine[3] ) ~= nil and tonumber( nBroadcastID ) or nil
  371.            
  372.         end --if bUseBroadcast
  373.        
  374.         if sHarvestMode == "farm" then
  375.            
  376.             nRows = tonumber( tLine[4] ) ~= nil and tonumber( tLine[4] ) or nil
  377.             nTrees = tonumber( tLine[5] ) ~= nil and tonumber( tLine[5] ) or nil
  378.             bEmptyLogs = tLine[6] == "true" and true or ( tLine[6] == "false" and false or false )
  379.             bRefillSaplings = tLine[7] == "true" and true or ( tLine[7] == "false" and false or false )
  380.             if bEmptyLogs or bRefillSaplings then
  381.                 bOutput = tLine[8] == "true" and true or ( tLine[8] == "false" and false or false )
  382.                 if bOutput then
  383.                     tSides = textutils.unserialize( tLine[9] ) or {}
  384.                 end --if bOutput
  385.             end --if bEmptyLogs or bRefillSaplings
  386.            
  387.         end --if sHarvestMode == "farm"
  388.        
  389.        
  390.        
  391.         if sHarvestMode == "farm" and ( bUseBroadcast == true or bUseBroadcast == false ) and nRows and nTrees and ( bEmptyLogs == true or bEmptyLogs == false ) and ( bRefillSaplings == true or bRefillSaplings == false ) then
  392.             return true
  393.         elseif sHarvestMode == "bonemeal" then
  394.             return true
  395.         else --sHarvestMode == "farm" and ( bUseBroadcast == true or bUseBroadcast == false ) and nRows and nTrees and ( bEmptyLogs == true or bEmptyLogs == false ) and ( bRefillSaplings == true or bRefillSaplings == false )
  396.             return false
  397.         end --sHarvestMode == "farm" and ( bUseBroadcast == true or bUseBroadcast == false ) and nRows and nTrees and ( bEmptyLogs == true or bEmptyLogs == false ) and ( bRefillSaplings == true or bRefillSaplings == false )
  398.        
  399.     elseif not fs.exists( "loggerSettings" ) then
  400.         return false
  401.     end --if fs.exists( "loggerSettings" )
  402.    
  403. end --local function loadSettings()
  404.  
  405.  
  406.  
  407. local function writeToFile()
  408.    
  409.     if fs.exists( "loggerSettings" ) then
  410.         fs.delete( "loggerSettings" )
  411.     end --if fs.exists( "loggerSettings" )
  412.     local file = fs.open( "loggerSettings", "w" )
  413.     file.writeLine( sHarvestMode )
  414.     file.writeLine( bUseBroadcast ~= nil and tostring( bUseBroadcast ) or "nil" )
  415.     file.writeLine( tostring( nBroadcastId ) ~= nil and tostring( nBroadcastID ) or "nil" )
  416.     if sHarvestMode == "farm" then
  417.         file.writeLine( nRows ~= nil and nRows or "nil" )
  418.         file.writeLine( nTrees ~= nil and nTrees or "nil" )
  419.         file.writeLine( tostring( bEmptyLogs ) ~= nil and tostring( bEmptyLogs ) or "false" )
  420.         file.writeLine( tostring( bRefillSaplings ) ~= nil and tostring( bRefillSaplings ) or "false" )
  421.         if bEmptyLogs or bRefillSaplings then
  422.             file.writeLine( tostring( bOutput ) ~= nil and tostring( bOutput ) or "false" )
  423.             if bOutput then
  424.                 file.writeLine( textutils.serialize( tSides ) ~= nil and textutils.serialize( tSides ) or "nil" )
  425.             end --if bOutput
  426.         end --if bEmptyLogs or bRefillSaplings
  427.     end --if sHarvestMode == "farm"
  428.     file.close()
  429.    
  430. end --local function writeToFile()
  431.  
  432.  
  433.  
  434. local function createSettings()
  435.    
  436.     sHarvestMode = nil
  437.     bUseBroadcast = nil
  438.     nBroadcastID = nil
  439.     nRows = nil
  440.     nTrees = nil
  441.     bEmptyLogs = nil
  442.     bRefillSaplings = nil
  443.     bOutput = nil
  444.     tSides = {}
  445.    
  446.     clearAll( 1, 3, "Settings:" )
  447.    
  448.     local xCursorPos, yCursorPos = term.getCursorPos()
  449.     while sHarvestMode == nil do
  450.         header( "Settings:" )
  451.         term.setCursorPos( xCursorPos, yCursorPos )
  452.         term.clearLine()
  453.         write( "Harvest mode (farm/bonemeal): " )
  454.         sHarvestMode = string.lower( read() )
  455.         if sHarvestMode ~= "farm" and sHarvestMode ~= "bonemeal" then
  456.             term.clearLine()
  457.             write( "Invalid Value" )
  458.             sleep( 0.5 )
  459.             term.clearLine()
  460.             sHarvestMode = nil
  461.         end --if sHarvestMode ~= "farm" and sHarvestMode ~= "bonemeal"
  462.     end --while sHarvestMode == nil
  463.    
  464.     if not bNoBroadcast and tPeripheralType[right] ~= "modem" then
  465.        
  466.         local xCursorPos, yCursorPos = term.getCursorPos()
  467.         while bUseBroadcast == nil do
  468.             header( "Settings:" )
  469.             term.setCursorPos( xCursorPos, yCursorPos )
  470.             term.clearLine()
  471.             write( "Use Broadcast Console: " )
  472.             bUseBroadcast = read()
  473.             if bUseBroadcast == "true" or bUseBroadcast == "yes" or bUseBroadcast == "1" then
  474.                 bUseBroadcast = true
  475.             elseif bUseBroadcast == "false" or bUseBroadcast == "no" or bUseBroadcast == "0" then
  476.                 bUseBroadcast = false
  477.             else --if bUseBroadcast == "true" or bUseBroadcast == "yes" or bUseBroadcast == "1"
  478.                 term.clearLine()
  479.                 write( "Invalid Value" )
  480.                 sleep( 0.5 )
  481.                 term.clearLine()
  482.                 bUseBroadcast = nil
  483.             end --if bUseBroadcast == "true" or bUseBroadcast == "yes" or bUseBroadcast == "1"
  484.         end --while bUseBroadcast == nil
  485.        
  486.        
  487.         if bUseBroadcast then
  488.            
  489.             for _, side in pairs( rs.getSides() ) do
  490.                 rednet.open( side )
  491.             end --for _, side in pairs( rs.getSides() )
  492.            
  493.             local xCursorPos, yCursorPos = term.getCursorPos()
  494.             while nBroadcastID == nil do
  495.                 header( "Settings:" )
  496.                 rednet.broadcast( "broadcastPing" )
  497.                 local param1, param2, param3 = rednet.receive( 0.1 )
  498.                 if param2 == "broadcastPong" then
  499.                     term.setCursorPos( xCursorPos, yCursorPos + 1 )
  500.                     term.clearLine()
  501.                     write( ">Broadcast Console #" .. param1 .. " is " .. round( param3, 0 ) .. " Away" )
  502.                 else --param2 == "loggerPong"
  503.                     write( ">No Broadcast Consoles Found Nearby" )
  504.                 end --if param2 == "loggerPong"
  505.                 term.setCursorPos( xCursorPos, yCursorPos )
  506.                 term.clearLine()
  507.                 write( "Broadcast Console ID: " )
  508.                 nBroadcastID = tonumber( read() )
  509.                 if nBroadcastID == nil then
  510.                     term.clearLine()
  511.                     write( "Invalid Value" )
  512.                     sleep( 0.5 )
  513.                     term.clearLine()
  514.                 elseif nBroadcastID < 0 then
  515.                     term.clearLine()
  516.                     write( "Invalid Value" )
  517.                     sleep( 0.5 )
  518.                     term.clearLine()
  519.                     nBroadcastID = nil
  520.                 else --nBroadcastID == nil
  521.                     rednetSend( "loggerPing" )
  522.                     local id, msg, dist = rednet.receive( 0.1 )
  523.                     if msg == "loggerPong" then
  524.                         break --while nBroadcastID == nil
  525.                     else --msg == "loggerPong"
  526.                     term.clearLine()
  527.                     write( "No Response" )
  528.                     sleep( 1 )
  529.                     term.clearLine()
  530.                     nBroadcastID = nil
  531.                     end --if msg == "broadcastPong"
  532.                 end --if nBroadcastID == nil
  533.             end --while nBroadcastID == nil
  534.            
  535.         end --if bUseBroadcast
  536.        
  537.     else --not bNoBroadcast and tPeripheralType[right] ~= "modem"
  538.        
  539.         bUseBroadcast = false
  540.        
  541.     end --if not bNoBroadcast and tPeripheralType[right] ~= "modem"
  542.    
  543.     if sHarvestMode == "farm" then
  544.         local xCursorPos, yCursorPos = term.getCursorPos()
  545.         while nRows == nil do
  546.             header( "Settings:" )
  547.             term.setCursorPos( xCursorPos, yCursorPos )
  548.             term.clearLine()
  549.             write( "Number of rows: " )
  550.             nRows = tonumber( read() )
  551.             if nRows == nil then
  552.                 term.clearLine()
  553.                 write( "Invalid Value" )
  554.                 sleep( 0.5 )
  555.                 term.clearLine()
  556.             elseif nRows < 1 then
  557.                 term.clearLine()
  558.                 write( "Invalid Value" )
  559.                 sleep( 0.5 )
  560.                 term.clearLine()
  561.                 nRows = nil
  562.             end --if nRows == nil
  563.         end --while nRows == nil
  564.        
  565.         local xCursorPos, yCursorPos = term.getCursorPos()
  566.         while nTrees == nil do
  567.             header( "Settings:" )
  568.             term.setCursorPos( xCursorPos, yCursorPos )
  569.             term.clearLine()
  570.             write( "Trees per row: " )
  571.             nTrees = tonumber( read() )
  572.             if nTrees == nil then
  573.                 term.clearLine()
  574.                 write( "Invalid Value" )
  575.                 sleep( 0.5 )
  576.                 term.clearLine()
  577.             elseif nTrees < 1 then
  578.                 term.clearLine()
  579.                 write( "Invalid Value" )
  580.                 sleep( 0.5 )
  581.                 term.clearLine()
  582.                 nTrees = nil
  583.             end --if nTrees == nil
  584.         end --while nTrees == nil
  585.        
  586.         local xCursorPos, yCursorPos = term.getCursorPos()
  587.         while bEmptyLogs == nil do
  588.             header( "Settings:" )
  589.             term.setCursorPos( xCursorPos, yCursorPos )
  590.             term.clearLine()
  591.             write( "Wait for emptied logs: " )
  592.             bEmptyLogs = read()
  593.             if bEmptyLogs == "true" or bEmptyLogs == "yes" or bEmptyLogs == "1" then
  594.                 bEmptyLogs = true
  595.             elseif bEmptyLogs == "false" or bEmptyLogs == "no" or bEmptyLogs == "0" then
  596.                 bEmptyLogs = false
  597.             else --if bEmptyLogs == "true" or bEmptyLogs == "yes" or bEmptyLogs == "1"
  598.                 term.clearLine()
  599.                 write( "Invalid Value" )
  600.                 sleep( 0.5 )
  601.                 term.clearLine()
  602.                 bEmptyLogs = nil
  603.             end --if bEmptyLogs == "true" or bEmptyLogs == "yes" or bEmptyLogs == "1"
  604.         end --while bEmptyLogs == nil
  605.        
  606.         local xCursorPos, yCursorPos = term.getCursorPos()
  607.         while bRefillSaplings == nil do
  608.             header( "Settings:" )
  609.             term.setCursorPos( xCursorPos, yCursorPos )
  610.             term.clearLine()
  611.             write( "Wait for full saplings: " )
  612.             bRefillSaplings = read()
  613.             if bRefillSaplings == "true" or bRefillSaplings == "yes" or bRefillSaplings == "1" then
  614.                 bRefillSaplings = true
  615.             elseif bRefillSaplings == "false" or bRefillSaplings == "no" or bRefillSaplings == "0" then
  616.                 bRefillSaplings = false
  617.             else --if bRefillSaplings == "true" or bRefillSaplings == "yes" or bRefillSaplings == "1"
  618.                 term.clearLine()
  619.                 write( "Invalid Value" )
  620.                 sleep( 0.5 )
  621.                 term.clearLine()
  622.                 bRefillSaplings = nil
  623.             end --if bRefillSaplings == "true" or bRefillSaplings == "yes" or bRefillSaplings == "1"
  624.         end --while bRefillSaplings == nil
  625.        
  626.         if bEmptyLogs or bRefillSaplings then
  627.             local xCursorPos, yCursorPos = term.getCursorPos()
  628.             while bOutput == nil do
  629.                 header( "Settings:" )
  630.                 term.setCursorPos( xCursorPos, yCursorPos )
  631.                 term.clearLine()
  632.                 write( "Output redstone after cycle: " )
  633.                 bOutput = read()
  634.                 if bOutput == "true" or bOutput == "yes" or bOutput == "1" then
  635.                     bOutput = true
  636.                 elseif bOutput == "false" or bOutput == "no" or bOutput == "0" then
  637.                     bOutput = false
  638.                 else --if bOutput == "true" or bOutput == "yes" or bOutput == "1"
  639.                     term.clearLine()
  640.                     write( "Invalid Value" )
  641.                     sleep( 0.5 )
  642.                     term.clearLine()
  643.                     bOutput = nil
  644.                 end --if bOutput == "true" or bOutput == "yes" or bOutput == "1"
  645.             end --while bOutput == nil
  646.         end --if bEmptyLogs or bRebillSaplings
  647.        
  648.         if bOutput then
  649.             for _, side in ipairs( rs.getSides() ) do
  650.                 if tPeripheralType[side] ~= "modem" and tPeripheralType[side] ~= "workbench" then
  651.                     local xCursorPos, yCursorPos = term.getCursorPos()
  652.                     term.setCursorPos( xCursorPos, yCursorPos )
  653.                     term.clearLine()
  654.                     while tSides[side] == nil do
  655.                         header( "Settings:" )
  656.                         term.setCursorPos( xCursorPos, yCursorPos )
  657.                         term.clearLine()
  658.                         write( "Output on " .. side .. " side: " )
  659.                         tSides[side] = read()
  660.                         if tSides[side] == "true" or tSides[side] == "yes" or tSides[side] == "1" then
  661.                             tSides[side] = true
  662.                         elseif tSides[side] == "false" or tSides[side] == "no" or tSides[side] == "0" then
  663.                             tSides[side] = false
  664.                         else --if tSides[side] == "true" or tSides[side] == "yes" or tSides[side] == "1"
  665.                             term.clearLine()
  666.                             write( "Invalid Value" )
  667.                             sleep( 0.5 )
  668.                             term.clearLine()
  669.                             tSides[side] = nil
  670.                         end --if tSides[side] == "true" or tSides[side] == "yes" or tSides[side] == "1"
  671.                     end --while tSides[side] == nil
  672.                 end --if tPeripheralType[side] ~= "modem" and tPeripheralType[side] ~= "workbench"
  673.             end --for i, side in ipairs( rs.getSides() )
  674.         end --if bOutput
  675.        
  676.        
  677.     end --if sHarvestMode == "farm"
  678.    
  679.     writeToFile()
  680.    
  681.     clearAll()
  682.    
  683. end --local function createSettings()
  684.  
  685.  
  686.  
  687. local function saplingCheck()
  688.    
  689.     if not bLowSaplings and turtle.getItemCount( 1 ) < ( nRows * nTrees > 32 and 32 or ( nRows * nTrees < 9 and 9 or nRows * nTrees ) ) and turtle.getItemCount( 1 ) ~= 0 then
  690.         bLowSaplings = true
  691.         rednetSend( "loggerLowSaplings" )
  692.     end --if not bLowSaplings and turtle.getItemCount( 1 ) < ( nRows * nTrees > 32 and 32 or ( nRows * nTrees < 9 and 9 or nRows * nTrees ) ) and turtle.getItemCount( 1 ) ~= 0
  693.    
  694.     if not bNoSaplings and turtle.getItemSpace( 1 ) == 64 then
  695.         bNoSaplings = true
  696.         rednetSend( "loggerNoSaplings" )
  697.     end --if not bNoSaplings and turtle.getItemSpace( 1 ) == 64
  698.    
  699. end --local function saplingCheck()
  700.  
  701.  
  702.  
  703. local function output( _sState )
  704.    
  705.     if _sState == "on" then
  706.         if bRefillSaplings or bEmptyLogs then
  707.             for side, _ in pairs( tSides ) do
  708.                 if tSides[side] then
  709.                     rs.setOutput( side, true )
  710.                 end --if tSides[side]
  711.             end --for side, _ in ipairs( tSides )
  712.         end --if bRefillSaplings or bEmptyLogs then
  713.     elseif _sState == "off" then
  714.         for side, _ in pairs( tSides ) do
  715.             if tSides[side] then
  716.                 rs.setOutput( side, true )
  717.             end --if tSides[side]
  718.         end --for side, _ in ipairs( tSides )
  719.     end --if _sState
  720.    
  721. end --local function output( _sState )
  722.  
  723.  
  724.  
  725. local function emptyLogs()
  726.    
  727.     local slotCheck = bNoSaplings
  728.    
  729.     while true do
  730.        
  731.         for i = 2, 15 do
  732.             if turtle.getItemSpace( 1 ) == 64 then
  733.                 slotCheck = false
  734.             end --if turtle.getItemSpace( 1 ) == 64
  735.             i = i == 2 and ( slotCheck and 1 or 3 ) or i
  736.             if turtle.getItemSpace( i ) ~= 64 then
  737.                 break --for i = 3, 15
  738.             else --turtle.getItemCount( i ) ~= 64
  739.                 if i == 15 then
  740.                     return true
  741.                 end --if i == 15
  742.             end --if turtle.getItemSpace( i ) ~= 64
  743.         end --for i = 3, 15
  744.        
  745.         sleep( 0.01 )
  746.        
  747.     end --while true
  748.    
  749. end --local function emptyLogs()
  750.  
  751.  
  752.  
  753. local function refillSaplings()
  754.    
  755.     while true do
  756.        
  757.         if turtle.getItemSpace( 1 ) == 0 then
  758.             return true
  759.         end --if turtle.getItemSpace == 0
  760.        
  761.         sleep( 0.01 )
  762.        
  763.     end --while true
  764.    
  765. end --local function refillSaplings()
  766.  
  767.  
  768.  
  769. local function plantTree()
  770.     if bDebug then
  771.         print( "plantTree" )
  772.     end --if bDebug
  773.    
  774.     saplingCheck()
  775.    
  776.     if not bNoSaplings and not turtle.compareDown() then
  777.         if not turtle.detectDown() then
  778.             select( 1 )
  779.             if not turtle.placeDown() then
  780.                 move( "down", 1, select() )
  781.                 select( 2 )
  782.                 turtle.placeDown()
  783.                 move( "up", 1, select() )
  784.                 select( 1 )
  785.                 turtle.placeDown()
  786.             end --if not turtle.placeDown()
  787.         end --if not turtle.detectDown()
  788.     end --if not bNoSaplings and not turtle.compareDown()
  789.    
  790.     saplingCheck()
  791.    
  792. end --local function plantTree()
  793.  
  794.  
  795.  
  796. local function harvestTree()
  797.     if bDebug then
  798.         print( "harvestTree" )
  799.     end --if bDebug
  800.    
  801.     move( "forward", 1, 3 )
  802.     if turtle.compareDown() then
  803.         dig( "down" )
  804.     end --if turtle.compareDown()
  805.    
  806.     bar = foo
  807.     foo = 0
  808.    
  809.     while turtle.compareUp() do
  810.        
  811.         move( "up", 1, 3 )
  812.         foo = foo + 1
  813.         if foo == 20 then
  814.             break --while true
  815.         end --if foo == 20
  816.        
  817.     end --while turtle.compareUp() do
  818.    
  819.     for i = 1, foo do
  820.        
  821.         move( "down", 1, 1 )
  822.        
  823.     end --for i = 1, foo
  824.    
  825.     foo = bar
  826.     bar = nil
  827.    
  828.     plantTree()
  829.    
  830. end --local function harvestTree()
  831.  
  832.  
  833.  
  834. local function checkTree()
  835.     if bDebug then
  836.         print( "checkTree" )
  837.     end --if bDebug
  838.    
  839.     if turtle.getItemSpace( 3 ) < 64 then
  840.        
  841.         select( 3 )
  842.        
  843.         if turtle.compare() then
  844.             harvestTree()
  845.         else --turtle.compare()
  846.             move( "forward", 1, 1 )
  847.             plantTree()
  848.         end --if turtle.compare()
  849.        
  850.     else --turtle.getItemSpace( 3 ) < 64
  851.        
  852.         if turtle.detect() then
  853.             harvestTree()
  854.         else --turtle.detect()
  855.             move( "forward", 1, 1 )
  856.             plantTree()
  857.         end --if turtle.detect()
  858.        
  859.     end --if turtle.getItemSpace < 64
  860.    
  861.     nTreesremaining = nTreesremaining - 1
  862.     header()
  863.     local xCursorPos, yCursorPos = term.getCursorPos()
  864.     term.setCursorPos( 1, 3 )
  865.     term.clearLine()
  866.     write( "Harvesting " .. nRows .. "x" .. nTrees .. ". " .. nTreesremaining .. ( nTreesremaining == 1 and " tree" or " trees" ) .. " remaining." )
  867.     term.setCursorPos( xCursorPos, yCursorPos )
  868.    
  869. end --local function checkTree()
  870.  
  871.  
  872.  
  873. local function harvest( _sHarvestMode )
  874.     if bDebug then
  875.         print( "harvest" )
  876.     end --if bDebug
  877.    
  878.     if _sHarvestMode == "farm" then
  879.        
  880.         bLowSaplings = false
  881.         bNoSaplings = false
  882.        
  883.         saplingCheck()
  884.        
  885.         nTreesremaining = nRows * nTrees
  886.        
  887.         if bUseFuel then
  888.             while turtle.getFuelLevel() < ( ( nTreesremaining ) * 3 ) + ( nRows % 2 == 1 and ( nTrees * 3 ) or 1 ) + ( nRows * 3 ) - 2 do
  889.                
  890.                 if turtle.getItemSpace( 16 ) ~= 64 then
  891.                     select( 16 )
  892.                 else --turtle.getItemSpace( 16 ) ~= 64
  893.                     for i = 3, 15 do
  894.                         if turtle.getItemSpace( i ) ~= 64 then
  895.                             turtle.select( i )
  896.                             break --for i = 3, 15
  897.                         end --if turtle.getItemSpace( i ) ~= 64
  898.                         if i == 15 then
  899.                             print( "Need " .. ( ( ( nTreesremaining ) * 3 ) + ( nRows % 2 == 1 and ( nTrees * 3 ) or 1 ) + ( nRows * 3 ) - 2 ) - turtle.getFuelLevel() .. " more fuel." )
  900.                             sleep( 2 )
  901.                             return
  902.                         end --if i == 15
  903.                     end --for i = 3, 15
  904.                 end --if turtle.getItemSpace( 16 ) ~= 64
  905.                 turtle.refuel( 1 )
  906.                
  907.             end --while turtle.getFuelLevel() < ( ( nTreesremaining ) * 3 ) + ( nRows % 2 == 1 and ( nTrees * 3 ) or 1 ) + ( nRows * 3 ) - 2
  908.         end --if bUseFuel
  909.        
  910.         if turtle.getItemCount( 1 ) < nTreesremaining then         
  911.             rednetSend( "loggerLowSaplings" )          
  912.         end --if turtle.getItemCount( 1 ) < nTreesremaining
  913.        
  914.        
  915.         clearAll()
  916.         print( "Harvesting " .. nRows .. "x" .. nTrees .. ". " .. nTreesremaining .. ( nTreesremaining == 1 and " tree" or " trees" ) .. " remaining." )
  917.        
  918.         move( "up", 1, 1 )
  919.         checkTree()
  920.        
  921.         for i = 1, nRows do
  922.            
  923.             for i = 1, nTrees do
  924.                
  925.                 if i ~= nTrees then
  926.                    
  927.                     move( "forward", 2, 1 )
  928.                     checkTree()
  929.                    
  930.                 end --if i ~= nTrees
  931.                
  932.             end --for i = 1, nTrees
  933.            
  934.             if i ~= nRows then
  935.                 move( i % 2 == 0 and "right" or "left", 2, 1 )
  936.                 checkTree()
  937.                 move( i % 2 == 0 and "right" or "left", 0, 1 )
  938.             end --if i ~= nRows
  939.            
  940.         end --for i = 1, nRows
  941.        
  942.         if nRows % 2 == 0 then 
  943.             move( "forward", 1, 1 )
  944.             move( "left", 0, 1 )
  945.         else --nRows % 2 == 0                  
  946.             move( "left", 1, 1 )
  947.             move( "left", 0, 1 )
  948.             move( "forward", ( nTrees * 3 ) - 2, 1 )
  949.             move( "left", 1, 1 )
  950.         end --if nRows % 2 == 0
  951.        
  952.         if nRows ~= 1 then
  953.             move( "forward", ( nRows * 3 ) - 3, 1 )
  954.         end --if nRows ~= 1
  955.        
  956.         move( "left", 0, 1 )           
  957.         move( "down", 1, 1 )
  958.        
  959.         output( "on" )
  960.         if bEmptyLogs then
  961.             if bRefillSaplings then
  962.                 parallel.waitForAll( emptyLogs, refillSaplings )
  963.             end --if bRefillSaplings
  964.             parallel.waitForAll( emptyLogs )
  965.         else --bEmptyLogs
  966.             if bRefillSaplings then
  967.                 parallel.waitForAll( refillSaplings )
  968.             end --if bRefillSaplings
  969.         end --if bEmptyLogs
  970.         output( "off" )
  971.        
  972.        
  973.     elseif _sHarvestMode == "bonemeal" then
  974.        
  975.         while true do
  976.            
  977.             if not bKeyLog then
  978.                
  979.                 clearAll()
  980.                 print( "Press Any Key to Stop Logging" )
  981.                
  982.                 if turtle.getItemSpace( 1 ) ~= 64 and turtle.getItemSpace( 2 ) ~= 64 then
  983.                    
  984.                     select( 1 )
  985.                     if not turtle.compare() then
  986.                         while not turtle.place() do
  987.                             turtle.dig()
  988.                         end --while not turtle.place()
  989.                     end --if turtle.compare()
  990.                    
  991.                     select( 2 )
  992.                     if not turtle.place() then
  993.                         print( "Need bonemeal in slot 2" )
  994.                         sleep( 1 )
  995.                         return
  996.                     end --if not turtle.place()
  997.                    
  998.                     move( "forward", 1, 3 )
  999.                    
  1000.                     bar = foo
  1001.                     foo = 1
  1002.                    
  1003.                     while turtle.compareUp() do
  1004.                        
  1005.                         move( "up", 1, 3 )
  1006.                         foo = foo + 1
  1007.                         if foo == 20 then
  1008.                             break --while turtle.compareUp()
  1009.                         end --if foo == 20
  1010.                        
  1011.                     end --while turtle.compareUp()
  1012.                    
  1013.                     for i = 1, foo do
  1014.                         if i ~= foo then
  1015.                             move( "down", 1, 3 )
  1016.                         end --if i ~= foo
  1017.                     end --for i = 1, foo
  1018.                    
  1019.                     foo = bar
  1020.                     bar = nil
  1021.                    
  1022.                     move( "back", 1, 3 )
  1023.                    
  1024.                    
  1025.                 else --if turtle.getItemSpace( 1 ) ~= 64 and turtle.getItemSpace( 2 ) ~= 64
  1026.                    
  1027.                     term.setCursorPos( 1, 3 )
  1028.                     term.clearLine()
  1029.                    
  1030.                     if turtle.getItemSpace( 1 ) == 64 then
  1031.                         print( "Need saplings in slot 1" )
  1032.                     end --if turtle.getItemSpace( 1 ) == 64
  1033.                    
  1034.                     if turtle.getItemSpace( 2 ) == 64 then
  1035.                         print( "Need bonemeal in slot 2" )
  1036.                     end --if turtle.getItemSpace( 1 ) == 64
  1037.                    
  1038.                     sleep( 2 )
  1039.                     return
  1040.                    
  1041.                 end --if turtle.getItemSpace( 1 ) ~= 64 and turtle.getItemSpace( 2 ) ~= 64
  1042.                
  1043.             else --not keyLog
  1044.                
  1045.                 break --while true
  1046.                
  1047.             end --if not bKeyLog
  1048.            
  1049.         end --while true
  1050.        
  1051.     end --if _sHarvestMode == "farm"
  1052.    
  1053. end --local function harvest( _sHarvestMode, nRows, nTrees )
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061. --[[MAIN METHOD]]
  1062.  
  1063.  
  1064. while true do
  1065.    
  1066.     if not loadSettings() then
  1067.         createSettings()
  1068.     end --if not LoadSettings()
  1069.    
  1070.     rednet.open( "right" )
  1071.     baz = bUseBroadcast
  1072.    
  1073.     while true do
  1074.         if baz then
  1075.             clearAll( 1, 3, "Anonomit Tree Farmer #" .. os.computerID(), 5 )
  1076.         else --baz
  1077.             clearAll()
  1078.         end --if baz
  1079.         baz = bUseBroadcast
  1080.         print( "Press 'r' to begin logging" )
  1081.         print( "Press 's' to recreate settings" )
  1082.             if bUseBroadcast then
  1083.                 print( "Press 'c' to clear broadcast console" )
  1084.             end --if bUseBroadcast
  1085.        
  1086.         local event, param1, param2, param3 = os.pullEvent()
  1087.         if event == "char" and param1 == "r" then
  1088.             rednetSend( "loggerLogging" )
  1089.             if sHarvestMode == "farm" then
  1090.                 harvest( sHarvestMode )
  1091.             elseif sHarvestMode == "bonemeal" then
  1092.                 parallel.waitForAny( function() harvest( sHarvestMode ) end, keyLog )
  1093.             end --if sHarvestMode == "farm"
  1094.             rednetSend( "loggerDoneLogging" )
  1095.             print( "Press 'r' to begin logging" )
  1096.             print( "Press 's' to recreate settings" )
  1097.             if bUseBroadcast then
  1098.                 print( "Press 'c' to clear broadcast console" )
  1099.             end --if bUseBroadcast
  1100.         elseif bUseBroadcast and param1 == nBroadcastID and event == "rednet_message" and param2 == "loggerStartLogging" then
  1101.             rednetSend( "loggerLogging" )
  1102.             if sHarvestMode == "farm" then
  1103.                 harvest( sHarvestMode )
  1104.             elseif sHarvestMode == "bonemeal" then
  1105.                 parallel.waitForAny( function() harvest( sHarvestMode ) end, keyLog )
  1106.             end --if sHarvestMode == "farm"
  1107.             rednetSend( "loggerDoneLogging" )
  1108.             print( "Press 'r' to begin logging" )
  1109.             print( "Press 's' to recreate settings" )
  1110.         elseif event == "char" and param1 == "s" then
  1111.             createSettings()
  1112.             break --while true
  1113.         elseif event == "char" and param1 == "c" then
  1114.             rednetSend( "loggerForget" )
  1115.             local id, msg, dist = rednet.receive( 0.1 )
  1116.             if id == nBroadcastID and msg == "loggerForgot" then
  1117.                 local xCursorPos, yCursorPos = term.getCursorPos()
  1118.                 term.setCursorPos( 1, yCursorPos - 1 )
  1119.                 term.clearLine()
  1120.                 print( "Cleared from Broadcast Console" )
  1121.                 bUseBroadcast = false
  1122.                 writeToFile()
  1123.             else --id == nBroadcastID and msg == "loggerForgot"
  1124.                 local xCursorPos, yCursorPos = term.getCursorPos()
  1125.                 term.setCursorPos( 1, yCursorPos - 1 )
  1126.                 term.clearLine()
  1127.                 print( "No Response" )
  1128.                 sleep( 0.5 )
  1129.             end --if id == nBroadcastID and msg == "loggerForgot"
  1130.         end --if event == "char" and param1 == "r"
  1131.     end --while true
  1132.    
  1133. end --while true
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement