1
0
forked from 0ad/0ad

IsEntityRefd now checks the entity pointer as well (avoids null pointer dereference in some cases - encountered during MP game).

Simulation.cpp: hoist retrieval of simulation pointer out of loop

This was SVN commit r6482.
This commit is contained in:
janwas 2008-11-15 22:38:04 +00:00
parent cb257dd020
commit 6267e13760
3 changed files with 6 additions and 3 deletions

View File

@ -308,7 +308,7 @@ void CEntityManager::GetExtant( std::vector<CEntity*>& results )
{ {
results.clear(); results.clear();
for( size_t i = 0; i < MAX_HANDLES; i++ ) for( size_t i = 0; i < MAX_HANDLES; i++ )
if( IsEntityRefd(i) && m_entities[i].m_entity->m_extant ) if( IsEntityRefd(i) )
results.push_back( m_entities[i].m_entity ); results.push_back( m_entities[i].m_entity );
} }
@ -432,7 +432,7 @@ void CEntityManager::InterpolateAll( float relativeoffset )
for( size_t i = 0; i < MAX_HANDLES; i++ ) for( size_t i = 0; i < MAX_HANDLES; i++ )
// This needs to handle all entities, including destroyed/non-extant ones // This needs to handle all entities, including destroyed/non-extant ones
// (mainly dead bodies), so it can't use IsEntityRefd // (mainly dead bodies), so it can't use IsEntityRefd
if( m_entities[i].m_refcount ) if( m_entities[i].m_refcount && m_entities[i].m_entity )
m_entities[i].m_entity->Interpolate( relativeoffset ); m_entities[i].m_entity->Interpolate( relativeoffset );
} }

View File

@ -60,6 +60,8 @@ friend class CHandle;
inline bool IsEntityRefd( size_t index ) inline bool IsEntityRefd( size_t index )
{ {
if(!m_entities[index].m_entity)
return false;
return m_refd[index]; return m_refd[index];
//return m_entities[index].m_refcount && !m_entities[index].m_entity->entf_get(ENTF_DESTROYED); //return m_entities[index].m_refcount && !m_entities[index].m_entity->entf_get(ENTF_DESTROYED);
} }

View File

@ -198,12 +198,13 @@ void RandomizeLocations(const CEntityOrder& order, const std::vector<HEntity> &e
std::vector<HEntity>::const_iterator it; std::vector<HEntity>::const_iterator it;
float radius = 2.0f * sqrt( (float)entities.size() - 1 ); float radius = 2.0f * sqrt( (float)entities.size() - 1 );
CSimulation* sim = g_Game->GetSimulation();
for (it = entities.begin(); it < entities.end(); it++) for (it = entities.begin(); it < entities.end(); it++)
{ {
float _x, _y; float _x, _y;
CEntityOrder randomizedOrder = order; CEntityOrder randomizedOrder = order;
CSimulation* sim = g_Game->GetSimulation();
do do
{ {
_x = sim->RandFloat() * 2.0f - 1.0f; _x = sim->RandFloat() * 2.0f - 1.0f;