diff --git a/libs/turtle-utils.lua b/libs/turtle-utils.lua index 7c09004..86dcd64 100644 --- a/libs/turtle-utils.lua +++ b/libs/turtle-utils.lua @@ -1,6 +1,7 @@ local turtleUtils = {} local DEFAULT_IDLE_TIME = 2 +local DEFAULT_MIN_FUEL_NEEDED = 1000 turtleUtils.isFuelItem = function(item) item = item or {} @@ -221,7 +222,7 @@ turtleUtils.refuelAllFromInventory = function() end end --- utils function used by "compactInventory" +-- utils functions used by "compactInventory" local function getItemsMap() local result = {} @@ -283,4 +284,47 @@ turtleUtils.compactInventory = function() return turtleUtils.countFreeSlots() - initialNbFreeSlots end +-- utils functions used by "refuelWithBuffer" +local function getSuckFn(side) + if side == 'front' then + return turtle.suck + elseif side == 'top' + return turtle.suckUp + elseif side == 'bottom' + return turtle.suckDown + end +end + +local function findFuelSlot(inventory) + for slot in pairs(inventory.list()) do + local item = inventory.getItemDetail(slot) + + if item and turtleUtils.isFuelItem(item) then + return slot + end + end +end + +-- Refuel using a buffer chest +turtleUtils.refuelWithBuffer = function(sideFuel, sideBuffer, minFuelNeeded, sleepTime) + sleepTime = sleepTime or DEFAULT_IDLE_TIME + minFuelNeeded = minFuelNeeded or DEFAULT_MIN_FUEL_NEEDED + local suckFn = getSuckFn(sideBuffer) + + if not suckFn then + return false, 'refuelWithBuffer: sideBuffer should be "front", "top" or "bottom"' + end + + local fuelInventory = waitForInventory(sideFuel, sleepTime) + local bufferInventory = waitForInventory(sideBuffer, sleepTime) + + local ok, errMessage = turtleUtils.refuel(minFuelNeeded, function() + local fuelSlot = findFuelSlot(fuelInventory) + fuelInventory.pushItems(peripheral.getName(bufferInventory), fuelSlot) + return suckFn() + end, sleepTime) + + return ok, errMessage +end + return turtleUtils \ No newline at end of file