allow_metadata_inventory_take returns a number, not a bool
authorNovatux <nathanael.courant@laposte.net>
Sat, 11 Jan 2014 07:04:11 +0000 (08:04 +0100)
committerNovatux <nathanael.courant@laposte.net>
Sat, 11 Jan 2014 07:04:11 +0000 (08:04 +0100)
item_transport.lua

index e67ef35fa50676b9ffa89ce94265ca17f176029b..b97d5bb7f230d4ea8472b101bd27378b2df38f4a 100644 (file)
@@ -38,7 +38,7 @@ function pipeworks.tube_item(pos, item)
 end
 
 -- adding two tube functions
--- can_remove(pos,node,stack,dir) returns true if an item can be removed from that stack on that node
+-- can_remove(pos,node,stack,dir) returns the maximum number of items of that stack that can be removed
 -- remove_items(pos,node,stack,dir,count) removes count items and returns them
 -- both optional w/ sensible defaults and fallback to normal allow_* function
 -- XXX: possibly change insert_object to insert_item
@@ -48,18 +48,18 @@ end
 local function grabAndFire(frominv,frominvname,frompos,fromnode,sname,tube,idef,dir,all)
        for spos,stack in ipairs(frominv:get_list(frominvname)) do
                if (sname == nil and stack:get_name() ~= "") or stack:get_name() == sname then
-                       local doRemove = true
+                       local doRemove = stack:get_count()
                        if tube.can_remove then
                                doRemove = tube.can_remove(frompos, fromnode, stack, dir)
                        elseif idef.allow_metadata_inventory_take then
                                doRemove = idef.allow_metadata_inventory_take(frompos,"main",spos, stack, fakePlayer)
                        end
                        -- stupid lack of continue statements grumble
-                       if doRemove then
+                       if doRemove > 0 then
                                local item
                                local count
                                if all then
-                                       count = stack:get_count()
+                                       count = math.min(stack:get_count(), doRemove)
                                else
                                        count = 1
                                end