Fix falling through nodes on world load (fixes #2784)
authorChristof Kaufmann <christofkaufmann1986@gmail.com>
Tue, 18 Aug 2015 10:05:24 +0000 (12:05 +0200)
committerest31 <MTest31@outlook.com>
Sat, 26 Sep 2015 19:40:45 +0000 (21:40 +0200)
On world load the collision code can not see node boxes, since the
nodes have not been loaded. Thus it collided only at the next full
node. However, standing on a slab on world load leaded to sinking into
it until the world finished loading. Then one maybe fell further, if
the node below was not walkable.

Now, with this commit, when no node around the player has been loaded
it simply does not move the player.

src/collision.cpp

index adb6970f5fc4f5d31791c46621027e3f0ce26c3f..5d52202d9b3a7935ca40ff9ec5ad941184834f03 100644 (file)
@@ -245,6 +245,8 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
        s16 max_y = MYMAX(oldpos_i.Y, newpos_i.Y) + (box_0.MaxEdge.Y / BS) + 1;
        s16 max_z = MYMAX(oldpos_i.Z, newpos_i.Z) + (box_0.MaxEdge.Z / BS) + 1;
 
+       bool any_position_valid = false;
+
        for(s16 x = min_x; x <= max_x; x++)
        for(s16 y = min_y; y <= max_y; y++)
        for(s16 z = min_z; z <= max_z; z++)
@@ -257,6 +259,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                if (is_position_valid) {
                        // Object collides into walkable nodes
 
+                       any_position_valid = true;
                        const ContentFeatures &f = gamedef->getNodeDefManager()->get(n);
                        if(f.walkable == false)
                                continue;
@@ -289,6 +292,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                        is_object.push_back(false);
                }
        }
+
+       // Do not move if world has not loaded yet, since custom node boxes
+       // are not available for collision detection.
+       if (!any_position_valid)
+               return result;
+
        } // tt2
 
        if(collideWithObjects)
@@ -298,7 +307,6 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 
                /* add object boxes to cboxes */
 
-
                std::vector<ActiveObject*> objects;
 #ifndef SERVER
                ClientEnvironment *c_env = dynamic_cast<ClientEnvironment*>(env);