Item entities: Enable item collision detection for sudden movement
authorDTA7 <dta7e@t-online.de>
Mon, 18 Sep 2017 18:18:55 +0000 (20:18 +0200)
committerparamat <mat.gregory@virginmedia.com>
Mon, 6 Nov 2017 13:51:26 +0000 (13:51 +0000)
builtin/game/item_entity.lua

index 718c94fb24e715109194e73549fac0312f560589..06e67762c95dd76a2c87a9b51ff9d23c6e4b82ba 100644 (file)
@@ -33,7 +33,7 @@ core.register_entity(":__builtin:item", {
        },
 
        itemstring = "",
-       physical_state = true,
+       moving_state = true,
        slippery_state = false,
        age = 0,
 
@@ -148,16 +148,14 @@ core.register_entity(":__builtin:item", {
                local vel = self.object:getvelocity()
                local def = node and core.registered_nodes[node.name]
                -- Ignore is nil -> stop until the block loaded
-               local is_physical = (def and not def.walkable) or vel.y ~= 0
+               local is_moving = (def and not def.walkable) or
+                               vel.x ~= 0 or vel.y ~= 0 or vel.z ~= 0
                local is_slippery = false
 
-               if def and def.walkable and
-                               (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then
+               if def and def.walkable then
                        local slippery = core.get_item_group(node.name, "slippery")
                        is_slippery = slippery ~= 0
-                       if is_slippery then
-                               is_physical = true
-
+                       if is_slippery and (math.abs(vel.x) > 0.2 or math.abs(vel.z) > 0.2) then
                                -- Horizontal deceleration
                                local slip_factor = 4.0 / (slippery + 4)
                                self.object:set_acceleration({
@@ -165,32 +163,31 @@ core.register_entity(":__builtin:item", {
                                        y = 0,
                                        z = -vel.z * slip_factor
                                })
+                       elseif vel.y == 0 then
+                               is_moving = false
                        end
                end
 
-               if self.physical_state == is_physical and
+               if self.moving_state == is_moving and
                                self.slippery_state == is_slippery then
-                       -- Do not update anything until the physical state changes
+                       -- Do not update anything until the moving state changes
                        return
                end
 
-               self.physical_state = is_physical
+               self.moving_state = is_moving
                self.slippery_state = is_slippery
-               self.object:set_properties({
-                       physical = is_physical
-               })
-
-               if is_slippery then
-                       return
-               end
 
-               if is_physical then
+               if is_moving then
                        self.object:set_acceleration({x = 0, y = -gravity, z = 0})
                else
                        self.object:set_acceleration({x = 0, y = 0, z = 0})
                        self.object:set_velocity({x = 0, y = 0, z = 0})
                end
 
+               --Only collect items if not moving
+               if is_moving then
+                       return
+               end
                -- Collect the items around to merge with
                local own_stack = ItemStack(self.itemstring)
                if own_stack:get_free_space() == 0 then