summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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