diff --git a/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java b/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java index bb82977bf..2d5863e76 100644 --- a/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java +++ b/src/main/java/dan200/computercraft/shared/turtle/apis/TurtleAPI.java @@ -303,7 +303,8 @@ public Object[] callMethod( @Nonnull ILuaContext context, int method, @Nonnull O case 31: { // refuel - int count = parseCount( args, 0 ); + int count = optInt( args, 0, Integer.MAX_VALUE ); + if( count < 0 ) throw new LuaException( "Refuel count " + count + " out of range" ); return tryCommand( context, new TurtleRefuelCommand( count ) ); } case 32: diff --git a/src/main/resources/assets/computercraft/lua/rom/programs/turtle/refuel.lua b/src/main/resources/assets/computercraft/lua/rom/programs/turtle/refuel.lua index 41956d59c..618b199cb 100644 --- a/src/main/resources/assets/computercraft/lua/rom/programs/turtle/refuel.lua +++ b/src/main/resources/assets/computercraft/lua/rom/programs/turtle/refuel.lua @@ -6,19 +6,27 @@ if #tArgs > 1 then return elseif #tArgs > 0 then if tArgs[1] == "all" then - nLimit = 64 * 16 + nLimit = nil else nLimit = tonumber( tArgs[1] ) + if not nLimit then + print("Invalid limit, expected a number or \"all\"") + return + end end end if turtle.getFuelLevel() ~= "unlimited" then - for n=1,16 do + for n = 1, 16 do + -- Stop if we've reached the limit, or are fully refuelled. + if (nLimit and nLimit <= 0) or turtle.getFuelLevel() >= turtle.getFuelLimit() then + break + end + local nCount = turtle.getItemCount(n) - if nLimit > 0 and nCount > 0 and turtle.getFuelLevel() < turtle.getFuelLimit() then - local nBurn = math.min( nLimit, nCount ) + if nCount > 0 then turtle.select( n ) - if turtle.refuel( nBurn ) then + if turtle.refuel( nLimit ) and nLimit then local nNewCount = turtle.getItemCount(n) nLimit = nLimit - (nCount - nNewCount) end