diff options
author | DTA7 <dta7e@t-online.de> | 2017-09-18 20:18:55 +0200 |
---|---|---|
committer | paramat <mat.gregory@virginmedia.com> | 2017-11-06 13:51:26 +0000 |
commit | ce832eb4218340d92caa8961f5b7d7c2cda47a7e (patch) | |
tree | 2406cdab23ec305d63bbf30b475537df0ea9db5e /builtin/game/item_entity.lua | |
parent | 179476d8330ff0fd03c3c95bbb8ea0f55e5ad2ed (diff) | |
download | minetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.tar.gz minetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.tar.bz2 minetest-ce832eb4218340d92caa8961f5b7d7c2cda47a7e.zip |
Item entities: Enable item collision detection for sudden movement
Diffstat (limited to 'builtin/game/item_entity.lua')
-rw-r--r-- | builtin/game/item_entity.lua | 33 |
1 files changed, 15 insertions, 18 deletions
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 |