aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2020-05-01 14:56:56 +0200
committersfan5 <sfan5@live.de>2020-05-06 14:03:52 +0200
commite8e5d282da81a0c6bf37ece93dfa5f274aaaf041 (patch)
treefd2b1217490203813f289b6290799b863af066ea
parent723926a995f8ee0428e4aaa95de37a46354f5249 (diff)
downloadminetest-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.lua23
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