From: sapier Date: Tue, 9 Apr 2013 21:16:13 +0000 (+0200) Subject: fix objects colliding with its own collision boxes X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=6e4fdf37baaeaf1048210e5519822ebd68dd413b;p=zefram%2Fminetest%2Fminetest_engine.git fix objects colliding with its own collision boxes --- diff --git a/src/collision.cpp b/src/collision.cpp index cd170196..673966b6 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -192,7 +192,7 @@ bool wouldCollideWithCeiling( collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, f32 pos_max_d, const aabb3f &box_0, f32 stepheight, f32 dtime, - v3f &pos_f, v3f &speed_f, v3f &accel_f) + v3f &pos_f, v3f &speed_f, v3f &accel_f,ActiveObject* self) { Map *map = &env->getMap(); //TimeTaker tt("collisionMoveSimple"); @@ -300,7 +300,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, c_env->getActiveObjects(pos_f,distance * 1.5,clientobjects); for (int i=0; i < clientobjects.size(); i++) { - objects.push_back((ActiveObject*)clientobjects[i].obj); + if ((self == 0) || (self != clientobjects[i].obj)) { + objects.push_back((ActiveObject*)clientobjects[i].obj); + } } } else @@ -314,7 +316,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, for (std::set::iterator iter = s_objects.begin(); iter != s_objects.end(); iter++) { ServerActiveObject *current = s_env->getActiveObject(*iter); - objects.push_back((ActiveObject*)current); + if ((self == 0) || (self != current)) { + objects.push_back((ActiveObject*)current); + } } } } @@ -458,8 +462,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, if (is_object[nearest_boxindex]) { info.type = COLLISION_OBJECT; } - else + else { info.type = COLLISION_NODE; + } info.node_p = node_positions[nearest_boxindex]; info.bouncy = bouncy; info.old_speed = speed_f; diff --git a/src/collision.h b/src/collision.h index 11781845..77bf1f15 100644 --- a/src/collision.h +++ b/src/collision.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., class Map; class IGameDef; class Environment; +class ActiveObject; enum CollisionType { @@ -70,7 +71,7 @@ struct collisionMoveResult collisionMoveResult collisionMoveSimple(Environment *env,IGameDef *gamedef, f32 pos_max_d, const aabb3f &box_0, f32 stepheight, f32 dtime, - v3f &pos_f, v3f &speed_f, v3f &accel_f); + v3f &pos_f, v3f &speed_f, v3f &accel_f,ActiveObject* self=0); #if 0 // This doesn't seem to work and isn't used diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 9738dc34..f79d0d6f 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -1152,7 +1152,7 @@ public: v3f p_acceleration = m_acceleration; moveresult = collisionMoveSimple(env,env->getGameDef(), pos_max_d, box, stepheight, dtime, - p_pos, p_velocity, p_acceleration); + p_pos, p_velocity, p_acceleration,this); // Apply results m_position = p_pos; m_velocity = p_velocity; diff --git a/src/content_sao.cpp b/src/content_sao.cpp index e6c8c725..3526ecbd 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -502,7 +502,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) v3f p_acceleration = m_acceleration; moveresult = collisionMoveSimple(m_env,m_env->getGameDef(), pos_max_d, box, stepheight, dtime, - p_pos, p_velocity, p_acceleration); + p_pos, p_velocity, p_acceleration,this); // Apply results m_base_position = p_pos; m_velocity = p_velocity;