-- vi: ft=lua -- Goal: collect lava using buckets in the nether, deposit the buckets into a fluid transposer that extracts the lava and sends it to a power generator -- -- chest above base needs to contain empty buckets -- the filled buckets will be deposited in a chest below the base FORWARD = 1 RIGHT = 2 LEFT = 3 BACKWARD = 4 local function compareItemName(target) local itemDetail = turtle.getItemDetail() if itemDetail == nil then return nil end return itemDetail.name == target end local function findFirstItem(target) for i=1,16 do turtle.select(i) if compareItemName(target) then print('Found an target item (' .. target .. ') in slot ' .. i) return i end end return nil end local function findFirstEmptyBucket() return findFirstItem("minecraft:bucket") end local function findFirstLavaBucket() return findFirstItem("minecraft:lava_bucket") end local function goRight() if not turtle.turnRight() then return false end local success = turtle.forward() turtle.turnLeft() return success end local function goLeft() if not turtle.turnLeft() then return false end local success = turtle.forward() turtle.turnRight() return success end local function doReverseMovement(movement) if movement == FORWARD then return turtle.back() elseif movement == RIGHT then return goLeft() elseif movement == LEFT then return goRight() elseif movement == BACKWARD then return turtle.forward() end end local function returnToBase() print('returing to base') for i = #Movements, 1, -1 do local movement = Movements[i] print('Movement ' .. i .. ': ' .. movement) if not doReverseMovement(movement) then print('hit a block on the way back, I am stuck!') end end end local function despositRefill() for i = 1, 16 do turtle.select(i) if compareItemName("minecraft:lava_bucket") then while not turtle.dropDown() do ---@diagnostic disable-next-line: undefined-field os.sleep(1) end end if compareItemName("minecraft:bucket") then turtle.dropUp() end end print('sleeping for 15 seconds, waiting for the buckets to be returned') os.sleep(15) turtle.suckUp(16) while not redstone.getInput("right") then print('no active redstone signal on the right side, waiting to start') os.sleep(5) end end local function refuel() local lava_bucket = findFirstLavaBucket() if lava_bucket == nil then return false end turtle.select(lava_bucket) turtle.refuel() return true end Movements = {} despositRefill() while true do if turtle.getFuelLevel() <= #Movements then print('not enough fuel to return. trying to refuel') if not refuel() then print('refulling failed. probably the end of the lava lake. returning to base') returnToBase() break end end if not compareItemName("minecraft:bucket") and findFirstEmptyBucket() == nil then print('could not find any empty buckets. returning and refilling') returnToBase() despositRefill() else -- try to fill it turtle.placeDown() if compareItemName("minecraft:bucket") then if turtle.forward() then table.insert(Movements, FORWARD) elseif goRight() then table.insert(Movements, RIGHT) elseif goLeft() then table.insert(Movements, LEFT) else print("can't find a path - returning to base") returnToBase() despositRefill() end end end end