From ce832eb4218340d92caa8961f5b7d7c2cda47a7e Mon Sep 17 00:00:00 2001 From: DTA7 Date: Mon, 18 Sep 2017 20:18:55 +0200 Subject: Item entities: Enable item collision detection for sudden movement --- builtin/game/item_entity.lua | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) (limited to 'builtin/game') diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index 718c94fb2..06e67762c 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -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 -- cgit v1.2.3