Update minetest.conf.example and settings_translation_file.cpp (#8278)
[oweals/minetest.git] / src / collision.cpp
index 99874dbfd8c1337d71e9fb440687573ad446d00c..a07899e652c7ec0d976ca79c30ab3923976a9f4e 100644 (file)
@@ -24,7 +24,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "nodedef.h"
 #include "gamedef.h"
 #ifndef SERVER
-#include "clientenvironment.h"
+#include "client/clientenvironment.h"
 #endif
 #include "serverenvironment.h"
 #include "serverobject.h"
@@ -360,11 +360,16 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 #ifndef SERVER
                ClientEnvironment *c_env = dynamic_cast<ClientEnvironment*>(env);
                if (c_env != 0) {
-                       f32 distance = speed_f->getLength();
+                       // Calculate distance by speed, add own extent and 1.5m of tolerance
+                       f32 distance = speed_f->getLength() * dtime +
+                               box_0.getExtent().getLength() + 1.5f * BS;
                        std::vector<DistanceSortedActiveObject> clientobjects;
-                       c_env->getActiveObjects(*pos_f, distance * 1.5f, clientobjects);
+                       c_env->getActiveObjects(*pos_f, distance, clientobjects);
+
                        for (auto &clientobject : clientobjects) {
-                               if (!self || (self != clientobject.obj)) {
+                               // Do collide with everything but itself and the parent CAO
+                               if (!self || (self != clientobject.obj &&
+                                               self != clientobject.obj->getParent())) {
                                        objects.push_back((ActiveObject*) clientobject.obj);
                                }
                        }
@@ -374,12 +379,17 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
                {
                        ServerEnvironment *s_env = dynamic_cast<ServerEnvironment*>(env);
                        if (s_env != NULL) {
-                               f32 distance = speed_f->getLength();
+                               // Calculate distance by speed, add own extent and 1.5m of tolerance
+                               f32 distance = speed_f->getLength() * dtime +
+                                       box_0.getExtent().getLength() + 1.5f * BS;
                                std::vector<u16> s_objects;
-                               s_env->getObjectsInsideRadius(s_objects, *pos_f, distance * 1.5f);
+                               s_env->getObjectsInsideRadius(s_objects, *pos_f, distance);
+
                                for (u16 obj_id : s_objects) {
                                        ServerActiveObject *current = s_env->getActiveObject(obj_id);
-                                       if (!self || (self != current)) {
+
+                                       if (!self || (self != current &&
+                                                       self != current->getParent())) {
                                                objects.push_back((ActiveObject*)current);
                                        }
                                }
@@ -505,6 +515,7 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
 
                        info.node_p = nearest_info.position;
                        info.old_speed = *speed_f;
+                       info.plane = nearest_collided;
 
                        // Set the speed component that caused the collision to zero
                        if (step_up) {