Add optional before/after filter callbacks
authorCiaran Gultnieks <ciaran@ciarang.com>
Mon, 10 Feb 2014 19:18:18 +0000 (19:18 +0000)
committerCiaran Gultnieks <ciaran@ciarang.com>
Mon, 10 Feb 2014 19:19:57 +0000 (19:19 +0000)
These allow nodes that manage inventory in a non-standard manner (e.g. a
barrel) to still be able to work with pipeworks filters.

item_transport.lua

index b97d5bb7f230d4ea8472b101bd27378b2df38f4a..1e698bfefef67a6df2a9c452c1ae197a101c9691 100644 (file)
@@ -130,20 +130,30 @@ minetest.register_node("pipeworks:filter", {
                if not (tube and tube.input_inventory) then
                        return
                end
+               if tube.before_filter then
+                       tube.before_filter(frompos)
+               end
                local frommeta = minetest.get_meta(frompos)
                local frominvname = tube.input_inventory
                local frominv = frommeta:get_inventory()
                local sname
+               local fired = false
                for _,filter in ipairs(inv:get_list("main")) do
                        sname = filter:get_name()
                        if sname ~= "" then
                                -- XXX: that's a lot of parameters
-                               if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir) then return end
+                               if grabAndFire(frominv, frominvname, frompos, fromnode, sname, tube, idef, dir) then
+                                       fired = true
+                                       break
+                               end
                        end
                end
-               if inv:is_empty("main") then
+               if not fired and inv:is_empty("main") then
                        grabAndFire(frominv,frominvname,frompos,fromnode,nil,tube,idef,dir)
                end
+               if tube.after_filter then
+                       tube.after_filter(frompos)
+               end
        end,
 })
 
@@ -208,7 +218,7 @@ minetest.register_node("pipeworks:mese_filter", {
                        end
                end
                if inv:is_empty("main") then
-                       grabAndFire(frominv, frominvname, frompos, fromnode, nil, tube, idef, dir, true)
+                       grabAndFire(frominv, frominvname, frompos, fromnode, nil, tube, idef, dir, true)
                end
        end,
 })