Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- yaft (yet another felling turtle) v0.1 by lpenap
- -- Program for lumberjack turtles in Computercraft
- --
- -- this is a work in progress, IT IS NOT WORKING ATM
- shell.run('clear')
- print ("Put saplings and fuel in any slot.")
- local tArgs = { ... }
- if #tArgs ~= 1 then
- print( "Usage: deforestate <number of trees>" )
- return
- end
- local numTrees = tonumber( tArgs[1] )
- if numTrees < 1 then
- print( "Number of trees must be positive" )
- return
- end
- local saplingBlock = "minecraft:sapling"
- local logBlock = "minecraft:log"
- local fuelItem = "minecraft:coal"
- local minFuelNeeded = (numTrees * 5 * 9) + 2
- local maxRefuelAttempts = 32
- local sleepSecsForFuel = 60
- local sleepCycle = 120
- local lastTree = 0
- local xPos, yPos, zPos = 0, 0, 0
- local step = 2
- function refuel( ammount )
- local fuelLevel = turtle.getFuelLevel()
- if fuelLevel == "unlimited" then
- return true
- end
- local needed = ammount
- if turtle.getFuelLevel() < needed then
- local fueled = false
- for n=1,16 do
- if turtle.getItemCount(n) > 0 then
- turtle.select(n)
- local data = turtle.getItemDetail(i)
- if data.name == fuelItem then
- if turtle.refuel(1) then
- while turtle.getItemCount(n) > 0 and turtle.getFuelLevel() < needed do
- turtle.refuel(1)
- end
- if turtle.getFuelLevel() >= needed then
- turtle.select(1)
- return true
- end
- end
- end
- end
- end
- turtle.select(1)
- return false
- end
- return true
- end
- function tryForward()
- xPos = xPos + 1
- turtle.forward()
- end
- function tryBack()
- xPos = xPos - 1
- turtle.back()
- end
- function circleAndSuck()
- for i = 1, 4 do
- turtle.suck()
- turtle.turnRight()
- end
- end
- function scanInventory()
- for i = 1, 16 do
- local data = turtle.getItemDetail(i)
- if data then
- print("Item name (".. data.count .."): ", data.name)
- end
- end
- end
- function gotSaplingInInventory()
- for i = 1, 16 do
- local data = turtle.getItemDetail(i)
- if data then
- if data.name == saplingBlock then
- turtle.select(i)
- return true
- end
- end
- end
- return false
- end
- function moveToTree(treePos)
- -- we are in front of a tree, move to the next position
- turtle.turnLeft()
- turtle.forward()
- circleAndSuck()
- turtle.forward()
- circleAndSuck()
- turtle.turnRight()
- return true
- end
- function exitTree()
- while not turtle.detectDown() do
- turtle.down()
- end
- -- attempt to suck fallen saplings
- turtle.suckUp()
- circleAndSuck()
- --turtle.forward()
- --circleAndSuck()
- --turtle.back()
- turtle.back()
- circleAndSuck()
- end
- function digUpTree(treePos)
- local success, data = turtle.inspectUp()
- while data.name == logBlock do
- if turtle.digUp() then
- if not collect(treePost) then
- exitTree()
- return false
- else
- turtle.up()
- end
- else
- break
- end
- success, data = turtle.inspectUp()
- end
- exitTree()
- return true
- end
- function continueTree(treePos)
- if not turtle.detect() then
- turtle.forward()
- end
- while turtle.up() do
- end
- return digUpTree(treePos)
- end
- function digTree(treePos)
- if turtle.detect() then
- if turtle.dig() then
- if not collect(treePos) then
- return false
- end
- turtle.forward()
- if not digUpTree(treePos) then
- return false
- end
- end
- end
- if not turtle.detect() then
- if gotSaplingInInventory() then
- turtle.place()
- end
- end
- return true
- end
- function checkBlock(data, treePos)
- if data.name == logBlock then
- return digTree(treePos)
- elseif data.name == saplingBlock then
- print ("Found sapling, skipping for now...")
- else
- print ("Found neither a log(tree) or a sapling, skipping...")
- end
- return true
- end
- function canTakeAction(treePos)
- if turtle.detect() then
- local success, data = turtle.inspect()
- return checkBlock(data, treePos)
- else
- if gotSaplingInInventory() then
- turtle.place()
- else
- return false
- end
- end
- return true
- end
- function collect(treePos)
- local bFull = true
- local nTotalItems = 0
- for n=1,16 do
- local nCount = turtle.getItemCount(n)
- if nCount == 0 then
- bFull = false
- end
- nTotalItems = nTotalItems + nCount
- end
- if bFull then
- lastTree = treePos
- print( "No empty slots left on tree ", lastTree)
- return false
- end
- return true
- end
- function waitForFuel(ammount)
- while not refuel (ammount) do
- print ("Not enough fuel, please refuel manually to continue...")
- os.sleep(sleepSecsForFuel)
- end
- end
- function compactInventory()
- -- TODO compact inventory to maintain at least 1 stack of coal for fuel
- -- and 1 stack of saplings
- return true
- end
- function returnSupplies()
- print ("returning supplies...")
- turtle.turnRight()
- circleAndSuck()
- while turtle.forward() do
- circleAndSuck()
- end
- turtle.turnLeft()
- turtle.forward()
- turtle.turnRight()
- for i = 1, 16 do
- local data = turtle.getItemDetail(i)
- if data then
- if data.name ~= fuelItem and data.name ~= saplingBlock then
- turtle.select(i)
- turtle.drop()
- end
- end
- end
- compactInventory()
- if not refuel (minFuelNeeded) then
- print ("Not enough fuel, attempting to refuel")
- turtle.turnLeft()
- local suckCount = 1
- turtle.suck()
- while not refuel(minFuelNeeded) do
- turtle.suck()
- suckCount = suckCount + 1
- if suckCount >= maxRefuelAttempts then
- print (suckCount .. " unsuccessful attempts to refuel from inventory ahead, sleeping 60 secs...")
- os.sleep(sleepSecsForFuel)
- suckCount = 0
- end
- end
- print ("Refueled!, going to starting position...")
- turtle.turnLeft()
- else
- turtle.turnRight()
- turtle.turnRight()
- end
- end
- scanInventory()
- if not refuel(minFuelNeeded) then
- print ("Out of Fuel")
- return
- end
- while true do
- turtle.forward()
- turtle.turnRight()
- turtle.back()
- if lastTree ~= 0 then
- print ("Going to resume tree ", lastTree)
- for i = 1, lastTree do
- moveToTree(i)
- end
- if continueTree(lastTree) then
- lastTree = 0
- end
- else
- for i = 1, numTrees do
- moveToTree(i)
- if not canTakeAction(i) then
- break
- end
- end
- end
- returnSupplies()
- if lastTree == 0 then
- os.sleep(sleepCycle)
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment