fix objects colliding with its own collision boxes

This commit is contained in:
sapier 2013-04-09 23:16:13 +02:00
parent 7d002b60ff
commit 6e4fdf37ba
4 changed files with 13 additions and 7 deletions

@ -192,7 +192,7 @@ bool wouldCollideWithCeiling(
collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
f32 pos_max_d, const aabb3f &box_0, f32 pos_max_d, const aabb3f &box_0,
f32 stepheight, f32 dtime, 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(); Map *map = &env->getMap();
//TimeTaker tt("collisionMoveSimple"); //TimeTaker tt("collisionMoveSimple");
@ -300,7 +300,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
c_env->getActiveObjects(pos_f,distance * 1.5,clientobjects); c_env->getActiveObjects(pos_f,distance * 1.5,clientobjects);
for (int i=0; i < clientobjects.size(); i++) 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 else
@ -314,7 +316,9 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef,
for (std::set<u16>::iterator iter = s_objects.begin(); iter != s_objects.end(); iter++) for (std::set<u16>::iterator iter = s_objects.begin(); iter != s_objects.end(); iter++)
{ {
ServerActiveObject *current = s_env->getActiveObject(*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]) { if (is_object[nearest_boxindex]) {
info.type = COLLISION_OBJECT; info.type = COLLISION_OBJECT;
} }
else else {
info.type = COLLISION_NODE; info.type = COLLISION_NODE;
}
info.node_p = node_positions[nearest_boxindex]; info.node_p = node_positions[nearest_boxindex];
info.bouncy = bouncy; info.bouncy = bouncy;
info.old_speed = speed_f; info.old_speed = speed_f;

@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
class Map; class Map;
class IGameDef; class IGameDef;
class Environment; class Environment;
class ActiveObject;
enum CollisionType enum CollisionType
{ {
@ -70,7 +71,7 @@ struct collisionMoveResult
collisionMoveResult collisionMoveSimple(Environment *env,IGameDef *gamedef, collisionMoveResult collisionMoveSimple(Environment *env,IGameDef *gamedef,
f32 pos_max_d, const aabb3f &box_0, f32 pos_max_d, const aabb3f &box_0,
f32 stepheight, f32 dtime, 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 #if 0
// This doesn't seem to work and isn't used // This doesn't seem to work and isn't used

@ -1152,7 +1152,7 @@ public:
v3f p_acceleration = m_acceleration; v3f p_acceleration = m_acceleration;
moveresult = collisionMoveSimple(env,env->getGameDef(), moveresult = collisionMoveSimple(env,env->getGameDef(),
pos_max_d, box, stepheight, dtime, pos_max_d, box, stepheight, dtime,
p_pos, p_velocity, p_acceleration); p_pos, p_velocity, p_acceleration,this);
// Apply results // Apply results
m_position = p_pos; m_position = p_pos;
m_velocity = p_velocity; m_velocity = p_velocity;

@ -502,7 +502,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended)
v3f p_acceleration = m_acceleration; v3f p_acceleration = m_acceleration;
moveresult = collisionMoveSimple(m_env,m_env->getGameDef(), moveresult = collisionMoveSimple(m_env,m_env->getGameDef(),
pos_max_d, box, stepheight, dtime, pos_max_d, box, stepheight, dtime,
p_pos, p_velocity, p_acceleration); p_pos, p_velocity, p_acceleration,this);
// Apply results // Apply results
m_base_position = p_pos; m_base_position = p_pos;
m_velocity = p_velocity; m_velocity = p_velocity;