156 lines
3.8 KiB
Lua
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
|