From 6267e13760f9f91c137637f4dbfdb83cd92344e6 Mon Sep 17 00:00:00 2001 From: janwas Date: Sat, 15 Nov 2008 22:38:04 +0000 Subject: [PATCH] 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. --- source/simulation/EntityManager.cpp | 4 ++-- source/simulation/EntityManager.h | 2 ++ source/simulation/Simulation.cpp | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/source/simulation/EntityManager.cpp b/source/simulation/EntityManager.cpp index 8d92cd48a0..914a6d973b 100644 --- a/source/simulation/EntityManager.cpp +++ b/source/simulation/EntityManager.cpp @@ -308,7 +308,7 @@ void CEntityManager::GetExtant( std::vector& results ) { results.clear(); 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 ); } @@ -432,7 +432,7 @@ void CEntityManager::InterpolateAll( float relativeoffset ) for( size_t i = 0; i < MAX_HANDLES; i++ ) // This needs to handle all entities, including destroyed/non-extant ones // (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 ); } diff --git a/source/simulation/EntityManager.h b/source/simulation/EntityManager.h index d70cfbbe2a..d1fce31fac 100644 --- a/source/simulation/EntityManager.h +++ b/source/simulation/EntityManager.h @@ -60,6 +60,8 @@ friend class CHandle; inline bool IsEntityRefd( size_t index ) { + if(!m_entities[index].m_entity) + return false; return m_refd[index]; //return m_entities[index].m_refcount && !m_entities[index].m_entity->entf_get(ENTF_DESTROYED); } diff --git a/source/simulation/Simulation.cpp b/source/simulation/Simulation.cpp index ca4f27afb6..42edb3a61e 100644 --- a/source/simulation/Simulation.cpp +++ b/source/simulation/Simulation.cpp @@ -198,12 +198,13 @@ void RandomizeLocations(const CEntityOrder& order, const std::vector &e std::vector::const_iterator it; float radius = 2.0f * sqrt( (float)entities.size() - 1 ); + CSimulation* sim = g_Game->GetSimulation(); + for (it = entities.begin(); it < entities.end(); it++) { float _x, _y; CEntityOrder randomizedOrder = order; - CSimulation* sim = g_Game->GetSimulation(); do { _x = sim->RandFloat() * 2.0f - 1.0f;