powerful Tree Farm
Description
{program="aTreeFarm",version="1.01",date="2015-01-31"}
Installation
Copy one of these commands into your ComputerCraft terminal:
Pastebin:
pastebin get xWGAdiP6 powerful_tree_farmwget:
wget https://pastebin.com/raw/xWGAdiP6 powerful_tree_farmArchive:
wget https://cc.shobie.xyz/cc/get/pb-xWGAdiP6 powerful_tree_farm
Quick Install:
wget https://cc.shobie.xyz/cc/get/pb-xWGAdiP6 powerful Tree Farm
Usage
Run the program after downloading
Tags
Source
View Original SourceCode Preview
--{program="aTreeFarm",version="1.01",date="2015-01-31"}
---------------------------------------
-- aTreeFarm by Kaikaku
-- 2015-01-31, v1.01 fixed initial refuelling
-- 2015-01-31, v1.00 finalized UI + counter
-- 2015-01-30, v0.80 auto set-up option
-- 2015-01-26, v0.70 preparing for video
-- 2014-01-12, v0.61 replant limited tries
-- 2014-01-04, v0.60 redstone stop
-- 2013-12-15, v0.51 initial
---------------------------------------
---------------------------------------
---- DESCRIPTION ----------------------
---------------------------------------
-- Turtle-automated tree farm.
-- Details see information during program
-- execution or YouTube video.
---------------------------------------
---- PARAMETERS -----------------------
---------------------------------------
local cVersion ="1.01"
local cPrgName ="aTreeFarm"
local cMinFuel = 960*2 -- 2 stacks of planks
local minRandomCheckSapling=0.1 -- below this will check replant
local actRandomCheckSapling=minRandomCheckSapling*2
local cIncreaseCheckSapling_Sapling=0.02
local cIncreaseCheckSapling_Stub=0.04
local cMaxCheckSapling=0.6
local strC="tReeTreESdig!diG;-)FaRmKaIKAKUudIgYdIgyTreEAndsOrRygUYsd"
local cSlotChest=16 -- chest for crafty turtle
local cCraftRefuelMaxItems=16 -- use how many logs to refuel at max
local cSlotRefuel=15 -- where to put fuel
local cExtraDigUp=1 -- go how many extra levels to reach jungle branches
local cLoopEnd=56 -- one loop
local cWaitingTime=20 -- if redstone signal in back is on
---------------------------------------
---- VARIABLES ------------------------
---------------------------------------
--local testStart=nil
--local testEnd=nil
local strC_now=""
local strC_next=""
local tmpResult=""
local blnAskForParameters=true
local blnShowUsage=false
local blnAutoSetup=false
local strSimpleCheck="Press enter to start:"
local intCounter=0
local maxCounter=0
---------------------------------------
---- tArgs ----------------------------
---------------------------------------
local tArgs = {...}
if #tArgs >= 1 then -- no error check
blnAskForParameters=false
if tArgs[1]=="help" then blnShowUsage=true end
if tArgs[1]=="setup" then blnAutoSetup=true end
if tArgs[1]=="set-up" then blnAutoSetup=true end
if tonumber(tArgs[1])~=nil then
maxCounter=tonumber(tArgs[1])
end
--print("maxCounter='",maxCounter,"'") os.sleep(5)
end
--if #tArgs >= 2 then
-- testStart = tArgs[2]
--end
--if #tArgs >= 3 then
-- testEnd = tArgs[3]
--end
if blnShowUsage then
print("Usage: aTreeFarm [setup/set-up]")
print(" or: aTreeFarm [maxCounter]")
print("setup or set-up:")
print(" Will start auto set-up")
print("maxCounter:")
print(" 0=will farm infinitely")
print(" x=will farm x rounds")
print("More details on YouTube ;)")
return
end
---------------------------------------
-- BASIC FUNCTIONS FOR TURTLE CONTROL -
---------------------------------------
local function gf(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.forward() do end end
end
local function gb(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.back() do end end
end
local function gu(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.up() do end end
end
local function gd(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.down() do end end
end
local function gl(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.turnLeft() do end end
end
local function gr(n)
if n==nil then n=1 end
for i=1,n,1 do while not turtle.turnRight() do end end
end
local function pf(n)
-- moves backwards if n>1
if n==nil then n=1 end
for i=1,n,1 do if i~=1 then gb() end turtle.place() end
end
local function pu() turtle.placeUp() end
local function pd() turtle.placeDown() end
local function df() return turtle.dig() end
local function du() turtle.digUp() end
local function dd() turtle.digDown() end
local function sf() turtle.suck() end
local function su() turtle.suckUp() end
local function sd(n)
if n==nil then
while turtle.suckDown() do end
else
for i=1,n do
turtle.suckDown()
end
end
end
local function Df() turtle.drop() end
local function Du() turtle.dropUp() end
local function Dd(n)
if n==nil then n=64 end
turtle.dropDown(n)
end
local function ss(s) turtle.select(s) end
local function askForInputText(textt)
local at=""
-- check prompting texts
if textt==nil then textt="Enter text:" end
-- ask for input
write(textt)
at=read()
return at
end
local function checkFuel()
local tmp=turtle.getFuelLevel()
return tmp
end
---------------------------------------
---- functions ------------------------
---------------------------------------
local function cutTree()
local tmpExtraDigUp=cExtraDigUp
---- assumptions
-- turtle faces trunk one block below bottom
---- variables
local intUpCount = 0
local intFace = 0 -- -1=left, 1=right
local blnDigSomething=false
term.write(" cutting tree: ")
-- get into tree column
df()
while not turtle.forward() do df() end
gr() df() gl() df() gl() df()
local intFace=-1
-- cut and go up
repeat
blnDigSomething=false
du()
while not turtle.up() do du() end
blnDigSomething=df() or blnDigSomething
if intFace==-1 then
gr()
blnDigSomething=df() or blnDigSomething
gr()
elseif intFace==1 then
gl()
blnDigSomething=df() or blnDigSomething
gl()
end
intFace=intFace * -1
blnDigSomething=df() or blnDigSomething
intUpCount = intUpCount +1
term.write(".")
-- check for 2 conditions
-- either
-- 1) nothing above the turtle
-- or
-- 2) nothing dig on the other columns blnDigSomething
if not (turtle.detectUp() or blnDigSomething) then
tmpExtraDigUp=tmpExtraDigUp-1
else
tmpExtraDigUp=cExtraDigUp -- restore it
end
until tmpExtraDigUp<0 --not (turtle.detectUp() or blnDigSomething) ----- NOT kai_2
-- go off tree column
if intFace==-1 then
gl()
elseif intFace==1 then
gr()
end
df()
while not turtle.forward() do df() end
gl()
intFace = 0
intFace = 1 -- 1=forward,-1=backwards
-- go back down
-- hint: only digging front and back in order
-- to not cut into larger neighbouring,
-- as this may leave upper tree parts left
for i = 1,intUpCount+1 do
dd() df() gl(2) df()
intFace=intFace* -1
while not turtle.down() do dd() end
end
if intFace==1 then
gl()
elseif intFace==-1 then
gr()
end
sf() df() term.write(".")
print(" done!")
-- plant new
plantTree()
while not turtle.up() do du() end
sd()
end
---------------------------------------
function plantTree()
local tmpCount=0
---- assumptions
-- turtle faces place to plant
-- check for enough saplings
sf()
if turtle.getItemCount(1) > 1 then
-- plant
print(" plant new sapling")
while not turtle.place() do
print(" hard to plant here...")
tmpCount=tmpCount+1
if tmpCount>3 then break end
os.sleep(1)
end -- NOT kai_2
else
-- error
print(" Out of saplings...") -- prog name
os.sleep(5)
actRandomCheckSapling=cMaxCheckSapling
return
end
end
---------------------------------------
local function replantStub()
ss(2) -- compare with wood in slot 2
if turtle.compare() then
-- assumption: there is only a stub left, so replant
-- if there is a tree on top of it, it will be harvested next round
print(" Replanting a stub")
df() ss(1)
if pf() then
actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Stub
else
print(" failure!")
end
else
ss(1)
end
end
local function eS(sI,sA,eA)
local sO=""
local sR=""
if sA==nil then sA=1 end
if eA==nil then eA=string.len(sI) end
for i=sA,eA,1 do
sO=string.sub(sI,i,i)
if sR~="" then break end
if sO=="a" then
gl()
elseif sO=="d" then
gr()
else
while not turtle.forward() do df() end
end
end
return sR
end
---------------------------------------
local function randomReplant()
local intSuccess=0
if turtle.getItemCount(1) > 10 then
-- try to plant
while not turtle.down() do dd() end
sf() gl() sf()
if turtle.place() then
actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Sapling
else
if turtle.detect() then replantStub() end
end
gl() sf() gl() sf()
if turtle.place() then
actRandomCheckSapling=actRandomCheckSapling+cIncreaseCheckSapling_Sapling
else
if turtle.detect() then replantStub() end
end
gl() sf()
while not turtle.up() do du() end
-- ensure min probability and max 100%
actRandomCheckSapling=math.max(actRandomCheckSapling-0.01,minRandomCheckSapling)
actRandomCheckSapling=math.min(actRandomCheckSapling,cMaxCheckSapling)
print((actRandomCheckSapling*100).."% check probability")
else
-- extra suck
while not turtle.down() do dd() end
sf() gr() sf() gr() sf() gr() sf() gr() sf()
while not turtle.up() do du() end
sd()
end
end
---------------------------------------
---- main -----------------------------
---------------------------------------
-- step 0 info and inital check
term.clear() term.setCursorPos(1,1)
repeat
print("+-------------------------------------+")
print("| aTreeFarm ",cVersion,", by Kaikaku (1/2) |")
print("+-------------------------------------+")
print("| Farm set-up: Place crafty felling |")
print("| turtle down (e.g. bottom left |")
print("| corner of chunk). Run program with|")
print("| parameter 'setup' (one time). |")
print("| Materials for auto set-up: |")
print("| slot 3: chest (1) |")
print("| slot 4: cobble (47) |")
print("| slot 5: torches (8) |")
print("+-------------------------------------+")
if blnAutoSetup then
if turtle.getItemCount(3)~=1 or turtle.getItemCount(4)<47 or turtle.getItemCount(5)<8 then
-- inventory not ready for set-up
strSimpleCheck="Fill in slots 3-5 and press enter:"
else
strSimpleCheck="Press enter to start:"
end
else
strSimpleCheck="Press enter to start:"
end
if not blnAskForParameters and strSimpleCheck=="Press enter to start:" then break end
until askForInputText(strSimpleCheck)=="" and strSimpleCheck=="Press enter to start:"
term.clear() term.setCursorPos(1,1)
repeat
print("+-------------------------------------+")
print("| aTreeFarm ",cVersion,", by Kaikaku (2/2) |")
print("+-------------------------------------+")
print("| Running the farm: |")
print("| Felling turtle sits above chest |")
print("| (as after running set-up). Turtle |")
print("| needs some initial fuel to start. |")
print("| Turtle inventory: |")
print("| slot 1: saplings (20+x) |")
print("| slot 2: wood from sapling (1) |")
print("| slot 16: chest (1) |")
print("+-------------------------------------+")
if turtle.getItemCount(1)<11 or turtle.getItemCount(2)~=1 or turtle.getItemCount(16)~=1 then
-- inventory not ready
strSimpleCheck="Provide materials and press enter:"
else
strSimpleCheck="Press enter to start:"
end
--strSimpleCheck="Press enter to start:"
if not blnAskForParameters and strSimpleCheck=="Press enter to start:" then break end
if blnAutoSetup then strSimpleCheck="Press enter to start:" end
until askForInputText(strSimpleCheck)=="" and strSimpleCheck=="Press enter to start:"
---------------------------------------
---- set-up farm ----------------------
---------------------------------------
-- set-up = not running the farm
if blnAutoSetup then
write("Setting up tree farm...")
-- chest
gf(3) gr() gf(3) gl() ss(3) dd() pd()
-- path
ss(4)
for i=1,9,1 do gf() dd() pd() end gr()
for i=1,3,1 do gf() dd() pd() end gr()
for i=1,6,1 do gf() dd() pd() end gl()
for i=1,3,1 do gf() dd() pd() end gl()
for i=1,6,1 do gf() dd() pd() end gr()
for i=1,3,1 do gf() dd() pd() end gr()
for i=1,9,1 do gf() dd() pd() end gr()
for i=1,8,1 do gf() dd() pd() end
-- torches
ss(5) gf(2) gl() pf() gu() gb(10) pd()
gl() gf(5) pd() gf() pd() gf(5) pd() gr() gf(11) pd()
gb(3) gr() gf(3) pd() gf(5) pd() gf(2) gr() gb(2) gd()
print(" done!")
print("You can now run the tree farm with: ",cPrgName)
return
end
---------------------------------------
---- tree farm ------------------------
---------------------------------------
strC_next=string.sub(strC,1,1)
while true do
-- step 0 check exit
if maxCounter>0 then
if intCounter==maxCounter then
print("Completed all ",maxCounter," farming rounds.")
print("I'm awaiting new commands, master!")
return
end
end
-- step 2 wait if redstone signal
while rs.getInput("back") do
print("Waiting due to redstone signal ",cWaitingTime,"s.")
os.sleep(cWaitingTime)
end
-- step 3 new round
while not turtle.up() do du() end
ss(1)
intCounter=intCounter+1
print("Starting round ",intCounter," with "..turtle.getItemCount(1).." saplings.")
for i=1,cLoopEnd,1 do
-- update commands
strC_now=strC_next
if i<cLoopEnd then
strC_next=string.sub(strC,i+1,i+1)
else
strC_next=string.sub(strC,1,1)
end
-- step 4 one step on the road
tmpResult=eS(strC,i,i)
if tmpResult~="" then
print("found special command: "..tmpResult)
end
-- step 5 check for blocks
-- step 5.1 check left hand side
if strC_now~="a" and strC_next~="a" then
-- now a=>just turned left
-- next a=>will turned left
gl()
if turtle.detect() then cutTree() end
gr()
end
-- step 5.2 check right hand side
if strC_now~="d" and strC_next~="d" then
-- now d=>just turned right
-- next d=>will turn right
gr()
if turtle.detect() then cutTree() end
gl()
end
sd()
if math.random()<=actRandomCheckSapling then
if strC_now~="d" and strC_now~="a" then
randomReplant()
end
end
end
-- step 6 need to craft some fuel?
craftFuel()
-- step 7 empty into chest
print(" Drop what I've harvested!")
while not turtle.down() do dd() end
ss(2)
if turtle.compareTo(1) then
print("Ups, in slot 2 is the same as in slot 1??")
Dd()
else
-- if slot 2 has other item (wood) than slot 1
-- keep one of them for comparison
Dd(math.max(turtle.getItemCount(2)-1,0))
end
for i=3,15,1 do
-- assumption slot 16 contains a chest
ss(i) Dd()
end
os.sleep(0)
ss(1)
end