Enable collide_with_objects for falling entities

falling nodes intentionally still fall through players
fixes #5313
master
sfan5 2020-05-01 14:56:56 +02:00
parent 723926a995
commit e8e5d282da
1 changed files with 21 additions and 2 deletions

View File

@ -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