void CGameWorld::Tick() { if(m_ResetRequested) Reset(); if(!m_Paused) { if(GameServer()->m_pController->IsForceBalanced()) GameServer()->SendChat(-1, CGameContext::CHAT_ALL, "Teams have been balanced"); // update all objects for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Tick(); pEnt = m_pNextTraverseEntity; } for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickDefered(); pEnt = m_pNextTraverseEntity; } } RemoveEntities(); }
void CGameWorld::Reset() { // reset all entities for(int i = 0; i < NUM_ENTTYPES; i++) for(CEntity *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Reset(); pEnt = m_pNextTraverseEntity; } RemoveEntities(); GameServer()->m_pController->PostReset(); RemoveEntities(); m_ResetRequested = false; }
void CEntityManager::Release() { CreateEntities(); RemoveEntities(); vector<CGameEntity*>::iterator l_it = m_vEntities.begin(); vector<CGameEntity*>::iterator l_end = m_vEntities.end(); for(; l_it != l_end; ++l_it) { delete *l_it; } m_vEntities.clear(); m_vFreeIDs.clear(); m_vNames.clear(); m_vEvents.clear(); }
void CEntityManager::PostUpdate(float _fDeltaTime) { vector<CGameEntity*>::iterator l_it = m_vEntities.begin(); vector<CGameEntity*>::iterator l_end = m_vEntities.end(); for(; l_it != l_end; ++l_it) { CGameEntity* l_pEntity = (*l_it); if(l_pEntity) { if(l_pEntity->IsActive()) { l_pEntity->PostUpdate(_fDeltaTime); } } } CreateEntities(); RemoveEntities(); }
void CGameWorld::Tick() { if(m_ResetRequested) Reset(); if(!m_Paused) { // update all objects for(int i = 0; i < MOD_NUM_ENTTYPES; i++) for(CEntityCore *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->Tick(); pEnt = m_pNextTraverseEntity; } for(int i = 0; i < MOD_NUM_ENTTYPES; i++) for(CEntityCore *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickDefered(); pEnt = m_pNextTraverseEntity; } } else if(GameServer()->m_pController->IsGamePaused()) { // update all objects for(int i = 0; i < MOD_NUM_ENTTYPES; i++) for(CEntityCore *pEnt = m_apFirstEntityTypes[i]; pEnt; ) { m_pNextTraverseEntity = pEnt->m_pNextTypeEntity; pEnt->TickPaused(); pEnt = m_pNextTraverseEntity; } } RemoveEntities(); }
/* =============== idMapFile::Parse =============== */ bool idMapFile::Parse( const char *filename, bool ignoreRegion, bool osPath ) { // no string concatenation for epairs and allow path names for materials idLexer src( LEXFL_NOSTRINGCONCAT | LEXFL_NOSTRINGESCAPECHARS | LEXFL_ALLOWPATHNAMES ); idToken token; idStr fullName; idMapEntity *mapEnt; int i, j, k; name = filename; name.StripFileExtension(); fullName = name; hasPrimitiveData = false; if ( !ignoreRegion ) { // try loading a .reg file first fullName.SetFileExtension( "reg" ); src.LoadFile( fullName, osPath ); } if ( !src.IsLoaded() ) { // now try a .map file fullName.SetFileExtension( "map" ); src.LoadFile( fullName, osPath ); if ( !src.IsLoaded() ) { // didn't get anything at all return false; } } version = OLD_MAP_VERSION; fileTime = src.GetFileTime(); entities.DeleteContents( true ); if ( src.CheckTokenString( "Version" ) ) { src.ReadTokenOnLine( &token ); version = token.GetFloatValue(); } while( 1 ) { mapEnt = idMapEntity::Parse( src, ( entities.Num() == 0 ), version ); if ( !mapEnt ) { break; } entities.Append( mapEnt ); } SetGeometryCRC(); // if the map has a worldspawn if ( entities.Num() ) { // "removeEntities" "classname" can be set in the worldspawn to remove all entities with the given classname const idKeyValue *removeEntities = entities[0]->epairs.MatchPrefix( "removeEntities", NULL ); while ( removeEntities ) { RemoveEntities( removeEntities->GetValue() ); removeEntities = entities[0]->epairs.MatchPrefix( "removeEntities", removeEntities ); } // "overrideMaterial" "material" can be set in the worldspawn to reset all materials idStr material; if ( entities[0]->epairs.GetString( "overrideMaterial", "", material ) ) { for ( i = 0; i < entities.Num(); i++ ) { mapEnt = entities[i]; for ( j = 0; j < mapEnt->GetNumPrimitives(); j++ ) { idMapPrimitive *mapPrimitive = mapEnt->GetPrimitive( j ); switch( mapPrimitive->GetType() ) { case idMapPrimitive::TYPE_BRUSH: { idMapBrush *mapBrush = static_cast<idMapBrush *>(mapPrimitive); for ( k = 0; k < mapBrush->GetNumSides(); k++ ) { mapBrush->GetSide( k )->SetMaterial( material ); } break; } case idMapPrimitive::TYPE_PATCH: { static_cast<idMapPatch *>(mapPrimitive)->SetMaterial( material ); break; } } } } } // force all entities to have a name key/value pair if ( entities[0]->epairs.GetBool( "forceEntityNames" ) ) { for ( i = 1; i < entities.Num(); i++ ) { mapEnt = entities[i]; if ( !mapEnt->epairs.FindKey( "name" ) ) { mapEnt->epairs.Set( "name", va( "%s%d", mapEnt->epairs.GetString( "classname", "forcedName" ), i ) ); } } } // move the primitives of any func_group entities to the worldspawn if ( entities[0]->epairs.GetBool( "moveFuncGroups" ) ) { for ( i = 1; i < entities.Num(); i++ ) { mapEnt = entities[i]; if ( idStr::Icmp( mapEnt->epairs.GetString( "classname" ), "func_group" ) == 0 ) { entities[0]->primitives.Append( mapEnt->primitives ); mapEnt->primitives.Clear(); } } } } hasPrimitiveData = true; return true; }