void EntityChanged( CBaseEntity *pEntity ) { // might change after deletion, don't put back into the list if ( pEntity->IsMarkedForDeletion() ) return; const CBaseHandle &eh = pEntity->GetRefEHandle(); if ( !eh.IsValid() ) return; int index = eh.GetEntryIndex(); // UNDONE: Maintain separate lists for "no think/no sim" and just "no sim" // UNDONE: Keep "no sim" list sorted by thinktime // UNDONE: Add query for "no sim" list that includes a time and just get ents that will think by that time if ( pEntity->IsEFlagSet( EFL_NO_THINK_FUNCTION ) && pEntity->IsEFlagSet( EFL_NO_GAME_PHYSICS_SIMULATION ) ) { Assert( !pEntity->IsPlayer() ); RemoveEntinfoIndex( index ); } else { // already in the list? (had think or sim last time, now has both - or had both last time, now just one) if ( m_entinfoIndex[index] == 0xFFFF ) { MEM_ALLOC_CREDIT(); m_entinfoIndex[index] = m_simThinkList.AddToTail( (unsigned short)index ); } } }
void EntityChanged( CBaseEntity *pEntity ) { // might change after deletion, don't put back into the list if ( pEntity->IsMarkedForDeletion() ) return; const CBaseHandle &eh = pEntity->GetRefEHandle(); if ( !eh.IsValid() ) return; int index = eh.GetEntryIndex(); if ( pEntity->IsEFlagSet( EFL_NO_THINK_FUNCTION ) && pEntity->IsEFlagSet( EFL_NO_GAME_PHYSICS_SIMULATION ) ) { RemoveEntinfoIndex( index ); } else { // already in the list? (had think or sim last time, now has both - or had both last time, now just one) if ( m_entinfoIndex[index] == 0xFFFF ) { MEM_ALLOC_CREDIT(); m_entinfoIndex[index] = m_simThinkList.AddToTail(); m_simThinkList[m_entinfoIndex[index]].entEntry = (unsigned short)index; m_simThinkList[m_entinfoIndex[index]].nextThinkTick = 0; if ( pEntity->IsEFlagSet(EFL_NO_GAME_PHYSICS_SIMULATION) ) { m_simThinkList[m_entinfoIndex[index]].nextThinkTick = pEntity->GetFirstThinkTick(); Assert(m_simThinkList[m_entinfoIndex[index]].nextThinkTick>=0); } } else { // updating existing entry - if no sim, reset think time if ( pEntity->IsEFlagSet(EFL_NO_GAME_PHYSICS_SIMULATION) ) { m_simThinkList[m_entinfoIndex[index]].nextThinkTick = pEntity->GetFirstThinkTick(); Assert(m_simThinkList[m_entinfoIndex[index]].nextThinkTick>=0); } else { m_simThinkList[m_entinfoIndex[index]].nextThinkTick = 0; } } } }
void OnEntityDeleted( CBaseEntity *pEntity ) { RemoveEntinfoIndex( pEntity->GetRefEHandle().GetEntryIndex() ); }