local farmWidth -- number local farmLength -- number local farmSpacing -- number, blocks between each tree local farmField -- table local farmXOffset -- number local farmYOffset -- number local farmZOffset -- number -- gets all global variables function init( global ) setfenv(1,global) end function distance( x1,z1,x2,z2 ) local dx = x1-x2 local dz = z1-z2 return math.sqrt(dx^2+dz^2) end function findNearestSpot( x,z ) local nearX,nearZ = x,z local nearestDistance = math.huge local turtleX,_,turtleZ = gps.getPosition() local direction -- direction is from the nearest position towards the x,z for xOffset = -1,1 do for zOffset = -1,1 do if (xOffset==0 or zOffset==0) and zOffset~=xOffset then -- distance from the turtle to the tree local tmpDistance = distance(x+xOffset,z+zOffset,turtleX,turtleZ) if tmpDistance < nearestDistance then nearX = x + xOffset nearZ = z + zOffset nearestDistance = tmpDistance if xOffset == 1 then direction = gps.west elseif xOffset == -1 then direction = gps.east elseif zOffset == 1 then direction = gps.north elseif zOffset == -1 then direction = gps.south end end end end end return nearX,nearZ,direction end function findNearestCorner( x1,z1,x2,z2 ) local nearX,nearZ local nearestDistance = math.huge local turtleX,_,turtleZ = gps.getPosition() for x = x1,x2,x2-x1 do for z = z1,z2,z2-z1 do -- distance from the turtle to the corner local tmpDistance = distance(x,z,turtleX,turtleZ) if tmpDistance < nearestDistance then nearX = x nearZ = z nearestDistance = tmpDistance end end end return nearX,nearZ end -- will dig til it reaches the surface -- instead of comparing log -- more consistant and easier with a big farm -- This does move the turtle 1 block forward function chop( clearDirt,x,z ) if not x or not z then x,_,z = gps.getPosition(1,gps.absPos.dir) end gps.moveForward(1,killMobs,true) if turtle.detectUp() then -- tree in front -- begin chop down the tree -- keep count on the trees height local height = 0 while turtle.detectUp() do gps.moveUp(1,killMobs,true) height = height + 1 end -- get back down to the "ground" gps.moveDown(height,killMobs,true) else -- no tree in front end if clearDirt then dig.down(killMobs,true) end end function chopAll( clearDirt ) if type(farmWidth) == "number" and type(farmLength) == "number" and type(farmSpacing) == "number" and type(farmXOffset) == "number" and type(farmYOffset) == "number" and type(farmZOffset) == "number" then -- find nearest corner of farm local homeX,homeY,homeZ = gps.getHome() local corner1x = homeX + farmXOffset local corner1z = homeZ + farmZOffset local corner2x = homeX + farmXOffset + (farmWidth-mult(farmWidth)) * farmSpacing local corner2z = homeZ + farmZOffset + (farmLength-mult(farmLength)) * farmSpacing -- loop through the trees local startX,startZ = findNearestCorner( corner1x,corner1z,corner2x,corner2z ) local stopX = corner1x; if stopX==startX then stopX = corner2x end local stopZ = corner1z; if stopZ==startZ then stopZ = corner2z end for x = startX,stopX,farmSpacing*mult(stopX-startX) do -- to alternate so you zig zag through the farm to save fuel and time local iteration = (x-startX+farmSpacing)/farmSpacing local A,B = startZ,stopZ if iteration%2==0 then A,B = stopZ,startZ end --print("i="..iteration.." start at "..A.." stop at "..B) for z = A,B,farmSpacing*mult(B-A) do --write(z.." ") local treeX,treeZ,dir = findNearestSpot(x,z) gps.goto(treeX,homeY+farmYOffset,treeZ,dir) chop(clearDirt) end --print() end end end -- requires dirt function replant() if type(farmWidth) == "number" and type(farmLength) == "number" and type(farmSpacing) == "number" and type(farmXOffset) == "number" and type(farmYOffset) == "number" and type(farmZOffset) == "number" then -- obtain materials item.followStoragePath() item.dropoff() item.getItems({item.types.dirt,item.types.sapling},math.abs(farmWidth*farmLength),true) item.followStoragePath(true) -- find nearest corner of farm local homeX,homeY,homeZ = gps.getHome() local corner1x = homeX + farmXOffset local corner1z = homeZ + farmZOffset local corner2x = homeX + farmXOffset + (farmWidth-mult(farmWidth)) * farmSpacing local corner2z = homeZ + farmZOffset + (farmLength-mult(farmLength)) * farmSpacing -- loop through the trees local startX,startZ = findNearestCorner( corner1x,corner1z,corner2x,corner2z ) local stopX = corner1x; if stopX==startX then stopX = corner2x end local stopZ = corner1z; if stopZ==startZ then stopZ = corner2z end for x = startX,stopX,farmSpacing*mult(stopX-startX) do -- to alternate so you zig zag through the farm to save fuel and time local iteration = (x-startX+farmSpacing)/farmSpacing local A,B = startZ,stopZ if iteration%2==0 then A,B = stopZ,startZ end --print("i="..iteration.." start at "..A.." stop at "..B) for z = A,B,farmSpacing*mult(B-A) do -- select dirt local atStorage = false while not item.select(item.types.dirt) do if not atStorage then item.followStoragePath() atStorage=true end item.getItem(item.types.dirt,_,false) end if atStorage then item.followStoragePath(true) end gps.goto(x,homeY+farmYOffset,z) turtle.placeDown() -- select sapling local atStorage = false while not item.select(item.types.sapling) do if not atStorage then item.followStoragePath() atStorage=true end item.getItem(item.types.sapling,_,false) end if atStorage then item.followStoragePath(true) end gps.goto(x,homeY+farmYOffset+1,z) turtle.placeDown() end end end item.followStoragePath() item.dropoff() gps.goto(gps.getHome()) end function setOffset( xOffset,yOffset,zOffset ) farmXOffset = xOffset or farmXOffset farmYOffset = yOffset or farmYOffset farmZOffset = zOffset or farmZOffset end function setSize( width,length,spacing ) farmWidth = width or farmWidth farmLength = length or farmLength farmSpacing = spacing or farmSpacing end -- sets the field forwards to the right -- z = forward -- x = right -- state = (boolean) true/false depends if its grown/harvested function updateField( state ) if type(farmWidth) == "number" and type(farmLength) == "number" and type(farmSpacing) == "number" and type(farmZOffset) == "number" and type(farmXOffset) == "number" then -- reset the field farmField = {} local totalWidth = (farmWidth-1) * farmSpacing + 1 local totalLength = (farmLength-1) * farmSpacing + 1 -- loop through the width and length for x = 1,totalWidth,farmSpacing do for z = 1,totalLength,farmSpacing do -- make sure the column exists if not farmField[x] then farmField[x] = {} end farmField[x][z] = farmField[x][z] or (state or false) end end return true else return false end end