computercraft/lava-collector

156 lines
3.8 KiB
Lua

-- 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
Movements = {}
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") do
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