Inksaver

selfReplicate.lua

Dec 27th, 2014
926
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 150.32 KB | None | 0 0
  1. -- selfReplicate.lua
  2. -- Using CC 1.65 to 1.79 on Minecraft 1.7.10 and 1.8.9
  3. -- Takes advantage of turtle.inspect() and turtle.getItemDetail()
  4. -- pastebin http://pastebin.com/2Krm3Yva
  5. -- multiline comments not used as Pastebin trashes the appearance of the code!
  6. -- functions in alphabetical order except main()
  7. -- classes declared after functions
  8. -- CraftOS 1.6 names: (altered in main() if using CraftOS 1.7)
  9. ccComputer = "ComputerCraft:CC-Computer"
  10. ccDisk = "ComputerCraft:disk"
  11. ccTurtle = "ComputerCraft:CC-Turtle"
  12. ccCraftyMiningTurtle = "ComputerCraft:CC-TurtleExpanded"
  13. ccDiskDrive = "ComputerCraft:CC-Peripheral"
  14.  
  15. function checkTreeFarm()
  16.     -- will only be called if bucket already onboard
  17.     -- do not bother if no saplings
  18.     if not treeFarm:getPondFilled() then --pond not filled yet
  19.         fillPond() -- use iron ore from creating mine for bucket, fill pond with water
  20.     end
  21.     if treeFarm:getPondFilled() then --pond filled
  22.         if not treeFarm:getFarmCreated() then --treefarm not yet made
  23.             clearTreeFarm() -- clear 11 x 10 area to right of base and plant 4 saplings
  24.         end
  25.         if treeFarm:getFarmCreated() then -- treefarm built
  26.             if not treeFarm:getHopperPlaced() then --hopper not yet built
  27.                 craftHopper()
  28.             end
  29.         end
  30.         if treeFarm:getFarmCreated() and treeFarm:getHopperPlaced() then --treefarm built, hopper placed
  31.             if not treeFarm:getFarmFlooded() then
  32.                 floodTreeFarm()     -- Use bucket and pond to flood tree farm base ready for sapling collection
  33.             end
  34.         end
  35.     end
  36. end
  37.  
  38. function checkWaterCoordsOK(x,z)
  39.     local result = true
  40.     --  0 = go south (z increases)
  41.     --  1 = go west  (x decreases)
  42.     --  2 = go north (z decreases
  43.     --  3 = go east  (x increases)
  44.     -- check if water coords are within storage placement area 
  45.     if coordHome:getFacing() == 0 then
  46.         --zCoord = zCoord + 1
  47.         if coordHome:getZ() + z > coordHome:getZ() then --in same direction. Check x+1,x-1
  48.             if coordHome:getX() == x or coordHome:getX() + 1 == x or coordHome:getX() - 1 == x then
  49.                 result = false
  50.             end
  51.         end
  52.     elseif coordHome:getFacing() == 1 then
  53.         --xCoord = xCoord - 1
  54.         if coordHome:getX() + x < coordHome:getX() then --in same direction. Check z+1,z-1
  55.             if coordHome:getZ() == z or coordHome:getZ() + 1 == z or coordHome:getZ() - 1 == z then
  56.                 result = false
  57.             end
  58.         end
  59.     elseif coordHome:getFacing() == 2 then
  60.         --zCoord = zCoord - 1
  61.         if coordHome:getZ() + z < coordHome:getZ() then --in same direction. Check x+1,x-1
  62.             if coordHome:getX() == x or coordHome:getX() + 1 == x or coordHome:getX() - 1 == x then
  63.                 result = false
  64.             end
  65.         end
  66.     else
  67.         --xCoord = xCoord + 1
  68.         if coordHome:getX() + x > coordHome:getX() then --in same direction. Check z+1,z-1
  69.             if coordHome:getZ() == z or coordHome:getZ() + 1 == z or coordHome:getZ() - 1 == z then
  70.                 result = false
  71.             end
  72.         end
  73.     end
  74.    
  75.     return result
  76. end
  77.  
  78. function clearBase()
  79.     local goUp = 0
  80.     saveToLog("clearBase() Starting...", true)
  81.     emptyAfterHarvest() --empty trash
  82.     --clear area around first tree 5 X 5 square
  83.     --craft furnace
  84.     T:craft("minecraft:furnace", 1, "minecraft:cobblestone", nil, nil, false)
  85.     T:go("FuxCL")
  86.     for i = 1, 3 do
  87.         T:go("Fu*")
  88.     end
  89.     T:go("Fu*L")
  90.     for i = 1, 2 do
  91.         T:go("Fu*")
  92.     end
  93.     T:go("Fu*L")
  94.     for i = 1, 5 do
  95.         T:go("Fu*")
  96.     end
  97.     T:go("Fu*L Fu*")
  98.     T:go("Fu*DDxCUU")
  99.     T:go("Fu*L Fu*L FuxC FuxCR")
  100.     T:go("FuxC FuxC")
  101.     T:go("FuDxC FuxCR FuxCR FuxC")
  102.     T:go("FuxCUxCFL")
  103.     --put furnace above
  104.     turtle.select(T:getItemSlot("minecraft:furnace"))
  105.     turtle.placeUp()
  106.     saveToLog("clearBase() Completed. Saving Status '4'", true)
  107.     saveStatus("4")
  108. end
  109.  
  110. function clearTreeFarm()
  111.     local stockData = {}
  112.     stockData = T:getStock("minecraft:log")
  113.     local numLogs = stockData.count
  114.     stockData = T:getStock("minecraft:torch")
  115.     local numTorches = stockData.count
  116.     local torchesNeeded = 10 - numTorches
  117.    
  118.     -- turtle class .go() function
  119.     -- R L F B U D + - = Right, Left, Forward, Back, Up, Down, up while detect, down while not detect
  120.     -- d u x M N O Q = dIG, DIGuP, x-cavate (digDown), mineItem "up" and close with cobble, digUp if valuable and close, digDown if valuable and close, digDown if valuable
  121.     -- c h k C H r S T P = cHECK/ChECK/CHECk place Cobble down/forward/up if no block, place cobblestone/dirt, cHest, Sapling, Torch, DIrT, hoPper
  122.     saveToLog("clearTreeFarm() starting")
  123.     --clear farm area
  124.     treeFarm:reset()
  125.     T:sortInventory()
  126.     if torchesNeeded < 0 then
  127.         torchesNeeded = 0
  128.     else
  129.         if numLogs > 4 then
  130.             craftTorches(8) -- craft 6 torches for tree farm
  131.         end
  132.     end
  133.     emptyTurtle(true)
  134.     -- get saplings
  135.     T:go("RFFDRR")
  136.     while turtle.suckDown() do end
  137.     stockData = T:getStock("minecraft:sapling")
  138.     if stockData.count > 0 then
  139.         T:go("UFFR")
  140.         --get cobble/dirt
  141.         T:go("FFFFRR")
  142.         while turtle.suckDown() do end
  143.         T:go("FFFFRR")
  144.         T:go("RFFLU") -- on water enclosure wall
  145.         -- build outer wall
  146.         for i = 1, 9 do     --|
  147.             T:go("xC+-F")   --|
  148.         end --col 1, row 1  --|
  149.         T:turnRight(1)
  150.         for i = 1, 9 do     --_________
  151.             T:go("xC+-F")
  152.         end --col 10, row 1
  153.         T:turnRight(1)
  154.         for i = 1, 10 do    --|
  155.             T:go("xC+-F")   --|
  156.         end --col 10, row 19--|
  157.         T:turnRight(1)
  158.         for i = 1, 9 do     --_________
  159.             T:go("xC+-F")
  160.         end --col 1, row 19
  161.         T:turnRight(1)
  162.         T:go("xC+-F")
  163.         --clear ground within outer wall
  164.         T:go("RFDL")
  165.         for i = 1, 8 do
  166.             T:go("c+-F")
  167.         end -- col 2, row 2
  168.         T:turnRight(1)
  169.         for j = 1, 4 do
  170.             for i = 1, 7 do
  171.                 T:go("c+-F")
  172.             end
  173.             T:go("Rc+-FR")
  174.             for i = 1, 7 do
  175.                 T:go("c+-F")
  176.             end
  177.             T:go("Lc+-FL")
  178.         end
  179.         for i = 1, 7 do
  180.             T:go("c+-F")
  181.         end -- col 9, row 9 on right side of farm
  182.         -- channel across end of farm
  183.         T:go("c+-LD") -- stay at bottom end
  184.         T:go("RdCRhRhxC FxCLhR FxCLhR FxCLhR FxCLhR FxCLhR FxCLhR FxCLhR FudCRR FFF ULFFF") --on top of bottom wall left
  185.         --place dirt and torches
  186.         for i = 1, 4 do
  187.             T:go("rBuTFFFFR") --place dirt, Back, digUp, place Torch, forward 3,  turn right
  188.         end
  189.         T:go("BBUUUFF") --dodge torch on first block
  190.         T:go("xS FFFSR FFFSR FFFS FFFDDDR FFFF FFFFR")
  191.         treeFarm:setFarmCreated(true)
  192.         treeFarm:setTimePlanted(os.time())
  193.         saveStatus("treeFarm")
  194.         emptyTurtle(false)
  195.     else -- no saplings abandon tree farm
  196.         T:go("UFFR")
  197.         saveToLog("No saplings: treeFarm abandoned")
  198.     end
  199.    
  200. end
  201.  
  202. function completeMining(status)
  203.     local level = 14
  204.     local woodNeeded = 0
  205.     stockData = {}
  206.    
  207.     if status == 8 then
  208.         level = 14
  209.     elseif status == 9 then
  210.         level = 11
  211.     elseif status == 10 then
  212.         level = 8
  213.     end
  214.     saveToLog("completeMining() Starting level "..level, true)
  215.     emptyTurtle(false)
  216.     checkTreeFarm()
  217.    
  218.     repeat --start at level 14, then 11, and finally 8
  219.         if T:getFuelStock() + turtle.getFuelLevel() < 1500 then
  220.             woodNeeded = math.ceil((1500 - T:getFuelStock() - turtle.getFuelLevel()) / 60 )
  221.             saveToLog("logs needed = "..woodNeeded.." Waiting for tree farm")
  222.             waitForTreeFarm(woodNeeded)
  223.         end
  224.         goMining(level)
  225.         level = level - 3
  226.         emptyTurtle(false)
  227.         checkTreeFarm()
  228.         if level < 8 then
  229.             break
  230.         end
  231.         stockData = T:getStock("minecraft:diamond")
  232.         if level == 14 then
  233.             saveToLog("completeMining() level 14 complete. Saving Status '9'", true)
  234.             saveStatus("9")
  235.         elseif level == 11 then
  236.             saveToLog("completeMining() level 11 complete. Saving Status '10'", true)
  237.             saveStatus("10")
  238.         elseif level == 8 then
  239.             saveToLog("completeMining() level 8 complete. Saving Status '11'", true)
  240.             saveStatus("11")
  241.         end
  242.     until stockData.count >= 6
  243.     --all simple areas mined out or >7 diamonds found. turtle back at furnace
  244. end
  245.  
  246. function craftHopper()
  247.     local doContinue = false
  248.     local stockData = {}
  249.    
  250.     saveToLog("craftHopper() started")
  251.     stockData = T:getStock("minecraft:iron_ore")
  252.     if stockData.count >= 5 then
  253.         stockData = T:getStock("minecraft:chest")
  254.         if stockData.count < 2 then
  255.             if T:craftChests(1, false) >= 1 then
  256.                 doContinue = true
  257.             end
  258.         end
  259.         if doContinue then --chests x 1 available
  260.             doContinue = false
  261.             if smelt("minecraft:iron_ore", 5) then
  262.                doContinue = true
  263.             end
  264.         end
  265.         if doContinue then -- chests x 1, and iron x 5 available
  266.             doContinue = false
  267.             if T:craft("minecraft:hopper", 1, "minecraft:iron_ingot", "minecraft:chest", nil, false) then
  268.                 doContinue = true  
  269.             end
  270.         end
  271.         if doContinue then -- hopper available
  272.             T:go("RFFFFRRDDd")
  273.             turtle.select(T:getItemSlot("minecraft:hopper"))
  274.             turtle.place()
  275.             T:go("UxCUFFFFR")
  276.             treeFarm:setHopperPlaced(true)
  277.             saveStatus("treeFarm")
  278.         end
  279.     end
  280.     saveToLog("craftHopper() completed")
  281.     return doContinue
  282. end
  283.  
  284. function craftMiningTurtle(numTurtles)
  285.     local itemSlot = 0
  286.     local keepNum = 0
  287.     local logType = "minecraft:log"
  288.     local logsNeeded = 0
  289.     local numSticks = 0
  290.     local sticksNeeded = 0
  291.     local startFile = ""
  292.     local itemInStock = 0
  293.     local maxItemSlot = 0
  294.     local minItemSlot = 0
  295.     local stockData = {}
  296.     local doContinue = false
  297.    
  298.     -- chest1 = sticks
  299.     -- chest2 = logs (oak/birch/jungle etc)
  300.     -- chest3 = cobblestone, dirt
  301.     -- chest4 = sand
  302.     -- chest5 = iron_ore
  303.     -- chest6 = redstone
  304.     -- chest7 = diamond
  305.     -- chest8 = gold_ore, lapis, mossy_cobblestone, obsidian
  306.     -- chest9 = saplings (oak/birch,jungle)
  307.    
  308.     -- Logs for Items needed:
  309.     --                      1 turtle        2 turtles
  310.     --          6 sand      2 logs          2 logs
  311.     -- disk dr: 7 cobble    2 logs          2 logs
  312.     -- turtle:  7 cobble    2 logs          4 logs
  313.     -- ironore: 7 iron ore  2 logs          4 logs
  314.     -- crafting:            1 log           2 logs
  315.     -- chests:              2 logs          4 logs
  316.     -- pickaxe:             1 log           1 log
  317.     --                  Min 13 wood     Max 21 wood
  318.     saveToLog("craftMiningTurtle() started")
  319.     -- start under furnace / over chest1
  320.     if numTurtles == 0 then
  321.         term.clear()
  322.         saveToLog("Not enough diamonds in this area.\nMission has failed", true)
  323.         error()
  324.     elseif numTurtles == 1 then -- 0 - 2 diamonds + pickaxe
  325.         sticksNeeded = 2
  326.         logsNeeded = 20
  327.     elseif numTurtles == 2 then
  328.         sticksNeeded = 4
  329.         logsNeeded = 28
  330.     end
  331.    
  332.     T:sortInventory()
  333.     T:refuel(60)
  334.     --empty turtle into correct storage
  335.     dropItem("minecraft:stick", 0)
  336.     T:forward(2) -- logs
  337.     dropItem("minecraft:log", 0)
  338.     dropItem("minecraft:log2", 0)
  339.     T:forward(2) --dirt cobble
  340.     dropItem("minecraft:cobblestone", 0)
  341.     dropItem("minecraft:dirt", 0)
  342.     T:forward(2) --sand reeds
  343.     dropItem("minecraft:sand", 0)
  344.     T:forward(2) --iron ore
  345.     dropItem("minecraft:iron_ore", 0)
  346.     dropItem("minecraft:bucket", 0)
  347.     T:forward(2) --redstone
  348.     dropItem("minecraft:redstone", 0)
  349.     T:forward(2) -- diamond
  350.     dropItem("minecraft:diamond", 0)
  351.     T:forward(2)
  352.     for i = 1, 16 do
  353.         if turtle.getItemCount(i) > 0 then
  354.             if T:getItemName(i) ~= "minecraft:chest" then
  355.                 dropItem(T:getItemName(i))
  356.             end
  357.         end
  358.     end
  359.    
  360.     -- only chest(s) left behind in turtle
  361.     itemSlot = T:getItemSlot("minecraft:chest")
  362.     if itemSlot ~= 1 then
  363.         turtle.select(itemSlot)
  364.         turtle.transferTo(1)
  365.     end
  366.     -- go back and remove supplies
  367.     T:go("RRFF") -- diamonds
  368.     turtle.select(1)
  369.     turtle.suckDown()
  370.     itemSlot = T:getItemSlot("minecraft:diamond")
  371.     keepNum = numTurtles * 3
  372.     turtle.select(itemSlot)
  373.     if turtle.getItemCount(itemSlot) > keepNum then
  374.         turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  375.     end
  376.    
  377.     T:forward(2) --redstone
  378.     turtle.select(1)
  379.     turtle.suckDown()
  380.     itemSlot = T:getItemSlot("minecraft:redstone")
  381.     keepNum = numTurtles + 3
  382.     turtle.select(itemSlot)
  383.     if turtle.getItemCount(itemSlot) > keepNum then
  384.         turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  385.     end
  386.    
  387.     T:forward(2) --iron ore
  388.     turtle.select(1)
  389.     turtle.suckDown()
  390.     itemSlot = T:getItemSlot("minecraft:iron_ore")
  391.     keepNum = numTurtles * 7
  392.     turtle.select(itemSlot)
  393.     if turtle.getItemCount(itemSlot) > keepNum then
  394.         turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  395.     end
  396.    
  397.    
  398.     T:forward(2) --sand and reeds
  399.     turtle.select(1)
  400.     while turtle.suckDown() do end
  401.     itemSlot = T:getItemSlot("minecraft:sand")
  402.     keepNum = 6
  403.     turtle.select(itemSlot)
  404.     if turtle.getItemCount(itemSlot) > keepNum then
  405.         turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  406.     end
  407.     itemSlot = T:getItemSlot("minecraft:reeds")
  408.     turtle.select(itemSlot)
  409.     keepNum = 3
  410.     if turtle.getItemCount(itemSlot) > keepNum then
  411.         turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  412.     end
  413.    
  414.     T:forward(2) --cobblestone
  415.     keepNum = numTurtles * 7 + 7
  416.     repeat
  417.         turtle.suckDown()
  418.         stockData = T:getStock("minecraft:cobblestone")
  419.     until stockData.count >= keepNum
  420.     itemSlot = T:getItemSlot("minecraft:cobblestone")
  421.     dropItem("minecraft:cobblestone", turtle.getItemCount(itemSlot) - keepNum)
  422.     dropItem("minecraft:dirt", 0)
  423.    
  424.     T:forward(2) --logs
  425.     while turtle.suckDown() do
  426.         stockData = T:getStock("minecraft:log")
  427.         if stockData.count >= logsNeeded then
  428.             break
  429.         end
  430.         stockData = T:getStock("minecraft:log2")
  431.         if stockData.count >= logsNeeded then
  432.             break
  433.         end
  434.     end
  435.     T:forward(2) -- sticks
  436.     T:turnRight(2)
  437.     --empty furnace
  438.     T:go("BU")
  439.     turtle.select(1)
  440.     turtle.suck()
  441.     T:go("DF")
  442.     itemSlot = T:getItemSlot("minecraft:planks")
  443.     if itemSlot > 0 then
  444.         stockData = T:getStock("minecraft:planks")
  445.         if stockData.count >= 2 then
  446.             craftSticks(4)
  447.         end
  448.         itemSlot = T:getItemSlot("minecraft:planks")
  449.         if itemSlot > 0 then
  450.             turtle.select(itemSlot)
  451.             turtle.refuel()
  452.         end
  453.     end
  454.     turtle.select(1)
  455.     turtle.suckDown()
  456.     itemSlot = T:getItemSlot("minecraft:stick")
  457.     keepNum = sticksNeeded
  458.     if itemSlot > 0 then
  459.         if turtle.getItemCount(itemSlot) > keepNum then
  460.             turtle.select(itemSlot)
  461.             turtle.dropDown(turtle.getItemCount(itemSlot) - keepNum)
  462.             sticksNeeded = 0
  463.         end
  464.     end
  465.    
  466.        
  467.     -- logs: crafting table = 2, sticks  = 1, smelt
  468.     -- planks: crafting table = 8, sticks = 2, smelt cobble = 21, smelt ironore = 14, smelt sand = 6, total 64
  469.     stockData = T:getStock("minecraft:log")
  470.     if stockData.count == 0 then
  471.         stockData = T:getStock("minecraft:log2")
  472.         logType = "minecraft:log2"
  473.     end
  474.     if stockData.count < logsNeeded then --not enough logs on board
  475.         harvestTreeFarm()
  476.         stockData = T:getStock("minecraft:log")
  477.         logType = "minecraft:log"
  478.         if stockData.count == 0 then
  479.             stockData = T:getStock("minecraft:log2")
  480.             logType = "minecraft:log2"
  481.         end
  482.     end
  483.     if sticksNeeded > 0 then
  484.         craftSticks(4)
  485.     end
  486.     T:craft("minecraft:diamond_pickaxe", 1, "minecraft:stick",  "minecraft:diamond", nil, false)
  487.     if numTurtles == 2 then --make 2 diamond pickaxe
  488.         T:craft("minecraft:diamond_pickaxe", 1, "minecraft:stick",  "minecraft:diamond", nil, false)
  489.     end
  490.     smelt("minecraft:cobblestone", 7  * numTurtles + 7)
  491.     smelt("minecraft:iron_ore", 7 * numTurtles)
  492.     smelt("minecraft:sand", 6)
  493.     T:craft("minecraft:planks", 12 * numTurtles, logType, nil, nil, false)
  494.     T:craftChests(numTurtles)
  495.     T:craft("minecraft:crafting_table", numTurtles, "minecraft:planks", nil, nil, false)
  496.     itemSlot = T:getItemSlot("minecraft:planks")
  497.     if itemSlot > 0 then
  498.         turtle.select(itemSlot)
  499.         turtle.refuel()
  500.     end
  501.    
  502.     T:craft("minecraft:paper", 3, "minecraft:reeds", nil, nil, false)
  503.     T:craft("minecraft:glass_pane", 16, "minecraft:glass", nil, nil, false)
  504.     T:craft(ccDisk, 1, "minecraft:paper", "minecraft:redstone", nil, false)
  505.     T:craft(ccComputer, numTurtles, "minecraft:glass_pane", "minecraft:redstone", "minecraft:stone", false)
  506.     T:craft(ccTurtle, numTurtles, "minecraft:chest", ccComputer, "minecraft:iron_ingot", false)
  507.     T:craft(ccCraftyMiningTurtle, 1, "minecraft:crafting_table", "minecraft:diamond_pickaxe", ccTurtle, false)
  508.     T:craft(ccDiskDrive, 1, "minecraft:redstone", "minecraft:stone", nil, false)
  509.     T:go("RRFFFRR")
  510.  
  511.     --program mining turtle
  512.     turtle.select(T:getItemSlot(ccDiskDrive))
  513.     turtle.place()
  514.     turtle.select(T:getItemSlot(ccDisk))
  515.     turtle.drop()
  516.     T:go("UF") --now on top of disk drive
  517.    
  518.    
  519.     if disk.isPresent("bottom") then
  520.         local filepath = shell.getRunningProgram()
  521.         local filename = fs.getName(filepath)
  522.         if fs.getFreeSpace("/disk/") > 130000 then -- use filecopy
  523.             fs.copy(filepath, "/disk/"..filename)
  524.             saveToLog("selfReplicate.lua copied to floppy disk", true)
  525.         else
  526.             local text = "Config file not modified on this system."
  527.             text = text.."\nUnable to copy 150kB file."
  528.             text = text.."\nMy offspring will download files from"
  529.             text = text.."\nPastebin if connected to the internet"
  530.             text = text.."\nLast resort:\ncopy selfReplicate.lua\nusing Windows file explorer"
  531.             saveToLog(text, true)
  532.         end
  533.        
  534.         --This script is a file called startup stored on the floppy disk
  535.         --When a turtle is placed next to the disk drive, it reads this script
  536.         --which opens 'minerList.txt' and sets the label to Miner2, (as '2' is stored in this file)
  537.         --Either copies start.lua to the turtle then modifies 'minerList.txt' to '3'
  538.         --or if on a server, requests the start.lua file via http from pastebin
  539.         --so the name Miner3 given for the second turtle, (if constructed)
  540.        
  541.         -- create/overwrite 'minerList.txt' on floppy disk
  542.         startFile = fs.open("/disk/minerList.txt", "w")
  543.         startFile.writeLine("2")
  544.         startFile.close()
  545.         -- create/overwrite startup
  546.         startFile = fs.open("/disk/startup", "w")
  547.         startFile.writeLine('function get(name, code)')
  548.         startFile.writeLine('   local response = http.get("http://pastebin.com/raw.php?i="..textutils.urlEncode(code))')
  549.         startFile.writeLine('   if response then')
  550.         startFile.writeLine('       local sCode = response.readAll()')
  551.         startFile.writeLine('       if sCode ~= nil and sCode ~= "" then')
  552.         startFile.writeLine('           local file = fs.open( name, "w" )')
  553.         startFile.writeLine('           response.close()')
  554.         startFile.writeLine('           file.write(sCode)')
  555.         startFile.writeLine('           file.close()')
  556.         startFile.writeLine('           return true')
  557.         startFile.writeLine('       end')
  558.         startFile.writeLine('   end')
  559.         startFile.writeLine('   return false')
  560.         startFile.writeLine('end') 
  561.         startFile.writeLine('if fs.exists("/disk/minerList.txt") then')
  562.         startFile.writeLine('   textFile = fs.open("/disk/minerList.txt", "r")')
  563.         startFile.writeLine('   textIn = textFile.readAll()')
  564.         startFile.writeLine('   minerName = "Miner"..textIn')
  565.         startFile.writeLine('   textFile.close()')
  566.         startFile.writeLine('   textOut = tostring(tonumber(textIn) + 1)')
  567.         startFile.writeLine('else')
  568.         startFile.writeLine('   minerName = "Miner2"')
  569.         startFile.writeLine('   textOut = "3"')
  570.         startFile.writeLine('end')
  571.         startFile.writeLine('textFile = fs.open("/disk/minerList.txt", "w")')
  572.         startFile.writeLine('textFile.writeLine(textOut)')
  573.         startFile.writeLine('textFile.close()')
  574.         startFile.writeLine('if os.getComputerLabel() == nil or string.find(os.getComputerLabel(),"Miner") == nil then')
  575.         startFile.writeLine('   os.setComputerLabel(minerName)')
  576.         startFile.writeLine('end')
  577.         startFile.writeLine('print("Hello, my name is "..os.getComputerLabel())')
  578.         startFile.writeLine('if fs.exists("/disk/selfReplicate.lua") then')
  579.         startFile.writeLine('   fs.copy("/disk/selfReplicate.lua", "selfReplicate.lua")')
  580.         startFile.writeLine('   print("Replication program copied")')
  581.         startFile.writeLine('else')
  582.         startFile.writeLine('   get("selfReplicate.lua", "'..pastebinCode..'")')   
  583.         startFile.writeLine('end')
  584.         startFile.writeLine('print("Break me and move to a tree > 33 blocks away")')
  585.         startFile.writeLine('print("use selfReplicate.lua to begin self replicating ")')
  586.         startFile.close()
  587.     end
  588.     T:go("BDRFL")
  589.     turtle.select(T:getItemSlot(ccCraftyMiningTurtle))
  590.     turtle.place() --next to disk drive
  591.     T:turnLeft(1)
  592.     if numTurtles == 2 then
  593.         T:craft(ccCraftyMiningTurtle, 1, "minecraft:crafting_table", "minecraft:diamond_pickaxe", ccTurtle, false)
  594.         T:go("FRU")
  595.         turtle.select(T:getItemSlot(ccCraftyMiningTurtle))
  596.         turtle.place() --next to disk drive
  597.         T:down(1)
  598.     else
  599.         T:go("FR")
  600.     end
  601.     term.clear()
  602.     if numTurtles == 2 then
  603.         saveToLog("Mission successful.\nI have replicated myself twice.\n\nRight-Click on my offspring to check their status...")
  604.     else
  605.         saveToLog("Mission partially successful.\nI have replicated myself once\n\nRight-Click on my offspring to check its status...")
  606.     end
  607. end
  608.  
  609. function craftBucket()
  610.     local stockData = {}
  611.     local success = false
  612.    
  613.     -- called only when under furnace
  614.     stockData = T:getStock("minecraft:bucket")
  615.     if stockData.count == 0 then
  616.         stockData = T:getStock("minecraft:iron_ore")
  617.         if stockData.count >= 3 then
  618.             if smelt("minecraft:iron_ore", 3) then
  619.                 if T:craft("minecraft:bucket", 1, "minecraft:iron_ingot", nil, nil, false) then
  620.                     success = true
  621.                 end
  622.             end
  623.         end
  624.     else
  625.         success = true
  626.     end
  627.    
  628.     return success
  629. end
  630.  
  631. function craftSigns(signsNeeded)
  632.     local success = false
  633.     local woodNeeded = 0
  634.     local woodInStock = 0
  635.     local numPlanksNeeded = 0
  636.     local logType = "minecraft:log"
  637.     local stockData = {}
  638.  
  639.     turtle.suckDown() --get any sticks in chest below
  640.     signsNeeded = signsNeeded or 3
  641.     if signsNeeded > 12 then
  642.         signsNeeded = 12
  643.     end
  644.     --make 3 signs by default , need 8 planks, leaves 3 sticks
  645.     --  signs   planks  sticks  wood
  646.     --  3       6 + 2   1       2
  647.     --  6       12 + 2  2       4
  648.     --  9       18 + 2  3       5
  649.     --  12      24 + 2  4       7
  650.    
  651.     if signsNeeded == 3 then
  652.         woodNeeded = 2
  653.         numPlanksNeeded = 8
  654.     elseif signsNeeded == 6 then
  655.         woodNeeded = 4
  656.         numPlanksNeeded = 16
  657.     elseif signsNeeded == 9 then
  658.         woodNeeded = 5
  659.         numPlanksNeeded = 20
  660.     else
  661.         woodNeeded = 7
  662.         numPlanksNeeded = 28
  663.     end
  664.  
  665.     woodInStock = T:getLogStock()
  666.     if woodInStock >= woodNeeded then
  667.         stockData = T:getStock("minecraft:log")
  668.         if stockData.count < woodNeeded then
  669.             stockData = T:getStock("minecraft:log2")
  670.             if stockData.count >= woodNeeded then
  671.                 logType = "minecraft:log2"
  672.             end
  673.         end
  674.         T:craft("minecraft:planks", numPlanksNeeded, logType, nil, nil, false)
  675.         stockData = T:getStock("minecraft:stick")
  676.         if stockData.count < 1 then
  677.             T:craft("minecraft:stick", 4, "minecraft:planks", nil, nil, false)
  678.         end
  679.         if T:craft("minecraft:sign", signsNeeded, "minecraft:stick", "minecraft:planks", nil, false) then
  680.             success = true
  681.         end
  682.         stockData = T:getStock("minecraft:planks")
  683.         if stockData.count > 0 then
  684.             turtle.select(stockData.primarySlot)
  685.             turtle.refuel()
  686.         end
  687.         stockData = T:getStock("minecraft:stick")
  688.         if stockData.count > 0 then
  689.             turtle.select(stockData.primarySlot)
  690.             turtle.dropDown()
  691.         end
  692.     end
  693.     return success
  694. end
  695.  
  696. function craftSticks(sticksNeeded)
  697.     local success = false
  698.     local makePlanks = false
  699.     local woodNeeded = 0
  700.     local planksNeeded = 0
  701.     local doContinue = true
  702.     local stockData = {}
  703.    
  704.    
  705.     if sticksNeeded <= 4 then
  706.         sticksNeeded = 4
  707.         planksNeeded = 4   
  708.         woodNeeded = 1
  709.     elseif sticksNeeded <= 8 then
  710.         sticksNeeded = 8
  711.         planksNeeded = 4
  712.         woodNeeded = 1
  713.     elseif sticksNeeded <= 12 then
  714.         sticksNeeded = 12
  715.         planksNeeded = 8
  716.         woodNeeded = 2
  717.     else
  718.         sticksNeeded = 16
  719.         planksNeeded = 8
  720.         woodNeeded = 2
  721.     end
  722.    
  723.     stockData = T:getStock("minecraft:planks")
  724.     if stockData.count < planksNeeded then
  725.         makePlanks = true
  726.     else
  727.         woodNeeded = 0 --reset
  728.     end
  729.    
  730.     if makePlanks then --need wood
  731.         stockData = T:getStock("minecraft:log")
  732.         if stockData.count >= woodNeeded then
  733.             T:craft("minecraft:planks", planksNeeded, T:getItemName(stockData.primarySlot), nil, nil, false)
  734.         else
  735.             doContinue = false
  736.         end
  737.     end
  738.     if doContinue then
  739.         if T:craft("minecraft:stick", sticksNeeded, "minecraft:planks", nil, nil, false) then
  740.             success = true
  741.         end
  742.     end
  743.    
  744.     return success
  745. end
  746.  
  747. function craftTorches(torchesNeeded)
  748.     -- 4 torches min : 1 head + 1 stick = 4 torches. Min sticks  = 4, min planks = 4
  749.     -- torches head planks sticks
  750.     -- 4        1       4       4
  751.     -- 8        2       4       4
  752.     -- 12       3       4       4
  753.     -- 16       4       4       4
  754.     -- 20       5       4       8
  755.     -- 24       6       4       8
  756.     -- 28       7       4       8
  757.     -- 32       8       4       8
  758.     -- 36       9       8       12
  759.     -- 40       10      8       12
  760.     -- 44       11      8       12
  761.     -- 48       12      8       12
  762.     -- 52       13      8       16
  763.     -- 56       14      8       16
  764.     -- 60       15      8       16
  765.     -- 64       16      8       16
  766.     local logType = "minecraft:log"
  767.     local headModifier = 1 --charcoal
  768.     local headQuantity = 0
  769.     local makeCharcoal = false
  770.     local makePlanks = false
  771.     local success = false
  772.     local doContinue = true
  773.     local woodNeeded = 0
  774.     local planksNeeded = 0
  775.     local sticksNeeded = 0
  776.     local coalInStock = 0
  777.     local charcoalInStock = 0
  778.     local sticksInStock = 0
  779.     local planksInStock = 0
  780.     local stockData = {}
  781.    
  782.     saveToLog("craftTorches("..torchesNeeded..")")
  783.     --turtle will be above storage chest to run this function
  784.     turtle.select(1)
  785.     --get sticks from storage
  786.     while turtle.suckDown() do end
  787.     stockData = T:getStock("minecraft:stick")
  788.     sticksInStock = stockData.count
  789.     torchesNeeded = math.floor(torchesNeeded / 4) * 4 -- correct torchesNeeded to multiple of 4
  790.     headQuantity = torchesNeeded / 4 -- coal, charcoal
  791.     stockData = T:getStock("minecraft:planks")
  792.     planksInStock = stockData.count
  793.     -- calculate sticks/planks/logs needed
  794.     if torchesNeeded == 0 then
  795.         torchesNeeded = 4 -- torches min 4
  796.         if sticksInStock < 4 then
  797.             planksNeeded = 4 -- 1 wood
  798.             sticksNeeded = 4 -- 2 planks
  799.             woodNeeded = 1
  800.         end
  801.     elseif torchesNeeded <= 16 then-- 4, 8, 12, 16
  802.         if sticksInStock < 4 then
  803.             planksNeeded = 4  -- 8 planks = 16 sticks
  804.             sticksNeeded = 4  -- 4 sticks
  805.             woodNeeded = 1
  806.         end
  807.     elseif torchesNeeded <= 32 then-- 4, 8, 12, 16
  808.         if sticksInStock < 8 then
  809.             planksNeeded = 4  -- 8 planks = 16 sticks
  810.             sticksNeeded = 8  -- 8 sticks
  811.             woodNeeded = 2
  812.         end
  813.     elseif torchesNeeded <= 48 then-- 4, 8, 12, 16
  814.         if sticksInStock < 12 then
  815.             planksNeeded = 8  -- 8 planks = 16 sticks
  816.             sticksNeeded = 12 -- 12 sticks
  817.             woodNeeded = 2
  818.         end
  819.     else
  820.         if sticksInStock < 16 then
  821.             planksNeeded = 8  -- 8 planks = 16 sticks
  822.             sticksNeeded = 16 -- 16 sticks
  823.             woodNeeded = 2
  824.         end
  825.     end
  826.     --need either coal or charcoal
  827.     stockData = T:getStock("minecraft:coal", 0)
  828.     coalInStock = stockData.count
  829.     stockData = T:getStock("minecraft:coal", 1)
  830.     charcoalInStock = stockData.count
  831.    
  832.     if coalInStock >= headQuantity  then
  833.         headModifier  = 0 --use coal
  834.     else
  835.         headModifier  = 1 -- use charcoal
  836.     end
  837.     if headModifier == 1 then --use charcoal
  838.         if charcoalInStock < headQuantity then
  839.             makeCharcoal = true
  840.         end
  841.         -- extra logs needed for charcoal production
  842.         woodNeeded = woodNeeded + headQuantity
  843.         -- extra logs needed for charcoal fuel
  844.         woodNeeded = woodNeeded + torchesNeeded / 4
  845.     end
  846.     saveToLog("craftTorches("..torchesNeeded..") coal="..coalInStock..", charcoal="..charcoalInStock..", planksNeeded="..planksNeeded..", woodNeeded="..woodNeeded)
  847.     -- amount of logs needed known
  848.     stockData = T:getStock("minecraft:log")
  849.     if stockData.count < woodNeeded then
  850.         stockData = T:getStock("minecraft:log2")
  851.         if stockData.count >= woodNeeded then
  852.             logType = "minecraft:log2"
  853.         else -- not enough log/log2 onboard
  854.             getItemFromStorage("minecraft:log", true) -- get all types of log from storage
  855.             stockData = T:getStock("minecraft:log")
  856.             if stockData.count < woodNeeded then
  857.                 stockData = T:getStock("minecraft:log2")
  858.                 if stockData.count >= woodNeeded then
  859.                     logType = "minecraft:log2"
  860.                 else -- not enough logs to make torches
  861.                     doContinue = false
  862.                 end
  863.             else
  864.                 logType = "minecraft:log"
  865.             end
  866.         end
  867.     end
  868.     saveToLog("craftTorches("..torchesNeeded..") using "..logType)
  869.  
  870.     if doContinue then --enough raw materials onboard
  871.         if sticksInStock == 0 or sticksInStock < headQuantity then
  872.             stockData = T:getStock("minecraft:stick")
  873.             if stockData.count < sticksNeeded then
  874.                 doContinue = false
  875.                 saveToLog("craftTorches("..torchesNeeded..") crafting sticks")
  876.                 if craftSticks(sticksNeeded) then
  877.                     doContinue = true
  878.                 end
  879.             end
  880.         end
  881.         if doContinue then
  882.             if makeCharcoal then
  883.                 doContinue = false
  884.                 saveToLog("craftTorches("..torchesNeeded..") smelting charcoal")
  885.                 if smelt(logType, headQuantity) then
  886.                     doContinue = true
  887.                 end
  888.             end
  889.             if doContinue then
  890.                 --make  torches
  891.                 saveToLog("craftTorches("..torchesNeeded..") crafting torches...")
  892.                 if T:craft("minecraft:torch", torchesNeeded, "minecraft:stick", "minecraft:coal", nil, false) then
  893.                     success = true
  894.                 end
  895.             end
  896.         end
  897.         stockData = T:getStock("minecraft:stick")
  898.         if stockData.count > 0 then
  899.             saveToLog("craftTorches("..torchesNeeded..") storing sticks")
  900.             turtle.select(stockData.primarySlot)
  901.             turtle.dropDown()
  902.         end
  903.     end
  904.    
  905.     return success
  906. end
  907.  
  908. function createMine(status)
  909.     -- initial excavation in centre complete.
  910.     saveToLog("createMine() Starting...", true)
  911.     if status == 5 then
  912.         createMinePrepare(14)
  913.         saveToLog("createMine() Starting Level 14", true)
  914.         createMineLevel(14)
  915.         status = 6
  916.         saveToLog("createMine() Level 14 complete. Saving Status '6'", true)
  917.         saveStatus("6")
  918.     end
  919.     if status == 6 then
  920.         createMinePrepare(11)
  921.         saveToLog("createMine() Starting Level 11", true)
  922.         createMineLevel(11)
  923.         status = 7
  924.         saveToLog("createMine() Level 11 complete. Saving Status '7'", true)
  925.         saveStatus("7")
  926.     end
  927.     if status == 7 then
  928.         createMinePrepare(8)
  929.         saveToLog("createMine() Starting Level 8", true)
  930.         createMineLevel(8)
  931.         status = 8
  932.         saveToLog("createMine() Level 8 complete. Saving Status '8'", true)
  933.         saveStatus("8")
  934.     end
  935.     saveToLog("createMine() Completed...", true)
  936. end
  937.  
  938. function createMinePrepare(level)
  939.     local stockData = {}
  940.     local logsRequired = 0
  941.     stockData = T:getStock("minecraft:coal") --either coal or charcoal
  942.     local numCoal = stockData.count
  943.     local numLogs = T:getLogStock()
  944.    
  945.     emptyTurtle(false) -- keeps iron_ore, cobble, dirt, bucket, torches, signs, log, log2
  946.     -- may have iron ore so attempt bucket crafting / check if bucket onboard
  947.     if craftBucket() then -- checks or crafts a bucket
  948.         checkTreeFarm()
  949.     end
  950.     -- wood needed for level 14 signs: 2 for signs
  951.     -- wood needed for all levels: 5 for fuel, 3 for torches, 2 for chests
  952.     if level == 14 then
  953.         logsRequired = 12
  954.     else
  955.         logsRequired = 10
  956.     end
  957.     if numCoal >= 2 then
  958.         logsRequired = logsRequired - 2
  959.     end
  960.     if numLogs < logsRequired then
  961.         if treeFarm:getFarmCreated() then
  962.             waitForTreeFarm(10)
  963.         end
  964.     end
  965.     numLogs = T:getLogStock()
  966.    
  967.     if numLogs >= 2 then -- make 1 chest if 2 logs
  968.         T:craftChests(1, true)
  969.         numLogs = T:getLogStock()
  970.     end
  971.     if numLogs >= 4 or (numLogs >= 2 and numCoal >= 2) then
  972.         craftTorches(8) -- craft 8 torches 3 logs
  973.         numLogs = T:getLogStock()
  974.     end
  975.     if level == 14 then
  976.         if numLogs >= 2 then
  977.             craftSigns(3)   -- craft 3 signs 2 logs
  978.         end
  979.     end
  980.     stockData = T:getStock("minecraft:sign")
  981.     saveToLog("createMinePrepare("..level..") Signs avaiable: "..stockData.count, true)
  982.     stockData = T:getStock("minecraft:torch")
  983.     saveToLog("createMinePrepare("..level..") Torches avaiable: "..stockData.count, true)
  984.     stockData = T:getStock("minecraft:chest")
  985.     saveToLog("createMinePrepare("..level..") Chests avaiable: "..stockData.count - 1, true)
  986.    
  987. end
  988.  
  989. function createMineLevel(level)
  990.     local tempYcoord = T:getY()
  991.     local doContinue = false
  992.     local data = {}
  993.     local stockData = {}
  994.    
  995.     -- turtle class .go() function
  996.     -- R L F B U D + - = Right, Left, Forward, Back, Up, Down, up while detect, down while not detect
  997.     -- d u x M N O = dIG, DIGuP, x-cavate (digDown), mineItem "up" and close with cobble, digUp if valuable and close, digDown if valuable and close
  998.     -- c h k C H r S T P = cHECK/ChECK/CHECk place Cobble down/forward/up if no block, place cobblestone/dirt, cHest, Sapling, Torch, DIrT, hoPper
  999.     -- go down to level 14, 11, 8 and create + shape with firstTree at centre, 16 blocks length each arm
  1000.     -- torches at each end, and half way along
  1001.     T:forward(16) --now over mineshaft site
  1002.     if level == 14 then --first level so create mineshaft
  1003.         -- level out mine entrance and mark with a sign
  1004.         while turtle.detectUp() do
  1005.             T:up(1)
  1006.         end
  1007.         turtle.select(1)
  1008.         while T:getY() >= tempYcoord - 1 do
  1009.             for i = 1, 4 do
  1010.                 turtle.dig()
  1011.                 T:turnRight(1)
  1012.             end
  1013.             T:down(1)
  1014.         end
  1015.         T:up(1)
  1016.         turtle.select(T:getItemSlot("minecraft:cobblestone"))
  1017.         for i = 1,4 do
  1018.             turtle.place()
  1019.             T:turnRight(1)
  1020.         end
  1021.         T:up(1)
  1022.         if T:getItemSlot("minecraft:sign") > 0 then
  1023.             turtle.select(1)
  1024.             turtle.dig()
  1025.             turtle.select(T:getItemSlot("minecraft:sign"))
  1026.             turtle.place("Diamond Mine\nPreparing for\nDeep Excavation\nLevel "..tostring(level))
  1027.             --dump remaining signs
  1028.             turtle.dropDown()
  1029.         end
  1030.     else   
  1031.         turtle.select(1)
  1032.         turtle.dig() -- dig existing sign
  1033.         if T:getItemSlot("minecraft:sign") > 0 then
  1034.             turtle.select(T:getItemSlot("minecraft:sign"))
  1035.             turtle.place("Diamond Mine\nPreparing for\nDeep Excavation\nLevel "..tostring(level))
  1036.         end
  1037.     end
  1038.     mineEntrance:setX(T:getX())
  1039.     mineEntrance:setY(T:getY())
  1040.     mineEntrance:setZ(T:getZ())
  1041.     mineEntrance:setFacing(T:getFacing())
  1042.     T:turnRight(2)
  1043.     while T:getY() > level do
  1044.         T:down(1)
  1045.         if level == 14 then
  1046.             for i = 1, 4 do
  1047.                 if T:isValuable("forward") then
  1048.                     mineItem(true, "forward")
  1049.                 else
  1050.                     data = T:getBlockType("forward")
  1051.                     if data.name == "minecraft:water" or data.name == "minecraft:flowing_water" then
  1052.                         T:go("dC")
  1053.                     end
  1054.                 end
  1055.                 T:turnRight(1)
  1056.             end
  1057.         end
  1058.     end
  1059.     T:go("xRRdCDdCRRU")
  1060.     if level == 14 then
  1061.         for i = 1, 32 do --create 32 block corridor and check ceiling
  1062.             T:go("FxN")
  1063.         end
  1064.     else
  1065.         for i = 1, 32 do
  1066.             T:go("Fx")
  1067.         end
  1068.     end
  1069.     T:go("dCDdCRROUxTFDO") -- create end of corridor
  1070.     for i = 1, 6 do -- check floor of 16 blocks
  1071.         T:go("FOLhRRhL")
  1072.     end
  1073.     T:go("FOLhRRhLUxTFDOLhRRhL")
  1074.     for i = 1, 6 do
  1075.         T:go("FOLhRRhL")
  1076.     end
  1077.    
  1078.     T:go("FUR") -- create RH branch at ceiling level
  1079.     if level == 14 then
  1080.         for i = 1, 16 do
  1081.             T:go("FxN")
  1082.         end
  1083.     else
  1084.         for i = 1, 16 do
  1085.             T:go("Fx")
  1086.         end
  1087.     end
  1088.     T:go("dCDdCRROUxTFDO") --create end of RH branch
  1089.     for i = 1, 6 do -- create 16 block floor
  1090.         T:go("FOLhRRhL")
  1091.     end
  1092.     T:go("FOLhRRhLUxTFDOLhRRhL")
  1093.     for i = 1, 6 do
  1094.         T:go("FOLhRRhL")
  1095.     end
  1096.    
  1097.     T:go("FU")
  1098.     if level == 14 then -- create LH branch at ceiling level
  1099.         for i = 1, 16 do
  1100.             T:go("FxN")
  1101.         end
  1102.     else
  1103.         for i = 1, 16 do
  1104.             T:go("Fx")
  1105.         end
  1106.     end
  1107.     T:go("dCDdCRROUxTFDOLhRRhL") -- create corridor end
  1108.     for i = 1, 6 do -- create 16 block floor
  1109.         T:go("FOLhRRhL")
  1110.     end
  1111.     T:go("FOLhRRhLUxTFDOLhRRhL")
  1112.     for i = 1, 6 do
  1113.         T:go("FOLhRRhL")
  1114.     end
  1115.    
  1116.     T:go("FLx")
  1117.        
  1118.     stockData = T:getStock("minecraft:chest")
  1119.     if stockData.count > 1 then
  1120.         turtle.select(stockData.primarySlot)
  1121.         turtle.placeDown()
  1122.     end
  1123.    
  1124.     T:up(1)
  1125.     T:emptyTrash("down")
  1126.     T:down(1)
  1127.    
  1128.     for i = 1, 6 do
  1129.         T:go("FOLhRRhL")
  1130.     end
  1131.     T:go("FOLhRRhLUxTFDxCLhRRhL")
  1132.     for i = 1, 7 do
  1133.         T:go("FOLhRRhL")
  1134.     end
  1135.     T:go("FRR")
  1136.     while T:getY() < mineEntrance:getY() do
  1137.         T:up(1)
  1138.     end --at surface now
  1139.     T:forward(16)
  1140.     T:turnRight(2)
  1141. end
  1142.  
  1143. function dropItem(item, keepAmount)
  1144.     local itemSlot = 0
  1145.     local stockData = {}
  1146.     keepAmount = keepAmount or 0
  1147.     if keepAmount == 0 then -- drop everything
  1148.         itemSlot = T:getItemSlot(item)
  1149.         while itemSlot > 0 do
  1150.             turtle.select(itemSlot)
  1151.             turtle.dropDown()
  1152.             itemSlot = T:getItemSlot(item)
  1153.         end
  1154.     elseif keepAmount >= 64 then -- drop everything else
  1155.         stockData = T:getStock(item)
  1156.         while stockData.count > keepAmount do
  1157.             if stockData.primarySlot ~= stockData.finalSlot then
  1158.                 turtle.select(stockData.finalSlot)
  1159.             else --only one slot but more than required in it
  1160.                 turtle.select(stockData.primarySlot)
  1161.             end
  1162.             turtle.dropDown()
  1163.             stockData = T:getStock(item)
  1164.         end
  1165.     else --store specific amount
  1166.         itemSlot = T:getItemSlot(item)
  1167.         if itemSlot > 0 then
  1168.             turtle.select(itemSlot)
  1169.             turtle.dropDown(turtle.getItemCount(itemSlot) - keepAmount)
  1170.         end
  1171.     end
  1172. end
  1173.  
  1174. function emptyAfterHarvest()
  1175.     local item = ""
  1176.     local keepit = false
  1177.     local keepItems = { "minecraft:dirt", "minecraft:cobblestone", "minecraft:chest", "minecraft:log", "minecraft:log2", "minecraft:coal",
  1178.                         "minecraft:sapling", "minecraft:iron_ore", "minecraft:diamond", "minecraft:redstone", "minecraft:sign", "minecraft:torch",
  1179.                         "minecraft:water_bucket", "minecraft:lava_bucket", "minecraft:bucket", "minecraft:planks",
  1180.                         "minecraft:sand", "minecraft:reeds", "minecraft:iron_ingot", "minecraft:emerald"}
  1181.    
  1182.     -- just finished harvesting all trees. get rid of apples, seeds any other junk
  1183.     -- or finished finding cobble after going into a disused mine
  1184.     for i = 1, 16 do
  1185.         keepit = false
  1186.         if turtle.getItemCount(i) > 0 then
  1187.             item = T:getItemName(i)
  1188.             for _,v in pairs(keepItems) do
  1189.                 if v == item then
  1190.                     keepit = true
  1191.                     break
  1192.                 end
  1193.             end
  1194.             if not keepit then
  1195.                 turtle.select(i)
  1196.                 turtle.dropDown()
  1197.             end
  1198.         end
  1199.     end
  1200. end
  1201.  
  1202. function emptyTurtle(keepAll)
  1203.     --  empty out turtle except for logs, coal, torches, signs, bucket, cobble, dirt,diamonds
  1204.     --  chest1 = sticks
  1205.     --  chest2 = logs (oak/birch/jungle etc)
  1206.     --  chest3 = cobblestone, dirt
  1207.     --  chest4 = sand
  1208.     --  chest5 = iron_ore
  1209.     --  chest6 = redstone
  1210.     --  chest7 = diamond
  1211.     --  chest8 = gold_ore, lapis, mossy_cobblestone, obsidian
  1212.     --  chest9 = saplings (oak/birch,jungle)
  1213.  
  1214.     local itemSlot = 0
  1215.     local stockData = {}
  1216.    
  1217.     T:sortInventory()
  1218.     stockData = T:getStock("minecraft:planks")
  1219.     if stockData.count > 0 then
  1220.         turtle.select(stockData.primarySlot)
  1221.         turtle.refuel()
  1222.     end
  1223.    
  1224.     --sapling chest
  1225.     T:go("RFFDRR")
  1226.     while turtle.suckDown() do end --remove any junk in the sapling chest as well
  1227.     dropItem("minecraft:sapling", 0)-- now only saplings in there
  1228.     T:go("UFFR")
  1229.     -- chest1 sticks only
  1230.     dropItem("minecraft:stick", 0)
  1231.    
  1232.     T:forward(2) -- chest2 logs of any type, keep 1 stack
  1233.     dropItem("minecraft:log", 64)
  1234.     dropItem("minecraft:log2", 64)
  1235.    
  1236.     T:forward(2) -- chest3 dirt and cobble
  1237.     if not keepAll then -- keep max 1 stack cobble
  1238.         dropItem("minecraft:cobblestone", 64)
  1239.         dropItem("minecraft:dirt", 64)
  1240.     end
  1241.    
  1242.     T:forward(2) -- chest4 sand and reeds
  1243.     dropItem("minecraft:sand", 0)
  1244.     dropItem("minecraft:reeds", 0)
  1245.    
  1246.     T:forward(2) -- chest5 iron ore only
  1247.     dropItem("minecraft:iron_ore", 64)
  1248.    
  1249.     T:forward(2) -- redstone
  1250.     dropItem("minecraft:redstone", 0)
  1251.     T:forward(4)
  1252.     -- chest8 gold ore, mossy cobblestone, obsidian, lapis, mob drops, misc items
  1253.     for i = 1, 16 do
  1254.         itemName = T:getItemName(i)
  1255.         if itemName ~= ""
  1256.             and itemName ~= "minecraft:chest"
  1257.             and itemName ~= "minecraft:torch"
  1258.             and itemName ~= "minecraft:iron_ore"
  1259.             and itemName ~= "minecraft:cobblestone"
  1260.             and itemName ~= "minecraft:dirt"
  1261.             and itemName ~= "minecraft:log"
  1262.             and itemName ~= "minecraft:log2"
  1263.             and itemName ~= "minecraft:sign"
  1264.             and itemName ~= "minecraft:coal"
  1265.             and itemName ~= "minecraft:diamond"
  1266.             and itemName ~= "minecraft:bucket" then
  1267.             turtle.select(i)
  1268.             turtle.dropDown()
  1269.         end
  1270.     end
  1271.     T:turnRight(2)
  1272.     T:forward(14)
  1273.     T:turnRight(2)
  1274. end
  1275.  
  1276. function fillPond()
  1277.     local doContinue = false
  1278.     local fileHandle = ""
  1279.     local strText = ""
  1280.     local waterFound = false
  1281.     local numArms = 0
  1282.     local startFile = ""
  1283.     local itemSlot = 0
  1284.     local stockData = {}
  1285.  
  1286.     -- read 'waterCoords.txt' from file
  1287.     if fs.exists("waterCoords.txt") then
  1288.         fileHandle = fs.open("waterCoords.txt", "r")
  1289.         strText = fileHandle.readLine()
  1290.         water:setX(tonumber(string.sub(strText, 3)))
  1291.         strText = fileHandle.readLine()
  1292.         water:setY(tonumber(string.sub(strText, 3)))
  1293.         strText = fileHandle.readLine()
  1294.         water:setZ(tonumber(string.sub(strText, 3)))
  1295.         fileHandle.close()
  1296.         saveToLog("Water coords from file x="..water:getX()..", y="..water:getY()..", z="..water:getZ(), true)
  1297.     end
  1298.     T:sortInventory()
  1299.     stockData = T:getStock("minecraft:bucket")
  1300.     if stockData.count == 0 then
  1301.         if craftBucket() then
  1302.             doContinue = true
  1303.         end
  1304.     else
  1305.         doContinue = true
  1306.     end
  1307.     if doContinue then -- bucket available
  1308.         -- fetch 2 buckets water and charge water pool
  1309.         -- place 4 buckets water in tree farm corners
  1310.         -- dig 4 corner blocks in treefarm to allow water flow down to hoppers
  1311.         goToWater("x") -- calls safeRun which constantly checks for water
  1312.         goToWater("z") -- may have already collected water
  1313.         if T:getItemSlot("minecraft:water_bucket") == 0 then --no water found yet
  1314.             while not turtle.inspectDown() do -- must be air below
  1315.                 T:down(1)
  1316.             end
  1317.             safeRun(1)
  1318.             T:turnRight(1)
  1319.             safeRun(1)
  1320.             T:turnRight(1) --now facing south, ready to continue spiral
  1321.         end
  1322.         if T:getItemSlot("minecraft:water_bucket") == 0 then
  1323.             numArms = 4
  1324.             for i = 2, numArms, 2 do
  1325.                 safeRun(i)     
  1326.                 T:turnRight(1)
  1327.                 safeRun(i)
  1328.                 T:turnRight(1)
  1329.                 safeRun(i + 1)
  1330.                 T:turnRight(1)
  1331.                 if i + 1 < numArms then
  1332.                     safeRun(i + 1)
  1333.                     T:turnRight(1)
  1334.                 else
  1335.                     --return to starting position
  1336.                     safeRun(i / 2)
  1337.                     T:turnRight(1)
  1338.                     safeRun(i / 2 + 1)
  1339.                 end
  1340.             end
  1341.             --changeDirection()
  1342.             if T:getItemSlot("minecraft:water_bucket") > 0 then
  1343.                 startFile = fs.open("waterCoords.txt", "w")
  1344.                 startFile.writeLine("x="..T:getX())
  1345.                 startFile.writeLine("y="..T:getY())
  1346.                 startFile.writeLine("z="..T:getZ())
  1347.                 startFile.close()
  1348.             end
  1349.         end
  1350.         itemSlot = T:getItemSlot("minecraft:water_bucket")
  1351.         if itemSlot > 0 then
  1352.             treeFarm:setWaterFound(true)
  1353.             returnHome("x")
  1354.             returnHome("z")
  1355.             returnHome("facing")
  1356.             T:go("LFFF")
  1357.             turtle.select(T:getItemSlot("minecraft:water_bucket"))
  1358.             if turtle.placeDown() then
  1359.                 saveToLog("Water added to pond at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1360.                 T:go("RRFFFL")
  1361.             else
  1362.                 T:go("LFLF")
  1363.                 if turtle.placeDown() then
  1364.                     saveToLog("Water added (after moving) to pond at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1365.                 end
  1366.                 T:go("LFRFFL")
  1367.             end
  1368.             goToWater("x")
  1369.             goToWater("z")
  1370.             returnHome("x")
  1371.             returnHome("z")
  1372.             returnHome("facing")
  1373.             T:go("LFFLF")
  1374.             turtle.select(T:getItemSlot("minecraft:water_bucket"))
  1375.             if turtle.placeDown() then
  1376.                 saveToLog("Water added to pond at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1377.                 T:go("RRFRFFL")
  1378.             else
  1379.                 T:go("RFRF")
  1380.                 if turtle.placeDown() then
  1381.                     saveToLog("Water added (after moving) to pond at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1382.                 end
  1383.                 T:go("RFFFL")
  1384.             end
  1385.         else
  1386.             print("Water not found")
  1387.             error()
  1388.         end
  1389.     end
  1390.     treeFarm:setPondFilled(true)
  1391.     saveStatus("treeFarm")
  1392. end
  1393.  
  1394. function findCobble()
  1395.     local atBedrock = false
  1396.     local blockType = ""
  1397.     local tempY = T:getY()
  1398.     saveToLog("findCobble() Starting...", true)
  1399.     --just finished harvesting all trees. get rid of apples, seeds any other junk
  1400.     emptyAfterHarvest()
  1401.     T:down(1)
  1402.     repeat
  1403.         turtle.select(1)
  1404.         if not T:down(1) then
  1405.             atBedrock = true
  1406.         end
  1407.         for i = 1, 4 do
  1408.             if T:isValuable("forward") then
  1409.                 -- call recursive function!!!
  1410.                 mineItem(true, "forward")
  1411.             else
  1412.                 turtle.dig()
  1413.                 if T:getItemSlot("minecraft:gravel") > 0 then
  1414.                     turtle.select(T:getItemSlot("minecraft:gravel"))
  1415.                     turtle.drop()
  1416.                 elseif T:getItemSlot("minecraft:flint") > 0 then
  1417.                     turtle.select(T:getItemSlot("minecraft:flint"))
  1418.                     turtle.drop()
  1419.                 end
  1420.             end
  1421.             T:turnRight(1)
  1422.             turtle.select(1)
  1423.         end
  1424.     until atBedrock
  1425.     repeat
  1426.         T:up(1)
  1427.     until T:getY() == tempY - 4
  1428.     turtle.select(T:getItemSlot("minecraft:cobblestone"))
  1429.     for i = 1, 3 do
  1430.         for j = 1, 4 do
  1431.             turtle.select(T:getItemSlot("minecraft:cobblestone"))
  1432.             turtle.place()
  1433.             T:turnRight(1)
  1434.         end
  1435.         T:up(1)
  1436.     end
  1437.     T:up(1)
  1438.     saveToLog("findCobble() Completed. Saving status '3'", true)
  1439.     saveStatus("3")
  1440. end
  1441.  
  1442. function floodTreeFarm()
  1443.     saveToLog("floodTreeFarm() started")
  1444.     T:go("LFFRR") -- go to pond
  1445.     for i = 1, 9, 2 do --flood farm except for drainage channel
  1446.         turtle.select(T:getItemSlot("minecraft:bucket"))
  1447.         turtle.placeDown() -- Fill 1
  1448.         if i < 9 then
  1449.             T:forward(4 + i)
  1450.         else
  1451.             T:forward(12) -- far right side of farm
  1452.         end
  1453.         T:go("L FFFF FFFF U")
  1454.         turtle.select(T:getItemSlot("minecraft:water_bucket"))
  1455.         turtle.placeDown()
  1456.         T:turnLeft(1)
  1457.         if i < 9 then  -- return to left wall of farm
  1458.             T:forward(i)
  1459.         else
  1460.             T:forward(8)
  1461.         end
  1462.         T:turnLeft(1)
  1463.         T:go("FFFF FFFF DR")
  1464.         T:forward(4)
  1465.         T:turnRight(2)
  1466.         -- ready for next bucket fill
  1467.     end
  1468.     turtle.select(T:getItemSlot("minecraft:bucket"))
  1469.     turtle.placeDown()
  1470.     T:forward(12)
  1471.     turtle.select(T:getItemSlot("minecraft:water_bucket"))
  1472.     turtle.placeDown()
  1473.     T:go("RR FFFF FFFF FFR")
  1474.     treeFarm:setFarmFlooded(true)
  1475.     saveStatus("treeFarm")
  1476.     saveToLog("floodTreeFarm() completed")
  1477. end
  1478.  
  1479. function getCoords()
  1480.     --get world coordinates from player
  1481.     local coord = 0
  1482.     local response = ""
  1483.     local continue = true
  1484.     local event = ""
  1485.     local param1 = ""
  1486.    
  1487.     term.clear()
  1488.     term.setCursorPos(1,1)
  1489.    
  1490.     if fs.exists("homeCoords.txt") then
  1491.         fileHandle = fs.open("homeCoords.txt", "r")
  1492.         strText = fileHandle.readLine()
  1493.         T:setX(tonumber(string.sub(strText, 3)))
  1494.         coordHome:setX(T:getX())
  1495.         strText = fileHandle.readLine()
  1496.         T:setY(tonumber(string.sub(strText, 3)))
  1497.         coordHome:setY(T:getY())
  1498.         strText = fileHandle.readLine()
  1499.         T:setZ(tonumber(string.sub(strText, 3)))
  1500.         strText = fileHandle.readLine()
  1501.         coordHome:setZ(T:getZ())
  1502.         T:setFacing(tonumber(string.sub(strText, 3)))
  1503.         coordHome:setFacing(T:getFacing())
  1504.         fileHandle.close()
  1505.         saveToLog("Coordinates loaded from file:", true)
  1506.         saveToLog("x = "..T:getX()..", y = "..T:getY()..", z = "..T:getZ()..", f = "..T:getFacing(), true)
  1507.         print()
  1508.         print("Miner1 assumed to be at Home Location")
  1509.         print()
  1510.         print("starting in 3 seconds")
  1511.         print("STAND CLEAR!")
  1512.         os.sleep(3)
  1513.     else
  1514.         print("IMPORTANT! Stand directly behind turtle")
  1515.         print("Press F3 to read coordinates")
  1516.         print()
  1517.         continue = true
  1518.         while continue do
  1519.             print("Please enter your X coordinate")
  1520.             write("  x = ")
  1521.             coord = nil
  1522.             while coord == nil do
  1523.                 coord = tonumber(read())
  1524.                 if coord == nil then
  1525.                     term.clear()
  1526.                     term.setCursorPos(1,1)
  1527.                     print("Incorrect input. Use numbers only!")
  1528.                     print()
  1529.                     print("Please enter your X coordinate")
  1530.                     write("  x = ")
  1531.                 end
  1532.             end
  1533.             T:setX(coord)
  1534.             term.clear()
  1535.             term.setCursorPos(1,1)
  1536.             print("Please enter your Y coordinate")
  1537.             write("  y = ")
  1538.             coord = nil
  1539.             while coord == nil do
  1540.                 coord = tonumber(read())
  1541.                 if coord == nil then
  1542.                     term.clear()
  1543.                     term.setCursorPos(1,1)
  1544.                     print("Incorrect input. Use numbers only")
  1545.                     print()
  1546.                     print("Please enter your y coordinate")
  1547.                     write("  y = ")
  1548.                 end
  1549.             end
  1550.             T:setY(coord)
  1551.             term.clear()
  1552.             term.setCursorPos(1,1)
  1553.             print("Please enter your Z coordinate")
  1554.             write("  z = ")
  1555.             coord = nil
  1556.             while coord == nil do
  1557.                 coord = tonumber(read())
  1558.                 if coord == nil then
  1559.                     term.clear()
  1560.                     term.setCursorPos(1,1)
  1561.                     print("Incorrect input. Use numbers only")
  1562.                     print()
  1563.                     print("Please enter your z coordinate")
  1564.                     write("  z = ")
  1565.                 end
  1566.             end
  1567.             T:setZ(coord)
  1568.             response = true
  1569.             while response do
  1570.                 response = false
  1571.                 term.clear()
  1572.                 term.setCursorPos(1,1)
  1573.                 print("Enter Direction you are facing:")
  1574.                 print("  0,1,2,3 (s,w,n,e)")
  1575.                 print()
  1576.                 print(  "  Direction = ")
  1577.                 event, param1 = os.pullEvent ("char")
  1578.                 --response = read()
  1579.                 if param1 == "s" or param1 == "S" then
  1580.                     coord = 0
  1581.                 elseif param1 == "w" or param1 == "W" then
  1582.                     coord = 1
  1583.                 elseif param1 == "n" or param1 == "N" then
  1584.                     coord = 2
  1585.                 elseif param1 == "e" or param1 == "E" then
  1586.                     coord = 3
  1587.                 elseif param1 == "0" or param1 == "1" or param1 == "2" or param1 == "3" then
  1588.                     coord = tonumber(param1)
  1589.                 else
  1590.                     print()
  1591.                     print("Incorrect input: "..param1)
  1592.                     print()
  1593.                     print("Use 0,1,2,3,n,s,w,e")
  1594.                     sleep(2)
  1595.                     response = true
  1596.                 end
  1597.             end
  1598.             T:setFacing(coord)
  1599.             term.clear()
  1600.             term.setCursorPos(1,1)
  1601.             print("Your current location is:")
  1602.             print()
  1603.             print("  x = "..T:getX())
  1604.             print("  y = "..T:getY())
  1605.             print("  z = "..T:getZ())
  1606.             print("  facing "..T:getCompass().." ("..T:getFacing()..")")
  1607.             print()
  1608.             write("Is this correct? (y/n)")
  1609.             event, param1 = os.pullEvent ("char")
  1610.             if param1 == "y" or param1 == "Y" then
  1611.                 continue = false
  1612.             end
  1613.         end
  1614.         -- correct coords to compensate for player standing position
  1615.         -- First tree is considered as point zero, on startup, turtle is in front of this tree
  1616.         -- Player is behind turtle, use 2 blocks to compensate
  1617.         -- facing:      Change:
  1618.         -- 0 (S)        z+1
  1619.         -- 1 (W)        x-1
  1620.         -- 2 (N)        z-1
  1621.         -- 3 (E)        x+1
  1622.  
  1623.         if T:getFacing() == 0 then
  1624.             T:setZ(T:getZ() + 2)
  1625.         elseif T:getFacing() == 1 then
  1626.             T:setX(T:getX() - 2)
  1627.         elseif T:getFacing() == 2 then
  1628.             T:setZ(T:getZ() - 2)
  1629.         elseif T:getFacing() == 3 then
  1630.             T:setX(T:getX() + 2)
  1631.         end
  1632.         coordHome:setX(T:getX())
  1633.         coordHome:setY(T:getY())
  1634.         coordHome:setZ(T:getZ())
  1635.         coordHome:setFacing(T:getFacing())
  1636.         -- create/overwrite 'homeCoords.txt'
  1637.         local fileHandle = fs.open("homeCoords.txt", "w")
  1638.         fileHandle.writeLine("x="..T:getX())
  1639.         fileHandle.writeLine("y="..T:getY())
  1640.         fileHandle.writeLine("z="..T:getZ())
  1641.         fileHandle.writeLine("f="..T:getFacing())
  1642.         fileHandle.close()
  1643.         saveToLog("homeCoords.txt file created", true)
  1644.         saveToLog("x = "..T:getX()..", y = "..T:getY()..", z = "..T:getZ()..", f = "..T:getFacing(), false)
  1645.         print()
  1646.         print("Press esc within 2 secs to watch the action!")
  1647.         sleep(2)
  1648.     end
  1649.     term.clear()
  1650.     term.setCursorPos(1,1)
  1651.     print("Here we go...")
  1652.     sleep(2)
  1653.     term.clear()
  1654.     term.setCursorPos(1,1)
  1655. end
  1656.  
  1657. function getItemFromStorage(item, allItems)
  1658.     local success = false
  1659.     local moves = 0
  1660.     allItems = allItems or false
  1661.    
  1662.     if item == "minecraft:log" or item == "minecraft:log2" then
  1663.         moves = 2
  1664.     elseif item == "minecraft:cobblestone" or item == "minecraft:dirt"then
  1665.         moves = 4
  1666.     elseif item == "minecraft:sand" or item == "minecraft:reeds" then
  1667.         moves = 6
  1668.     elseif item == "minecraft:iron_ore" then
  1669.         moves = 8
  1670.         numIronore = 0
  1671.     elseif item == "minecraft:redstone" then
  1672.         moves = 10
  1673.     elseif item == "minecraft:diamond" then
  1674.         moves = 12
  1675.     end
  1676.     T:forward(moves)
  1677.     turtle.select(1)
  1678.     if allItems then
  1679.         while turtle.suckDown() do -- all items
  1680.             success = true
  1681.         end
  1682.         if T:getFirstEmptySlot() == 0 then
  1683.             turtle.select(T:getItemSlot("minecraft:dirt"))
  1684.             turtle.dropDown()
  1685.         end
  1686.     else
  1687.         if turtle.suckDown() then -- item removed from chest
  1688.             success = true
  1689.         end
  1690.     end
  1691.     T:turnRight(2)
  1692.     T:forward(moves)
  1693.     T:turnRight(2)
  1694.    
  1695.     return success
  1696. end
  1697.  
  1698. function goMining(level)
  1699.     stockData = {}
  1700.     -- start at furnace
  1701.     stockData = T:getStock("minecraft:torch")
  1702.     if stockData.count < 24 then
  1703.         craftTorches(24)
  1704.     end
  1705.     T:forward(16)
  1706.     turtle.dig()
  1707.     saveToLog("goMining() Level "..level.." started", true)
  1708.     if T:getItemSlot("minecraft:sign") > 0 then
  1709.         turtle.select(T:getItemSlot("minecraft:sign"))
  1710.         turtle.place("Diamond Mine\nMining for\nDiamonds\nLevel "..level)
  1711.         turtle.select(1)
  1712.     end
  1713.     T:turnRight(2)
  1714.            
  1715.     while T:getY() > level do
  1716.         T:down(1)
  1717.     end
  1718.     -- R L F B U D + - = Right, Left, Forward, Back, Up, Down, up while detect, down while not detect
  1719.     -- d u x M N O Q = dIG, DIGuP, digDown (x-cavate ?!), MineItem Up and close with cobble, DigUp if valuable and close, digDown if valuable and close, digDown if valuable
  1720.     -- c h k C H r S T P = cHECK/ChECK/CHECk place Cobble down/forward/up if no block, place cobblestone/dirt, cHest, Sapling, Torch, DIrT, hoPper
  1721.    
  1722.     --clear 33 x 33 square at ceiling level
  1723.     T:turnLeft(1)
  1724.     for i = 1, 16 do
  1725.         if level == 14 then
  1726.             T:go("FMxLhR")
  1727.         else
  1728.             T:go("FxkLhR")
  1729.         end
  1730.     end
  1731.     for j = 1, 3 do
  1732.         T:turnRight(1)
  1733.         for i = 1, 32 do
  1734.             if level == 14 then
  1735.                 T:go("FMxLhR")
  1736.             else
  1737.                 T:go("FxkLhR")
  1738.             end
  1739.         end
  1740.     end
  1741.     T:turnRight(1)
  1742.     for i = 1, 15 do
  1743.         if level == 14 then
  1744.             T:go("FMxLhR")
  1745.         else
  1746.             T:go("FxkLhR")
  1747.         end
  1748.     end
  1749.     T:go("FxD")
  1750.     --clear 33 x 33 square at floor level and place torches
  1751.     for i = 1, 7 do
  1752.         T:go("FOLhRRhL")
  1753.     end
  1754.     T:go("FOLhRUxTFDOLhRRhL")
  1755.     for i = 1, 6  do
  1756.         T:go("FOLhRRhL")
  1757.     end
  1758.     for j = 1, 3 do
  1759.         T:go("FOLhRRhLUxTRFDO")
  1760.         for i = 1, 6 do
  1761.             T:go("FOLhRRhL")
  1762.         end
  1763.         T:go("FOLhRUxTFDOLhRRhL") --torch in mid path
  1764.         for i = 1, 6 do
  1765.             T:go("FOLhRRhL")
  1766.         end
  1767.         T:go("FOLhRUxTFDOLhR")
  1768.         for i = 1, 6 do
  1769.             T:go("FOLhRRhL")
  1770.         end
  1771.         T:go("FOLhRUxTFDOLhRRhL")
  1772.         for i = 1, 6 do
  1773.             T:go("FOLhRRhL")
  1774.         end
  1775.     end
  1776.     T:go("FOLhRRhLUxTRFDO")
  1777.     for i = 1, 6 do
  1778.         T:go("FOLhRRhL")
  1779.     end
  1780.     T:go("FOLhRUxTFDOLhRRhL")
  1781.     for i = 1, 6 do
  1782.         T:go("FOLhRRhL")
  1783.     end
  1784.     T:forward(1)
  1785.     --empty rubbish
  1786.     T:up(1)
  1787.     T:turnRight(1)
  1788.     T:forward(16)
  1789.     T:emptyTrash("down")
  1790.     T:go("LFL")
  1791.    
  1792.     -- mine 1 of 4 quarters
  1793.     for j = 1, 8 do
  1794.         for i = 1, 15 do
  1795.             T:forward(1)
  1796.             T:go("N")
  1797.             T:go("Q")
  1798.         end
  1799.         T:go("FRFR")
  1800.         for i = 1, 15 do
  1801.             T:forward(1)
  1802.             T:go("N")
  1803.             T:go("Q")
  1804.         end
  1805.         if j < 8 then
  1806.             T:go("FLFL")
  1807.         end
  1808.     end
  1809.     T:go("FR")
  1810.     T:forward(16)
  1811.     T:emptyTrash("down")
  1812.     T:go("FR")
  1813.     -- mine 2 of 4 quarters
  1814.     for j = 1, 8 do
  1815.         for i = 1, 15 do
  1816.             T:forward(1)
  1817.             T:go("N")
  1818.             T:go("Q")
  1819.         end
  1820.         T:go("FLFL")
  1821.         for i = 1, 15 do
  1822.             T:forward(1)
  1823.             T:go("N")
  1824.             T:go("Q")
  1825.         end
  1826.         if j < 8 then
  1827.             T:go("FRFR")
  1828.         end
  1829.     end
  1830.     T:go("FL")
  1831.     T:forward(16)
  1832.     T:emptyTrash("down")
  1833.     T:go("FR")
  1834.     -- mine 3 of 4 quarters
  1835.     for j = 1, 8 do
  1836.         for i = 1, 15 do
  1837.             T:forward(1)
  1838.             T:go("N")
  1839.             T:go("Q")
  1840.         end
  1841.         T:go("FLFL")
  1842.         for i = 1, 15 do
  1843.             T:forward(1)
  1844.             T:go("N")
  1845.             T:go("Q")
  1846.         end
  1847.         if j < 8 then
  1848.             T:go("FRFR")
  1849.         end
  1850.     end
  1851.     T:go("FL")
  1852.     T:forward(16)
  1853.     T:emptyTrash("down")
  1854.     T:go("FL")
  1855.     -- mine 4 of 4 quarters
  1856.     for j = 1, 8 do
  1857.         for i = 1, 15 do
  1858.             T:forward(1)
  1859.             T:go("N")
  1860.             T:go("Q")
  1861.         end
  1862.         T:go("FRFR")
  1863.         for i = 1, 15 do
  1864.             T:forward(1)
  1865.             T:go("N")
  1866.             T:go("Q")
  1867.         end
  1868.         if j < 8 then
  1869.             T:go("FLFL")
  1870.         end
  1871.     end
  1872.     T:go("FR")
  1873.     T:forward(16)
  1874.     T:emptyTrash("down")
  1875.     T:turnLeft(1)
  1876.     T:forward(16)
  1877.     T:turnRight(2)
  1878.     while T:getY() < coordHome:getY() do
  1879.         T:up(1)
  1880.     end
  1881.     T:forward(16)
  1882.     T:turnRight(2)
  1883.     saveToLog("goMining() Level "..level.." completed", true)
  1884. end
  1885.  
  1886. function goToWater(goDirection)
  1887.     local startX = T:getX()
  1888.     local startZ = T:getZ()
  1889.     local itemSlot = 0
  1890.    
  1891.     saveToLog("goToWater() started", true)
  1892.     --x=-154 y=64 z=-2 f=3
  1893.     --water x=-149 y=63 z=-8
  1894.     if goDirection == "x" then
  1895.         if T:getX() < water:getX() then
  1896.             while T:getFacing() ~= 3 do
  1897.                 T:turnRight(1)
  1898.             end
  1899.             while T:getX() < water:getX() do
  1900.                 safeRun(1)
  1901.                 itemSlot = T:getItemSlot("minecraft:water_bucket")
  1902.                 if itemSlot > 0 then
  1903.                     saveToLog("Water collected at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1904.                 end
  1905.                 if T:getX() < startX then --going wrong way
  1906.                     T:turnRight(2)
  1907.                 end
  1908.             end
  1909.         elseif T:getX() > water:getX() then
  1910.             while T:getFacing() ~= 1 do
  1911.                 T:turnRight(1)
  1912.             end
  1913.             while T:getX() > water:getX() do
  1914.                 safeRun(1)
  1915.                 itemSlot = T:getItemSlot("minecraft:water_bucket")
  1916.                 if itemSlot > 0 then
  1917.                     saveToLog("Water collected at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1918.                 end
  1919.                 if T:getX() > startX then --going wrong way
  1920.                     T:turnRight(2)
  1921.                 end
  1922.             end
  1923.         end
  1924.     elseif goDirection == "y" then
  1925.         while T:getY() > water:getY() do
  1926.             T:down(1)
  1927.         end
  1928.         while T:getY() < water:getY() do --
  1929.             T:up(1) -- back to ground level at home
  1930.         end
  1931.     elseif goDirection == "z" then
  1932.         if T:getZ() > water:getZ() then -- go north
  1933.             while T:getFacing() ~= 2 do
  1934.                 T:turnRight(1)
  1935.             end
  1936.             while T:getZ() > water:getZ() do
  1937.                 safeRun(1)
  1938.                 itemSlot = T:getItemSlot("minecraft:water_bucket")
  1939.                 if itemSlot > 0 then
  1940.                     saveToLog("Water collected at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1941.                 end
  1942.                 if T:getZ() > startZ then --going wrong way
  1943.                     T:turnRight(2)
  1944.                 end
  1945.             end
  1946.         elseif T:getZ() < water:getZ() then
  1947.             while T:getFacing() ~= 0 do
  1948.                 T:turnRight(1)
  1949.             end
  1950.             while T:getZ() < water:getZ() do
  1951.                 safeRun(1)
  1952.                 itemSlot = T:getItemSlot("minecraft:water_bucket")
  1953.                 if itemSlot > 0 then
  1954.                     saveToLog("Water collected at: x="..T:getX()..", y="..T:getY()..", z="..T:getZ(),true)
  1955.                 end
  1956.                 if T:getZ() < startZ then --going wrong way
  1957.                     T:turnRight(2)
  1958.                 end
  1959.             end
  1960.         end
  1961.     end
  1962.     saveToLog("goToWater() completed", true)
  1963. end
  1964.  
  1965. function harvestAllTrees()
  1966.     -- create a 33 x 33 square with base camp in the centre
  1967.     --      - make sure on solid ground
  1968.     --      - If wood in front harvest tree.
  1969.     --      - else if leaves in front dig then move
  1970.     --      - else any other block climb up and over
  1971.     -- move in a spiral
  1972.     local numReeds = 0
  1973.     local numSand = 0
  1974.     local numLogs = 0
  1975.     local numSaplings = 0
  1976.     local waterFound  = false
  1977.     local stockData = {}
  1978.     local doContinue = true
  1979.    
  1980.    
  1981.     saveToLog("harvestAllTrees() Starting...", true)
  1982.     harvestRun(1) -- move 1 blocks
  1983.     T:turnRight(1)
  1984.     harvestRun(1, true)
  1985.     T:turnRight(1) --now facing south, ready to continue spiral
  1986.     numArms = 32 --32 for full version 4 for testing
  1987.     for i = 2, numArms, 2 do -- 2,4,6,8...32
  1988.         if i < 5 then
  1989.             harvestRun(i, true)
  1990.         else
  1991.             harvestRun(i)
  1992.         end    
  1993.         T:turnRight(1)
  1994.         if i < 5 then
  1995.             harvestRun(i, true)
  1996.         else
  1997.             harvestRun(i)
  1998.         end
  1999.         T:turnRight(1)
  2000.         if i < 5 then
  2001.             harvestRun(i + 1, true)
  2002.         else
  2003.             harvestRun(i + 1)
  2004.         end
  2005.         T:turnRight(1) --full square completed. Can return if supplies sufficient
  2006.         if i + 1 < numArms then
  2007.             -- toDo
  2008.             -- choose point to break
  2009.             saveToLog("harvestAllTrees() spiral arm no: "..i, true)
  2010.             stockData = T:getStock("minecraft:reeds")
  2011.             numReeds = stockData.count
  2012.             stockData =  T:getStock("minecraft:sand")
  2013.             numSand = stockData.count
  2014.             stockData =  T:getStock("minecraft:sapling")
  2015.             numSaplings = stockData.count
  2016.             numLogs = T:getLogStock()
  2017.             waterFound = treeFarm:getWaterFound()
  2018.             saveToLog("reeds = "..numReeds..", sand = "..numSand..", logs = "..numLogs..", Water found = "..tostring(waterFound),true)
  2019.             if numReeds >= 3 and numSand >= 6 and numLogs >= 40 and treeFarm:getWaterFound() then
  2020.                 if (numLogs >= 30 and numSaplings >=4) or (numLogs > 60 and numSaplings == 0)then
  2021.                     doContinue = false
  2022.                     saveToLog("harvestAllTrees() Abandoned after "..i.." spiral arms: Supplies sufficient", true)
  2023.                     --return to starting position
  2024.                     harvestRun(i / 2)
  2025.                     T:turnRight(1)
  2026.                     harvestRun(i / 2 + 1)
  2027.                     T:turnRight(2)
  2028.                     break
  2029.                 end
  2030.             end
  2031.             if i < 2 then
  2032.                 harvestRun(i + 1, true)
  2033.             else
  2034.                 harvestRun(i + 1)
  2035.             end
  2036.             T:turnRight(1)
  2037.         else -- i + 1 >= 32 (i = 32)
  2038.             --return to starting position
  2039.             harvestRun(i / 2)
  2040.             T:turnRight(1)
  2041.             harvestRun(i / 2 + 1)
  2042.         end
  2043.     end
  2044.     if doContinue then
  2045.         T:turnRight(2)
  2046.         saveToLog("harvestAllTrees() Completed", true)
  2047.     end
  2048.     saveToLog("Saving Status: '2'", true)
  2049.     saveStatus("2")
  2050. end
  2051.  
  2052. function harvestAndReplant()
  2053.     if T:isValuable("forward") then -- log in front
  2054.         harvestTree()
  2055.     else
  2056.         turtle.select(1)
  2057.         T:forward(1) --sapling harvested if still present
  2058.     end
  2059.     itemSlot = T:getItemSlot("minecraft:sapling")
  2060.     if itemSlot > 0 then -- move up, plant sapling, move forward and down
  2061.         T:up(1)
  2062.         turtle.select(itemSlot)
  2063.         turtle.placeDown()
  2064.         T:forward(1)
  2065.         T:down(1)
  2066.     else
  2067.         T:forward(1) --no sapling so simply move forward
  2068.     end
  2069. end
  2070.  
  2071. function harvestFirstTree()
  2072.     local treeHeight = 0
  2073.     local isBranched = false
  2074.     -- craft a chest first, then continue to harvest leaves and logs
  2075.     saveToLog("harvestFirstTree() Starting...", true)
  2076.     turtle.select(1) -- select slot 1
  2077.     turtle.dig()     -- dig base of tree
  2078.     turtle.craft()   -- craft log to planks
  2079.     turtle.refuel()  --
  2080.     T:forward(1) -- go under tree
  2081.     -- dig 2 more logs to make a chest
  2082.     T:up(1)
  2083.     treeHeight = treeHeight + 1
  2084.     turtle.digUp()
  2085.     turtle.craft() -- make logs into planks
  2086.     turtle.transferTo(2,1) -- move planks into correct slots
  2087.     turtle.transferTo(3,1)
  2088.     turtle.transferTo(5,1)
  2089.     turtle.transferTo(7,1)
  2090.     turtle.transferTo(9,1)
  2091.     turtle.transferTo(10,1)
  2092.     turtle.transferTo(11,1)
  2093.     turtle.craft() --create chest
  2094.    
  2095.     treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2096.     --repeat to move up 3 more blocks in case branched tree has gaps
  2097.     if isBranched then
  2098.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2099.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2100.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2101.     end
  2102.     -- At top of the tree. New loop to return to ground
  2103.     while not turtle.detectDown() do -- While nothing detected below
  2104.         T:down(1) -- Go down
  2105.     end
  2106.    
  2107.     if isBranched then
  2108.         harvestTreeBranches(treeHeight)
  2109.     end
  2110.     saveToLog("harvestFirstTree() Completed. Saving status '1'", true)
  2111.     saveStatus("1")
  2112. end
  2113.  
  2114. function harvestRun(runLength, digDirt)
  2115.     local itemSlot = 0
  2116.     local logType = ""
  2117.     local startFile = ""
  2118.     local data = {} --initialise empty table variable
  2119.     local success = false
  2120.     local relX = 0
  2121.     local relZ = 0
  2122.     local data = {}
  2123.    
  2124.     turtle.select(1)
  2125.     for i = 1, runLength do
  2126.         while not turtle.inspectDown() do -- must be air below
  2127.             turtle.suckDown()
  2128.             T:down(1)
  2129.         end
  2130.         data = T:getBlockType("down")
  2131.         if data.name == "minecraft:sand" then
  2132.             itemSlot = T:getItemSlot("minecraft:sand")
  2133.             if itemSlot > 0 then
  2134.                 if turtle.getItemCount(itemSlot) < 6 then
  2135.                     harvestSand()
  2136.                 end
  2137.             else
  2138.                 harvestSand()
  2139.             end
  2140.         elseif data.name == "minecraft:flowing_water" or data.name == "minecraft:water" then
  2141.             if data.modifier == 0 then -- source block
  2142.                 if water:getX() == 0 then -- water coords not yet found
  2143.                     saveToLog("Water source found: checking suitability", true)
  2144.                     relX = math.abs(math.abs(T:getX()) - math.abs(coordHome:getX()))
  2145.                     relZ = math.abs(math.abs(T:getZ()) - math.abs(coordHome:getZ()))
  2146.                     saveToLog("Water found: x="..T:getX().."rel X="..relX..", z="..T:getZ()..", rel Z="..relZ, true)
  2147.                     if relX > 5 and relZ > 5 then
  2148.                         if checkWaterCoordsOK(T:getX(),T:getZ()) then
  2149.                             water:setX(T:getX())
  2150.                             water:setY(T:getY())
  2151.                             water:setZ(T:getZ())
  2152.                             water:setFacing(T:getFacing())
  2153.                             -- create/overwrite 'waterCoords.txt'
  2154.                             startFile = fs.open("waterCoords.txt", "w")
  2155.                             startFile.writeLine("x="..T:getX())
  2156.                             startFile.writeLine("y="..T:getY())
  2157.                             startFile.writeLine("z="..T:getZ())
  2158.                             startFile.close()
  2159.                             treeFarm:setWaterFound(true)
  2160.                             saveToLog("Water confirmed and saved to file x="..water:getX()..", y="..water:getY()..", z="..water:getZ(), true)
  2161.                         else
  2162.                             saveToLog("Water coords not suitable x="..water:getX()..", y="..water:getY()..", z="..water:getZ(), true)
  2163.                         end
  2164.                     else
  2165.                         saveToLog("Water found: too close to base camp (rel X="..relX..", rel Z="..relZ..")", true)
  2166.                     end
  2167.                 end
  2168.             end
  2169.         end
  2170.         data = T:getBlockType("up")
  2171.         if  data.name == "minecraft:log" then
  2172.             T:back(1)
  2173.             harvestTree()
  2174.         end
  2175.         if digDirt and i < 5 then
  2176.             turtle.select(1)
  2177.             if T:getY() == coordHome:getY() then
  2178.                 turtle.digUp()
  2179.                 turtle.digDown()
  2180.             end
  2181.         end
  2182.         turtle.suck()
  2183.        
  2184.         if turtle.detect() then --can't move forward
  2185.             data = T:getBlockType("forward")
  2186.             if  data.name == "minecraft:log" then
  2187.                 harvestTree()
  2188.                 T:back(1)
  2189.             elseif data.name == "minecraft:reeds" then
  2190.                 saveToLog("Reeds found", true)
  2191.                 while  data.name == "minecraft:reeds" do -- continue loop while reeds detected in front
  2192.                     T:up(1)    -- Move up
  2193.                     data = T:getBlockType("forward")
  2194.                 end
  2195.                 -- At top of the Reeds/Sugar Cane.
  2196.                 T:forward(1)
  2197.                 -- New loop to return to ground
  2198.                 data  = T:getBlockType("down")
  2199.                 while data.name == "minecraft:reeds" do -- While sugar cane detected below
  2200.                     turtle.digDown()
  2201.                     T:down(1)
  2202.                     data = T:getBlockType("down")
  2203.                 end
  2204.                 T:back(1)
  2205.             -- check if leaves or grass in front, dig through  
  2206.             else --any block except log or reeds
  2207.                 if isVegetation(data.name) then -- tallgrass,flower, vine etc
  2208.                     turtle.dig()
  2209.                 else
  2210.                     while turtle.detect() do
  2211.                         T:up(1)
  2212.                         data = T:getBlockType("forward")
  2213.                         if isVegetation(data.name) then -- tallgrass,flower, vine etc
  2214.                             break
  2215.                         elseif  data.name == "minecraft:log" then
  2216.                             harvestTree()
  2217.                             T:back(1)
  2218.                             break
  2219.                         end
  2220.                     end
  2221.                 end
  2222.             end
  2223.         end
  2224.         T:forward(1)
  2225.         -- check if wood below eg tree harvest started mid - trunk
  2226.         data = T:getBlockType("down")
  2227.         while data.name == "minecraft:log" or data.name == "minecraft:log2"  do
  2228.             T:down(1)
  2229.             data = T:getBlockType("down")
  2230.         end
  2231.     end
  2232. end
  2233.  
  2234. function harvestSand()
  2235.     local depth = 0
  2236.     local itemSlot = 0
  2237.     local data = {}
  2238.    
  2239.     saveToLog("harvestSand() started", true)
  2240.     data = T:getBlockType("down")
  2241.     while data.name == "minecraft:sand" do -- While sand detected below
  2242.         turtle.digDown()
  2243.         T:down(1)
  2244.         depth = depth - 1
  2245.         data = T:getBlockType("down")
  2246.     end
  2247.    
  2248.     while depth < 0 do
  2249.         T:up(1)
  2250.         depth = depth + 1
  2251.         itemSlot = T:getItemSlot("minecraft:dirt")
  2252.         if itemSlot > 0 then
  2253.             turtle.select(itemSlot)
  2254.             turtle.placeDown()
  2255.             turtle.select(1)
  2256.         end
  2257.     end
  2258.     saveToLog("harvestSand() completed", true)
  2259. end
  2260.  
  2261. function harvestTree()
  2262.     turtle.select(1)
  2263.     turtle.dig()       -- dig base of tree
  2264.     T:forward(1) -- go under tree
  2265.    
  2266.     local treeHeight, isBranched = harvestTrunk(0, false)
  2267.     --repeat to move up 3 more blocks in case branched tree has gaps
  2268.     if isBranched then
  2269.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2270.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2271.         treeHeight, isBranched = harvestTrunk(treeHeight, isBranched)
  2272.     end
  2273.  
  2274.     -- At top of the tree. New loop to return to ground
  2275.     while not turtle.detectDown() do -- While nothing detected below
  2276.         T:down(1) -- Go down
  2277.     end
  2278.    
  2279.     if isBranched then
  2280.         harvestTreeBranches(treeHeight)
  2281.     end
  2282. end
  2283.  
  2284. function harvestTreeBranches(treeHeight)
  2285.     T:up(treeHeight)
  2286.     while not turtle.detectDown() do
  2287.         for i = 1, 4 do
  2288.             if T:isLog("forward") then -- check if log in front
  2289.                 harvestWholeTree("forward")
  2290.             end
  2291.             T:turnRight(1)
  2292.         end
  2293.         T:down(1)
  2294.     end
  2295. end
  2296.  
  2297. function harvestTrunk(treeHeight, isBranched)    
  2298.     local data = {}
  2299.     repeat  
  2300.         -- Inner loop to check for leaves
  2301.         for i = 1, 4 do
  2302.             if T:isLog("forward") then -- check if log in front
  2303.                 isBranched = true
  2304.             else
  2305.                 data = T:getBlockType("forward")
  2306.                 if data.name == "minecraft:leaves" then
  2307.                     turtle.dig()
  2308.                 end
  2309.             end
  2310.             T:turnRight(1)
  2311.         end
  2312.         T:up(1)    -- Move up
  2313.         treeHeight = treeHeight + 1
  2314.     until not turtle.detectUp() -- continue loop while block detected above
  2315.    
  2316.     return treeHeight, isBranched
  2317. end
  2318.  
  2319. function harvestWholeTree(direction)   
  2320.     --RECURSIVE FUNCTION - BEWARE!
  2321.     local data = {}
  2322.     if direction == "up" then
  2323.         if turtle.getFuelLevel() < 10 then
  2324.             turtle.select(1)
  2325.         end
  2326.         if T:isLog("up") then
  2327.             T:up(1)
  2328.             if T:isLog("up") then
  2329.                 harvestWholeTree("up")
  2330.             end
  2331.         end
  2332.         for i = 1, 4 do
  2333.             -- check all round
  2334.             if T:isLog("forward") then
  2335.                 harvestWholeTree("forward")
  2336.             else
  2337.                 data = T:getBlockType("forward")
  2338.                 if data.name == "minecraft:leaves" then
  2339.                     T:forward(1)
  2340.                     harvestWholeTree("forward")
  2341.                     T:back(1)
  2342.                 end
  2343.             end
  2344.             T:turnRight(1)
  2345.         end
  2346.         T:down(1)
  2347.         for i = 1, 4 do
  2348.             -- check all round
  2349.             if T:isLog("forward") then
  2350.                 harvestWholeTree("forward")
  2351.             else
  2352.                 data = T:getBlockType("forward")
  2353.                 if data.name == "minecraft:leaves" then
  2354.                     T:forward(1)
  2355.                     harvestWholeTree("forward")
  2356.                     T:back(1)
  2357.                 end
  2358.             end
  2359.             T:turnRight(1)
  2360.         end
  2361.     elseif direction == "forward" then
  2362.         if T:isLog("forward") then
  2363.             if turtle.getFuelLevel() < 10 then
  2364.                 turtle.select(1)
  2365.             end
  2366.            
  2367.             T:forward(1)
  2368.             if turtle.detectUp() then
  2369.                 turtle.digUp()
  2370.             end
  2371.             if T:isLog("forward") then
  2372.                 harvestWholeTree("forward")
  2373.             end
  2374.             --check left side
  2375.             T:turnLeft(1)
  2376.             if T:isLog("forward") then
  2377.                 harvestWholeTree("forward")
  2378.             end
  2379.             -- check right side
  2380.             T:turnRight(2)
  2381.             if T:isLog("forward") then
  2382.                 harvestWholeTree("forward")
  2383.             end
  2384.             T:turnLeft(1)
  2385.             T:back(1)
  2386.         end
  2387.     end
  2388. end
  2389.  
  2390. function harvestTreeFarm()
  2391.     local itemSlot = 0
  2392.    
  2393.     saveToLog("harvestTreeFarm() started", true)
  2394.     treeFarm:reset()
  2395.     T:go("RFFD")
  2396.     turtle.select(1)
  2397.     while turtle.suckDown() do  -- get saplings from chest
  2398.    
  2399.     end
  2400.     T:go("UUUFFFLFF")
  2401.     harvestAndReplant()
  2402.     T:forward(1)
  2403.     harvestAndReplant()
  2404.     T:go("RFFFR")
  2405.     harvestAndReplant()
  2406.     T:forward(1)
  2407.     harvestAndReplant()
  2408.     T:go("FFRFFFFFFDDD")
  2409.     --store any remaining saplings
  2410.     dropItem("minecraft:sapling", 0)
  2411.     T:go("UFFR")
  2412.     --get rid of any apples
  2413.     if T:getItemSlot("minecraft:apple") > 0 then
  2414.         turtle.select(T:getItemSlot("minecraft:apple"))
  2415.         turtle.drop()
  2416.     end
  2417.     treeFarm:setTimePlanted(os.time())
  2418.     saveStatus("treeFarm")
  2419.     saveToLog("harvestTreeFarm() completed", true)
  2420. end
  2421.  
  2422. function initialise()
  2423.     -- create classes/objects
  2424.     T = classTurtleObject() -- usage: T:forward(5), T:up(2), T:go("RRFFFFFDDx")
  2425.     coordHome = classCoordObject("homeLocation")
  2426.     mineEntrance = classCoordObject("mineEntrance")
  2427.     water = classCoordObject("water")
  2428.     fso = classLogfileObject("selfReplicateLog.txt")
  2429.     fso:setUseLog(true)
  2430.     saveToLog("Log File Created", true)
  2431.     treeFarm = classTreeFarmObject()
  2432.     loadStatus("treeFarm")
  2433.     -- set global variables.
  2434.     pastebinCode = "2Krm3Yva"
  2435. end
  2436.  
  2437. function isVegetation(blockName)
  2438.     local isVeg = false
  2439.     local vegList = {"minecraft:tallgrass", "minecraft:deadbush", "minecraft:cactus", "minecraft:leaves",
  2440.                      "minecraft:pumpkin", "minecraft:melon_block", "minecraft:vine", "minecraft:mycelium", "minecraft:waterliliy",
  2441.                      "minecraft:cocoa", "minecraft:double_plant", "minecraft:sponge", "minecraft:wheat"}
  2442.    
  2443.     -- check for flower, mushroom
  2444.     if string.find(blockName, "flower") ~= nil or string.find(blockName, "mushroom") ~= nil then
  2445.         isVeg = true
  2446.     end
  2447.     if not isVeg then
  2448.         for _,v in pairs(vegList) do
  2449.             if v == blockName then
  2450.                 isVeg = true
  2451.                 break
  2452.             end
  2453.         end
  2454.     end
  2455.    
  2456.     return isVeg
  2457. end
  2458.  
  2459. function loadStatus(obj)
  2460.     local fileHandle = ""
  2461.     local strText = ""
  2462.    
  2463.     if obj == "treeFarm" then
  2464.         if fs.exists("treeFarm.txt") then
  2465.             fileHandle = fs.open("treeFarm.txt", "r")
  2466.             strText = fileHandle.readLine()
  2467.             if strText == "true" then
  2468.                 treeFarm:setPondFilled(true)
  2469.             end
  2470.             strText = fileHandle.readLine()
  2471.             if strText == "true" then
  2472.                 treeFarm:setFarmCreated(true)
  2473.             end
  2474.             strText = fileHandle.readLine()
  2475.             if strText == "true" then
  2476.                 treeFarm:setHopperPlaced(true)
  2477.             end
  2478.             strText = fileHandle.readLine()
  2479.             if strText == "true" then
  2480.                 treeFarm:setFarmFlooded(true)
  2481.             end
  2482.             strText = fileHandle.readLine()
  2483.             treeFarm:setTimePlanted(tonumber(strText))
  2484.             fileHandle.close()
  2485.         end
  2486.     else
  2487.         -- obj = "currentStatus.txt"
  2488.         strText = "0"
  2489.         if fs.exists(obj) then
  2490.             fileHandle = fs.open(obj, "r")
  2491.             strText = fileHandle.readLine()
  2492.             fileHandle.close()
  2493.         end
  2494.     end
  2495.    
  2496.     return strText
  2497. end
  2498.  
  2499. function mineCorridor(length, torchesAt, doNotPlug, doReturn)
  2500.     local placeBlock = false
  2501.     local data = {}
  2502.     local stockData = {}
  2503.     -- torchesAt[1] = true, torchesAt[2] = false
  2504.     -- length = length of corridor, torchesAt = position of torches, doNotPlug  = place block above entrance to corridor
  2505.     -- doReturn = return same distance as length
  2506.     for i = 1, length do
  2507.         if turtle.detectUp() then --block above
  2508.             if T:isValuable("up") then --could be useful, so dig and replace with cobble
  2509.                 mineItem(true, "up")
  2510.                 placeBlock = true
  2511.             end
  2512.         else --no block above or lava/water, so place cobble
  2513.             placeBlock = true
  2514.             if doNotPlug and i == 1 then --don't plug mine entrance
  2515.                 placeBlock = false
  2516.             end
  2517.         end
  2518.         if placeBlock then
  2519.             stockData = T:getStock("minecraft:cobblestone")
  2520.             if stockData.count > 0 then
  2521.                 turtle.select(stockData.primarySlot)
  2522.                 turtle.placeUp()
  2523.             else
  2524.                 stockData = T:getStock("minecraft:dirt")
  2525.                 if stockData.count > 0 then
  2526.                     turtle.select(stockData.primarySlot)
  2527.                     turtle.placeUp()
  2528.                 end
  2529.             end
  2530.             placeBlock = false
  2531.         end
  2532.         turtle.select(1)
  2533.         if turtle.detectDown() then
  2534.             turtle.digDown()
  2535.         else --nothing below could be air, water, lava
  2536.             if T:getItemSlot("minecraft:bucket") > 0 then
  2537.                 data = T:getBlockType("down")
  2538.                 if data.name == "minecraft:flowing_lava" then
  2539.                     turtle.select(T:getItemSlot("minecraft:bucket"))
  2540.                     if turtle.placeDown() then --bucket filled lava
  2541.                         if turtle.refuel() then --lava
  2542.                             sleep(2)
  2543.                             while turtle.placeDown() do
  2544.                                 if not turtle.refuel() then --lava
  2545.                                     break
  2546.                                 end
  2547.                                 sleep(2)
  2548.                                 if turtle.getFuelLevel() > 10000 then
  2549.                                     break
  2550.                                 end
  2551.                             end
  2552.                         end
  2553.                     end
  2554.                 end
  2555.             end
  2556.         end
  2557.         turtle.select(1)
  2558.         if torchesAt[i] then
  2559.             if T:getItemSlot("minecraft:torch") > 0 then
  2560.                 T:go("DxCUxT")
  2561.             end
  2562.         end
  2563.         if i < length then
  2564.             if T:isValuable("forward") then
  2565.                 mineItem(true, "forward")
  2566.             end
  2567.             T:forward(1)
  2568.         end
  2569.     end
  2570.     if doReturn then
  2571.         T:turnRight(2)
  2572.         T:forward(length)
  2573.         T:turnRight(2)
  2574.     end
  2575. end
  2576.  
  2577. function mineItem(do3D, direction) 
  2578.     local doContinue = true
  2579.     local mineIt = false
  2580.     local blockType = ""
  2581.  
  2582.     --RECURSIVE FUNCTION - BEWARE!
  2583.    
  2584.     -- check if block in front is valuable. If so mine it
  2585.     -- direction only up/down if already called recursively
  2586.     if direction == "up" then
  2587.         mineIt, blockType = T:isValuable("up")
  2588.         if mineIt then
  2589.             turtle.select(1)
  2590.             turtle.digUp()
  2591.             sleep(0.5)
  2592.             while turtle.detectUp() do
  2593.                 turtle.digUp()
  2594.                 sleep(0.5)
  2595.             end
  2596.         end
  2597.         -- move up into space dug out
  2598.         T:up(1)
  2599.         -- check if item in front is valuable
  2600.         mineIt, blockType = T:isValuable("forward")
  2601.         if mineIt then
  2602.             mineItem(do3D, "forward")
  2603.         end
  2604.         --check right side
  2605.         T:turnRight(1)
  2606.         mineIt, blockType = T:isValuable("forward")
  2607.         if mineIt then
  2608.             mineItem(do3D, "forward")
  2609.         end
  2610.         --check behind
  2611.         T:turnRight(1)
  2612.         mineIt, blockType = T:isValuable("forward")
  2613.         if mineIt then
  2614.             mineItem(do3D, "forward")
  2615.         end
  2616.         --check left side
  2617.         T:turnRight(1)
  2618.         mineIt, blockType = T:isValuable("forward")
  2619.         if mineIt then
  2620.             mineItem(do3D, "forward")
  2621.         end
  2622.         --return to front
  2623.         T:turnRight(1)
  2624.         T:down(1)
  2625.     end
  2626.     if direction == "down" then
  2627.         mineIt, blockType = T:isValuable("down")
  2628.         if mineIt then
  2629.             turtle.select(1)
  2630.             turtle.digDown()
  2631.         end
  2632.         -- move down into space dug out
  2633.         T:down(1)
  2634.         -- check if item in front is valuable
  2635.         mineIt, blockType = T:isValuable("forward")
  2636.         if mineIt then
  2637.             mineItem(do3D, "forward")
  2638.         end
  2639.         --check right side
  2640.         T:turnRight(1)
  2641.         mineIt, blockType = T:isValuable("forward")
  2642.         if mineIt then
  2643.             mineItem(do3D, "forward")
  2644.         end
  2645.         --check behind
  2646.         T:turnRight(1)
  2647.         mineIt, blockType = T:isValuable("forward")
  2648.         if mineIt then
  2649.             mineItem(do3D, "forward")
  2650.         end
  2651.         --check left side
  2652.         T:turnRight(1)
  2653.         mineIt, blockType = T:isValuable("forward")
  2654.         if mineIt then
  2655.             mineItem(do3D, "forward")
  2656.         end
  2657.         --return to front
  2658.         T:turnRight(1)
  2659.         T:up(1)
  2660.     end
  2661.     if direction == "forward" then
  2662.         mineIt, blockType = T:isValuable("forward")
  2663.         if mineIt then
  2664.             T:forward(1)
  2665.             mineIt, blockType = T:isValuable("up")
  2666.             if mineIt then
  2667.                 if do3D then
  2668.                     mineItem(do3D, "up")
  2669.                 else
  2670.                     turtle.select(1)
  2671.                     turtle.digUp()
  2672.                 end
  2673.             end
  2674.             mineIt, blockType = T:isValuable("down")
  2675.             if mineIt then
  2676.                 if do3D then
  2677.                     mineItem(do3D, "down")
  2678.                 else
  2679.                     turtle.select(1)
  2680.                     turtle.digDown()
  2681.                 end
  2682.             end
  2683.             -- check if item in front is valuable
  2684.             mineIt, blockType = T:isValuable("forward")
  2685.             if mineIt then
  2686.                 mineItem(do3D, "forward")
  2687.             end
  2688.             --check left side
  2689.             T:turnLeft(1)
  2690.             mineIt, blockType = T:isValuable("forward")
  2691.             if mineIt then
  2692.                 mineItem(do3D, "forward")
  2693.             end
  2694.             -- check right side
  2695.             T:turnRight(2)
  2696.             mineIt, blockType = T:isValuable("forward")
  2697.             if mineIt then
  2698.                 mineItem(do3D, "forward")
  2699.             end
  2700.             T:turnLeft(1)
  2701.             T:back(1)
  2702.         end
  2703.     end
  2704. end
  2705.  
  2706. function mineToBedrock()
  2707.     local aboveBedrock = true
  2708.     local stockData = {}
  2709.     saveToLog("mineToBedrock() started", true)
  2710.     -- start at furnace
  2711.     T:sortInventory()
  2712.     emptyTurtle(false)
  2713.     stockData = T:getStock("minecraft:torch")
  2714.     if stockData.count < 24 then
  2715.         craftTorches(24)
  2716.     end
  2717.     T:forward(16)
  2718.     turtle.dig()
  2719.     if T:getItemSlot("minecraft:sign") > 0 then
  2720.         turtle.select(T:getItemSlot("minecraft:sign"))
  2721.         turtle.place("Diamond Mine\nMining for\nDiamonds\nTo Bedrock")
  2722.         turtle.select(1)
  2723.     end
  2724.     T:turnRight(2)
  2725.            
  2726.     while T:getY() > 5 do
  2727.         T:down(1)
  2728.     end
  2729.     turtle.digDown()
  2730.     --create cross shape
  2731.     for i = 1, 32 do
  2732.         mineToBedrockSub01(i)
  2733.     end
  2734.     T:turnRight(2)
  2735.     T:forward(16)
  2736.     T:turnRight(1) --back at centre
  2737.     for i = 1, 16 do
  2738.         mineToBedrockSub01(i)
  2739.     end
  2740.     T:turnRight(2)
  2741.     T:forward(16)
  2742.     for i = 1, 16 do
  2743.         mineToBedrockSub01(i)
  2744.     end
  2745.     T:turnRight(2)
  2746.     T:forward(16)
  2747.     T:emptyTrash("up")
  2748.     T:turnLeft(1)
  2749.     T:forward(16)
  2750.     T:turnRight(1)
  2751.     -- make 33 x 33 square
  2752.     --clear top right corner
  2753.     for i = 1, 16 do
  2754.         mineToBedrockSub01(i)
  2755.     end
  2756.     T:turnRight(1)
  2757.     for i = 1, 32 do
  2758.         mineToBedrockSub01(i)
  2759.     end
  2760.     T:turnRight(1)
  2761.     for i = 1, 32 do
  2762.         mineToBedrockSub01(i)
  2763.     end
  2764.     T:turnRight(1)
  2765.     for i = 1, 32 do
  2766.         mineToBedrockSub01(i)
  2767.     end
  2768.     T:turnRight(1)
  2769.     for i = 1, 16 do
  2770.         mineToBedrockSub01(i)
  2771.     end
  2772.     T:turnRight(1)
  2773.     T:forward(16)
  2774.     T:emptyTrash("up")
  2775.     T:go("LFL")
  2776.    
  2777.     -- mine 1 of 4 quarters
  2778.     for j = 1, 8 do
  2779.         for i = 1, 15 do --14 lines
  2780.             mineToBedrockSub02(i)
  2781.         end
  2782.         T:go("FRFR")
  2783.         if j < 8 then
  2784.             for i = 1, 15 do --14 lines
  2785.                 mineToBedrockSub02(i)
  2786.             end
  2787.             T:go("FLFL")
  2788.         else
  2789.             T:forward(16)
  2790.         end
  2791.     end
  2792.     T:turnRight(1)
  2793.     T:forward(16)
  2794.     T:emptyTrash("up")
  2795.     T:go("FR")
  2796.    
  2797.     -- mine 2 of 4 quarters
  2798.     for j = 1, 8 do
  2799.         for i = 1, 15 do --14 lines
  2800.             mineToBedrockSub02(i)
  2801.         end
  2802.         T:go("FLFL")
  2803.         if j < 8 then
  2804.             for i = 1, 15 do --14 lines
  2805.                 mineToBedrockSub02(i)
  2806.             end
  2807.             T:go("FRFR")
  2808.         else
  2809.             T:forward(16)
  2810.         end
  2811.     end
  2812.     T:turnLeft(1)
  2813.     T:forward(16)
  2814.     T:emptyTrash("up")
  2815.     T:go("FR")
  2816.    
  2817.     -- mine 3 of 4 quarters
  2818.     for j = 1, 8 do
  2819.         for i = 1, 15 do --14 lines
  2820.             mineToBedrockSub02(i)
  2821.         end
  2822.         T:go("FLFL")
  2823.         if j < 8 then
  2824.             for i = 1, 15 do --14 lines
  2825.                 mineToBedrockSub02(i)
  2826.             end
  2827.             T:go("FRFR")
  2828.         else
  2829.             T:forward(16)
  2830.         end
  2831.     end
  2832.     T:turnLeft(1)
  2833.     T:forward(16)
  2834.     T:emptyTrash("up")
  2835.     T:go("FL")
  2836.    
  2837.     -- mine 4 of 4 quarters
  2838.     for j = 1, 8 do
  2839.         for i = 1, 15 do --14 lines
  2840.             mineToBedrockSub02(i)
  2841.         end
  2842.         T:go("FRFR")
  2843.         if j < 8 then
  2844.             for i = 1, 15 do --14 lines
  2845.                 mineToBedrockSub02(i)
  2846.             end
  2847.             T:go("FLFL")
  2848.         else
  2849.             T:forward(16)
  2850.         end
  2851.     end
  2852.     T:turnRight(1)
  2853.     T:forward(16)
  2854.     T:emptyTrash("up")
  2855.    
  2856.     T:turnLeft(1)
  2857.     T:forward(16)
  2858.     T:turnRight(2)
  2859.     while T:getY() < coordHome:getY() do
  2860.         T:up(1)
  2861.     end
  2862.     T:forward(16)
  2863.     T:turnRight(2)
  2864.     saveToLog("mineToBedrock() complete. Saving Status '12'", true)
  2865.     saveStatus("12")
  2866. end
  2867.  
  2868. function mineToBedrockSub01(i)
  2869.     local aboveBedrock = false
  2870.    
  2871.     T:forward(1)
  2872.     turtle.select(1)
  2873.     repeat
  2874.         T:isValuable("down")
  2875.         aboveBedrock = T:down(1)
  2876.     until not aboveBedrock
  2877.     while T:getY() < 5 do
  2878.         T:up(1)
  2879.         if T:getY() <= 4 then
  2880.             if T:getItemSlot("minecraft:cobblestone") > 0 then
  2881.                 turtle.select(T:getItemSlot("minecraft:cobblestone"))
  2882.                 turtle.placeDown()
  2883.             end
  2884.         end
  2885.     end
  2886.     if i == 8 or i == 16 or i == 24 or i == 32 then
  2887.         turtle.select(T:getItemSlot("minecraft:torch"))
  2888.         turtle.placeDown()
  2889.     end
  2890. end
  2891.  
  2892. function mineToBedrockSub02(i)
  2893.     local aboveBedrock = true
  2894.    
  2895.     T:forward(1)
  2896.     if turtle.detectUp() then
  2897.         if T:isValuable("up") then
  2898.             turtle.select(1)
  2899.             turtle.digUp()
  2900.             if T:getItemSlot("minecraft:cobblestone") > 0 then
  2901.                 turtle.select(T:getItemSlot("minecraft:cobblestone"))
  2902.                 turtle.placeUp()
  2903.             end
  2904.         end
  2905.     else
  2906.         if T:getItemSlot("minecraft:cobblestone") > 0 then
  2907.             turtle.select(T:getItemSlot("minecraft:cobblestone"))
  2908.             turtle.placeUp()
  2909.         end
  2910.     end
  2911.     turtle.select(1)
  2912.     repeat
  2913.         T:isValuable("down") --clear space for valuable items
  2914.         aboveBedrock = T:down(1)
  2915.     until not aboveBedrock
  2916.     while T:getY() < 5 do
  2917.         T:up(1)
  2918.         if T:getY() <= 4 then
  2919.             if T:getItemSlot("minecraft:cobblestone") > 0 then
  2920.                 turtle.select(T:getItemSlot("minecraft:cobblestone"))
  2921.                 turtle.placeDown()
  2922.             end
  2923.         end
  2924.     end
  2925. end
  2926.  
  2927. function placeStorage()
  2928.     -- Chest1 sticks
  2929.     -- Chest2 logs
  2930.     -- chest3 cobblestone
  2931.     -- chest4 sand, reeds
  2932.     -- chest5 iron ore
  2933.     -- chest6 redstone
  2934.     -- chest7 diamond
  2935.     -- chest8 dirt, misc
  2936.     -- chest9 saplings (placed right side of furnace)
  2937.  
  2938.     -- make 9 chests need 18 logs
  2939.     -- this function runs when all trees harvested locally
  2940.     saveToLog("placeStorage() Starting...", true)
  2941.     T:craftChests(9, false)
  2942.     T:go("RFFDxHURRFFR")
  2943.     T:go("xH FuxC")
  2944.     for i = 2, 8 do
  2945.         T:go("FuxH FuxC")
  2946.     end
  2947.     T:go("FuxC RFuxCR")
  2948.     for i = 1, 14 do
  2949.         T:go("FuxC")
  2950.     end
  2951.     T:go("RFFRuxC")
  2952.     for i = 1, 14 do
  2953.         T:go("FuxC")
  2954.     end
  2955.     T:go("RFL")
  2956.     T:turnRight(2)
  2957.     T:forward(16)
  2958.     T:turnRight(2)
  2959.     saveToLog("placeStorage() Completed. Saving Status '5'", true)
  2960.     saveStatus("5")
  2961. end
  2962.  
  2963. function returnHome(goDirection)
  2964.     local startX = T:getX()
  2965.     local startZ = T:getZ()
  2966.    
  2967.     saveToLog("returnHome() started", true)
  2968.     if goDirection == "x" then
  2969.         if T:getX() <= coordHome:getX() then
  2970.             while T:getFacing() ~= 3 do
  2971.                 T:turnRight(1)
  2972.             end
  2973.             while T:getX() < coordHome:getX() do
  2974.                 safeRun(1)
  2975.             end
  2976.         elseif T:getX() > coordHome:getX() then -- eg -200 current -211 home
  2977.             while T:getFacing() ~= 1 do
  2978.                 T:turnRight(1)
  2979.             end
  2980.             while T:getX() > coordHome:getX() do
  2981.                 safeRun(1)
  2982.             end
  2983.         end
  2984.     elseif goDirection == "y" then
  2985.         while T:getY() > coordHome:getY() do
  2986.             T:down(1)
  2987.         end
  2988.         while T:getY() < coordHome:getY() do --
  2989.             T:up(1) -- back to ground level at home
  2990.         end
  2991.     elseif goDirection == "z" then
  2992.         if T:getZ() >= coordHome:getZ() then -- go north
  2993.             while T:getFacing() ~= 2 do
  2994.                 T:turnRight(1)
  2995.             end
  2996.             while T:getZ() > coordHome:getZ() do
  2997.                 safeRun(1)
  2998.             end
  2999.         elseif T:getZ() < coordHome:getZ() then
  3000.             while T:getFacing() ~= 0 do
  3001.                 T:turnRight(1)
  3002.             end
  3003.             while T:getZ() < coordHome:getZ() do
  3004.                 safeRun(1)
  3005.             end
  3006.         end
  3007.     elseif goDirection == "facing" then
  3008.         while T:getFacing() ~= coordHome:getFacing() do
  3009.             T:turnRight(1)
  3010.         end
  3011.     end
  3012.     saveToLog("returnHome() completed", true)
  3013. end
  3014.  
  3015. function safeRun(runLength)
  3016.     local itemSlot = 0
  3017.     local success = false
  3018.     local relX = 0
  3019.     local relZ = 0
  3020.     local data = {}
  3021.    
  3022.     turtle.select(1)
  3023.     for i = 1, runLength do
  3024.         if turtle.detect() then --can't move forward
  3025.             data = T:getBlockType("forward")
  3026.             if data.name ~= "minecraft:leaves" and data.name ~= "minecraft:tallgrass"
  3027.                 and data.name ~= "minecraft:double_plant" then
  3028.  
  3029.                 while turtle.detect() do
  3030.                     T:up(1)
  3031.                     data = T:getBlockType("forward")
  3032.                     if data.name == "minecraft:leaves"
  3033.                         or data.name == "minecraft:tallgrass"
  3034.                         or data.name == "minecraft:double_plant" then
  3035.                    
  3036.                         break
  3037.                     end
  3038.                 end
  3039.             end
  3040.         end
  3041.         T:forward(1)
  3042.         while not turtle.inspectDown() do -- must be air below
  3043.             T:down(1)
  3044.         end
  3045.         data = T:getBlockType("down")
  3046.         if data.name == "minecraft:flowing_water" or data.name == "minecraft:water" then
  3047.             if data.modifier == 0 then -- source block
  3048.                 --check not found recently placed water!
  3049.                 relX = math.abs(math.abs(T:getX()) - math.abs(coordHome:getX()))
  3050.                 relZ = math.abs(math.abs(T:getZ()) - math.abs(coordHome:getZ()))
  3051.                 if relX > 5 and relZ > 5 then
  3052.                     if T:getItemSlot("minecraft:bucket") > 0 then
  3053.                         if not treeFarm:getWaterFound() then
  3054.                             water:setX(T:getX())
  3055.                             water:setY(T:getY())
  3056.                             water:setZ(T:getZ())
  3057.                         end
  3058.                         treeFarm:setWaterFound(true)
  3059.                         saveToLog("Water bucket filled x="..water:getX()..", y="..water:getY()..", z="..water:getZ(), true)
  3060.                         turtle.select(T:getItemSlot("minecraft:bucket"))
  3061.                         turtle.placeDown()
  3062.                         success = true
  3063.                     end
  3064.                 end
  3065.             end
  3066.         end
  3067.     end
  3068.    
  3069.     return success
  3070. end
  3071.  
  3072. function saveStatus(obj)
  3073.     local fileHandle = ""
  3074.    
  3075.     if obj == "treeFarm" then
  3076.         fileHandle = fs.open("treeFarm.txt", "w")
  3077.         fileHandle.writeLine(tostring(treeFarm:getPondFilled()))
  3078.         fileHandle.writeLine(tostring(treeFarm:getFarmCreated()))
  3079.         fileHandle.writeLine(tostring(treeFarm:getHopperPlaced()))
  3080.         fileHandle.writeLine(tostring(treeFarm:getFarmFlooded()))
  3081.         fileHandle.writeLine(tostring(treeFarm:getTimePlanted()))
  3082.     else
  3083.         -- from e.g. saveStatus("harvestFirstTree")
  3084.         fileHandle = fs.open("currentStatus.txt", "w")
  3085.         fileHandle.writeLine(obj)    
  3086.     end
  3087.     fileHandle.close()
  3088. end
  3089.  
  3090. function saveToLog(text, toScreen)
  3091.     if toScreen == nil then
  3092.         toScreen = true
  3093.     end
  3094.     text = text or "Nil instead of text supplied, check your code!"
  3095.    
  3096.     if toScreen then
  3097.         print(text)
  3098.     end
  3099.     if fso:getUseLog() then
  3100.         fso:appendLine(text)
  3101.     end
  3102. end
  3103.  
  3104. function smelt(oreType, quantity)
  3105.     --log->charcoal, iron_ore->iron, cobblestone->stone, sand->glass
  3106.     --assume function called with turtle under furnace, at ground level
  3107.     --move next to furnace to place planks
  3108.     --move to top of furnace to place wood
  3109.     --move under furnace to remove charcoal, stone, glass, iron
  3110.     saveToLog("smelt("..oreType..", "..quantity..") started", true)
  3111.     local smeltType = ""
  3112.     local continue = true
  3113.     local waitTime = 0
  3114.     local planksNeeded = 0 --total needed for smelting
  3115.     local woodNeeded = 0
  3116.     local woodAvailable = 0
  3117.     local success = false
  3118.     local stockData = {}
  3119.    
  3120.     stockData = T:getStock("minecraft:planks")
  3121.     if stockData.count > 0 then
  3122.         turtle.select(stockData.primarySlot)
  3123.         turtle.refuel()
  3124.     end
  3125.     woodAvailable = T:getLogStock()
  3126.     planksNeeded = quantity
  3127.     if oreType == "minecraft:log" then
  3128.         woodNeeded = quantity + math.ceil(quantity / 4)
  3129.     end
  3130.     if woodNeeded > woodAvailable then
  3131.         getItemFromStorage("minecraft:log", false)
  3132.         woodAvailable = T:getLogStock()
  3133.     end
  3134.     T:go("BUUF") --now on top
  3135.    
  3136.     if oreType == "minecraft:log" or oreType == "minecraft:log2" then --eg quantity = 2, needs 2 wood + 2 planks ASSUME only called if wood in stock
  3137.         smeltType = "minecraft:coal"   
  3138.     elseif oreType == "minecraft:cobblestone"then
  3139.         smeltType = "minecraft:stone"
  3140.     elseif oreType == "minecraft:iron_ore"  then
  3141.         smeltType = "minecraft:iron_ingot"
  3142.     elseif oreType == "minecraft:sand" then
  3143.         smeltType = "minecraft:glass"
  3144.     end
  3145.     turtle.select(T:getItemSlot(oreType))
  3146.     turtle.dropDown(quantity)
  3147.     T:go("BD") --in front of furnace, remove any existing planks and refuel
  3148.     turtle.select(16)
  3149.     if turtle.suck() then
  3150.         if T:getItemSlot("minecraft:planks") > 0 then
  3151.             turtle.select(T:getItemSlot("minecraft:planks"))
  3152.             turtle.refuel()
  3153.         end
  3154.     end
  3155.     planksNeeded = math.ceil(planksNeeded / 4) * 4 --eg 1/4 = 1 ,*4 = 4 planks
  3156.     T:turnRight(1) --side on to furnace
  3157.     T:craft("minecraft:planks", planksNeeded, "minecraft:log", nil, nil, false)
  3158.     T:turnLeft(1)
  3159.     turtle.select(T:getItemSlot("minecraft:planks"))
  3160.     turtle.drop() --drop planks into furnace
  3161.     T:go("DF") --back under furnace
  3162.     turtle.select(1)
  3163.     repeat
  3164.         waitTime = waitTime + 1
  3165.         sleep(1)
  3166.         if waitTime == 10 then --every 10 secs check if any output
  3167.             if turtle.suckUp() then --continue to wait
  3168.                 continue = true
  3169.                 waitTime = 0
  3170.             else --either no product or all done
  3171.                 continue = false
  3172.             end
  3173.         end
  3174.     until not continue
  3175.    
  3176.     if T:getItemSlot(smeltType) > 0 then
  3177.         success = true
  3178.         saveToLog("smelt("..oreType..", "..quantity..") completed", true)
  3179.     end
  3180.     return success
  3181. end
  3182.  
  3183. function waitForTreeFarm(woodNeeded)
  3184.     local woodGrowing = 0
  3185.     local maxWood = 0
  3186.    
  3187.     if woodNeeded > 0 and treeFarm:getFarmCreated() then
  3188.         woodGrowing = treeFarm:getPotentialHarvest()
  3189.         treeFarm:getMaxHarvest()
  3190.         while woodGrowing < woodNeeded do
  3191.             sleep(10)
  3192.             -- 10 secs = 12 minecraft minutes
  3193.             -- 1  min  = 1 hour 12 minutes
  3194.             -- 20 mins = 1 minecraft day
  3195.             woodGrowing = treeFarm:getPotentialHarvest()
  3196.             --will be equal to maxHarvest after 2 days
  3197.             saveToLog("waiting for tree farm to grow. potential harvest = "..woodGrowing.." from "..maxWood, true)
  3198.             if woodGrowing >= maxWood then
  3199.                 break
  3200.             end
  3201.         end
  3202.         harvestTreeFarm()
  3203.     end
  3204. end
  3205.  
  3206. function classCoordObject(coordName)
  3207.     -- 0 = go south (z increases)
  3208.     -- 1 = go west  (x decreases)
  3209.     -- 2 = go north (z decreases
  3210.     -- 3 = go east  (x increases)
  3211.  
  3212.     -- compass[0] = "south"
  3213.     -- compass[1] = "west"
  3214.     -- compass[2] = "north"
  3215.     -- compass[3] = "east"
  3216.    
  3217.     clsCoord = {} -- the table representing the class, which will double as the metatable for any instances
  3218.     clsCoord.__index = clsCoord -- failed table lookups on the instances should fallback to the class table, to get methods
  3219.  
  3220.     local self = setmetatable({}, clsCoord)
  3221.     self.name = coordName
  3222.     self.x = 0
  3223.     self.y = 0
  3224.     self.z = 0
  3225.     self.facing = 0
  3226.     self.compass = "south"
  3227.        
  3228.     function clsCoord.getX(self)
  3229.         return self.x
  3230.     end
  3231.     function clsCoord.setX(self, newVal) -- setter
  3232.         self.x = newVal
  3233.     end
  3234.     function clsCoord.getY(self) -- getter
  3235.         return self.y
  3236.     end
  3237.     function clsCoord.setY(self, newVal)
  3238.         self.y = newVal
  3239.     end
  3240.     function clsCoord.getZ(self)
  3241.         return self.z
  3242.     end
  3243.     function clsCoord.setZ(self, newVal)
  3244.         self.z = newVal
  3245.     end
  3246.     function clsCoord.getFacing(self)
  3247.         return self.facing
  3248.     end
  3249.     function clsCoord.setFacing(self, newVal) -- setter
  3250.         self.facing = newVal
  3251.         if self.facing < 0 then
  3252.                 self.facing = 3
  3253.         elseif self.facing > 3 then
  3254.                 self.facing = 0
  3255.         end
  3256.         if self.facing == 0 then
  3257.             self.compass = "south"
  3258.         elseif self.facing == 1 then
  3259.             self.compass = "west"
  3260.         elseif self.facing == 2 then
  3261.             self.compass = "north"
  3262.         else
  3263.             self.compass = "east"
  3264.         end
  3265.     end
  3266.     function clsCoord.getCompass(self)
  3267.         return self.compass
  3268.     end
  3269.     function clsCoord.setCompass(self, newVal) -- setter
  3270.         self.compass = newVal
  3271.  
  3272.         if self.compass == "south" then
  3273.             self.facing = 0
  3274.         elseif self.compass == "west" then
  3275.             self.facing = 1
  3276.         elseif self.compass == "north" then
  3277.             self.facing = 2
  3278.         elseif self.compass == "east" then
  3279.             self.facing = 3
  3280.         end
  3281.     end
  3282.     function clsCoord.goUp(blocks)
  3283.         blocks = blocks or 1
  3284.         self.y = self.y + blocks
  3285.     end
  3286.     function clsCoord.goDown(blocks)
  3287.         blocks = blocks or 1
  3288.         self.y = self.y - blocks
  3289.     end
  3290.     --  uses:
  3291.     --  location:getX()             get current turtle x coordinate
  3292.     --  location:getY()             get current turtle y coordinate
  3293.     --  location:getZ()             get current turtle z coordinate
  3294.     --  location:setX(xCoord)       set current turtle x coordinate eg location:setX(-235)
  3295.     --  location:setY(yCoord)       set current turtle y coordinate eg location:setY(66)
  3296.     --  location:setZ(zCoord)       set current turtle z coordinate eg location:setZ(125)
  3297.     --  location:getFacing()        returns a number 0 - 3 representing direction of player
  3298.     --  location:setFacing(facing)  sets direction eg location:setFacing(1) (West)
  3299.     --  location:getCompass()       returns direction as text eg "north"
  3300.     --  location:setCompass("X")    sets direction using text eg location:setCompass("south")
  3301.     --  location:goUp(X)            increases Y coord by X
  3302.     --  location:goDown(X)          decreases Y coord by X
  3303.     return self
  3304. end
  3305.  
  3306. function classLogfileObject(fileName)
  3307.     clsLogfile = {} -- the table representing the class, which will double as the metatable for any instances
  3308.     clsLogfile.__index = clsLogfile -- failed table lookups on the instances should fallback to the class table, to get methods
  3309.  
  3310.  
  3311.     local self = setmetatable({}, clsLogfile)
  3312.     local iniText = ""
  3313.     local iniFile = ""
  3314.    
  3315.     self.size = 0
  3316.     self.useLog = false
  3317.     self.logFile = fileName
  3318.     self.logFileExists = false
  3319.  
  3320.     function clsLogfile.getUseLog(self)
  3321.         return self.useLog
  3322.     end
  3323.    
  3324.     function clsLogfile.setUseLog(self, use)
  3325.         self.useLog = use
  3326.     end
  3327.    
  3328.     function clsLogfile.checkLogExists(self)
  3329.         return self.logFileExists
  3330.     end
  3331.    
  3332.     function clsLogfile.getLogFileName(self)
  3333.         if self.logFileExists then
  3334.             return self.logFile
  3335.         end
  3336.     end
  3337.    
  3338.     function clsLogfile.getCurrentFileSize(self)       
  3339.         if self.logFileExists then
  3340.             return fs.getSize(self.logFile)
  3341.         else
  3342.             return 0
  3343.         end
  3344.     end
  3345.    
  3346.     function clsLogfile.deleteLog(self)    
  3347.         if fs.exists(self.logFile) then
  3348.             fs.delete(self.logFile)
  3349.         end
  3350.         self.logFileExists = false
  3351.        
  3352.         return true
  3353.     end
  3354.    
  3355.     function clsLogfile.appendLine(self, newText)
  3356.         local handle = ""
  3357.        
  3358.         if fs.exists(self.logFile) then --logFile already created
  3359.             handle = fs.open(self.logFile, "a")
  3360.         else
  3361.             handle = fs.open(self.logFile, "w") --create file
  3362.         end
  3363.         self.logFileExists = true
  3364.         handle.writeLine(newText)
  3365.         handle.close()
  3366.     end
  3367.    
  3368.     return self
  3369. end
  3370.  
  3371. function classTreeFarmObject()
  3372.     clsTreeFarm = {} -- the table representing the class, which will double as the metatable for any instances
  3373.     clsTreeFarm.__index = clsTreeFarm -- failed table lookups on the instances should fallback to the class table, to get methods
  3374.  
  3375.     local self = setmetatable({}, clsTreeFarm)
  3376.    
  3377.     self.numSaplings = 0
  3378.     self.timePlanted = 0
  3379.     self.dayPlanted = 0
  3380.     self.timeHarvested = 0
  3381.     self.woodHarvested = 0
  3382.     self.pondFilled = false
  3383.     self.hopperPlaced = false
  3384.     self.farmCreated = false
  3385.     self.farmFlooded = false
  3386.     self.waterFound = false
  3387.    
  3388.     function clsTreeFarm.reset(self)
  3389.         self.numSaplings = 0
  3390.         self.timePlanted = 0
  3391.         self.dayPlanted = 0
  3392.         self.timeHarvested = 0
  3393.         self.woodHarvested = 0
  3394.     end
  3395.    
  3396.     function clsTreeFarm.getPondFilled(self)
  3397.         return self.pondFilled
  3398.     end
  3399.     function clsTreeFarm.setPondFilled(self, yesNo)
  3400.         self.pondFilled = yesNo
  3401.     end
  3402.    
  3403.     function clsTreeFarm.getWaterFound(self)
  3404.         return self.waterFound
  3405.     end
  3406.     function clsTreeFarm.setWaterFound(self, yesNo)
  3407.         self.waterFound = yesNo
  3408.     end
  3409.    
  3410.     function clsTreeFarm.getHopperPlaced(self)
  3411.         return self.hopperPlaced
  3412.     end
  3413.     function clsTreeFarm.setHopperPlaced(self, yesNo)
  3414.         self.hopperPlaced = yesNo
  3415.     end
  3416.    
  3417.     function clsTreeFarm.getFarmCreated(self)
  3418.         return self.farmCreated
  3419.     end
  3420.     function clsTreeFarm.setFarmCreated(self, yesNo)
  3421.         self.farmCreated = yesNo
  3422.     end
  3423.    
  3424.     function clsTreeFarm.getFarmFlooded(self)
  3425.         return self.farmFlooded
  3426.     end
  3427.     function clsTreeFarm.setFarmFlooded(self, yesNo)
  3428.         self.farmFlooded = yesNo
  3429.     end
  3430.    
  3431.     function clsTreeFarm.getNumSaplings(self)
  3432.         return self.numSaplings
  3433.     end
  3434.     function clsTreeFarm.setNumSaplings(self, num)
  3435.         self.numSaplings = num
  3436.     end
  3437.     function clsTreeFarm.addSapling(self)
  3438.         self.numSaplings = self.numSaplings + 1
  3439.     end
  3440.     function clsTreeFarm.getTimePlanted(self)
  3441.         return self.timePlanted
  3442.     end
  3443.     function clsTreeFarm.setTimePlanted(self, num)
  3444.         self.timePlanted = num
  3445.         self.dayPlanted = os.day()
  3446.     end
  3447.     function clsTreeFarm.getTimeHarvested(self)
  3448.         return self.timeHarvested
  3449.     end
  3450.     function clsTreeFarm.setTimeHarvested(self, num)
  3451.         self.timeHarvested = num
  3452.     end
  3453.    
  3454.     function clsTreeFarm.getWoodHarvested(self)
  3455.         return self.woodHarvested
  3456.     end
  3457.     function clsTreeFarm.setWoodHarvested(self, num)
  3458.         self.woodHarvested = num
  3459.     end
  3460.    
  3461.     function clsTreeFarm.getMaxHarvest(self)
  3462.         return self.numSaplings * 5
  3463.     end
  3464.    
  3465.     function clsTreeFarm.setDebug(self, saplings, trees)
  3466.         --use if debugging and treeFarm already planted
  3467.         self.numSaplings = saplings + trees
  3468.         self.timePlanted = os.time()
  3469.         if trees >= 6 then
  3470.             self.dayPlanted = os.day() - 3
  3471.         end
  3472.     end
  3473.    
  3474.     function clsTreeFarm.getPotentialHarvest(self)
  3475.         local currentDay = os.day()
  3476.         local currentTime = os.time()
  3477.         local numDays = 0
  3478.         local numHours = 0
  3479.         local harvest = 0
  3480.        
  3481.         --days measured from world creation
  3482.         numDays = currentDay - self.dayPlanted
  3483.        
  3484.         --time 0 - 24 then resets
  3485.         if currentTime > self.timePlanted then -- eg 13.5 > 7.5 (13.5 - 7.5 = 6 hours)
  3486.             numHours = currentTime - self.timePlanted
  3487.         else -- eg 6.465 < 21.454
  3488.             numHours = 24 - self.timePlanted + currentTime -- eg 24 - 21.500 + 6.500 = 9 hours
  3489.         end
  3490.         -- 8 trees planted, half done in 12-14 minecraft hours
  3491.         -- 1 tree  4.5 hrs
  3492.         -- 2 trees 7 hrs
  3493.         -- 3 trees 8 hrs
  3494.         -- 4 trees 13 hrs
  3495.         -- 5 trees 20 hrs
  3496.         -- 6 trees 30 hours
  3497.         -- estimate as half no of saplings per 12 hours
  3498.         if numDays == 0 then
  3499.             harvest = math.ceil((5 * self.numSaplings) / 2)
  3500.         elseif numDays == 1 then
  3501.             harvest = math.ceil(((5 * self.numSaplings) * 2) / 3)
  3502.         else -- > 2 days probably most trees * 5 wood
  3503.             harvest = 5 * self.numSaplings
  3504.         end
  3505.        
  3506.         return harvest
  3507.     end
  3508.    
  3509.     return self
  3510. end
  3511.  
  3512. function classTurtleObject()   
  3513.     clsTurtle = {} -- the table representing the class, which will double as the metatable for any instances
  3514.     clsTurtle.__index = clsTurtle -- failed table lookups on the instances should fallback to the class table, to get methods
  3515.  
  3516.     local self = setmetatable({}, clsTurtle)
  3517.     self.x = 0
  3518.     self.y = 0
  3519.     self.z = 0
  3520.     self.facing = 0
  3521.     self.compass = "south"
  3522.     self.numDiamondsStored = 0
  3523.    
  3524.     function clsTurtle.getDiamondsStored(self)
  3525.         local stockData = {}
  3526.         stockData = clsTurtle.getStock(self, "minecraft:diamond", 0)
  3527.        
  3528.         return self.numDiamondsStored + stockData.count
  3529.     end
  3530.    
  3531.     function clsTurtle.setDiamondsStored(self, newVal) -- setter
  3532.         self.numDiamondsStored = newVal
  3533.     end
  3534.    
  3535.     function clsTurtle.getX(self)
  3536.         return self.x
  3537.     end
  3538.    
  3539.     function clsTurtle.setX(self, newVal) -- setter
  3540.         self.x = newVal
  3541.     end
  3542.    
  3543.     function clsTurtle.getY(self) -- getter
  3544.         return self.y
  3545.     end
  3546.    
  3547.     function clsTurtle.setY(self, newVal)
  3548.         self.y = newVal
  3549.     end
  3550.    
  3551.     function clsTurtle.getZ(self)
  3552.         return self.z
  3553.     end
  3554.    
  3555.     function clsTurtle.setZ(self, newVal)
  3556.         self.z = newVal
  3557.     end
  3558.    
  3559.     function clsTurtle.getFacing(self)
  3560.         return self.facing
  3561.     end
  3562.    
  3563.     function clsTurtle.setFacing(self, newVal) --property let in VB
  3564.         local direction = {"south","west","north","east"}
  3565.         self.facing = newVal
  3566.         if self.facing < 0 then
  3567.             self.facing = 3
  3568.         elseif self.facing > 3 then
  3569.             self.facing = 0
  3570.         end
  3571.         self.compass = direction[self.facing + 1]
  3572.     end
  3573.    
  3574.     function clsTurtle.getCompass(self)
  3575.         return self.compass
  3576.     end
  3577.    
  3578.     function clsTurtle.attack(self)
  3579.         -- minecart with chest is not detected, but responds to attack without breaking!
  3580.         local slot = turtle.getSelectedSlot()
  3581.         local numAttacks = 0
  3582.         local attackOK = false
  3583.         turtle.select(1)
  3584.        
  3585.         while turtle.attack() do --in case mob in front
  3586.             sleep(1.5)
  3587.             numAttacks = numAttacks + 1
  3588.             if numAttacks > 10 then -- may be a minecart due to bug
  3589.                 numAttacks = 0
  3590.                 turtle.dig()
  3591.             end
  3592.             attackOK = true        
  3593.         end
  3594.         while turtle.attackUp() do --in case mob above
  3595.             sleep(1.5)
  3596.             numAttacks = numAttacks + 1
  3597.             if numAttacks > 10 then -- may be a minecart due to bug
  3598.                 numAttacks = 0
  3599.                 turtle.digUp()
  3600.             end
  3601.             attackOK = true
  3602.         end
  3603.         while turtle.attackDown() do --in case mob below
  3604.             sleep(1.5)
  3605.             numAttacks = numAttacks + 1
  3606.             if numAttacks > 10 then -- may be a minecart due to bug
  3607.                 numAttacks = 0
  3608.                 turtle.digDown()
  3609.             end
  3610.             attackOK = true
  3611.         end
  3612.        
  3613.         turtle.select(slot)
  3614.         return attackOK
  3615.     end
  3616.    
  3617.     function clsTurtle.back(self, steps)
  3618.         steps = steps or 1
  3619.         local slot = turtle.getSelectedSlot()
  3620.        
  3621.         local success = true
  3622.         clsTurtle.refuel(self, steps)
  3623.         turtle.select(1)
  3624.         for i = 1, steps do
  3625.             if not turtle.back() then --cant move back
  3626.                 clsTurtle.turnRight(self, 2) --face backward direction
  3627.                 while turtle.dig() do
  3628.                     sleep(0.5)
  3629.                 end
  3630.                 if not clsTurtle.forward(self, 1) then -- will also attack mobs if in the way
  3631.                     success = false
  3632.                     break
  3633.                 end
  3634.                 clsTurtle.turnRight(self, 2)
  3635.             end
  3636.             if success then
  3637.                 clsTurtle.changeCoords(self, "back")
  3638.             end
  3639.         end
  3640.         turtle.select(slot)
  3641.        
  3642.         return success
  3643.     end
  3644.    
  3645.     function clsTurtle.changeCoords(self, direction)
  3646.         --  0 = go south (z increases)
  3647.         --  1 = go west  (x decreases)
  3648.         --  2 = go north (z decreases
  3649.         --  3 = go east  (x increases)
  3650.         if direction == "forward" then
  3651.             if self.facing == 0 then
  3652.                 self.z = self.z + 1
  3653.             elseif self.facing == 1 then
  3654.                 self.x = self.x - 1
  3655.             elseif self.facing == 2 then
  3656.                 self.z = self.z - 1
  3657.             else
  3658.                 self.x = self.x + 1
  3659.             end
  3660.         elseif direction == "back" then
  3661.             if self.facing == 0 then
  3662.                 self.z = self.z - 1
  3663.             elseif self.facing == 1 then
  3664.                 self.x = self.x + 1
  3665.             elseif self.facing == 2 then
  3666.                 self.z = self.z + 1
  3667.             else
  3668.                 self.x = self.x - 1
  3669.             end
  3670.         end
  3671.     end
  3672.    
  3673.     function clsTurtle.changeDirection(self)
  3674.         while self.facing ~= coordHome:getFacing() do
  3675.             clsTurtle.turnRight(self, 1)
  3676.         end
  3677.     end
  3678.    
  3679.     function clsTurtle.clear(self)
  3680.         term.clear()
  3681.         term.setCursorPos(1,1)
  3682.     end
  3683.    
  3684.     function clsTurtle.craft(self, craftItem, craftQuantity, sourceItem1, sourceItem2, sourceItem3, refuel)
  3685.         --Examples:
  3686.         --make planks:  T:craft("minecraft:planks", 8, "minecraft:log", nil, nil, false)
  3687.         --make planks:  clsTurtle.craft(self, "minecraft:planks", 8, "minecraft:log", nil, nil, false)
  3688.         --make planks:  T:craft{craftItem = "minecraft:planks", craftQuantity = 8, sourceItem1 = "minecraft:log"}
  3689.         --make 1 chest: T:craft{craftItem = "minecraft:chest", craftQuantity = 1, sourceItem1 = "minecraft:planks"}
  3690.         --late stage:   T:craft{craftItem = "ccComputer", craftQuantity = 1, sourceItem1 = "minecraft:glass_pane", sourceItem2 = "minecraft:redstone", sourceItem3 = "minecraft:stone"}
  3691.        
  3692.         local itemSlot = 0
  3693.         local sourceSlot1 = 0
  3694.         local sourceSlot2 = 0  
  3695.         local sourceSlot3 = 0
  3696.         local sourceSlot4 = 0
  3697.         local success = false
  3698.         local emptySlot = 0
  3699.         local turns = 0
  3700.         local doContinue = true
  3701.         local data = {}
  3702.         local stockData = {}
  3703.         --clsTurtle.saveToLog(self, "craft args "..arg.craftItem..", "..arg.craftQuantity..", "..arg.sourceItem1, true)
  3704.         -- check if at least 1 spare slot
  3705.         if clsTurtle.getFirstEmptySlot(self) == 0 then
  3706.             clsTurtle.emptyTrash(self, "down")
  3707.             if clsTurtle.getFirstEmptySlot(self) == 0 then
  3708.                 turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  3709.                 turtle.dropUp()
  3710.             end
  3711.         end
  3712.        
  3713.         itemSlot = clsTurtle.getItemSlot(self, "minecraft:chest") --get the slot number containing a chest
  3714.         if itemSlot == 0 then -- chest not found
  3715.             doContinue = false
  3716.         end
  3717.         if doContinue then
  3718.             if sourceItem1 == "minecraft:log" or sourceItem1 == "minecraft:log2" then
  3719.                 stockData = clsTurtle.getLogData(self)
  3720.                 saveToLog("craft(): sd.pSlot="..stockData.primarySlot..", sd.pCount="..stockData.primaryCount..", sd.fSlot="..stockData.finalSlot..", sd.fCount="..stockData.finalCount)
  3721.                 if refuel then
  3722.                     sourceSlot1 = stockData.finalSlot
  3723.                     saveToLog("craft(): slot no: "..stockData.finalSlot..", log count:"..stockData.finalCount)
  3724.                 else
  3725.                     if craftItem == "minecraft:planks" then
  3726.                         if stockData.finalCount >= craftQuantity / 4 then
  3727.                             sourceSlot1 = stockData.finalSlot
  3728.                             saveToLog("craft(): slot no: "..stockData.finalSlot..", log count:"..stockData.finalCount)
  3729.                         else
  3730.                             sourceSlot1 = stockData.primarySlot
  3731.                             saveToLog("craft(): slot no: "..stockData.primarySlot..", log count:"..stockData.primaryCount)
  3732.                         end
  3733.                     end
  3734.                 end
  3735.             else
  3736.                 sourceSlot1 = clsTurtle.getItemSlot(self, sourceItem1)
  3737.             end
  3738.             if sourceSlot1 == 0 then
  3739.                 doContinue = false
  3740.             end
  3741.             if sourceItem2 == nil then -- no second recipe item needed
  3742.                 sourceItem2 = ""
  3743.                 sourceSlot2 = 0
  3744.             else
  3745.                 sourceSlot2 = clsTurtle.getItemSlot(self, sourceItem2) -- find slot number of second recipe item
  3746.                 if sourceSlot2 == 0 then
  3747.                     doContinue = false
  3748.                 end
  3749.             end
  3750.             if sourceItem3 == nil then -- no third recipe item needed
  3751.                 sourceItem3 = ""
  3752.                 sourceSlot3 = 0
  3753.             else
  3754.                 sourceSlot3 = clsTurtle.getItemSlot(self, sourceItem3) -- find slot number of third recipe item
  3755.                 if sourceSlot3 == 0 then
  3756.                     doContinue = false
  3757.                 end
  3758.             end
  3759.         end
  3760.         if doContinue then
  3761.             while turtle.detect() do --check for clear space to place chest
  3762.                 clsTurtle.turnRight(self, 1)
  3763.                 turns = turns + 1
  3764.                 if turns == 4 then
  3765.                     turns = 0
  3766.                     break
  3767.                 end
  3768.             end
  3769.             turtle.select(1)
  3770.             while turtle.detect() do --clear space in front. Use loop in case of sand/gravel falling
  3771.                 turtle.dig()
  3772.                 sleep(.5)
  3773.             end
  3774.             turtle.select(itemSlot) --should be slot with chest
  3775.             while not turtle.place() do
  3776.                 while clsTurtle.attack(self) do --in case mobs in front
  3777.  
  3778.                 end
  3779.             end
  3780.             --check if chest placed
  3781.             data = clsTurtle.getBlockType(self, "forward")
  3782.             if data.name ~= "minecraft:chest" then
  3783.                 turtle.select(1)
  3784.                 turtle.dig()
  3785.                 turtle.select(itemSlot)
  3786.                 while not turtle.place() do
  3787.                     while clsTurtle.attack(self) do --in case mobs in front
  3788.                    
  3789.                     end
  3790.                 end
  3791.             end
  3792.             -- fill chest with everything except required items
  3793.             for i = 1, 16 do
  3794.                 if i ~= sourceSlot1 and i ~= sourceSlot2 and i ~= sourceSlot3 then
  3795.                     turtle.select(i)
  3796.                     turtle.drop()
  3797.                 end
  3798.             end
  3799.  
  3800.             --turtle emptied out except for crafting items, so move them to slots 16,15,14,13. Start by moving them all to empty slots
  3801.             emptySlot = clsTurtle.getFirstEmptySlot(self)
  3802.             turtle.select(sourceSlot1)
  3803.             turtle.transferTo(emptySlot) --move selected first item to empty slot
  3804.             sourceSlot1 = emptySlot
  3805.             if sourceSlot2 > 0 then
  3806.                 emptySlot = clsTurtle.getFirstEmptySlot(self)
  3807.                 turtle.select(sourceSlot2)
  3808.                 turtle.transferTo(emptySlot) --move selected first item to empty slot
  3809.                 sourceSlot2 = emptySlot
  3810.             end
  3811.             if sourceSlot3 > 0 then
  3812.                 emptySlot = clsTurtle.getFirstEmptySlot(self)
  3813.                 turtle.select(sourceSlot3)
  3814.                 turtle.transferTo(emptySlot) --move selected first item to empty slot
  3815.                 sourceSlot3 = emptySlot
  3816.             end
  3817.             if sourceSlot4 > 0 then
  3818.                 emptySlot = clsTurtle.getFirstEmptySlot(self)
  3819.                 turtle.select(sourceSlot4)
  3820.                 turtle.transferTo(emptySlot) --move selected first item to empty slot
  3821.                 sourceSlot4 = emptySlot
  3822.             end
  3823.             --now move to 16, (15,14,13)
  3824.             turtle.select(sourceSlot1)
  3825.             turtle.transferTo(16) --move selected first item to empty slot
  3826.             sourceSlot1 = 16
  3827.             if sourceSlot2 > 0 then
  3828.                 turtle.select(sourceSlot2)
  3829.                 turtle.transferTo(15) --move selected first item to empty slot
  3830.                 sourceSlot1 = 15
  3831.             end
  3832.             if sourceSlot3 > 0 then
  3833.                 turtle.select(sourceSlot3)
  3834.                 turtle.transferTo(14) --move selected first item to empty slot
  3835.                 sourceSlot1 = 14
  3836.             end
  3837.             if sourceSlot4 > 0 then
  3838.                 turtle.select(sourceSlot4)
  3839.                 turtle.transferTo(13) --move selected first item to empty slot
  3840.                 sourceSlot1 = 13
  3841.             end
  3842.             --ready to craft
  3843.             turtle.select(16)
  3844.             if craftItem == ccComputer then --T:craft{craftItem = ccComputer, craftQuantity = 1, sourceItem1 = "minecraft:glass_panes", sourceItem2 = "minecraft:redstone",sourceItem3 = "minecraft:stone"}
  3845.                 -- 1 glass_panes, 1 redstone, 7 stone
  3846.                 turtle.select(16)
  3847.                 turtle.transferTo(10, craftQuantity) --move glass panes to 10
  3848.                 turtle.select(15)
  3849.                 turtle.transferTo(6, craftQuantity) --move redstone to 6
  3850.                 turtle.select(14) --stone
  3851.                 turtle.transferTo(1, craftQuantity) --move stone to 6
  3852.                 turtle.transferTo(2, craftQuantity)
  3853.                 turtle.transferTo(3, craftQuantity)
  3854.                 turtle.transferTo(5, craftQuantity)
  3855.                 turtle.transferTo(7, craftQuantity)
  3856.                 turtle.transferTo(9, craftQuantity)
  3857.                 turtle.transferTo(11, craftQuantity)
  3858.             elseif craftItem == ccDisk then  --T:craft{craftItem = ccDisk, craftQuantity = 1, sourceItem1 = "minecraft:paper", sourceItem2 = "minecraft:redstone"}
  3859.                 -- 1 paper, 1 redstone
  3860.                 turtle.select(16)
  3861.                 turtle.transferTo(5, craftQuantity) --move paper to 5
  3862.                 turtle.select(15)
  3863.                 turtle.transferTo(1, craftQuantity) --move redstone to 1       
  3864.             elseif craftItem == ccDiskDrive then --T:craft{craftItem = ccDiskDrive, craftQuantity = 1, sourceItem1 = "minecraft:redstone", sourceItem2 = "minecraft:stone"}
  3865.                 -- 2 redstone, 7 stone
  3866.                 turtle.select(16)
  3867.                 turtle.transferTo(6, craftQuantity) --move to 6
  3868.                 turtle.transferTo(10, craftQuantity) --move to 10
  3869.                 turtle.select(15)
  3870.                 turtle.transferTo(1, craftQuantity) --move stone to 6
  3871.                 turtle.transferTo(2, craftQuantity)
  3872.                 turtle.transferTo(3, craftQuantity)
  3873.                 turtle.transferTo(5, craftQuantity)
  3874.                 turtle.transferTo(7, craftQuantity)
  3875.                 turtle.transferTo(9, craftQuantity)
  3876.                 turtle.transferTo(11, craftQuantity)
  3877.             elseif craftItem == ccTurtle then --T:craft{craftItem = ccTurtle, craftQuantity = 1, sourceItem1 = "minecraft:chest", sourceItem2 = ccComputer,sourceItem3 = "minecraft:iron_ingot"}
  3878.                 -- 1 chest, 1 computer, 7 iron
  3879.                 if sourceSlot2 ~= 15 then
  3880.                     turtle.select(sourceSlot2) --computer
  3881.                     turtle.transferTo(15, craftQuantity)
  3882.                 end
  3883.                 if sourceSlot3 ~= 14 then
  3884.                     turtle.select(sourceSlot3) --iron
  3885.                     turtle.transferTo(14)
  3886.                 end
  3887.                 turtle.select(16)
  3888.                 turtle.transferTo(10, craftQuantity)
  3889.                 turtle.select(15) --computer
  3890.                 turtle.transferTo(6, craftQuantity)
  3891.                 turtle.select(14) --iron
  3892.                 turtle.transferTo(1, craftQuantity) --move iron
  3893.                 turtle.transferTo(2, craftQuantity)
  3894.                 turtle.transferTo(3, craftQuantity)
  3895.                 turtle.transferTo(5, craftQuantity)
  3896.                 turtle.transferTo(7, craftQuantity)
  3897.                 turtle.transferTo(9, craftQuantity)
  3898.                 turtle.transferTo(11, craftQuantity)
  3899.             elseif craftItem == ccCraftyMiningTurtle then --T:craft{craftItem = ccCraftyMiningTurtle, craftQuantity = 1, sourceItem1 = "minecraft:crafting_table", sourceItem2 = "minecraft:diamond_pickaxe",sourceItem3 = ccTurtle}
  3900.                 -- 1 crafting table, 1 diamond pickaxe,  1 turtle
  3901.                 turtle.select(16)
  3902.                 turtle.transferTo(1, craftQuantity) --move crafting table to 1
  3903.                 turtle.select(15)
  3904.                 turtle.transferTo(3, craftQuantity) --move pickaxe to 3
  3905.                 turtle.select(14)
  3906.                 turtle.transferTo(2, craftQuantity) --move turtle to 2
  3907.             elseif craftItem == "minecraft:bucket" then --T:craft{craftItem = "minecraft:bucket", craftQuantity = 1, sourceItem1 = "minecraft:iron_ingot"}
  3908.                 turtle.transferTo(1, craftQuantity)
  3909.                 turtle.transferTo(3, craftQuantity)
  3910.                 turtle.transferTo(6, craftQuantity)
  3911.             elseif craftItem == "minecraft:chest" then  --T:craft{craftItem = "minecraft:chest", craftQuantity = 1, sourceItem1 = "minecraft:planks"}
  3912.                 --8 planks = 1 chest
  3913.                 turtle.transferTo(1, craftQuantity)
  3914.                 turtle.transferTo(2, craftQuantity)
  3915.                 turtle.transferTo(3, craftQuantity)
  3916.                 turtle.transferTo(5, craftQuantity)
  3917.                 turtle.transferTo(7, craftQuantity)
  3918.                 turtle.transferTo(9, craftQuantity)
  3919.                 turtle.transferTo(10, craftQuantity)
  3920.                 turtle.transferTo(11, craftQuantity)
  3921.             elseif craftItem == "minecraft:crafting_table" then --T:craft{craftItem = "minecraft:crafting_table", craftQuantity = 1, sourceItem1 = "minecraft:planks"}
  3922.                 -- 4 planks = 1 table
  3923.                 turtle.transferTo(1, craftQuantity)
  3924.                 turtle.transferTo(2, craftQuantity)
  3925.                 turtle.transferTo(5, craftQuantity)
  3926.                 turtle.transferTo(6, craftQuantity)
  3927.             elseif craftItem == "minecraft:diamond_pickaxe" then --T:craft{craftItem = "minecraft:diamond_pickaxe", craftQuantity = 1, sourceItem1 = "minecraft:stick", sourceItem2 = "minecraft:diamond"}
  3928.                 --2 sticks + 3 diamonds = 1 axe
  3929.                 turtle.select(16)
  3930.                 turtle.transferTo(6, craftQuantity) --move stick to 6
  3931.                 turtle.transferTo(10, craftQuantity) --move stick to 10
  3932.                 turtle.select(15)
  3933.                 turtle.transferTo(1, craftQuantity) --move diamond to 1
  3934.                 turtle.transferTo(2, craftQuantity) --move diamond to 2
  3935.                 turtle.transferTo(3, craftQuantity) --move diamond to 3
  3936.             elseif craftItem == "minecraft:fence" then --T:craft{craftItem = "minecraft:fence", craftQuantity = 2, sourceItem1 = "minecraft:stick"}
  3937.                 -- 6 stick = 2 fences
  3938.                 turtle.transferTo(5, craftQuantity / 2)
  3939.                 turtle.transferTo(6, craftQuantity / 2)
  3940.                 turtle.transferTo(7, craftQuantity / 2)
  3941.                 turtle.transferTo(9, craftQuantity / 2)
  3942.                 turtle.transferTo(10, craftQuantity / 2)
  3943.                 turtle.transferTo(11, craftQuantity / 2)   
  3944.             elseif craftItem == "minecraft:furnace" then --T:craft{craftItem = "minecraft:furnace", craftQuantity = 1, sourceItem1 = "minecraft:cobblestone"}
  3945.                 -- 8 cobblestone = 1 furnace
  3946.                 turtle.transferTo(1, craftQuantity)
  3947.                 turtle.transferTo(2, craftQuantity)
  3948.                 turtle.transferTo(3, craftQuantity)
  3949.                 turtle.transferTo(5, craftQuantity)
  3950.                 turtle.transferTo(7, craftQuantity)
  3951.                 turtle.transferTo(9, craftQuantity)
  3952.                 turtle.transferTo(10, craftQuantity)
  3953.                 turtle.transferTo(11, craftQuantity)
  3954.             elseif craftItem == "minecraft:glass_pane" then --T:craft{craftItem = "minecraft:glass_pane", craftQuantity = 16, sourceItem1 = "minecraft:glass"}
  3955.                 -- 6 glass = 16 panes
  3956.                 turtle.transferTo(5, craftQuantity / 16)
  3957.                 turtle.transferTo(6, craftQuantity / 16)
  3958.                 turtle.transferTo(7, craftQuantity / 16)
  3959.                 turtle.transferTo(9, craftQuantity / 16)
  3960.                 turtle.transferTo(10, craftQuantity / 16)
  3961.                 turtle.transferTo(11, craftQuantity / 16)
  3962.             elseif craftItem == "minecraft:hopper" then  --T:craft{craftItem = "minecraft:hopper", craftQuantity = 1, sourceItem1 = "minecraft:iron_ingot", sourceItem2 = "minecraft:chest"}
  3963.                 -- 5 iron, 1 chest
  3964.                 turtle.select(16)
  3965.                 turtle.transferTo(1, craftQuantity) --move iron to 1
  3966.                 turtle.transferTo(3, craftQuantity)
  3967.                 turtle.transferTo(5, craftQuantity)
  3968.                 turtle.transferTo(7, craftQuantity)
  3969.                 turtle.transferTo(10, craftQuantity)
  3970.                 turtle.select(15)
  3971.                 turtle.transferTo(6, craftQuantity) --move chest to 6      
  3972.             elseif craftItem == "minecraft:ladder" then --T:craft{craftItem = "minecraft:ladder", craftQuantity = 3, sourceItem1 = "minecraft:stick"}
  3973.                 -- 7 stick = 3 ladder
  3974.                 turtle.transferTo(1, craftQuantity / 3)
  3975.                 turtle.transferTo(3, craftQuantity / 3)
  3976.                 turtle.transferTo(5, craftQuantity / 3)
  3977.                 turtle.transferTo(6, craftQuantity / 3)
  3978.                 turtle.transferTo(7, craftQuantity / 3)
  3979.                 turtle.transferTo(9, craftQuantity / 3)
  3980.                 turtle.transferTo(11, craftQuantity / 3)
  3981.             elseif craftItem == "minecraft:paper" then --T:craft{craftItem = "minecraft:paper", craftQuantity = 3, sourceItem1 = "minecraft:reeds"}
  3982.                 --3 reeds = 3 paper
  3983.                 turtle.transferTo(1, craftQuantity / 3)
  3984.                 turtle.transferTo(2, craftQuantity / 3)
  3985.                 turtle.transferTo(3, craftQuantity / 3)
  3986.             elseif craftItem == "minecraft:planks" then  --T:craft{craftItem = "minecraft:planks", craftQuantity = 4, sourceItem1 = "minecraft:log"}
  3987.                 turtle.transferTo(1, craftQuantity / 4)
  3988.             elseif craftItem == "minecraft:sign" then --T:craft{craftItem = "minecraft:sign", craftQuantity = 3, sourceItem1 = "minecraft:stick", sourceItem2 = "minecraft:planks"}
  3989.                 -- 1 stick + 6 planks = 3 sign
  3990.                 if sourceSlot2 ~= 15 then
  3991.                     turtle.select(sourceSlot2) -- move planks to 15
  3992.                     turtle.transferTo(15)
  3993.                 end
  3994.                 turtle.select(16)
  3995.                 turtle.transferTo(10, craftQuantity / 3) --move sticks to 5
  3996.                 turtle.select(15)
  3997.                 turtle.transferTo(1, craftQuantity / 3) --move planks to 1
  3998.                 turtle.transferTo(2, craftQuantity / 3) --move planks to 2
  3999.                 turtle.transferTo(3, craftQuantity / 3) --move planks to 3
  4000.                 turtle.transferTo(5, craftQuantity / 3) --move planks to 5
  4001.                 turtle.transferTo(6, craftQuantity / 3) --move planks to 6
  4002.                 turtle.transferTo(7, craftQuantity / 3) --move planks to 7
  4003.             elseif craftItem == "minecraft:stair" then  --T:craft{craftItem = "minecraft:stair", craftQuantity = 4, sourceItem1 = "minecraft:cobblestone"}
  4004.                 --6 cobblestone = 4 stair
  4005.                 turtle.transferTo(1, craftQuantity / 4)
  4006.                 turtle.transferTo(5, craftQuantity / 4)
  4007.                 turtle.transferTo(6, craftQuantity / 4)
  4008.                 turtle.transferTo(9, craftQuantity / 4)
  4009.                 turtle.transferTo(10, craftQuantity / 4)
  4010.                 turtle.transferTo(11, craftQuantity / 4)
  4011.             elseif craftItem == "minecraft:stick" then --T:craft{craftItem = "stick", craftQuantity = 4, sourceItem1 = "minecraft:planks"} 
  4012.                 -- 2 planks gives 4 sticks
  4013.                 turtle.transferTo(1, craftQuantity / 4)
  4014.                 turtle.transferTo(5, craftQuantity / 4)
  4015.             elseif craftItem == "minecraft:torch" then --T:craft{craftItem = "minecraft:torch", craftQuantity = 4, sourceItem1 = "minecraft:stick", sourceItem2 = "minecraft:coal"}
  4016.                 -- 1 stick + 1 coal/charcoal = 4 torch
  4017.                 if sourceSlot2 ~= 15 then
  4018.                     turtle.select(sourceSlot2) -- move coal/charcoal to 15
  4019.                     turtle.transferTo(15)
  4020.                 end
  4021.                 turtle.select(16)
  4022.                 turtle.transferTo(5, craftQuantity / 4) --move sticks to 5
  4023.                 turtle.select(15)
  4024.                 turtle.transferTo(1, craftQuantity / 4) --move coal/charcoal to
  4025.             end
  4026.             for i = 13, 16 do -- empty remaining recipe items into chest
  4027.                 turtle.select(i)
  4028.                 turtle.drop()
  4029.             end
  4030.             -- Attempt to craft item into slot 16
  4031.             turtle.select(16)
  4032.             if turtle.craft() then
  4033.                 success = true
  4034.                 --now put crafted item in chest first, so will mix with any existing similar items
  4035.                 if refuel then
  4036.                     turtle.select(16)
  4037.                     turtle.refuel()
  4038.                 else
  4039.                     turtle.select(16)
  4040.                     turtle.drop()
  4041.                 end
  4042.             else --crafting not successful, so empty out all items into chest
  4043.                 for i = 1, 16 do
  4044.                     if turtle.getItemCount(i) > 0 then
  4045.                         turtle.select(i)
  4046.                         turtle.drop()
  4047.                     end
  4048.                 end
  4049.             end
  4050.             turtle.select(1) --empty chest into slot 1 onwards
  4051.             while turtle.suck() do
  4052.            
  4053.             end
  4054.             turtle.dig() -- collect chest
  4055.             if turns > 0 then --return to original position
  4056.                 clsTurtle.turnLeft(self, turns)
  4057.             end
  4058.         else
  4059.             saveToLog("Missing crafting ingredients.", true)
  4060.             success = false
  4061.         end
  4062.        
  4063.         return success
  4064.     end
  4065.    
  4066.     function clsTurtle.craftChests(self, quantity, orLess)
  4067.         local chestsCrafted = 0
  4068.         local logNum = 0
  4069.         local stockData = {}
  4070.        
  4071.         stockData = clsTurtle.getStock(self, "minecraft:log")
  4072.         if stockData.count >= 2 then -- at least one chest can be made
  4073.             if turtle.getItemCount(stockData.primarySlot) >= quantity * 2 then
  4074.                 if quantity > 8 then
  4075.                     clsTurtle.craft(self, "minecraft:planks", 64, clsTurtle.getItemName(self, stockData.primarySlot), nil, nil, false)
  4076.                     clsTurtle.craft(self, "minecraft:chest", 8, "minecraft:planks", nil, nil, false)
  4077.                     quantity = quantity - 8
  4078.                 end
  4079.                 stockData = clsTurtle.getStock(self, "minecraft:log")
  4080.                 clsTurtle.craft(self, "minecraft:planks", quantity * 8, clsTurtle.getItemName(self, stockData.primarySlot), nil, nil, false)
  4081.                 clsTurtle.craft(self, "minecraft:chest", quantity, "minecraft:planks", nil, nil, false)
  4082.                 chestsCrafted = quantity
  4083.             else -- less than required logs
  4084.                 if orLess then
  4085.                     logNum = turtle.getItemCount(stockData.primarySlot)
  4086.                     logNum = (math.floor(logNum / 2)) * 2
  4087.                     logNeeded = quantity * 2 - logNum
  4088.                     clsTurtle.craft(self, "minecraft:planks", logNum * 4, clsTurtle.getItemName(self, stockData.primarySlot), nil, nil, false)
  4089.                     clsTurtle.craft(self, "minecraft:chest", logNum / 2, "minecraft:planks", nil, nil, false)
  4090.                     stockData = clsTurtle.getStock(self, "minecraft:log")
  4091.                     logNum = turtle.getItemCount(stockData.primarySlot)
  4092.                     logNum = (math.floor(logNum / 2)) * 2
  4093.                     if logNum >= logNeeded then
  4094.                         clsTurtle.craft(self, "minecraft:planks", logNeeded * 4, clsTurtle.getItemName(self, stockData.primarySlot), nil, nil, false)
  4095.                         clsTurtle.craft(self, "minecraft:chest", logNeeded / 2, "minecraft:planks", nil, nil, false)
  4096.                     else
  4097.                         clsTurtle.craft(self, "minecraft:planks", logNum * 4, clsTurtle.getItemName(self, stockData.primarySlot), nil, nil, false)
  4098.                         clsTurtle.craft(self, "minecraft:chest", logNum / 2, "minecraft:planks", nil, nil, false)
  4099.                     end
  4100.                     chestsCrafted = logNeeded / 2
  4101.                 end
  4102.             end
  4103.         end
  4104.        
  4105.         return chestsCrafted
  4106.     end
  4107.    
  4108.     function clsTurtle.down(self, steps)
  4109.         steps = steps or 1
  4110.         --local slot = turtle.getSelectedSlot()
  4111.         local success = true
  4112.         local data = {}
  4113.        
  4114.         clsTurtle.refuel(self, steps)
  4115.         turtle.select(1)
  4116.         for i = 1, steps do
  4117.             if turtle.detectDown() then
  4118.                 data = clsTurtle.getBlockType(self, "down")
  4119.                 if data.name == "minecraft:bedrock" then
  4120.                     success = false
  4121.                     break
  4122.                 else
  4123.                     turtle.digDown()
  4124.                 end
  4125.             end --move down unless mob in the way
  4126.             while not turtle.down() do
  4127.                 clsTurtle.attack(self)
  4128.             end
  4129.             self.y = self.y - 1
  4130.         end
  4131.         --turtle.select(slot)
  4132.        
  4133.         return success
  4134.     end
  4135.    
  4136.     function clsTurtle.emptyTrashItem(self, direction, item, maxAmount)
  4137.         local stockData = {}
  4138.         stockData = clsTurtle.getStock(self, item)
  4139.        
  4140.         while stockData.count > maxAmount and stockData.primarySlot > 0 do
  4141.             turtle.select(stockData.primarySlot)
  4142.             if direction == "up" then
  4143.                 if not turtle.dropUp() then
  4144.                     turtle.dropDown()
  4145.                 end
  4146.             else
  4147.                 if not turtle.dropDown() then
  4148.                     turtle.dropUp()
  4149.                 end
  4150.             end
  4151.             stockData = clsTurtle.getStock(self, item)
  4152.         end
  4153.     end
  4154.    
  4155.     function clsTurtle.emptyTrash(self, direction)
  4156.         direction = direction or "down"
  4157.         local slotData = {}
  4158.         local item = ""
  4159.         local move = false
  4160.         --local slot = turtle.getSelectedSlot()
  4161.         local keepItems = {"minecraft:cobblestone", "minecraft:dirt", "minecraft:redstone", "minecraft:sand",
  4162.                             "minecraft:chest", "minecraft:log", "minecraft:log2", "minecraft:iron_ore", "minecraft:reeds", "minecraft:sapling",
  4163.                             "minecraft:bucket", "minecraft:lava_bucket", "minecraft:water_bucket", "minecraft:torch", "minecraft:diamond",
  4164.                             "minecraft:coal", "minecraft:iron_ingot", "minecraft:emerald"}
  4165.                            
  4166.         local keepit = false                   
  4167.         -- empty excess cobble, dirt, all gravel, unknown minerals
  4168.         --keep max of 1 stack
  4169.         clsTurtle.sortInventory(self)
  4170.         if direction == "down" then
  4171.             saveToLog("EmptyTrash():moving down ", true)  --debug here
  4172.             if clsTurtle.down(self, 1) then
  4173.                 saveToLog("EmptyTrash():down success ", true)  --debug here
  4174.                 move = true
  4175.             end
  4176.         end
  4177.         for i = 1, 16 do
  4178.             keepit = false
  4179.             if turtle.getItemCount(i) > 0 then
  4180.                 item = clsTurtle.getItemName(self, i)
  4181.                 for _,v in pairs(keepItems) do
  4182.                     if v == item then
  4183.                         keepit = true
  4184.                         break
  4185.                     end
  4186.                 end
  4187.                 if not keepit then
  4188.                     saveToLog("EmptyTrash():Dropping "..item, true)
  4189.                     turtle.select(i)
  4190.                     turtle.dropDown()
  4191.                 end
  4192.             end
  4193.         end
  4194.         clsTurtle.sortInventory(self)
  4195.         clsTurtle.emptyTrashItem(self, "down", "minecraft:cobblestone", 128)
  4196.         clsTurtle.emptyTrashItem(self, "down", "minecraft:dirt", 64)
  4197.         clsTurtle.emptyTrashItem(self, "down", "minecraft:redstone", 64)
  4198.         slotData = clsTurtle.getStock(self, "minecraft:coal", 0)
  4199.         if slotData.count > 64 then
  4200.             if slotData.primarySlot ~= slotData.finalSlot and slotData.finalSlot ~= 0 then
  4201.                 turtle.select(slotData.finalSlot)
  4202.                 turtle.refuel()
  4203.             end
  4204.         end
  4205.         if direction == "down" and move then
  4206.             clsTurtle.up(self, 1)
  4207.         end
  4208.         turtle.select(1)
  4209.     end
  4210.    
  4211.     function clsTurtle.equip(self, side, useItem, useDamage)
  4212.         useDamage = useDamage or 0
  4213.         local slot, damage = clsTurtle.getItemSlot(self, useItem)
  4214.         local success = false
  4215.         --minecraft:crafting_table
  4216.         --minecraft:diamond_pickaxe
  4217.         --minecraft:diamond_sword
  4218.         --minecraft:diamond_shovel
  4219.         --minecraft:diamond_hoe
  4220.         --minecraft:diamond_axe
  4221.         --wireless modem = ComputerCraft:CC-Peripheral, damage = 1
  4222.  
  4223.         if slot > 0 and damage == useDamage then
  4224.             turtle.select(slot)
  4225.             if side == "right" then
  4226.                 if turtle.equipRight() then
  4227.                     success = true
  4228.                 end
  4229.             else
  4230.                 if turtle.equipLeft() then
  4231.                     success = true
  4232.                 end
  4233.             end
  4234.         end
  4235.        
  4236.         return success
  4237.     end
  4238.  
  4239.     function clsTurtle.forward(self, steps)    
  4240.         steps = steps or 1
  4241.         --local slot = turtle.getSelectedSlot()
  4242.         local success = true
  4243.         local data = {}
  4244.        
  4245.         clsTurtle.refuel(self, steps)
  4246.         turtle.select(1)
  4247.         for i = 1, steps do
  4248.             while turtle.detect() do
  4249.                 if turtle.dig() then
  4250.                     sleep(0.5)
  4251.                 else
  4252.                     data = clsTurtle.getBlockType(self, "forward")
  4253.                     if data.name == "minecraft:bedrock" then
  4254.                         success = false
  4255.                         break
  4256.                     end
  4257.                 end
  4258.             end
  4259.             while not turtle.forward() do
  4260.                 clsTurtle.attack(self)
  4261.             end
  4262.             clsTurtle.changeCoords(self, "forward")
  4263.         end
  4264.         turtle.select(1)
  4265.        
  4266.         return success
  4267.     end
  4268.    
  4269.     function clsTurtle.getBlockType(self, direction)
  4270.         -- turtle.inspect() returns two values
  4271.         -- 1) boolean (true/false) success
  4272.         -- 2) table with two values:
  4273.         --  .name (string) e.g. "minecraft:log"
  4274.         --  .metadata (integer) e.g. 0
  4275.         --  oak has metadata of 0, spruce 1, birch 2 etc
  4276.        
  4277.         local success = false
  4278.         local data = {} --initialise empty table variable
  4279.         local rt = {}
  4280.         rt.name = ""
  4281.         rt.modifier = 0
  4282.      
  4283.         if direction == "up" then
  4284.             success, data = turtle.inspectUp() -- store information about the block above in a table   
  4285.         elseif direction == "down" then
  4286.             success, data = turtle.inspectDown() -- store information about the block below in a table
  4287.         else
  4288.             success, data = turtle.inspect() -- store information about the block ahead in a table
  4289.         end
  4290.         if success then -- block found
  4291.             rt.name = data.name -- eg "minecraft:log"
  4292.             rt.modifier = data.metadata
  4293.         end
  4294.        
  4295.         return rt -- return a table {rt.name, rt.modifier}
  4296.     end
  4297.    
  4298.     function clsTurtle.getFirstEmptySlot(self)
  4299.         local slot = 0
  4300.         for i = 1, 16 do
  4301.             if turtle.getItemCount(i) == 0 then
  4302.                 slot = i
  4303.                 break
  4304.             end
  4305.         end
  4306.         return slot
  4307.     end
  4308.    
  4309.     function clsTurtle.getFuelStock(self)
  4310.         local fuelAmount = 0
  4311.         local stockData = {}
  4312.        
  4313.         stockData = clsTurtle.getStock(self, "minecraft:coal", 0)
  4314.         if stockData.count > 0 then
  4315.             fuelAmount = fuelAmount + 80 * stockData.count
  4316.         end
  4317.         stockData = clsTurtle.getStock(self, "minecraft:coal", 1) --charcoal
  4318.         if stockData.count > 0 then
  4319.             fuelAmount = fuelAmount + 80 * stockData.count
  4320.         end
  4321.         stockData = clsTurtle.getStock(self, "minecraft:log", 0)
  4322.         if stockData.count > 0 then
  4323.             fuelAmount = fuelAmount + 60 * stockData.count
  4324.         end
  4325.         stockData = clsTurtle.getStock(self, "minecraft:log", 1)
  4326.         if stockData.count > 0 then
  4327.             fuelAmount = fuelAmount + 60 * stockData.count
  4328.         end
  4329.         stockData = clsTurtle.getStock(self, "minecraft:log2", 0)
  4330.         if stockData.count > 0 then
  4331.             fuelAmount = fuelAmount + 60 * stockData.count
  4332.         end
  4333.         stockData = clsTurtle.getStock(self, "minecraft:log2", 1)
  4334.         if stockData.count > 0 then
  4335.             fuelAmount = fuelAmount + 60 * stockData.count
  4336.         end
  4337.        
  4338.         return fuelAmount
  4339.     end
  4340.    
  4341.     function clsTurtle.getItemName(self, slot)
  4342.         local data = {} --initialise empty table variable
  4343.         data.name = ""
  4344.        
  4345.         if turtle.getItemCount(slot) > 0 then
  4346.             data = turtle.getItemDetail(slot)
  4347.         end
  4348.        
  4349.         return data.name
  4350.     end
  4351.    
  4352.     function clsTurtle.getItemSlot(self, item, useDamage)
  4353.         --useDamage = useDamage or 0
  4354.         local data = {} --initialise empty table variable
  4355.         local slot = 0
  4356.  
  4357.         for i = 1, 16 do
  4358.             if turtle.getItemCount(i) > 0 then
  4359.                 data = turtle.getItemDetail(i)
  4360.                 if data.name == item then
  4361.                     if useDamage == nil then -- only looking for item name
  4362.                         slot = i
  4363.                         break
  4364.                     else
  4365.                         if data.damage == useDamage then
  4366.                             slot = i
  4367.                             break
  4368.                         end
  4369.                     end
  4370.                 end
  4371.             end
  4372.         end
  4373.        
  4374.         return slot
  4375.     end
  4376.    
  4377.     function clsTurtle.getLogData(self)
  4378.         -- get the slot number and count of each type of log max and min only
  4379.         local maxCount  = 0
  4380.         local minCount = 64
  4381.         local data = {}
  4382.         local logData = {}
  4383.         logData.count = 0
  4384.         logData.primarySlot = 0
  4385.         logData.primaryCount = 0
  4386.         logData.primaryModifier = 0
  4387.         logData.primaryName = ""
  4388.         logData.finalSlot = 0
  4389.         logData.finalCount = 0
  4390.         logData.finalModifier = 0
  4391.         logData.finalName = ""
  4392.        
  4393.         for i = 1, 16 do
  4394.             if turtle.getItemCount(i) > 0 then -- not an empty slot
  4395.                 data = turtle.getItemDetail(i)
  4396.                 if data.name == "minecraft:log" or data.name == "minecraft:log2" then
  4397.                     logData.count = logData.count + data.count
  4398.                     if data.count > maxCount then
  4399.                         maxCount = data.count
  4400.                         logData.primarySlot = i
  4401.                         logData.primaryCount = data.count
  4402.                         logData.primaryModifier = data.damage
  4403.                         logData.primaryName = data.name
  4404.                     end
  4405.                     if data.count < minCount then
  4406.                         minCount = data.count
  4407.                         logData.finalSlot = i
  4408.                         logData.finalCount = data.count
  4409.                         logData.finalModifier = data.damage
  4410.                         logData.finalName = data.name
  4411.                     end
  4412.                 end
  4413.             end
  4414.         end
  4415.        
  4416.         return logData
  4417.     end
  4418.    
  4419.     function clsTurtle.getLogStock(self)
  4420.         local logAmount = 0
  4421.         local stockData = {}
  4422.  
  4423.         stockData = clsTurtle.getStock(self, "minecraft:log")  --oak, spruce, birch, jungle
  4424.         logAmount = logAmount + stockData.count
  4425.         stockData = clsTurtle.getStock(self, "minecraft:log2")  --acacia, dark oak
  4426.         logAmount = logAmount + stockData.count
  4427.        
  4428.         --[[
  4429.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log", 0)  --oak
  4430.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log", 1)  --spruce
  4431.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log", 2)  --birch
  4432.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log", 3)  -- jungle
  4433.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log2", 0) --acacia
  4434.         logAmount = logAmount + clsTurtle.getStock(self, "minecraft:log2", 1) --dark oak
  4435.         ]]--
  4436.  
  4437.         return logAmount
  4438.     end
  4439.    
  4440.     function clsTurtle.getSlotContains(self, slotNo)
  4441.         local data = {} --initialise empty table variable
  4442.         local rt = {}
  4443.        
  4444.         rt.count = 0
  4445.         rt.name = ""
  4446.         rt.modifier = 0
  4447.         if turtle.getItemCount(slotNo) > 0 then
  4448.             data = turtle.getItemDetail(slotNo)
  4449.             rt.count = data.count
  4450.             rt.name = data.name
  4451.             rt.modifier = data.damage
  4452.         end
  4453.        
  4454.         return rt
  4455.     end
  4456.  
  4457.     function clsTurtle.getStock(self, item, modifier)
  4458.         -- return total units and slot numbers of max and min amounts
  4459.         local minAmount = 64
  4460.         local maxAmount = 0
  4461.         local data = {} --initialise empty table variable
  4462.         local success = false
  4463.         local rt = {}
  4464.  
  4465.         rt.count = 0
  4466.         rt.primarySlot = 0
  4467.         rt.finalSlot = 0
  4468.         rt.primaryCount = 0
  4469.         rt.finalCount = 0
  4470.        
  4471.         for i = 1, 16 do
  4472.             if turtle.getItemCount(i) > 0 then
  4473.                 data = turtle.getItemDetail(i)
  4474.                 if data.name == item then
  4475.                     success = true
  4476.                     if modifier == nil then -- only looking for item name (care with log and coal)
  4477.                         rt.count = rt.count + data.count
  4478.                         saveToLog("getStock()"..item..", slot="..tostring(i)..", quantity="..data.count)
  4479.                         if maxAmount <= 64 then
  4480.                             if data.count >= maxAmount then
  4481.                                 rt.primarySlot = i
  4482.                                 rt.primaryCount = data.count
  4483.                                 maxAmount = data.count
  4484.                             end
  4485.                         else
  4486.                             if data.count <= minAmount then
  4487.                                 minAmount = data.count
  4488.                                 rt.finalSlot = i
  4489.                                 rt.finalCount = data.count
  4490.                             end
  4491.                         end
  4492.                     else --looking for specific block
  4493.                         if data.damage == modifier then
  4494.                             rt.count = rt.count + data.count
  4495.                             saveToLog("getStock()"..item.."("..tostring(modifier)..", slot="..tostring(i)..", quantity="..data.count)
  4496.                             if maxAmount <= 64 then
  4497.                                 if data.count >= maxAmount then
  4498.                                     rt.primarySlot = i
  4499.                                     rt.primaryCount = data.count
  4500.                                     maxAmount = data.count
  4501.                                 end
  4502.                             else
  4503.                                 if data.count <= minAmount then
  4504.                                     minAmount = data.count
  4505.                                     rt.finalSlot = i
  4506.                                     rt.finalCount = data.count
  4507.                                 end
  4508.                             end
  4509.                         end
  4510.                     end
  4511.                 end
  4512.             end
  4513.         end
  4514.         if rt.finalSlot == 0 then
  4515.             rt.finalSlot = rt.primarySlot
  4516.         end
  4517.         if rt.finalCount == 0 then
  4518.             rt.finalCount = rt.primaryCount
  4519.         end
  4520.         if not success then
  4521.             if modifier == nil then
  4522.                 saveToLog("getStock()"..tostring(item).."= not found", true)
  4523.             else
  4524.                 saveToLog("getStock()"..tostring(item).."("..tostring(modifier)..")= not found")
  4525.             end
  4526.         end
  4527.        
  4528.         return rt --{rt.count, rt.primarySlot, rt.finalSlot, rt.primaryCount, rt.finalCount} 0, 0, 0
  4529.     end
  4530.    
  4531.     function clsTurtle.go(self, path)
  4532.         local digDirection = "forward"
  4533.         local itemSelected = false
  4534.         local move = ""
  4535.         local goUp = 0
  4536.         local slot = turtle.getSelectedSlot()
  4537.         local data = {}
  4538.         local stockData = {}
  4539.         local currentY = 0
  4540.  
  4541.         -- R L F B U D + - = Right, Left, Forward, Back, Up, Down, up while detect, down while not detect
  4542.         -- d u x M N O Q = dIG, DIGuP, digDown (x-cavate ?!), MineItem Up and close with cobble, DigUp if valuable and close, digDown if valuable and close, digDown if valuable
  4543.         -- c h k C H r S T P = cHECK/ChECK/CHECk place Cobble down/forward/up if no block, place cobblestone/dirt, cHest, Sapling, Torch, DIrT, hoPper
  4544.         -- turtle.select(1)
  4545.         for i = 1, string.len(path) do
  4546.             turtle.select(1)
  4547.             itemSlot = 0
  4548.             move = string.sub(path, i, i)
  4549.             if move == "R" then
  4550.                 clsTurtle.turnRight(self, 1)
  4551.             elseif move == "L" then
  4552.                 clsTurtle.turnLeft(self, 1)
  4553.             elseif move == "B" then
  4554.                 clsTurtle.back(self, 1)
  4555.             elseif move == "F" then
  4556.                 if clsTurtle.isValuable(self, "forward") then
  4557.                     mineItem(true, "forward")
  4558.                 end
  4559.                 clsTurtle.forward(self, 1)
  4560.             elseif move == "U" then
  4561.                 if clsTurtle.isValuable(self, "up") then
  4562.                     mineItem(true, "up")
  4563.                 end
  4564.                 clsTurtle.up(self, 1)
  4565.             elseif move == "D" then
  4566.                 if clsTurtle.isValuable(self, "down") then
  4567.                     mineItem(true, "down")
  4568.                 end
  4569.                 clsTurtle.down(self, 1)
  4570.             elseif move == "+" then
  4571.                 while turtle.detectUp() do
  4572.                     clsTurtle.up(self, 1)
  4573.                 end
  4574.             elseif move == "-" then
  4575.                 while not turtle.inspectDown() do
  4576.                     if currentY == 0 then
  4577.                         clsTurtle.down(self, 1)
  4578.                     else
  4579.                         while T:getY() > currentY do
  4580.                             clsTurtle.down(self, 1)
  4581.                         end
  4582.                         currentY = 0
  4583.                     end
  4584.                 end
  4585.                 --make sure grass, dirt, stone below
  4586.                 data = clsTurtle.getBlockType(self, "down")
  4587.                 if data.name ~= "minecraft:grass" and data.name ~= "minecraft:dirt" and data.name ~= "minecraft:stone" and data.name ~= "minecraft:cobblestone" then
  4588.                     stockData = clsTurtle.getStock(self, "minecraft:cobblestone")
  4589.                     if stockData.count > 0 then
  4590.                         turtle.select(stockData.primarySlot)
  4591.                     else
  4592.                         stockData = clsTurtle.getStock(self, "minecraft:dirt")
  4593.                         if stockData.count > 10 then
  4594.                             turtle.select(stockData.primarySlot)
  4595.                             turtle.placeDown()
  4596.                         end
  4597.                     end
  4598.                 end
  4599.             elseif move == "*" then
  4600.                 digDirection = "down"
  4601.                 while not turtle.inspectDown() do
  4602.                     clsTurtle.down(self, 1)
  4603.                     goUp = goUp + 1
  4604.                 end
  4605.                 if goUp > 0 then
  4606.                     for i = 1, goUp do
  4607.                         clsTurtle.up(self, 1)
  4608.                         if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4609.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4610.                             turtle.placeDown()
  4611.                         else
  4612.                             if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4613.                                 turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4614.                                 turtle.placeDown()
  4615.                             end
  4616.                         end
  4617.                     end
  4618.                     goUp = 0
  4619.                 else
  4620.                     turtle.digDown()
  4621.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4622.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4623.                         turtle.placeDown()
  4624.                     end
  4625.                 end
  4626.             elseif move == "u" then
  4627.                 digDirection = "up"
  4628.                 if clsTurtle.isValuable(self, "up") then
  4629.                     mineItem(true, "up")
  4630.                 end
  4631.                 while turtle.detectUp() do
  4632.                     if turtle.digUp() then
  4633.                         --allow for sand and gravel
  4634.                         sleep(.7)
  4635.                     end
  4636.                 end
  4637.             elseif move == "M" then
  4638.                 digDirection = "up"
  4639.                 if clsTurtle.isValuable(self, "up") then
  4640.                     mineItem(true, "up")
  4641.                 end
  4642.                 if not turtle.detectUp() then
  4643.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4644.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4645.                         turtle.placeUp()
  4646.                     else
  4647.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4648.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4649.                             turtle.placeUp()
  4650.                         end
  4651.                     end
  4652.                 end
  4653.             elseif move == "N" then
  4654.                 digDirection = "up"
  4655.                 if clsTurtle.isValuable(self, "up") then
  4656.                     turtle.digUp()
  4657.                 end
  4658.                 if not turtle.detectUp() then
  4659.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4660.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4661.                         turtle.placeUp()
  4662.                     else
  4663.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4664.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4665.                             turtle.placeUp()
  4666.                         end
  4667.                     end
  4668.                 end
  4669.             elseif move == "O" then
  4670.                 digDirection = "down"
  4671.                 if clsTurtle.isValuable(self, "down") then
  4672.                     turtle.digDown()
  4673.                 end
  4674.                 if not turtle.detectDown() then
  4675.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4676.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4677.                         turtle.placeDown()
  4678.                     else
  4679.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4680.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4681.                             turtle.placeDown()
  4682.                         end
  4683.                     end
  4684.                 end
  4685.             elseif move == "Q" then
  4686.                 digDirection = "down"
  4687.                 if clsTurtle.isValuable(self, "down") then
  4688.                     turtle.digDown()
  4689.                 end
  4690.             elseif move == "d" then
  4691.                 digDirection = "forward"
  4692.                 if clsTurtle.isValuable(self, "forward") then
  4693.                     mineItem(true, "forward")
  4694.                 end
  4695.                 while turtle.detect() do
  4696.                     if turtle.dig() then
  4697.                         sleep(.7)
  4698.                     end
  4699.                 end
  4700.             elseif move == "x" then
  4701.                 digDirection = "down"
  4702.                 data = clsTurtle.getBlockType(self, "down")
  4703.                 if data.name ~= "minecraft:torch" then
  4704.                     if clsTurtle.isValuable(self, "down") then
  4705.                         mineItem(true, "down")
  4706.                     else
  4707.                         turtle.digDown()
  4708.                     end
  4709.                 end
  4710.             elseif move == "c" then
  4711.                 currentY = 0
  4712.                 if clsTurtle.isValuable(self, "down") then
  4713.                     mineItem(true, "down")
  4714.                 end
  4715.                 if turtle.detectDown() then
  4716.                     --check if vegetation and remove
  4717.                     data = clsTurtle.getBlockType(self, "down")
  4718.                     if data.name ~= "minecraft:dirt" and data.name ~= "minecraft:stone" and data.name ~= "minecraft:cobblestone" and data.name ~= "minecraft:grass" then
  4719.                         turtle.digDown()
  4720.                     end
  4721.                 end
  4722.                 if not turtle.detectDown() then
  4723.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4724.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4725.                         if not turtle.placeDown() then
  4726.                             currentY = T:getY()
  4727.                         end
  4728.                     else
  4729.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4730.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4731.                             if not turtle.placeDown() then
  4732.                                 currentY = T:getY()
  4733.                             end
  4734.                         end
  4735.                     end
  4736.                 end
  4737.             elseif move == "h" then
  4738.                 if clsTurtle.isValuable(self, "forward") then
  4739.                     mineItem(true, "forward")
  4740.                 end
  4741.                 if not turtle.detect() then
  4742.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4743.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4744.                         turtle.place()
  4745.                     else
  4746.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4747.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4748.                             turtle.place()
  4749.                         end
  4750.                     end
  4751.                 end
  4752.             elseif move == "k" then
  4753.                 if clsTurtle.isValuable(self, "up") then
  4754.                     --mineItem(true, "up")
  4755.                     turtle.digUp()
  4756.                 end
  4757.                 if not turtle.detectUp() then
  4758.                     if clsTurtle.getItemSlot(self, "minecraft:cobblestone") > 0 then
  4759.                         turtle.select(clsTurtle.getItemSlot(self, "minecraft:cobblestone"))
  4760.                         turtle.placeUp()
  4761.                     else
  4762.                         if clsTurtle.getItemSlot(self, "minecraft:dirt") > 0 then
  4763.                             turtle.select(clsTurtle.getItemSlot(self, "minecraft:dirt"))
  4764.                             turtle.placeUp()
  4765.                         end
  4766.                     end
  4767.                 end
  4768.             elseif move == "C" or move == "H" or move == "S" or move == "T" or move == "r" or move == "P" then
  4769.                 itemSelected = false
  4770.                
  4771.                 if digDirection == "forward" then
  4772.                     if clsTurtle.isValuable(self, "forward") then
  4773.                         mineItem(true, "forward")
  4774.                     end
  4775.                     while turtle.detect() do
  4776.                         if turtle.dig() then
  4777.                             --allow for sand and gravel
  4778.                             sleep(.7)
  4779.                         end
  4780.                     end
  4781.                 elseif digDirection == "up" then
  4782.                     if clsTurtle.isValuable(self, "up") then
  4783.                         mineItem(true, "up")
  4784.                     end
  4785.                     while turtle.detectUp() do
  4786.                         if turtle.digUp() then
  4787.                             --allow for sand and gravel
  4788.                             sleep(.7)
  4789.                         end
  4790.                     end
  4791.                 elseif digDirection == "down" then
  4792.                     if clsTurtle.isValuable(self, "down") then
  4793.                         mineItem(true, "down")
  4794.                     end
  4795.                     if turtle.detectDown() then
  4796.                         turtle.digDown()
  4797.                     end
  4798.                 end
  4799.                 if move == "C"  then
  4800.                     itemSlot = clsTurtle.getItemSlot(self, "minecraft:cobblestone")
  4801.                     if itemSlot == 0 then
  4802.                         itemSlot = clsTurtle.getItemSlot(self, "minecraft:dirt")
  4803.                     end
  4804.                 elseif move == "H" then
  4805.                     itemSlot = clsTurtle.getItemSlot(self, "minecraft:chest")
  4806.                 elseif move == "S" then
  4807.                     stockData = clsTurtle.getStock(self, "minecraft:sapling")
  4808.                     if stockData.primarySlot > 0 then
  4809.                         itemSlot = stockData.primarySlot
  4810.                         treeFarm:addSapling()
  4811.                     end
  4812.                 elseif move == "T" then
  4813.                     itemSlot = clsTurtle.getItemSlot(self, "minecraft:torch")
  4814.                 elseif move == "r" then
  4815.                     digDirection = "up"
  4816.                     itemSlot = clsTurtle.getItemSlot(self, "minecraft:dirt")
  4817.                 elseif move == "P" then
  4818.                     digDirection = "down"
  4819.                     itemSlot = clsTurtle.getItemSlot(self, "minecraft:hopper")
  4820.                 end
  4821.                 if itemSlot > 0 then
  4822.                     turtle.select(itemSlot)
  4823.                     if digDirection == "forward" then
  4824.                         turtle.place()
  4825.                     elseif digDirection == "up" then
  4826.                         turtle.placeUp()
  4827.                     elseif digDirection == "down" then
  4828.                         turtle.placeDown()
  4829.                     end
  4830.                 end
  4831.             end
  4832.         end
  4833.         turtle.select(slot)
  4834.     end
  4835.    
  4836.     function clsTurtle.isLog(self, direction)
  4837.         local success = false
  4838.         local data = {}
  4839.        
  4840.         local valuableItems = "minecraft:log minecraft:log2"
  4841.  
  4842.         if direction == "up" then
  4843.             if turtle.detectUp() then
  4844.                 data = clsTurtle.getBlockType(self, "up")
  4845.             end
  4846.         elseif direction == "down" then
  4847.             if turtle.detectDown() then
  4848.                 data = clsTurtle.getBlockType(self, "down")
  4849.             end
  4850.         elseif direction == "forward" then
  4851.             if turtle.detect() then
  4852.                 data = clsTurtle.getBlockType(self, "forward")
  4853.             end
  4854.         end
  4855.         if data.name ~= nil then
  4856.             if string.find(valuableItems, data.name) ~= nil then
  4857.                 success = true
  4858.             end
  4859.         end
  4860.        
  4861.         return success
  4862.     end
  4863.    
  4864.     function clsTurtle.isValuable(self, direction)
  4865.         local success = false
  4866.         local data = {}
  4867.         local valuableItems = "minecraft:coal_ore minecraft:redstone_ore minecraft:iron_ore minecraft:diamond_ore minecraft:log "
  4868.         valuableItems = valuableItems.."minecraft:log2 minecraft:gold_ore minecraft:reeds minecraft:emerald_ore"
  4869.         if direction == "up" then
  4870.             if turtle.detectUp() then
  4871.                 data = clsTurtle.getBlockType(self, "up")
  4872.             end
  4873.         elseif direction == "down" then
  4874.             if turtle.detectDown() then
  4875.                 data = clsTurtle.getBlockType(self, "down")
  4876.             end
  4877.         elseif direction == "forward" then
  4878.             if turtle.detect() then
  4879.                 data = clsTurtle.getBlockType(self, "forward")
  4880.             end
  4881.         end
  4882.         if data.name ~= nil then
  4883.             if string.find(valuableItems, data.name) ~= nil then
  4884.                 success = true
  4885.                 --clsTurtle.saveToLog(self, data.name .. " found at "..self.x..", " ..self.y..", "..self.z, true)
  4886.                 if clsTurtle.getItemSlot(self, data.name) == 0 then
  4887.                     if clsTurtle.getFirstEmptySlot(self) == 0 then -- no spare slots
  4888.                         clsTurtle.saveToLog(self, "Dumping excess blocks", true)
  4889.                         clsTurtle.emptyTrash(self, "up")
  4890.                     end
  4891.                 end
  4892.             end
  4893.         end
  4894.        
  4895.         return success, data.name
  4896.     end
  4897.    
  4898.     function clsTurtle.place(self, blockType, modifier, direction)
  4899.         local data = {}
  4900.        
  4901.         -- check if current slot is empty
  4902.         if turtle.getItemCount(turtle.getSelectedSlot()) == 0 then
  4903.             -- Find first non-empty slot
  4904.             for i = 1, 16 do
  4905.                 if turtle.getItemCount(i) > 0 then
  4906.                     turtle.select(i)
  4907.                     break
  4908.                 end
  4909.             end
  4910.         end
  4911.         data = clsTurtle.getSlotContains(self, turtle.getSelectedSlot())
  4912.         if data.name ~= blockType or data.modifier ~= modifier then
  4913.             for i = 1, 16 do
  4914.                 if turtle.getItemCount(i) > 0 then
  4915.                     data = clsTurtle.getSlotContains(self, i)
  4916.                     if data.name == blockType and data.modifier == modifier then
  4917.                         turtle.select(i)
  4918.                         break
  4919.                     end
  4920.                 end
  4921.             end
  4922.         end
  4923.  
  4924.         if direction == "down" then
  4925.             turtle.placeDown()
  4926.         elseif direction == "up" then
  4927.             turtle.placeUp()
  4928.         else
  4929.             turtle.place()
  4930.         end
  4931.     end
  4932.    
  4933.     function clsTurtle.refuel(self, minLevel, recursiveCall)   
  4934.         minLevel = minLevel or 15
  4935.         if recursiveCall == nil then
  4936.             recursiveCall = false
  4937.         end
  4938.         local itemSlot = 0
  4939.         local count = 0
  4940.         local item = ""
  4941.         local damage = 0
  4942.         local logData = {}
  4943.         local stockData = {}
  4944.         local success = false
  4945.        
  4946.         if turtle.getFuelLevel() < minLevel then
  4947.             --clsTurtle.saveToLog(self, "Refuel needed", true)
  4948.             itemSlot = clsTurtle.getItemSlot(self, "minecraft:lava_bucket")
  4949.             if itemSlot > 0 then
  4950.                 turtle.select(itemSlot)
  4951.                 if turtle.refuel() then
  4952.                     saveToLog("refuel() lava used. level="..turtle.getFuelLevel(),true)
  4953.                     success = true
  4954.                 end
  4955.             end
  4956.             if not success then
  4957.                 itemSlot = clsTurtle.getItemSlot(self, "minecraft:coal", 1) --charcoal
  4958.                 if itemSlot > 0 then
  4959.                     turtle.select(itemSlot)
  4960.                     if turtle.refuel() then --use all charcoal
  4961.                         saveToLog("refuel() all charcoal used. level="..turtle.getFuelLevel(),true)
  4962.                         success = true
  4963.                     end
  4964.                 end
  4965.             end
  4966.             if not success then
  4967.                 stockData = clsTurtle.getStock(self, "minecraft:coal", 0)
  4968.                 --itemSlot = clsTurtle.getItemSlot(self, "minecraft:coal", 0)
  4969.                 if stockData.count > 0 then
  4970.                     turtle.select(stockData.finalSlot)
  4971.                     if turtle.refuel(1) then
  4972.                         saveToLog("refuel() 1 coal used. level="..turtle.getFuelLevel(),true)
  4973.                         success = true
  4974.                     end
  4975.                 end
  4976.             end
  4977.             if not success then
  4978.                 itemSlot = clsTurtle.getItemSlot(self, "minecraft:planks")
  4979.                 if itemSlot > 0 then
  4980.                     turtle.select(itemSlot)
  4981.                     if turtle.refuel() then
  4982.                         success = true
  4983.                     end
  4984.                 end
  4985.             end
  4986.             if not success then
  4987.                 logData = clsTurtle.getLogData(self)
  4988.                 if logData.count > 0 then --logs onboard
  4989.                     itemSlot = logData.finalSlot
  4990.                     clsTurtle.saveToLog(self, "Refuelling with log slot "..tostring(itemSlot)..", crafting planks", true)
  4991.                     if not clsTurtle.craft(self, "minecraft:planks", 4, logData.finalName, nil, nil, true) then
  4992.                         print("refuel: error crafting planks")
  4993.                     else
  4994.                         success = true
  4995.                     end
  4996.                 end
  4997.             end        
  4998.         end
  4999.         if not recursiveCall then -- only runs once
  5000.             if not success then
  5001.                 while turtle.getFuelLevel() < minLevel do
  5002.                     term.clear()
  5003.                     term.setCursorPos(1,1)
  5004.                     print("Unable to refuel: "..turtle.getFuelLevel().." fuel remaining")
  5005.                     print("Please add any fuel to any slot")
  5006.                     clsTurtle.refuel(self, minLevel, true) -- recursive function, flag set
  5007.                     sleep(1)
  5008.                 end
  5009.                 term.clear()
  5010.                 term.setCursorPos(1,1)
  5011.             end
  5012.         end
  5013.         return success
  5014.     end
  5015.    
  5016.     function clsTurtle.saveToLog(self, text, toScreen)
  5017.         if toScreen == nil then
  5018.             toScreen = true
  5019.         end
  5020.         text = text or "Nil instead of text supplied, check your code!"
  5021.        
  5022.         if toScreen then
  5023.             print(text)
  5024.         end
  5025.         --error here if fso object not created
  5026.         if fso:getUseLog() then
  5027.             fso:appendLine(text)
  5028.         end
  5029.     end
  5030.    
  5031.     function clsTurtle.sortInventory(self)
  5032.         local turns = 0
  5033.         local itemSlot = 0
  5034.        
  5035.         itemSlot = clsTurtle.getItemSlot(self, "minecraft:chest") --get the slot number containing a chest
  5036.         if itemSlot > 0 then -- chest found
  5037.             while turtle.detect() do --check for clear space to place chest
  5038.                 clsTurtle.turnRight(self, 1)
  5039.                 turns = turns + 1
  5040.                 if turns == 4 then
  5041.                     turns = 0
  5042.                     break
  5043.                 end
  5044.             end
  5045.             turtle.select(1)
  5046.             while turtle.detect() do --clear space in front. Use loop in case of sand/gravel falling
  5047.                 turtle.dig()
  5048.                 sleep(.5)
  5049.             end
  5050.             turtle.select(itemSlot) --should be slot with chest
  5051.             while not turtle.place() do
  5052.                 while clsTurtle.attack(self) do --in case mobs in front
  5053.                     print("Mob attacked!")
  5054.                 end
  5055.             end
  5056.             -- fill chest with everything
  5057.             for i = 1, 16 do
  5058.                 turtle.select(i)
  5059.                 turtle.drop()
  5060.             end
  5061.             turtle.select(1) --empty chest into slot 1 onwards
  5062.             while turtle.suck() do
  5063.            
  5064.             end
  5065.             turtle.dig() -- collect chest
  5066.             if turns > 0 then --return to original position
  5067.                 clsTurtle.turnLeft(self, turns)
  5068.             end
  5069.         end
  5070.     end
  5071.    
  5072.     function clsTurtle.turnLeft(self, steps)
  5073.         steps = steps or 1
  5074.         for i = 1, steps do
  5075.             turtle.turnLeft()
  5076.             self.facing = self.facing - 1
  5077.             if self.facing < 0 then
  5078.                 self.facing = 3
  5079.             end
  5080.         end
  5081.     end
  5082.  
  5083.     function clsTurtle.turnRight(self, steps)
  5084.         steps = steps or 1
  5085.         for i = 1, steps do
  5086.             turtle.turnRight()
  5087.             self.facing = self.facing + 1
  5088.             if self.facing > 3 then
  5089.                 self.facing = 0
  5090.             end
  5091.         end
  5092.     end
  5093.    
  5094.     function clsTurtle.up(self, steps)
  5095.         steps = steps or 1
  5096.         local success = true
  5097.         local data = {}
  5098.        
  5099.         clsTurtle.refuel(self, steps)
  5100.         turtle.select(1)
  5101.         for i = 1, steps do
  5102.             if turtle.detectUp() then -- block above
  5103.                 if turtle.digUp() then  -- block above dug, may allow sand or gravel to drop
  5104.                     sleep(0.5) -- allow time for sand/gravel to drop
  5105.                     while turtle.digUp() do
  5106.                         sleep(0.5)
  5107.                     end
  5108.                 else --may be bedrock above
  5109.                     data = clsTurtle.getBlockType(self, "up")
  5110.                     if data.name == "minecraft:bedrock" then
  5111.                         success = false
  5112.                         break
  5113.                     end
  5114.                 end
  5115.             end --move up unless mob in the way
  5116.             while not turtle.up() do
  5117.                 clsTurtle.attack(self)
  5118.             end
  5119.             self.y = self.y + 1
  5120.         end
  5121.        
  5122.         return success
  5123.     end
  5124.  
  5125.     return self
  5126. end
  5127.  
  5128. function main()
  5129.     local stockData = {}
  5130.     local numIronOre = 0
  5131.     local functionList = {"harvestFirstTree()", "harvestAllTrees()", "findCobble()", "clearBase()", "placeStorage()",
  5132.                           "createMine(14)", "createMine(11)", "createMine(8)",
  5133.                           "completeMining(14)", "completeMining(11)", "completeMining(8)",
  5134.                           "mineToBedrock()", "craftMiningTurtle()"}
  5135.        
  5136.     if os.version() == "CraftOS 1.7" then
  5137.         ccComputer = "computercraft:CC-Computer"
  5138.         ccDisk = "computercraft:disk"
  5139.         ccTurtle = "computercraft:CC-Turtle"
  5140.         ccCraftyMiningTurtle = "computercraft:CC-TurtleExpanded"
  5141.         ccDiskDrive = "computercraft:CC-Peripheral"
  5142.     end
  5143.     initialise()        -- Set up global variables and create objects
  5144.     getCoords()         -- Get current coordinates from player
  5145.     local status = tonumber(loadStatus("currentStatus.txt")) -- if continuing from previous run (debugging aid)
  5146.     saveToLog("Starting at function "..functionList[status + 1], true)
  5147.     if status == 0 then
  5148.         harvestFirstTree()  -- harvest first tree and make chest
  5149.         status = 1
  5150.     end
  5151.     if status <= 1 then
  5152.         harvestAllTrees()   -- harvest remaining trees in 33 x 33 square
  5153.         status = 2
  5154.     end
  5155.     if status <= 2 then
  5156.         findCobble()        -- get cobble and any incidental coal or iron ore
  5157.         status = 3
  5158.     end
  5159.     if status <= 3 then
  5160.         clearBase()         -- create cobble base station including 2x2 pond area
  5161.         status = 4
  5162.     end
  5163.     if status <= 4 then
  5164.         placeStorage()      -- craft chests and place in ground for storage
  5165.         status = 5
  5166.     end
  5167.     if status <= 7 then
  5168.         createMine(status)  -- create basic 3 layer mine minimal structure and collect iron ore
  5169.         status = 8         
  5170.     end
  5171.     stockData = T:getStock("minecraft:iron_ore") -- check enough iron ore found
  5172.     numIronOre = stockData.count
  5173.     stockData = T:getStock("minecraft:diamond", 0) -- just possible 6 diamonds found
  5174.     if stockData.count < 6 or numIronOre < 14 then
  5175.         if status <= 10 then
  5176.             completeMining(status)  -- fully mine each layer constructed above. collect remaining supplies including min 3 diamonds
  5177.             status = 11
  5178.         end
  5179.         stockData = T:getStock("minecraft:diamond", 0)
  5180.         if status <= 11 then
  5181.             if stockData.count < 6 then -- 3 levels mined out, need more
  5182.                 mineToBedrock()
  5183.                 status = 12
  5184.             end
  5185.         end
  5186.     end
  5187.     if status <= 12 then
  5188.         stockData = T:getStock("minecraft:diamond", 0)
  5189.         if stockData.count < 3 then
  5190.             craftMiningTurtle(0)
  5191.         elseif stockData.count < 6 then
  5192.             craftMiningTurtle(1)
  5193.         else
  5194.             craftMiningTurtle(2)
  5195.         end
  5196.     end
  5197. end
  5198.  
  5199. --*********************Program runs from here*****************
  5200. main()
Add Comment
Please, Sign In to add comment