diff options
author | sfan5 <sfan5@live.de> | 2020-05-01 14:56:56 +0200 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2020-05-06 14:03:52 +0200 |
commit | e8e5d282da81a0c6bf37ece93dfa5f274aaaf041 (patch) | |
tree | fd2b1217490203813f289b6290799b863af066ea | |
parent | 723926a995f8ee0428e4aaa95de37a46354f5249 (diff) | |
download | minetest-e8e5d282da81a0c6bf37ece93dfa5f274aaaf041.tar.gz minetest-e8e5d282da81a0c6bf37ece93dfa5f274aaaf041.tar.bz2 minetest-e8e5d282da81a0c6bf37ece93dfa5f274aaaf041.zip |
Enable collide_with_objects for falling entities
falling nodes intentionally still fall through players
fixes #5313
-rw-r--r-- | builtin/game/falling.lua | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/builtin/game/falling.lua b/builtin/game/falling.lua index c340e769d..7037ae885 100644 --- a/builtin/game/falling.lua +++ b/builtin/game/falling.lua @@ -43,7 +43,7 @@ core.register_entity(":__builtin:falling_node", { textures = {}, physical = true, is_visible = false, - collide_with_objects = false, + collide_with_objects = true, collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, }, @@ -272,9 +272,14 @@ core.register_entity(":__builtin:falling_node", { end local bcp, bcn + local player_collision if moveresult.touching_ground then for _, info in ipairs(moveresult.collisions) do - if info.axis == "y" then + if info.type == "object" then + if info.axis == "y" and info.object:is_player() then + player_collision = info + end + elseif info.axis == "y" then bcp = info.node_pos bcn = core.get_node(bcp) break @@ -284,6 +289,20 @@ core.register_entity(":__builtin:falling_node", { if not bcp then -- We're colliding with something, but not the ground. Irrelevant to us. + if player_collision then + -- Continue falling through players by moving a little into + -- their collision box + -- TODO: this hack could be avoided in the future if objects + -- could choose who to collide with + local vel = self.object:get_velocity() + self.object:set_velocity({ + x = vel.x, + y = player_collision.old_velocity.y, + z = vel.z + }) + self.object:set_pos(vector.add(self.object:get_pos(), + {x = 0, y = -0.2, z = 0})) + end return elseif bcn.name == "ignore" then -- Delete on contact with ignore at world edges |