Only enqueue falling nodes if they really want to fall
authorPilzAdam <pilzadam@minetest.net>
Fri, 5 Apr 2013 20:33:11 +0000 (22:33 +0200)
committerPilzAdam <pilzadam@minetest.net>
Fri, 5 Apr 2013 20:33:11 +0000 (22:33 +0200)
builtin/falling.lua

index 5ae51e76388ffcb64ed899b3ed9cdafba9ab27b0..f6491991bbfe7baab087de8aa4dc8b5e7d048815 100644 (file)
@@ -142,7 +142,7 @@ end
 -- Some common functions
 --
 
-function nodeupdate_single(p)
+function nodeupdate_single(p, delay)
        n = minetest.env:get_node(p)
        if minetest.get_node_group(n.name, "falling_node") ~= 0 then
                p_bottom = {x=p.x, y=p.y-1, z=p.z}
@@ -151,9 +151,13 @@ function nodeupdate_single(p)
                if minetest.registered_nodes[n_bottom.name] and
                                (not minetest.registered_nodes[n_bottom.name].walkable or 
                                        minetest.registered_nodes[n_bottom.name].buildable_to) then
-                       minetest.env:remove_node(p)
-                       spawn_falling_node(p, n.name)
-                       nodeupdate(p)
+                       if delay then
+                               minetest.after(0.1, nodeupdate_single, {x=p.x, y=p.y, z=p.z}, false)
+                       else
+                               minetest.env:remove_node(p)
+                               spawn_falling_node(p, n.name)
+                               nodeupdate(p)
+                       end
                end
        end
        
@@ -170,14 +174,11 @@ function nodeupdate(p)
        p.x = math.floor(p.x+0.5)
        p.y = math.floor(p.y+0.5)
        p.z = math.floor(p.z+0.5)
-       nodeupdate_single(p)
        
        for x = -1,1 do
        for y = -1,1 do
        for z = -1,1 do
-               if not (x==0 and y==0 and z==0) then
-                       minetest.after(0.1, nodeupdate_single, {x=p.x+x, y=p.y+y, z=p.z+z})
-               end
+               nodeupdate_single({x=p.x+x, y=p.y+y, z=p.z+z}, not (x==0 and y==0 and z==0))
        end
        end
        end