forked from Mirrorlandia_minetest/minetest
fix objects colliding with its own collision boxes
This commit is contained in:
parent
7d002b60ff
commit
6e4fdf37ba
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user