Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local tArgs = { ... }
- local rows = nil
- local length = nil
- if #tArgs < 1 then
- print( "Usage: farm [number:rows] [number:length]" )
- return
- else
- rows = tonumber(tArgs[1])
- length = tonumber(tArgs[2])
- end
- local function check_fuel(required)
- -- Always assumes the turtle is currently at the
- -- bread creation place
- if turtle.getFuelLevel() == 'unlimited' or turtle.getFuelLevel() > required + 1 then
- return
- end
- -- Not enough fuel
- -- Try to refuel through inventory
- turtle.select(16)
- if turtle.refuel() then
- return
- end
- -- Turn right and check the chest for fuel
- turtle.turnRight()
- -- We need an additional action now (turn left)
- -- so increment required
- required = required + 1
- empty_spots = {}
- -- Suck it all up and call refuel on every item
- for s = 1, 16 do
- if turtle.getItemCount(s) == 0 then
- empty_spots[s] = 1
- turtle.suck()
- turtle.refuel()
- if turtle.getFuelLevel() > required + 1 then
- return
- end
- else
- empty_spots[s] = 0
- end
- end
- for s = 1, 16 do
- if empty_spots[s] == 1 then
- turtle.drop()
- end
- end
- -- Ask for fuel
- turtle.select(16)
- print("Need fuel!")
- -- Will be reduced by 3 at the destination
- redstone.setAnalogOutput("bottom", 14)
- while not turtle.refuel() or turtle.getFuelLevel() < required + 1 do
- os.pullEvent( "turtle_inventory")
- end
- redstone.setOutput("bottom", false)
- print("Got fuel!")
- turtle.turnLeft()
- end
- local function faces_chest()
- local success, data = turtle.inspect()
- if not success then
- return false
- end
- if data.name == "minecraft:chest" or data.name == "IronChest:BlockIronChest" then
- return true
- else
- return false
- end
- end
- local function is_at_start()
- turtle.turnLeft()
- if not faces_chest() then
- turtle.turnRight()
- return false
- end
- turtle.turnLeft()
- if not faces_chest() then
- turtle.turnRight()
- turtle.turnRight()
- return false
- end
- turtle.turnLeft()
- if not faces_chest() then
- turtle.turnRight()
- turtle.turnRight()
- turtle.turnRight()
- return false
- end
- turtle.turnLeft()
- return true
- end
- local function move(dir, amount)
- if dir == "fw" then
- for t = 1, amount do
- turtle.forward()
- end
- elseif dir == "bw" then
- for t = 1, amount do
- turtle.back()
- end
- elseif dir == "up" then
- for t = 1, amount do
- turtle.up()
- end
- elseif dir == "down" then
- for t = 1, amount do
- turtle.down()
- end
- end
- end
- local function initial_farm_path()
- -- check_fuel(12)
- move("fw", 1)
- turtle.turnLeft()
- move("fw", 6)
- move("up", 4)
- turtle.turnLeft()
- end
- local function selected_is_wheat()
- if turtle.getItemCount() == 0 then
- return false
- end
- if turtle.getItemDetail().name == "minecraft:wheat" then
- return true
- else
- return false
- end
- end
- local function selected_is_seeds()
- if turtle.getItemCount() == 0 then
- return false
- end
- if turtle.getItemDetail().name == "minecraft:wheat_seeds" then
- return true
- else
- return false
- end
- end
- local row_offset = 0
- local function find_seeds()
- for s = 1, 15 do
- turtle.select(s)
- if selected_is_seeds() then
- return true
- end
- end
- return false
- end
- local function place_seed()
- if not find_seeds() then
- return false
- end
- turtle.digDown()
- turtle.placeDown()
- return true
- end
- local function return_from_row(len_traveled)
- turtle.turnLeft()
- turtle.turnLeft()
- for t = 0, len_traveled do
- move("down", 1)
- if t == len_traveled then
- move("fw", 8)
- else
- move("fw", 7)
- end
- end
- turtle.turnLeft()
- turtle.turnLeft()
- end
- local function farm_single_row()
- -- check_fuel((length * 16) + 1)
- local len_traveled = 0
- local do_cancel = false
- for l = 1, length do
- local local_len = 7
- if l == 1 then
- -- First row is 1 longer
- local_len = 8
- else
- move("up", 1)
- end
- if do_cancel then
- break
- end
- len_traveled = len_traveled + 1
- for f = 1, local_len do
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- end
- end
- return_from_row(len_traveled)
- end
- local function farm_double_row()
- -- check_fuel((length * 23) + 1)
- local len_traveled = 0
- local do_cancel = false
- for l = 1, length do
- local local_len = 7
- if l == 1 then
- -- First row is 1 longer
- local_len = 8
- else
- move("up", 1)
- end
- if do_cancel then
- break
- end
- len_traveled = len_traveled + 1
- for f = 1, local_len / 2 do
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnRight()
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnLeft()
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnLeft()
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnRight()
- end
- if local_len % 2 > 0 then
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnRight()
- move("fw", 1)
- if not place_seed() then
- -- No more seeds, cancel after this row
- do_cancel = true
- end
- turtle.turnLeft()
- turtle.turnLeft()
- move("fw", 1)
- turtle.turnRight()
- end
- end
- return_from_row(len_traveled)
- end
- local function go_home()
- -- check_fuel(row_offset + 12)
- turtle.turnLeft()
- move("fw", row_offset)
- move("fw", 4)
- move("down", 4)
- move("fw", 2)
- turtle.turnRight()
- move("fw", 1)
- turtle.turnLeft()
- turtle.turnLeft()
- end
- local function dump_excess()
- check_fuel(6)
- move("up", 1)
- turtle.turnRight()
- move("fw", 2)
- for s = 1, 15 do
- turtle.select(s)
- turtle.drop(64)
- end
- turtle.turnLeft()
- turtle.turnLeft()
- move("fw", 2)
- turtle.turnRight()
- move("down", 1)
- end
- local function next_row(doubled)
- local amount = nil
- if doubled then
- amount = 3
- else
- amount = 2
- end
- -- check_fuel(amount)
- row_offset = row_offset + amount
- turtle.turnRight()
- move("fw", amount)
- turtle.turnLeft()
- end
- local function pick_up_seeds()
- turtle.turnLeft()
- for s = 1, 15 do
- turtle.select(s)
- turtle.suck(64)
- end
- turtle.turnRight()
- end
- local function farm()
- if rows < 3 then
- check_fuel(12 + (((length * 16) + 1) * rows) + ((rows - 1) * 4) + 12)
- else
- check_fuel(12 + 12 + 4 + 4 + ((((length * 23) + 1) + 3 + 3) * (rows - 2)) +
- (((length * 16) + 1) * 2) + (8))
- end
- pick_up_seeds()
- initial_farm_path()
- if rows < 1 then
- print("Amount of rows is set to lower than 1")
- return
- end
- farm_single_row()
- for r = 0, rows - 2 do
- if r == 0 then
- next_row()
- else
- next_row(true)
- end
- farm_double_row()
- end
- if rows > 1 then
- if rows > 2 then
- next_row(true)
- else
- next_row()
- end
- farm_single_row()
- end
- go_home()
- dump_excess()
- end
- local function init()
- -- Check fuel first
- check_fuel(1)
- print("Fuel remaining: ", turtle.getFuelLevel())
- farm()
- end
- init()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement